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

如何防止 ptrade 实盘由于服务器重启导致 initialize 和 before_trading_start 重复执行而重复下单?

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

问题描述

ptrade 实盘避坑:利用 set_parameters 避免服务器重启导致的重复建仓与委托
如何防止 ptrade 实盘由于服务器重启导致 initialize 和 before_trading_start 重复执行而重复下单?

解决方案

ptrade 实盘避坑:利用 set_parameters 避免服务器重启导致的重复建仓与委托

在 ptrade 实盘交易环境中,券商服务器升级、网络波动或环境重启是不可避免的。当服务器重启并恢复交易时,ptrade 框架会重新执行策略的 initialize 函数,并默认重复调用 before_trading_start 函数

如果您的策略在这两个函数中定义了无法被系统持久化保存的变量,或者直接调用了委托下单接口(如 ordermargin_trade 等),重启后极易引发重复委托、重复建仓或全局变量被覆盖重置的严重实盘事故。

为了解决这一痛点,ptrade 提供了 set_parameters 接口。通过合理配置该接口的参数,可以完美规避上述风险。


一、 核心避坑参数解析

initialize 函数中,您应当通过 set_parameters 设定以下两个关键参数:

  1. not_restart_trade

    • 作用:控制交易时间段内若服务器重启,是否自动重新拉起本交易。
    • 取值
      • "1"不自动拉起。在交易时间段(默认 09:00-11:30、13:00-15:30)避免因系统自动重启拉起而重复执行初始化逻辑。
      • "0":自动执行重新拉起(默认值)。
  2. server_restart_not_do_before

    • 作用:控制若服务器重启导致重拉交易时,是否重复执行 before_trading_start 函数。
    • 取值
      • "1"不重复执行。确保一个交易日内 before_trading_start 函数仅调用一次,防止盘前准备逻辑或盘前委托被二次触发。
      • "0":重复执行(默认值)。

二、 实盘防重复委托标准代码示例

以下是一个标准的防重启安全策略模板。展示了如何在 initialize 中配置安全参数,并结合私有变量(以 __ 开头,不被持久化覆盖)进行安全的策略编写:

def initialize(context):
    # 1. 设置操作的股票池
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 2. 【核心避坑配置】
    # 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"
    )
    
    # 3. 初始化私有变量(以 '__' 开头,防止被框架持久化信息覆盖)
    g.__is_ordered = False 

def before_trading_start(context, data):
    log.info("执行 before_trading_start 盘前准备逻辑")
    # 盘前获取历史数据或进行选股,由于设置了 server_restart_not_do_before="1",此段代码一天只运行一次
    g.history_df = get_history(5, '1d', 'close', g.security)

def handle_data(context, data):
    # 在盘中 handle_data 中结合全局变量状态进行下单,避免重复委托
    if not g.__is_ordered:
        order(g.security, 100)
        log.info(f"已成功发送首笔委托:{g.security} 100股")
        g.__is_ordered = True

三、 更多实盘注意事项

  1. 私有变量不落地持久化:全局变量 g 中以双下划线 __ 开头的变量(如 g.__test)为私有变量,系统在进行自动持久化时不会保存它们。这适用于存放不需要跨日保存的临时状态或 IO 对象(如打开的文件、实例化类对象等)。
  2. 避免在 initializebefore_trading_start 中直接下单:尽量将所有的交易委托逻辑移至 handle_datatick_data 或通过 run_daily 指定的盘中时间点执行,从根本上降低初始化阶段被重复触发的风险。