cta模块中,初始化策略加载数据调用的是bg的update_bar来填充数据,并且一次性把所有的数据都加载进去了,导致的问题就是在等新生成1根1分钟的bar数据后才有可能再触发on_window_bar。
问题流程如下:
比如周一上午开盘前启动系统,加载到上周五收盘的数据,window为1小时;
数据加载完之后,bg的状态是self.window_bar为上周五最后行情,只要再来1根新的bar,就可以触发on_window_bar
但是bg的self.bar为空,在开盘后第1根tick到来后,在bg的update_tick中,会因为self.bar为空,而直接跟过on_bar,直接走new_minute,这样就无法第一时间触发self.windw_bar的生成,进而第一时间调用on_window_bar;
必须等到第1根1分钟的bar生成之后,才会推送给update_bar。
相当于缓存中的最后一根self.window_bar要推迟1分钟才能触发on_window_bar,如果这根on_window_bar的计算结果刚好会触发交易,那结果就是晚了一分钟交易。
解决方案:
在一开始初始化加载数据的时候,不要全部数据都加载,截取最后1根bar不加载,而是直接附给bg.bar,这样可以直接解决问题。
可以在engine的load_bar中截取,return 给template的load_bar,在tempalte的load_bar中直接附给self.bg.bar