3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在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 或定时任务中处理。