问题描述
/
解决方案
问题原因分析
在 ptrade 平台中,如果在盘中(开盘期间)手动开启交易,或者因为服务器环境重启拉起交易,系统会默认重新执行 initialize 和 before_trading_start 函数。如果您的策略在这两个函数中定义了无法被系统持久化保存的变量,或者调用了委托下单接口,就会导致变量被重置、策略逻辑异常甚至重复委托下单。
核心解决办法:使用 set_parameters 配置
为了避免盘中重启或开启交易带来的逻辑混乱,ptrade 提供了 set_parameters 接口来进行底层行为配置。您可以在 initialize 函数中加入以下参数:
1. 禁止交易时间段自动重启交易
设置 not_restart_trade="1"。当服务器在交易时间段(如 09:00-11:30、13:00-15:30)重启时,系统将不会自动重新拉起本交易,从而避免重复执行初始化逻辑。
2. 禁止重复执行盘前函数
设置 server_restart_not_do_before="1"。如果服务器重启导致重拉交易,该设置可以保证一个交易日内 before_trading_start 函数仅被调用一次,避免盘前逻辑在盘中被重复触发。
代码示例
def initialize(context):
g.security = "600570.SS"
set_universe(g.security)
# 核心配置:防止盘中重启导致逻辑混乱
# not_restart_trade="1": 交易时间段若服务器重启,不自动执行重新拉起本交易
# server_restart_not_do_before="1": 若服务器重启导致重拉交易,不重复执行before_trading_start函数
set_parameters(not_restart_trade="1", server_restart_not_do_before="1")
def before_trading_start(context, data):
# 这里的逻辑每天只会安全执行一次
log.info("执行盘前初始化逻辑")
def handle_data(context, data):
# 正常的盘中交易逻辑
pass
其他注意事项
- 变量持久化:对于策略运行中依赖的全局状态变量(如仓位标记、连续计算的指标等),建议使用
pickle模块将其保存到本地文件中。这样即使策略在盘中被意外重启,也能从文件中恢复状态,保证逻辑连贯。 - 避免在盘前函数中下单:绝对不要在
initialize和before_trading_start中调用order等委托接口,所有的下单动作应放在handle_data、tick_data或定时任务run_daily中执行。