不需要修改ArrayManager,与它无关,需要扩展BarGenerator的update_bar(),使之,
应该是在策略里面增加一个def on_temp_bar(self,bar:BarData):这样的推送接口,
当每次执行on_tick执行合成bar,判断bar是是否已经完成,来决定是执行on_temp_bar()还是on_bar()。
不需要修改ArrayManager,与它无关,需要扩展BarGenerator的update_bar(),使之,
应该是在策略里面增加一个def on_temp_bar(self,bar:BarData):这样的推送接口,
当每次执行on_tick执行合成bar,判断bar是是否已经完成,来决定是执行on_temp_bar()还是on_bar()。
hxxjava wrote:
不需要修改ArrayManager,与它无关,需要扩展BarGenerator的update_bar(),使之,
应该是在策略里面增加一个def on_temp_bar(self,bar:BarData):这样的推送接口,
当每次执行on_tick执行合成bar,判断bar是是否已经完成,来决定是执行on_temp_bar()还是on_bar()。
多谢了,明白了,在实盘中可以采用这种方式,因为有tick数据,但是在做回测的时候,单纯的只有K线的数据的时候,举例,在10:20的时候,按照回测的机制,这个时候30min,最新的数据是9:30-9:59:59,一,这个如何能做到也有最新未走完的K线数据(即您说的临时K线),二,如何做到on_30min_bar中,也做到1分钟更新一次,而不是30分钟更新一次。之前看了许多的VNPY视频,都没有讲到这个地方,昨天看到您对这个问题有研究,才冒昧的跟您再问这个问题。新入VNPY,如果啰嗦,也请您原谅!
其实临时K线是每个tick都会变化的,岂止是1分钟!
1、目前的BarGenerator,如果你生成N分钟的K线,是等到完整的window_bar生成之后才执行on_Nmin_bar()之类的。缺少执行临时K线的机制。
2、其实这样也有好处,那就是在on_Nmin_bar()里计算产生的交易信号是稳定的,因为K线已经走完,不会发生变化了。
3、可是坏处也很明显,有时候一根巨大的临时K线会让你的交易有浮盈变成浮亏,可是你的策略会无动于衷,不动作!
4、那么你会说临时K线好,其实也不然!如果你依据临时K线计算产生交易信号,会出现频繁的信号忽闪问题,就是临时K线刚K开始就出现开仓信号,于是你的策略立即开仓了,可是之后的行情使得开仓信号又消失了,怎么办?你还要考虑把已经开了的仓位平掉,如此反复,光是手续费你都受不了!
所以:对临时K线的使用要有利弊分析,通盘考虑,不是一个扩展那么简单的!
大神,能不能提供一个标准日线合成的代码?比如说当前收盘价在20日线之上,论坛上找了很久,感觉不得要领.
特殊时段K线合成,比如10:15分-10:30分休盘时段,参考论坛上的简单处理方法如下:
日线合成因为合约的交易时间不同,用小数线合成日线会出问题,但是在这个贴里又说1分钟、5分钟、日线合成是对的,迷茫了?
mark
hxxjava wrote:
其实临时K线是每个tick都会变化的,岂止是1分钟!
1、目前的BarGenerator,如果你生成N分钟的K线,是等到完整的window_bar生成之后才执行on_Nmin_bar()之类的。缺少执行临时K线的机制。
2、其实这样也有好处,那就是在on_Nmin_bar()里计算产生的交易信号是稳定的,因为K线已经走完,不会发生变化了。
3、可是坏处也很明显,有时候一根巨大的临时K线会让你的交易有浮盈变成浮亏,可是你的策略会无动于衷,不动作!
4、那么你会说临时K线好,其实也不然!如果你依据临时K线计算产生交易信号,会出现频繁的信号忽闪问题,就是临时K线刚K开始就出现开仓信号,于是你的策略立即开仓了,可是之后的行情使得开仓信号又消失了,怎么办?你还要考虑把已经开了的仓位平掉,如此反复,光是手续费你都受不了!所以:对临时K线的使用要有利弊分析,通盘考虑,不是一个扩展那么简单的!
多谢回复,我改成1分钟更新一次所有的k线,止损平仓,从tick中拿出价格数据,直接计算是否需要平仓,谢谢您文章的启发。
小天下 wrote:
hxxjava wrote:
黄裳 wrote:
也就是说,想要得到随时更新的5分钟线,30分钟线,就要从新写自己的BarGenerator,非常感谢
是的,就要重新写自己的BarGenerator。
你所说的随时更新的5分钟线,30分钟线其实是临时K线,而目前的BarGenerator没有直接提供你要的临时K线机制。
不过你可以扩展一个BarGenerator类,实现一个属性或者方法,如gen_temp_bar()和temp_bar(),具体办法:def gen_temp_bar(self) self.temp_bar = self.window_bar与self.bar的合成 当然这只是伪代码,自己实现下,应该不难。 def temp_bar(self) return self.temp_bar
其中gen_temp_bar()需要在策略的on_tick()的函数中最后被执行,
def on_tick(self, tick: TickData): """ Callback of new tick data update. """ self.bg.update_tick(tick) self.bg.gen_temp_bar()
这样你就可以得到window_bar的临时K线了。
大神,这样需不需要同时改进class ArrayManager(object)或者重新 定制一个全新的或者扩展的ArrayManager函数来配套使用,因为每次推出新的bar,它也将新的close,high等数据存储进去了!
扩展BarGenerator(K线合成器)和ArrayManager(数组管理器)没有关系,
因为ArrayManager使用输入的是扩展BarGenerator的输出结果bar,只要
扩展BarGenerator没有改变bar的内容构成就不影响ArrayManager。
k线合成mark
21:00-23:30(4根小时K线) 为何这是4根K线呢?21-22一根,22-23一根,23-23:30一根,这不是3根吗
milter wrote:
21:00-23:30(4根小时K线) 为何这是4根K线呢?21-22一根,22-23一根,23-23:30一根,这不是3根吗
可能你用的是vnpy自带的BarGenerator产生的1小时K线造成的,它在实盘的时候就会有这个缺点。
如果你交易的是这国内期货,20:55~21:00是集合竞价阶段,在20:59时客户端会收到一个集合竞价tick,所以:
如果不明白为什么,请往前看1楼的帖子,细细地想下。
也可以参考本人的另外帖子 K线种类总结
mark
遇到一周小于5个交易日的,这么合成是不是就出问题了