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

ptrade 实盘防错:如何利用 set_parameters 避免服务器重启导致重复下单?

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

问题描述

ptrade 实盘防错:利用 set_parameters 避开服务器重启导致的重复执行与下单
如何设置 ptrade 的 set_parameters 参数,防止交易时间段服务器重启后策略重复执行 initialize 和 before_trading_start?

解决方案

ptrade 实盘防错:利用 set_parameters 避开服务器重启导致的重复执行与下单

在实盘交易中,券商服务器升级、环境重启或网络波动是不可避免的。当 ptrade 交易环境重启并恢复交易时,默认情况下框架会重新执行策略的 initialize 函数和 before_trading_start 函数。如果策略在这两个函数中定义了未持久化的全局变量,或者包含了委托下单逻辑,极易导致策略逻辑异常重复委托下单

为了解决这一痛点,ptrade 提供了 set_parameters 接口,允许开发者通过参数配置来规避服务器重启带来的重复执行风险。


一、 核心防错参数解析

initialize 函数中,可以通过调用 set_parameters 设置以下两个关键参数:

1. not_restart_trade(避免交易时段自动重拉)

  • 参数含义:交易时间段若服务器重启,是否自动执行重新拉起本交易。
  • 取值说明
    • "0":自动重新拉起(默认缺省值)。
    • "1"不自动重新拉起。在交易时间段(默认 09:00-11:30、13:00-15:30)避免因环境重启导致策略被动重复执行。

2. server_restart_not_do_before(避免重复执行盘前函数)

  • 参数含义:若服务器重启导致重拉交易,是否重复执行 before_trading_start 函数。
  • 取值说明
    • "0":重复执行(默认缺省值)。
    • "1"不重复执行。确保一个交易日内 before_trading_start 函数仅被调用一次,防止盘前初始化逻辑或盘前下单逻辑被二次触发。

注意:这两个参数必须initialize 模块中进行设置才能生效。


二、 实盘防错标准代码示例

以下是一个完整的 ptrade 实盘防错策略模板,展示了如何正确配置 set_parameters 以及如何结合私有变量进行持久化处理:

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"
    )
    
    # 3. 初始化无法被序列化的类对象(以双下划线 '__' 开头,落地持久化时跳过,避免重启报错)
    g.__test_class = TestClass()
    
    log.info("策略初始化完成,已启用服务器重启防重复执行保护。")

def before_trading_start(context, data):
    log.info("执行盘前处理逻辑(今日仅执行一次)")
    # 盘前获取历史数据或进行选股逻辑
    
def handle_data(context, data):
    # 盘中交易逻辑
    pass

class TestClass(object):
    def __init__(self):
        self.name = "Non-serializable Object"

三、 实盘注意事项与最佳实践

  1. 避免在 initializebefore_trading_start 中下单
    尽量不要在这两个初始化函数中直接调用 order 系列接口。如果必须在特定时间下单,建议使用 run_daily 注册定时任务来执行委托。
  2. 注意全局变量 g 的持久化覆盖
    ptrade 框架在重启恢复交易时,会先执行 initialize,然后恢复持久化数据。如果持久化数据中保存了全局对象 g 中的变量,它会覆盖掉你在 initialize 中初始化的同名变量。因此,对于不需要持久化或无法序列化的对象(如打开的文件、实例化的三方类),变量名请务必以双下划线 __ 开头(如 g.__client),框架在持久化时会自动跳过这些私有变量。
  3. 动态取消设置
    如果后续需要取消这些防错限制,可以在策略运行中再次调用 set_parameters(not_restart_trade="0", server_restart_not_do_before="0") 将其恢复为默认行为。