3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 PTrade 实盘交易中,服务器因券商升级、环境重启等原因拉起交易时,默认会重新调用 initialize 和 before_trading_start 函数。如果策略在这两个函数中定义了未持久化的变量或包含了委托下单逻辑,极易导致策略逻辑异常或重复委托下单。
为了解决这一痛点,PTrade 提供了 set_parameters 接口,允许用户通过参数配置来规避服务器重启带来的重复执行风险。
要防止服务器重启导致的重复执行与下单,必须在 initialize 函数中设置以下两个关键参数:
not_restart_trade="1":
server_restart_not_do_before="1":
before_trading_start 函数,避免其被重复执行。以下是标准的实盘防重启配置示例:
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 实盘策略时还应遵守以下原则:
initialize 和 before_trading_start 中调用委托接口(如 order、order_target 等)。所有的下单逻辑应严格限制在 handle_data、tick_data 或由 run_daily / run_interval 触发的盘中工作函数中。g 的持久化机制:PTrade 框架会自动使用 pickle 模块保存 g 中定义的变量。如果变量无法被序列化(如打开的文件、实例化的类对象等),请在 initialize 中将其命名为以双下划线 __ 开头的私有变量(例如 g.__test_class),落地持久化时系统会自动跳过该变量,避免重启时反序列化失败导致策略崩溃。