3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在实盘交易中,券商服务器升级、环境重启或网络波动是不可避免的。当 ptrade 交易环境重启并恢复交易时,默认情况下框架会重新执行策略的 initialize 函数和 before_trading_start 函数。如果策略在这两个函数中定义了未持久化的全局变量,或者包含了委托下单逻辑,极易导致策略逻辑异常或重复委托下单。
为了解决这一痛点,ptrade 提供了 set_parameters 接口,允许开发者通过参数配置来规避服务器重启带来的重复执行风险。
在 initialize 函数中,可以通过调用 set_parameters 设置以下两个关键参数:
not_restart_trade(避免交易时段自动重拉)"0":自动重新拉起(默认缺省值)。"1":不自动重新拉起。在交易时间段(默认 09:00-11:30、13:00-15:30)避免因环境重启导致策略被动重复执行。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"
initialize 和 before_trading_start 中下单:order 系列接口。如果必须在特定时间下单,建议使用 run_daily 注册定时任务来执行委托。g 的持久化覆盖:initialize,然后恢复持久化数据。如果持久化数据中保存了全局对象 g 中的变量,它会覆盖掉你在 initialize 中初始化的同名变量。因此,对于不需要持久化或无法序列化的对象(如打开的文件、实例化的三方类),变量名请务必以双下划线 __ 开头(如 g.__client),框架在持久化时会自动跳过这些私有变量。set_parameters(not_restart_trade="0", server_restart_not_do_before="0") 将其恢复为默认行为。