问题描述
解决方案
根据 PTrade API 文档说明,before_trading_start 函数在回测和实盘交易环境中的执行时间如下:
1. 回测环境
- 执行时间:每个回测交易日的 08:30。
2. 实盘交易环境
- 首日启动时:在点击“启动交易”时 立即执行 一次。
- 隔日运行时:从策略运行的第二天开始,默认在每天 09:10 执行。
注意事项
- 实盘启动时间风险:如果在实盘交易中于 09:10 之前 手动启动策略,
before_trading_start会立即执行。此时由于交易所行情尚未更新,在该函数内调用实时行情接口(如get_snapshot)可能会导致数据有误或获取不到数据。 - 避免措施:如果需要在盘前获取数据,建议在函数内添加
time.sleep等待至 09:10 之后,或者将获取实时行情的逻辑放入run_daily并指定时间(如time='09:15')来执行。 - 重启机制:如果服务器重启拉起交易,默认会再次执行该函数。可以通过在
initialize中设置set_parameters(server_restart_not_do_before="1")来避免重启时重复执行。
Q&A
Q: 实盘交易中,before_trading_start 的执行时间可以修改吗?
A: 不可以,该函数的默认触发时间由柜台系统配置决定(通常为 09:10)。如果需要在特定时间(如 09:25 或 09:30)执行盘前逻辑,建议使用 run_daily(context, func, time='09:25') 来替代。
Q: 在 before_trading_start 中可以进行下单交易吗?
A: 不可以。该函数主要用于盘前的数据初始化和信号计算。如果在回测模式下(08:30 执行)下单,撮合系统尚未开启;在实盘模式下,虽然部分券商支持夜市委托,但通常建议在 handle_data 或定时任务中进行交易操作。
Q: 为什么回测和实盘的时间不一致?
A: 回测为了提高效率,通常在数据准备好后(08:30)尽早开始计算。而实盘交易需要等待券商柜台系统初始化完成以及交易所数据接入,09:10 是一个相对安全且接近开盘的时间点,确保账户信息和基础行情已就绪。