问题描述
解决方案
在 PTrade 量化交易平台中,before_trading_start 函数用于在每天开始交易前执行一些初始化操作(如获取盘前数据、更新股票池等)。该函数在回测环境和实盘(交易)环境中的执行时间有显著差异,具体如下:
1. 回测环境中的执行时间
在回测模块中,before_trading_start 函数会在每个回测交易日的 8:30 分准时执行。
2. 实盘(交易)环境中的执行时间
在实盘交易模块中,执行时间相对复杂,分为以下两种情况:
- 首次开启交易时:该函数会在你开启交易的瞬间立即执行一次。
- 后续交易日:从开启交易的隔日开始,该函数默认在每天的 9:10 分执行。
⚠️ 实盘环境的重要注意事项
由于实盘中首次开启交易时会立即执行该函数,如果你在 9:10 之前开启了交易策略,可能会遇到以下问题:
- 行情数据未更新:此时交易所的最新行情可能尚未推送,如果在
before_trading_start内调用了实时行情接口(如get_snapshot等),可能会获取到错误或昨日的数据。 - 解决方案:
- 延迟执行:在函数内部使用
time.sleep()强制等待至 9:10 分之后再执行获取行情的逻辑。 - 改用定时任务:将需要调用实时行情接口的逻辑从
before_trading_start中移出,改用run_daily函数,并指定在 9:15 或更晚的时间执行(例如run_daily(context, func, time='09:15'))。
- 延迟执行:在函数内部使用
总结来说,编写兼容回测与实盘的策略时,务必考虑到实盘中 before_trading_start 可能在行情未就绪时被触发的风险,做好相应的异常处理或逻辑后置。