🚀 AI 一键生成 ptrade 策略代码
立即体验

PTrade 实盘避坑:如何使用 set_parameters 防止服务器重启重复委托?

ptrade | 发布时间: 2026/7/29
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: PTrade 实盘避坑:使用 set_parameters 防止服务器重启导致的策略重复委托

Question: 如何在 ptrade 中配置 set_parameters 参数以避免服务器重启时重复触发交易?

解决方案

PTrade 实盘避坑:使用 set_parameters 防止服务器重启导致的策略重复委托

在 PTrade 量化实盘交易过程中,若券商服务器环境突发异常重启或重启拉起交易,系统默认会重新执行策略的 initializebefore_trading_start 函数。如果策略未做防护,容易导致在盘中重新拉起时发生重复委托下单持久化变量被初始值覆盖等严重问题。

为了保障实盘交易的稳定性,PTrade 提供了 set_parameters 接口来精确控制服务器重启时的策略行为。


一、核心解决方案:配置 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 函数仅调用一次,避免盘前/盘中初始化逻辑被重复触发。

二、Python 示范代码

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

三、实盘防护三大黄金法则

  1. 初始化位置限制
    not_restart_tradeserver_restart_not_do_before 参数必须在 initialize 模块内进行配置,在其他事件回调(如 handle_data)中配置将无法生效。
  2. 严禁在 initializebefore_trading_start 中直接报单
    尽量避免在这两个函数中调用 order 系列委托接口。如确需在盘前下单,应结合标记变量及本地持久化文件(如 pickle 存储)判断当天是否已完成委托。
  3. 注意持久化私有变量命名
    环境重启恢复时,系统会先执行 initialize 再恢复全局变量 g 的持久化信息。不需要持久化的实例化类对象或文件句柄,变量名请以双下划线 __ 开头(如 g.__class_obj),避免序列化失败或被错误覆盖。