在早上9点开盘的时候,经常会出现某些期货的标的接受不到数据。夜盘没有这种问题。我敢肯定不是策略内部的bug,因为重启就恢复正常了。最近两天rb2105都出现了这个问题。我用的无图形界面,并且是在实盘上运行的。请问有人遇到和我类似的问题吗?
在早上9点开盘的时候,经常会出现某些期货的标的接受不到数据。夜盘没有这种问题。我敢肯定不是策略内部的bug,因为重启就恢复正常了。最近两天rb2105都出现了这个问题。我用的无图形界面,并且是在实盘上运行的。请问有人遇到和我类似的问题吗?
建议可以print一下看看当时是否有tick推送过来
刚刚试过了。tick是推送过来了。好奇怪,我用的
self.am = ArrayManager(1)
self.load_bar(10)
不存在数据准备的问题啊
而且为啥我开盘以后重新运行就成功了呢
我的策略是在分钟线上运行的。具体情况就是on_bar函数里的内容完全不执行,也接收不到bar里的任何信息。我其实不需要am计算指标,只需要当前的收盘价就行了。但问题是夜盘是没有任何问题的,早上开盘后再重启策略也是没有问题的。所以我不理解为什么在早上会出现这个问题。
那么可以去掉关于am的代码,有可能是因为am判断不满足直接return了。如果没有tick推送,可能是品种交易不活跃导致tick不更新,以至于没有生成bar。既然有tick推送,可以结合过来的tick和bargenerator看看是否成功合成了bar(也可先在on_bar打印看看是否有bar推送)。
我检查过了,am.inited也是Ture,也有tick推送,但on_bar上就是没有bar推送。最关键的一点就是如果在9点开盘前就启动,那么就没有on_bar的数据;在开盘后启动,就有on_bar的数据。在夜盘上,一直都有数据。
但是如果没有用到am,建议还是去掉关于am的代码。如果有tick推送,没有on_bar推送,建议可以print一下tick对照bg看一下为什么没有生成bar,在哪一步逻辑判断时被拦下来了
我发现问题出在哪里了。是开盘前的第一根tick的时间有问题。
我在BarGenerator的update_tick下加了一句话:
print(f'{tick.symbol}:{tick.datetime}')
于是早上启动策略后(开盘之前)就print出了如下:
rb2105:2020-12-25 23:00:00.500000+08:00
因为时间出现在今天晚上,所以开盘以后出现的tick都没有正常地被生成bar的数据。为什么会出现一个这样的时间戳?
更奇怪的是,另一个关于螺纹钢的策略输出的是正常的:
rb2105:2020-12-25 07:53:40+08:00
请问这可能是什么原因造成的?
应该是交易所盘前推送了fake_data吧,可以策略内过滤一下非交易时段的tick