程序思路是,程序不间断运行,计算得到天勤 api 的截止时间
wait_update(deadline) 后天勤 api 截止,即内部循环退出,继续外部循环
在外部循环中重新计算天勤 api 的截止时间,重新启动天勤 api
如此往复,实现天勤 api 每天关闭和重启的目的
碰到的问题是,每次连续运行几天,就会自动退出,退出点应该在初始化天勤 api 的时候,即:
add_log() 打印日志,有输出,说明能运行到这行
with TqApi(。。。) as api:…… 说明在这行退出了
add_log() 打印日志,无输出,说明没运行到这行
原因是什么?
# 主循环 while True: now = datetime.today() end = datetime(now.year, now.month, now.day, 15, 10) # 白盘结束后 start = datetime(now.year, now.month, now.day, 20, 45) # 夜盘开始前 # 根据每次运行程序的当前时间计算天勤 api 的截止时间 # 当前时间在白盘结束前,天勤 api 截止时间就在白盘结束时 # 当前时间在白盘结束后,截止时间延后一天 deadline = (end.timestamp() if now < end else (end + timedelta(days=1)).timestamp()) if self.real else None # 当前时间在白盘结束后,在夜盘开始前,先不急着初始化,到 20:45 再初始化 if self.real and end < now < start: time.sleep((start - now).seconds) # 正式开始 try: with TqApi(account=..., auth=...) as self.api: # 处理 quote_symbol 数据,得到“主力合约” self.quote_symbol = self.api.get_quote(config.SYMBOL("rb")) self.symbol = self.quote_symbol.underlying_symbol # 处理“目标持仓”对象 self.targetpos_chan = TqChan(self.api) self.targetpos = self.target_pos_get() # 创建协程处理程序 self.api.create_task(self.go(self.api, False)) self.api.create_task(self.target_pos_chan()) self.api.create_task(self.get_config()) # 获取行情更新,填入内部循环截止时间 # 内部循环截止后,代表一天的行情结束,继续外部主循环 # 在继续外部主循环的时候,重新初始化天勤 api while self.api.wait_update(deadline): ... except BacktestFinished: # 如果是回测,打印回测日志 self.log_backtest.write(str(account.tqsdk_stat)) self.log_backtest.close() break
李思恒 已回答的问题 2022年10月24日