VeighNa量化社区
你的开源社区量化交易平台
eastpeace's Avatar
Member
离线
38 帖子
声望: 1

排除基本的语法问题,策略能跑通。

可是,

这个策略是完全实现我的想法吗?怎么验证呢?
一个是可以把所有价格序列和用到的指标值全部打印出来

另一个办法是在k线图上显示相应的价格和指标线,但目前只是1分钟,如果我的策略是30分钟上跑的呢?

另外,怎么显示出来那些指标值呢? 不能像tb,mc那种,很友好地显示出来k线周期选项和指标值显示选项吗?

https://www.tradingview.com/script/sufFpGjC-Supertrend-V1-0-Buy-or-Sell-Signal/

只会写mc,不太会写vnpy,似乎需要用到循环和递归,

请大佬改写一个,谢谢!

mc代码 ```
input:
n(10),
m(3);
variables:
avg(0),up(0),dn(0),trend(0),atr(0),
ST(0);

avg = (h+l)/2;
atr = AvgTrueRange(n);

up = avg + m atr;
dn = avg - m
atr;

if c > up[1] then
trend = 1
else if c < dn[1] then
trend = -1;

if trend > 0 and dn < dn[1] then dn=dn[1];
if trend < 0 and up > up[1] then up=up[1];

if trend = 1 then ST = dn else ST = up;

Plot3(st,"SThl2",iff(trend = 1,red,green));

```

对完全程序化自动化没有信心。但脚本策略是不是可以实现这样的功能。

譬如,价格,或者成交量,仓差变动达到一个水平,然后开仓,成交的同时,自动设置上的止损止盈价?

哪个大佬给个示范的脚本呀,谢谢!

譬如
1,某品种 跌破某价格 ,做空,
出发成交后立即设置好止损止盈单。

2,持仓某品种的持仓数量,设置好止损止盈。

谢谢

请问夜盘品种怎么根据1分钟合成日线K线?

现在合成的分割是按照自然日期 ,

是否有交易小节的属性,然后做一个区分判断?

1,请问2.1.2 穿透性测试 ,可以吗?

2, 如果换了个网络环境,外网IP地址变了,还不能用了吗?

目的:
想将测试回测中的有关变量保存下来,做检查对比(因为策略表现不符合逻辑意图)

操作:
在策略类中一开始定义
log_dict = {}

在on_init():中

    #定义要记录的变量
    self.log_dict['date'] = []
    self.log_dict['close'] = []
    self.log_dict['qqe'] = []
    self.log_dict['qqesf'] = []
    self.log_dict['ma1'] = []
    self.log_dict['ma2'] = []
    self.log_dict['pos'] = []

然后 在on_bar中,
...
self.put_event()

    self.log_dict['date'].append(bar.datetime)
    self.log_dict['close'].append(bar.close_price)
    self.log_dict['qqe'].append(round(self.qqe[-1], 2))
    self.log_dict['qqesf'].append(round(self.qqesf[-1], 2))
    self.log_dict['ma1'].append(round(self.ma_fast[-1], 2))
    self.log_dict['ma2'].append(round(self.ma_slow[-1], 2))
    self.log_dict['pos'].append(self.pos)

在on_stop中
pd.DataFrame(self.log_dict).to_csv('D:\maqqelog.txt')
self.write_log("策略停止")

但程序回测完了,相关图表也输出了,
但D盘没有这个文件,

但如果把这个 pd.DataFrame(self.log_dict).to_csv('D:\maqqelog.txt')
放在on_bar中,程序可能需要每更新一个bar就写一次,特别耗时。

请问:
在on_bar()里有没有可能,用那个变量,检测表现全部跑完?
if XXX:
log.to_csv()这样?

或者要实现我的目的,最好的方式该如何处理呢?

谢谢!

请问,
当根k线收盘走完 条件满足(信号bar) 我想立即在下个k线(入场bar)开盘是买入。
那么回测记录的买开价格是信号bar的close呢 还是下个k线的开盘价呢?

策略回测的权益图
是按 平仓记录更新 还是按日更新呢?

请教个问题,

情况是这样的,
我导入1分钟K线,然后策略是使用这个1分钟合成的60分钟K线周期来进行判断买卖。

那么回放历史数据生成交易信号时,是用1分钟K线“动态模拟” 这个价格运行呢?还是直接使用60分钟K线来进行判断买卖。

两者的回测精确度还是很不少区别,譬如日内小节的一些体市再开始交易的跳空。

RT。
我想把策略回测时的,
K线时间,价格序列,技术指标值 打印输出到文件,以便检查自己写的指标是否正确 (策略移植中)

我的jupyter notebook里,
with open('./log.txt','wt') as f:
print(data['Close'],',',data['MA'],file=f)
这样是可以的,
但写在策略文件的 def on_5min_bar(self, bar: BarData): 里(策略逻辑所在的部分)

写在指标计算结果 的下行,策略回测一遍,找不到这个文件呢。

请问正确打印想观察变量的值的方式是如何 的?

策略,自带的Rsi_atr ,参数默认
品种rb2010
今天发现螺纹有一个开多信号,之前是平仓
但平仓发单是以3615的涨停价来发出的,这是正常的吗?
elif self.pos < 0:
self.intra_trade_low = min(self.intra_trade_low, bar.low_price)
self.intra_trade_high = bar.high_price

        short_stop = self.intra_trade_low * \
            (1 + self.trailing_percent / 100)
        self.cover(short_stop, abs(self.pos), stop=True)

这段代码怎么也看不出来是要涨停价发单呢?

description

以自带的atr_rsi策略为例,默认参数,品种为rb2010.
vnpy 2.1.2 ctp 的simnow 模拟账户。

if self.atr_value > self.atr_ma:
                if self.rsi_value > self.rsi_buy:
                    self.buy(bar.close_price + 5, self.fixed_size)
                elif self.rsi_value < self.rsi_sell:
                    self.short(bar.close_price - 5, self.fixed_size)

description

9点开盘立即发单(我理解是上周收盘时就满足了条件)

description

不过对照文华的1分钟数据,看到Atr(22)与atr_ma(10)满足条件,但RSI(5)并不满足条件>66。(只对监临近的几根Bar,这里假设文华与vnpy里的行情数据一致)

【问题1】如果是这样,那天9点开盘时,不应该发出 多开指令!除非不是next bar模式。因为高开后,rsi是立即满足了。那么是否存在信号闪烁的问题?

【问题2】假设条件逻辑没问题,进场指令都是限价指令,bar.close加减5。
17日最后一个1分钟Bar,收盘价3381,那我理解发出买单应该是3386。但回测来看,不论是否设置滑点,回测里的价格都是 3387。

然后策略实际跑的情况是以3404发单,成交3401。不是应该是限价单吗?这个是我的主要困惑。

description

问题3,策略运行的委托结果,与回测偏很大是如何产生的,尤其是 后面的翻空操作

description

5_-957772934_4那个委托,是手动测试交易模块的手动下单(不知道最近老是不成功,订阅不了,下单也老是提交中)

CTP 模拟账户
通过加载运行策略,可以订阅到行情,会在行情列表显示相应的品种;
但在左侧的交易模块,输入品种代码,如交易所SHFE, 品种代码 rb2010.SHFE , 无法获取盘口信息,也无法订阅行情到 行情模块。

有些指标用talib实现不太了。

指标含义大概是这样的,回溯过去几根bar,如果依次走高是上升,返回0,否则 返回1

主要问题是,我需要对返回的结果 进行回溯,不一定是使用最新(最后一个)的结果。

mc代码,接近自然语言,应该比较好理角,供参考

inputs:
    InputData( numericseries ),
    BarCount( numericsimple ),
    NotStrict( truefalse );

vars:   
    result( 0 ), PrevValue(0), CurrValue(0), Index(0);

PrevValue = InputData[BarCount-1];
result = 0;

For Index = 1 to BarCount-1 begin

    CurrValue = InputData[BarCount - 1 - Index];    

    If (CurrValue < PrevValue) then begin
        // indicator is falling, not rising
        result = 0;
        break;
    end;

    if(NotStrict = false and CurrValue = PrevValue) then begin
        result = 0;
        break;
    end;

    if(CurrValue > PrevValue) then begin
        result = 1;
    end;

    PrevValue = CurrValue;
end;

rising = result;

我尝试的python代码

def IsRisingFunc(self, arrayvalue, barcount: int, NotStrict: bool=True,
        array: bool = False
    ) -> Union[int, np.ndarray]:
        """"
        判断是上涨趋势,回溯barcount个价格序列,从左向右循环比较,均大为上升
        """
        PreValue = arrayvalue[-barcount]
        result = []  

        for num in range(-(barcount-1),0):
            CurrValue = arrayvalue[num]
            if CurrValue < PreValue:
                result.append(0)
                break
            if NotStrict == False and CurrValue == PreValue:
                result.append(0)
                break
            if CurrValue > PreValue:
                result.append(1)

            PreValue = CurrValue

        resultarray = np.array(result)
        if array:
            return resultarray
        return resultarray[-1]

修改了一下,应该是可以运行了,之前的错误是均线指标调用时,返回序列,直接当数值来比较了,加个[-1]就好了。

现在能回测,但就是返回一个错误提示
File "D:\Tmp\vnpy\strategies\ma_bo_v1.py", line 111, in on_Xmin_bar
array =False
File "d:\vnstudio\lib\site-packages\vnpy\app\xtool\XQuantTool.py", line 219, in SQ_IsRising
return resultarray[-1]
IndexError: index -1 is out of bounds for axis 0 with size 0

在策略文件是这样写的

        self.ma_fast = am.sma(self.ma_f_len, array=True)
        self.ma_slow = am.sma(self.ma_s_len, array=False)

        self.IsRising = am.SQ_IsRising(self.ma_fast,5,NotStrict=True,
            array =False
        )
        # longcond = self.ma_fast > self.ma_slow
        longcond = self.IsRising == 1 and self.ma_fast[-1] > self.ma_slow
        shortcond = self.ma_fast[-1] < self.ma_slow

...

尝试看ta_lib的源码,看看有没有启示,但C实在太难了。

因为经常使用其他指标值 作为参数输入,所以最后还是方法化了他。

请大家帮帮忙,如果把这个改写到符合vnpy, arraymanager的要求。

谢谢!

RT。显示在加载数据,但最终是 空 的。 好奇怪

2020-04-14 21:23:26.781135 开始加载历史数据
2020-04-14 21:23:26.781135 加载进度: [2%]
2020-04-14 21:23:26.781135 加载进度: [4%]
2020-04-14 21:23:26.781135 加载进度: [6%]
2020-04-14 21:23:26.781135 加载进度: [8%]
2020-04-14 21:23:26.781135 加载进度: [10%]
2020-04-14 21:23:26.781135 加载进度:# [12%]
2020-04-14 21:23:26.781135 加载进度:# [13%]
2020-04-14 21:23:26.781135 加载进度:# [15%]
2020-04-14 21:23:26.781135 加载进度:# [17%]
2020-04-14 21:23:26.781135 加载进度:# [19%]
2020-04-14 21:23:26.781135 加载进度:## [21%]
2020-04-14 21:23:26.782105 加载进度:## [23%]
2020-04-14 21:23:26.782105 加载进度:## [25%]
2020-04-14 21:23:26.782105 加载进度:## [27%]
2020-04-14 21:23:26.782105 加载进度:## [29%]
2020-04-14 21:23:26.782105 加载进度:### [31%]
2020-04-14 21:23:26.782105 加载进度:### [33%]
2020-04-14 21:23:26.782105 加载进度:### [35%]
2020-04-14 21:23:26.782105 加载进度:### [37%]
2020-04-14 21:23:26.782105 加载进度:### [38%]
2020-04-14 21:23:26.782105 加载进度:#### [40%]
2020-04-14 21:23:26.782105 加载进度:#### [42%]
2020-04-14 21:23:26.782105 加载进度:#### [44%]
2020-04-14 21:23:26.782105 加载进度:#### [46%]
2020-04-14 21:23:26.782105 加载进度:#### [48%]
2020-04-14 21:23:26.782105 加载进度:#### [50%]
2020-04-14 21:23:26.782105 加载进度:##### [52%]
2020-04-14 21:23:26.782105 加载进度:##### [54%]
2020-04-14 21:23:26.782105 加载进度:##### [56%]
2020-04-14 21:23:26.782105 加载进度:##### [58%]
2020-04-14 21:23:26.782105 加载进度:##### [60%]
2020-04-14 21:23:26.782105 加载进度:###### [61%]
2020-04-14 21:23:26.782105 加载进度:###### [63%]
2020-04-14 21:23:26.782105 加载进度:###### [65%]
2020-04-14 21:23:26.782105 加载进度:###### [67%]
2020-04-14 21:23:26.782105 加载进度:###### [69%]
2020-04-14 21:23:26.782105 加载进度:####### [71%]
2020-04-14 21:23:26.782105 加载进度:####### [73%]
2020-04-14 21:23:26.782105 加载进度:####### [75%]
2020-04-14 21:23:26.782105 加载进度:####### [77%]
2020-04-14 21:23:26.782105 加载进度:####### [79%]
2020-04-14 21:23:26.783187 加载进度:######## [81%]
2020-04-14 21:23:26.783187 加载进度:######## [83%]
2020-04-14 21:23:26.783187 加载进度:######## [85%]
2020-04-14 21:23:26.783187 加载进度:######## [86%]
2020-04-14 21:23:26.783187 加载进度:######## [88%]
2020-04-14 21:23:26.783187 加载进度:######### [90%]
2020-04-14 21:23:26.783187 加载进度:######### [92%]
2020-04-14 21:23:26.783187 加载进度:######### [94%]
2020-04-14 21:23:26.783187 加载进度:######### [96%]
2020-04-14 21:23:26.783187 加载进度:######### [98%]
2020-04-14 21:23:26.783187 加载进度:######### [100%]
2020-04-14 21:23:26.783187 加载进度:########## [100%]
2020-04-14 21:23:26.783187 历史数据加载完成,数据量:0
2020-04-14 21:23:26.783187 策略初始化完成
2020-04-14 21:23:26.783187 开始回放历史数据
2020-04-14 21:23:26.783187 历史数据回放结束
2020-04-14 21:23:26.783187 开始计算逐日盯市盈亏
2020-04-14 21:23:26.788089 成交记录为空,无法计算
2020-04-14 21:23:26.788089 开始计算策略统计指标
2020-04-14 21:23:26.788089 ------------------------------
2020-04-14 21:23:26.788089 首个交易日:
2020-04-14 21:23:26.788089 最后交易日:
2020-04-14 21:23:26.788089 总交易日: 0
2020-04-14 21:23:26.788089 盈利交易日: 0
2020-04-14 21:23:26.788089 亏损交易日: 0
2020-04-14 21:23:26.788089 起始资金: 1,000,000.00
2020-04-14 21:23:26.788089 结束资金: 0.00
2020-04-14 21:23:26.788089 总收益率: 0.00%
2020-04-14 21:23:26.788089 年化收益: 0.00%
2020-04-14 21:23:26.788089 最大回撤: 0.00
2020-04-14 21:23:26.788089 百分比最大回撤: 0.00%
2020-04-14 21:23:26.788089 最长回撤天数: 0
2020-04-14 21:23:26.788089 总盈亏: 0.00
2020-04-14 21:23:26.788089 总手续费: 0.00
2020-04-14 21:23:26.788089 总滑点: 0.00
2020-04-14 21:23:26.788089 总成交金额: 0.00
2020-04-14 21:23:26.788089 总成交笔数: 0
2020-04-14 21:23:26.788089 日均盈亏: 0.00
2020-04-14 21:23:26.788089 日均手续费: 0.00
2020-04-14 21:23:26.788089 日均滑点: 0.00
2020-04-14 21:23:26.788089 日均成交金额: 0.00
2020-04-14 21:23:26.788089 日均成交笔数: 0
2020-04-14 21:23:26.788089 日均收益率: 0.00%
2020-04-14 21:23:26.788089 收益标准差: 0.00%
2020-04-14 21:23:26.788089 Sharpe Ratio: 0.00
2020-04-14 21:23:26.788089 收益回撤比: 0.00
2020-04-14 21:23:26.789086 策略统计指标计算完成

前面的设置应该没错

%%

engine = BacktestingEngine()
engine.set_parameters(
vt_symbol="rb88.SHFE",
interval="1m",
start=datetime(2016, 1, 1),
end=datetime(2020, 4, 10),
rate=1.0/10000,
slippage=1,
size=1,
pricetick=0,
capital=1_000_000,
)

engine.add_strategy(AtrRsiStrategy, {})

description

譬如,均线指标,
SMA(real[, timeperiod=?])

Simple Moving Average (Overlap Studies)

Inputs:
    real: (any ndarray)
Parameters:
    timeperiod: 30
Outputs:
    real

我看vnpy里的指标,都是在定义里面写成固定的,直接传了self.close, self.high等进去。

如果我想使用 SMA(high,20), SMA(low,20)这类的,难道要为此单独定义一个指标出来?

不太懂编程,尤其是在面对对象这种,类内外,分不清哪个变量对应哪个变量。

请问哪位可以指点一下,提供个范例呢?谢谢!

CTA回测 论坛: CTA策略

1、有两个问题请教。
请问这个gui回测策略,
K线周期是原始数据的周期框架?譬如我导入是1分钟数据,这是选是1m。这是标识是原始数据的周期,不是指策略回测时使用的周期?

2、

另外搜索看到boll那个策略,可以实现从1分钟合成高级别,譬如15分钟的周期框架,

但如果我想测试30分钟周期,或者2小时周期框架上,好像不能即时刷新呀,需要关闭vn,然后再打开才能生效。

description

1,数据文件,必要是要有列名;列的内容对应要一致;
2,日期时间格式要对。

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】