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

ptrade 平台如何防止 before_trading_start 函数在节假日和服务器重启时重复调用?

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

问题描述

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

Title: ptrade 实盘调优:使用 set_parameters 规避节假日和重启异常

Question: ptrade在服务器重启或者节假日的时候怎么防止before_trading_start函数被重复调用?

解决方案

在 ptrade 量化交易平台的实盘运行中,服务器重启或节假日开机可能会导致 before_trading_start 函数被重复调用。这不仅会消耗不必要的计算资源,还可能因为在盘前函数中编写了初始化逻辑或委托逻辑,从而导致重复委托全局变量被意外覆盖等严重问题。

为了解决这一痛点,ptrade 提供了 set_parameters 接口,允许用户通过参数配置来精准控制 before_trading_start 的执行逻辑。


一、 核心解决方案:set_parameters 关键参数

你需要在策略的 initialize 函数中,通过 set_parameters 设置以下两个关键参数:

  1. holiday_not_do_before="1"
    • 作用:设置非交易日/节假日不执行 before_trading_start。默认值为 "0"(执行)。
  2. server_restart_not_do_before="1"
    • 作用:若一个交易日内服务器发生重启导致重拉交易,限制 before_trading_start 函数仅调用一次,避免重复执行。默认值为 "0"(重复执行)。

重要提示

  • set_parameters 的入参格式必须为 a="b" 样式(字符串类型的数字)。
  • 建议同时配合 not_restart_trade="1"(交易时间段若服务器重启,不自动重新拉起本交易),以确保极端异常下的资金安全。

二、 防重复调用标准模板代码

以下是一个完整的 ptrade 策略结构示例,展示了如何正确配置参数以规避重启与节假日异常:

def initialize(context):
    # 1. 设置操作的股票池
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 2. 使用 set_parameters 进行实盘安全调优
    set_parameters(
        holiday_not_do_before="1",          # 节假日不执行 before_trading_start
        server_restart_not_do_before="1",   # 服务器重启时不重复执行 before_trading_start
        not_restart_trade="1"               # 交易时间内服务器重启不自动拉起交易(可选,根据安全级别配置)
    )
    
    log.info("策略初始化完成,已启用防重复执行与防重启干扰配置。")

def before_trading_start(context, data):
    # 这里的代码在节假日不会执行;且在同一个交易日内,即使服务器重启也只会执行一次
    log.info("【盘前准备】开始执行,当前时间:%s" % context.blotter.current_dt)
    
    # 示例:获取历史数据作为当日策略因子
    history = get_history(5, '1d', 'close', g.security)
    g.last_close = history['close'].values[-1]
    log.info("昨日收盘价已成功初始化:%s" % g.last_close)

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

三、 避坑指南与注意事项

  1. 避免在 initializebefore_trading_start 中下单
    • 尽量不要在这两个初始化性质的函数中调用 order 系列委托接口。如果必须在盘前或特定时间下单,请使用 run_daily 注册定时任务(例如 time='09:15')来执行。
  2. 私有变量持久化处理
    • ptrade 框架在重启恢复时,会先执行 initialize,再恢复持久化数据(覆盖 g 中的同名变量)。
    • 如果有不需要被系统持久化覆盖的临时变量,可以在 initialize 中将其命名为以双下划线 __ 开头的私有变量(例如 g.__temp_var),这样该变量在落地持久化时会被跳过。