def process_tick_event(self, event: Event):
""""""
tick = event.data
strategies = self.symbol_strategy_map[tick.vt_symbol]
if not strategies:
return
self.check_stop_order(tick)
for strategy in strategies:
if strategy.inited:
self.call_strategy_func(strategy, strategy.on_tick, tick)
@xiaohe
你看下这里的逻辑, tick数据更新k线继而更新am的前提是strategy.inited=TRUE, 而strategy.inited的前提是load_bar()的完成和行情订阅, 你看下面的代码
self.call_strategy_func(strategy, strategy.on_init) # 这里的初始化指的是当策略启动的时候要预先做的一些事情,比如载入10天的K线数据
# Restore strategy data(variables)
data = self.strategy_data.get(strategy_name, None)
if data:
for name in strategy.variables:
value = data.get(name, None)
if value:
setattr(strategy, name, value)
# Subscribe market data
contract = self.main_engine.get_contract(strategy.vt_symbol)
if contract:
req = SubscribeRequest(
symbol=contract.symbol, exchange=contract.exchange)
self.main_engine.subscribe(req, contract.gateway_name)
else:
self.write_log(f"行情订阅失败,找不到合约{strategy.vt_symbol}", strategy)
# Put event to update init completed status.
strategy.inited = True
看下面这行:
self.call_strategy_func(strategy, strategy.on_init),这里的strategy.on_init 其实就是load_bar(10), 所以strategy.inited状态的改变也是要等load_bar(10)完成了之后才会变为TRUE