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

PTrade 实盘避坑:如何配置 set_parameters 防止服务器重启导致重复下单?

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

问题描述

PTrade 实盘避坑:使用 set_parameters 防止服务器重启导致的重复委托
服务器在交易时间段内重启后,如何配置 ptrade 的 set_parameters 参数,来防止 initialize 和 before_trading_start 函数重复执行并导致重复下单?

解决方案

在 PTrade 实盘交易中,服务器因券商升级、环境重启等原因拉起交易时,默认会重新调用 initializebefore_trading_start 函数。如果策略在这两个函数中定义了未持久化的变量或包含了委托下单逻辑,极易导致策略逻辑异常重复委托下单

为了解决这一痛点,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 函数,避免其被重复执行。

二、 避坑策略标准模板(Python 源码)

以下是标准的实盘防重启配置示例:

def initialize(context):
    # 1. 设置操作的股票池
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 2. 配置防重启参数(必须在 initialize 中设置)
    # 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"
    )
    
    log.info("initialize 初始化完成")

def before_trading_start(context, data):
    # 每日盘前准备逻辑
    log.info("执行盘前准备 before_trading_start,今日仅执行一次")

def handle_data(context, data):
    # 盘中交易逻辑
    pass

三、 实盘避坑黄金法则

除了配置 set_parameters 外,编写 PTrade 实盘策略时还应遵守以下原则:

  1. 严禁在 initializebefore_trading_start 中调用委托接口(如 orderorder_target 等)。所有的下单逻辑应严格限制在 handle_datatick_data 或由 run_daily / run_interval 触发的盘中工作函数中。
  2. 合理利用全局变量 g 的持久化机制:PTrade 框架会自动使用 pickle 模块保存 g 中定义的变量。如果变量无法被序列化(如打开的文件、实例化的类对象等),请在 initialize 中将其命名为以双下划线 __ 开头的私有变量(例如 g.__test_class),落地持久化时系统会自动跳过该变量,避免重启时反序列化失败导致策略崩溃。