使用Porfolio Strategy的策略,订阅CTP实盘行情下的多个期权合约和期货合约时,经常发现推到on_bars函数里面的bars有很多是None值,其中有不少是活跃的主力期货合约,想不明白这是什么原因。 合约都能正常订阅到,而且是UI里面,是可以看到价格在跳动的。
以下是 Porfolio Strategy 里面默认的on_tick函数写法:
def on_tick(self, tick: TickData):
"""
Callback of new tick data update.
"""
if (
self.last_tick_time
and self.last_tick_time.minute != tick.datetime.minute
):
bars = {}
for vt_symbol, bg in self.bgs.items():
bars[vt_symbol] = bg.generate()
self.on_bars(bars)
bg: BarGenerator = self.bgs[tick.vt_symbol]
bg.update_tick(tick)
self.last_tick_time = tick.datetime
之前我认为可能是在一分钟内没有收到到tick,就会合成None值,但是有些活跃期货合约也会出现这个情况,就不能理解了。
之后我加了一个优化,如果当前一分钟Bar为None的话,就调用bg.last_bar的价格来替换,结果发现依旧是None值。
def on_tick(self, tick: TickData):
"""
Callback of new tick data update.
"""
if (
self.last_tick_time
and self.last_tick_time.minute != tick.datetime.minute
):
bars = {}
for vt_symbol, bg in self.bgs.items():
if bg.bar is not None:
bars[vt_symbol] = bg.generate()
elif bg.last_bar is not None:
bars[vt_symbol] = bg.last_bar
else:
bars[vt_symbol] = None
self.on_bars(bars)
bg: BarGenerator = self.bgs[tick.vt_symbol]
bg.update_tick(tick)
self.last_tick_time = tick.datetime
不清楚是不是应该订阅的某些期权合约太不活跃导致,但是不应该活跃的主力期货合约也有时为None值