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

PTrade服务器重启导致策略重复执行的解决方法

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

问题描述

PTrade中服务器重启后策略出现重复执行怎么办?

服务器重启后initialize和before_trading_start被重复调用,导致策略异常

解决方案

在PTrade量化交易平台中,实盘交易环境下如果遇到服务器重启,系统默认会重新拉起交易,这会导致 initializebefore_trading_start 函数被重复调用。如果在这些函数中初始化了无法持久化的变量或执行了委托下单操作,就会导致策略逻辑异常或重复下单。

为了解决这个问题,PTrade 提供了 set_parameters 接口,允许您在 initialize 阶段配置服务器重启时的行为。

解决方法

您需要在策略的 initialize 函数中调用 set_parameters,并设置以下两个参数:

  1. not_restart_trade:控制交易时间段若服务器重启,是否自动执行重新拉起本交易。
    • "0":执行(缺省默认值)。
    • "1":不执行。设置为 "1" 可以避免在交易时间段(如09:00-11:30、13:00-15:30)因重启导致的重复执行问题。
  2. 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

注意事项

  1. 必须在 initialize 中设置not_restart_tradeserver_restart_not_do_before 这两个参数必须initialize 模块中进行设置才能生效。
  2. 参数类型set_parameters 的入参值必须是字符串类型,例如 "1""0"
  3. 变量持久化:即使配置了上述参数,也强烈建议使用 pickle 模块或 PTrade 的持久化机制来保存关键的全局变量(如仓位状态、标志位等),以防极端情况下的数据丢失。
  4. 避免在盘前下单:尽量避免在 initializebefore_trading_start 中调用 order 等委托接口,将交易逻辑集中在 handle_datatick_data 或定时任务中处理。