问题描述
/
解决方案
提示信息解析
在 ptrade 量化交易平台中,当您看到日志输出 “提示信息INFO - 当前服务器配置为:交易时间段服务器重启后,执行拉起本交易操作” 时,这意味着您的策略当前使用了系统的默认配置。即:如果在交易时间段内(通常为 09:00-11:30、13:00-15:30)券商服务器发生重启或环境升级,系统会在恢复后自动重新启动您的交易策略。
潜在风险:为什么需要关注这个提示?
虽然自动拉起交易保证了策略的连续性,但如果不加注意,可能会引发严重的逻辑错误,特别是重复下单问题。具体原因如下:
- 函数重复执行:服务器重启拉起交易时,框架会重新执行
initialize和before_trading_start函数。 - 变量被重置:如果您在这两个函数中初始化了无法被系统持久化保存的全局变量(如
g.xxx),这些变量会被重置,导致盘中逻辑判断失误。 - 重复委托:如果您在
initialize或before_trading_start中编写了委托下单接口(如order),重启时会再次触发这些代码,造成重复买入或卖出。
解决方案:如何修改重启配置?
为了避免上述风险,ptrade 提供了 set_parameters 接口,允许您在 initialize 函数中自定义服务器重启后的行为。主要涉及两个参数:
not_restart_trade:交易时间段若服务器重启,是否自动执行重新拉起本交易。"0"为执行(缺省),"1"为不执行。server_restart_not_do_before:若服务器重启导致重拉交易,是否重复执行before_trading_start函数。"0"为执行(缺省),"1"为不执行。
推荐配置代码示例
如果您希望在服务器重启后不再自动拉起交易,或者拉起交易但不重复执行盘前函数,可以在策略的 initialize 中进行如下设置:
def initialize(context):
g.security = "600570.SS"
set_universe(g.security)
# 方案一:服务器重启后,不再自动拉起本交易(最安全,需人工介入确认)
set_parameters(not_restart_trade="1")
# 方案二:服务器重启后自动拉起交易,但【不重复执行】 before_trading_start 函数
# set_parameters(server_restart_not_do_before="1")
def before_trading_start(context, data):
# 如果 server_restart_not_do_before="1",重启时这里的代码不会被再次执行
log.info("执行盘前初始化逻辑")
def handle_data(context, data):
pass
总结建议
- 检查策略逻辑:绝对不要在
initialize和before_trading_start中直接调用下单函数。 - 合理配置参数:对于对状态依赖极强的策略,建议设置
not_restart_trade="1",在服务器异常重启后由人工检查持仓并手动恢复;对于一般策略,建议至少设置server_restart_not_do_before="1"以防止盘前逻辑被重复触发。