Home >  > VNPY合成5分钟及1小时K线

VNPY合成5分钟及1小时K线

一、BarGenerator
BarGenerator的定义在utility文件中:

在这里我们可以看到,BarGenerator的作用分两个:

第一个是generating1minute bar data from tick data。就是用tick数据来合成一分钟K线的数据。

第二个则是generatingx minute bar/x hour data from 1 minute data,就是用一分钟的K线

再去合成后面的X分钟K线或者X小时的K线。

这里的注释中还有一个Notice,这里的意思是说你的X必须是可以被60整除的数,比如2、3、5、6、10、15、20、30(分钟)等等。这个主要是考虑到在K线合成上大家一般的使用习惯。

在创建BarGenerator对象的时候,需要的参数除了self,还有四个,分别是on_bar、window、on_window_bar和interval。他们分别的意思是这样:

1、on_bar:当一分钟的K线合成完成的时候,BarGenerator会自动去调用这一回调函数。

2、window:要合成的周期数,也就是X分钟或X小时的X。如果windows=0,就不会合成X分钟或者X小时的K线。

3、on_window_bar:要合成的自定义周期的K线合成之后对应的回调函数。

4、interval:要合成的周期,默认是MINUTE。可以是MINUTE、HOUR、DAILY、WEEKLY这四种中的一种。

在策略中,我们只需要在on_tick函数中加上一行self.bg.update_tick(tick)就可以实现K线合成,不需要了解BarGenerator的实现细节:

二、相关代码:
如果我们只需要合成1分钟K线,那么bg这样写就可以了。

self.bg = BarGenerator(self.on_bar)

如果要合成比如5分钟,10分钟K线,bg则要写成:

self.bg = BarGenerator(self.on_bar, window = 5,on_window_bar = self.on_5min_bar,interval=Interval.MINUTE)

然后定义on_5min_bar这个函数,

同时在on_bar函数内加上self.bg.update_bar(bar),因为这样 1 分钟 bar 才能流入 BarGenerator,它才能每5根聚合一次,并自动调用你的 on_5min_bar()。

    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)
        
        self.bg = BarGenerator(self.on_bar, window = 5,on_window_bar = self.on_5min_bar,interval=Interval.MINUTE)

    def on_bar(self,bar:BarData):
        #print("这是onbar的数据")
        self.bg.update_bar(bar)

    def on_5min_bar(self, bar: BarData):
        """K线更新"""
        # 更新数组管理
        self.am.update_bar(bar)
        #print(bar.datetime)

其实官方提供的BollChannelStrategy也是一个15分钟策略。可以看看他的写法:

可以看到他写得更简洁:

self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar)

三、合成小时K线
合成小时线参照上面的5分钟线就可以了。

不过要添加一句:

from vnpy.trader.constant import Exchange, Interval
 def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        """"""
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)

        self.bg = BarGenerator(
            self.on_bar, 1, self.on_hour_bar, interval=Interval.HOUR)
   def on_tick(self, tick: TickData):
        """
        Callback of new tick data update.
        """
        self.bg.update_tick(tick)

    def on_bar(self, bar: BarData):
        """
        Callback of new bar data update.
        """
        self.bg.update_bar(bar)

    def on_hour_bar(self, bar: BarData):
        """"""
        self.cancel_all()
        ......

参考:https://zhuanlan.zhihu.com/p/490100033
合成小时线:https://zhuanlan.zhihu.com/p/3004943208

四、多周期K线

    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        """"""
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)

        self.bg5 = BarGenerator(self.on_bar, 5, self.on_5min_bar)
        self.am5 = ArrayManager()

        self.bg15 = BarGenerator(self.on_bar, 15, self.on_15min_bar)
        self.am15 = ArrayManager()

    def on_bar(self, bar: BarData):
        """
        Callback of new bar data update.
        """
        self.bg5.update_bar(bar)
        self.bg15.update_bar(bar)

    def on_5min_bar(self, bar: BarData):
        """"""
        self.cancel_all()

        self.am5.update_bar(bar)
        if not self.am5.inited:
            return

    def on_15min_bar(self, bar: BarData):
        """"""
        self.am15.update_bar(bar)
        if not self.am15.inited:
            return

上代的代码来自官方的multi_timeframe_strategy

暧昧帖

本文暂无标签