问题描述
/
解决方案
问题分析
在 ptrade 交易环境中,run_daily 函数虽然支持设置 00:00~23:59 的任意时间执行,但每周一上午 7 点无法执行通常是由于券商周末系统维护与周一早上的重启机制导致的。
具体原因如下:
- 券商系统周末维护:大多数券商会在周末进行系统清算、升级或维护,期间交易服务器可能会处于关闭或非正常运行状态。
- 周一系统拉起时间晚于设定时间:券商的实盘交易环境通常在周一早上(例如 8:00 或 8:30)才会完成重启并重新拉起策略。如果策略在 8:30 才被系统恢复运行,那么设定在 7:00 的
run_daily任务就会因为“错过时间”而无法触发。
解决办法与最佳实践
为了确保盘前逻辑能够稳定执行,建议采取以下几种替代方案:
方案一:延后 run_daily 的执行时间(推荐)
将 run_daily 的执行时间延后至券商系统确定已经启动完毕的时间段。通常建议设置在 8:45 到 9:15 之间。
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 将时间延后至 8:45,避开券商系统重启盲区
run_daily(context, my_pre_market_func, time='08:45')
def my_pre_market_func(context):
log.info("执行盘前数据准备工作...")
def handle_data(context, data):
pass
方案二:使用 before_trading_start 函数
如果您的目的是在每天开盘前进行数据初始化或状态重置,ptrade 提供了专门的盘前事件函数 before_trading_start。该函数在开启交易时立即执行,从隔日开始每天 9:10 分(默认,具体视券商配置)执行,能够完美规避系统重启导致的时间错位问题。
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 盘前运行函数,系统保证在开盘前触发
def before_trading_start(context, data):
log.info("执行盘前初始化逻辑...")
# 注意:9:10前受行情未更新原因,调用实时行情接口可能数据有误
def handle_data(context, data):
pass
方案三:联系券商确认环境重启时间
不同券商的 ptrade 节点配置和重启时间可能有所不同。如果您必须在极早的时间(如 7:00)执行任务,建议联系所属券商的 IT 支持,确认其周末维护结束及周一早盘环境拉起的准确时间。
总结
在编写实盘量化策略时,应尽量避免依赖过早的绝对时间点(如 7:00 之前)。合理利用框架提供的 before_trading_start 生命周期钩子,或将定时任务设置在 8:30 之后,可以大幅提升策略在极端情况(如服务器重启、节假日后首个交易日)下的健壮性。