1.29K 浏览
0

程序思路是,程序不间断运行,计算得到天勤 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日
0

我们不建议一直运行,跨交易日的时候最好是重启api,不然会导致未知错误,如何无人值守看一下文档这里:

https://doc.shinnytech.com/tqsdk/latest/advanced/unanttended.html

李思恒 已回答的问题 2022年10月24日