问题描述
服务器重启后initialize和before_trading_start被重复调用,导致策略异常
解决方案
在PTrade量化交易平台中,实盘交易环境下如果遇到服务器重启,系统默认会重新拉起交易,这会导致 initialize 和 before_trading_start 函数被重复调用。如果在这些函数中初始化了无法持久化的变量或执行了委托下单操作,就会导致策略逻辑异常或重复下单。
为了解决这个问题,PTrade 提供了 set_parameters 接口,允许您在 initialize 阶段配置服务器重启时的行为。
解决方法
您需要在策略的 initialize 函数中调用 set_parameters,并设置以下两个参数:
not_restart_trade:控制交易时间段若服务器重启,是否自动执行重新拉起本交易。"0":执行(缺省默认值)。"1":不执行。设置为"1"可以避免在交易时间段(如09:00-11:30、13:00-15:30)因重启导致的重复执行问题。
server_restart_not_do_before:控制若服务器重启导致重拉交易,是否重复执行before_trading_start函数。"0":执行(缺省默认值)。"1":不执行。设置为"1"可以确保一个交易日内before_trading_start函数仅被调用一次。
代码示例
def initialize(context):
# 初始化策略股票池
g.security = "600570.SS"
set_universe(g.security)
# 核心配置:防止服务器重启导致的重复执行
# 设置交易时间段服务器重启不再拉起本交易
# 设置服务器重启重拉交易时不再执行before_trading_start函数
set_parameters(
not_restart_trade="1",
server_restart_not_do_before="1"
)
def before_trading_start(context, data):
# 这里的逻辑每天只会执行一次,即使服务器重启也不会重复执行
log.info("执行盘前初始化逻辑")
g.daily_buy_flag = False
def handle_data(context, data):
# 盘中交易逻辑
if not g.daily_buy_flag:
order(g.security, 100)
g.daily_buy_flag = True
注意事项
- 必须在
initialize中设置:not_restart_trade和server_restart_not_do_before这两个参数必须在initialize模块中进行设置才能生效。 - 参数类型:
set_parameters的入参值必须是字符串类型,例如"1"或"0"。 - 变量持久化:即使配置了上述参数,也强烈建议使用
pickle模块或 PTrade 的持久化机制来保存关键的全局变量(如仓位状态、标志位等),以防极端情况下的数据丢失。 - 避免在盘前下单:尽量避免在
initialize和before_trading_start中调用order等委托接口,将交易逻辑集中在handle_data、tick_data或定时任务中处理。