VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 419
声望: 170

不需要修改ArrayManager,与它无关,需要扩展BarGenerator的update_bar(),使之,
应该是在策略里面增加一个def on_temp_bar(self,bar:BarData):这样的推送接口,
当每次执行on_tick执行合成bar,判断bar是是否已经完成,来决定是执行on_temp_bar()还是on_bar()。

Member
avatar
加入于:
帖子: 7
声望: 0

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,如果啰嗦,也请您原谅!

Member
avatar
加入于:
帖子: 419
声望: 170

其实临时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线的使用要有利弊分析,通盘考虑,不是一个扩展那么简单的!

Member
avatar
加入于:
帖子: 20
声望: 0

大神,能不能提供一个标准日线合成的代码?比如说当前收盘价在20日线之上,论坛上找了很久,感觉不得要领.
特殊时段K线合成,比如10:15分-10:30分休盘时段,参考论坛上的简单处理方法如下:

description

Member
avatar
加入于:
帖子: 20
声望: 0

日线合成因为合约的交易时间不同,用小数线合成日线会出问题,但是在这个贴里又说1分钟、5分钟、日线合成是对的,迷茫了?
description

Member
avatar
加入于:
帖子: 5
声望: 0

mark

Member
avatar
加入于:
帖子: 7
声望: 0

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中拿出价格数据,直接计算是否需要平仓,谢谢您文章的启发。

Member
avatar
加入于:
帖子: 419
声望: 170

小天下 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。

Member
avatar
加入于:
帖子: 1
声望: 0

k线合成mark

Member
avatar
加入于:
帖子: 1
声望: 0

21:00-23:30(4根小时K线) 为何这是4根K线呢?21-22一根,22-23一根,23-23:30一根,这不是3根吗

Member
avatar
加入于:
帖子: 419
声望: 170

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,所以:

  • 20:55~21:00——第一根K线(只由1个tick数据合成)
  • 21:00~22:00——第二根K线(由1小时tick合成)
  • 22:00~23:00——第三根K线(由1小时tick合成)
  • 23:00~23:30——第四根K线(由30分钟tick合成)

如果不明白为什么,请往前看1楼的帖子,细细地想下。
也可以参考本人的另外帖子 K线种类总结

Member
avatar
加入于:
帖子: 7
声望: 0

mark

Member
avatar
加入于:
帖子: 104
声望: 5

遇到一周小于5个交易日的,这么合成是不是就出问题了

Member
avatar
加入于:
帖子: 2
声望: 0

请教一下:实盘当中,1分钟的K线是实时跳动的么,就是说一旦突破关键价格是否可以立即发单?还是说等着1分钟走完才生成固定的K线?

Member
avatar
加入于:
帖子: 4618
声望: 284

后者。突破发单可以用本地停止单

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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