一、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