3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
set_parameters 避免服务器重启导致的重复建仓与委托在 ptrade 实盘交易环境中,券商服务器升级、网络波动或环境重启是不可避免的。当服务器重启并恢复交易时,ptrade 框架会重新执行策略的 initialize 函数,并默认重复调用 before_trading_start 函数。
如果您的策略在这两个函数中定义了无法被系统持久化保存的变量,或者直接调用了委托下单接口(如 order、margin_trade 等),重启后极易引发重复委托、重复建仓或全局变量被覆盖重置的严重实盘事故。
为了解决这一痛点,ptrade 提供了 set_parameters 接口。通过合理配置该接口的参数,可以完美规避上述风险。
在 initialize 函数中,您应当通过 set_parameters 设定以下两个关键参数:
not_restart_trade
"1":不自动拉起。在交易时间段(默认 09:00-11:30、13:00-15:30)避免因系统自动重启拉起而重复执行初始化逻辑。"0":自动执行重新拉起(默认值)。server_restart_not_do_before
before_trading_start 函数。"1":不重复执行。确保一个交易日内 before_trading_start 函数仅调用一次,防止盘前准备逻辑或盘前委托被二次触发。"0":重复执行(默认值)。以下是一个标准的防重启安全策略模板。展示了如何在 initialize 中配置安全参数,并结合私有变量(以 __ 开头,不被持久化覆盖)进行安全的策略编写:
def initialize(context):
# 1. 设置操作的股票池
g.security = '600570.SS'
set_universe(g.security)
# 2. 【核心避坑配置】
# 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.__is_ordered = False
def before_trading_start(context, data):
log.info("执行 before_trading_start 盘前准备逻辑")
# 盘前获取历史数据或进行选股,由于设置了 server_restart_not_do_before="1",此段代码一天只运行一次
g.history_df = get_history(5, '1d', 'close', g.security)
def handle_data(context, data):
# 在盘中 handle_data 中结合全局变量状态进行下单,避免重复委托
if not g.__is_ordered:
order(g.security, 100)
log.info(f"已成功发送首笔委托:{g.security} 100股")
g.__is_ordered = True
g 中以双下划线 __ 开头的变量(如 g.__test)为私有变量,系统在进行自动持久化时不会保存它们。这适用于存放不需要跨日保存的临时状态或 IO 对象(如打开的文件、实例化类对象等)。initialize 和 before_trading_start 中直接下单:尽量将所有的交易委托逻辑移至 handle_data、tick_data 或通过 run_daily 指定的盘中时间点执行,从根本上降低初始化阶段被重复触发的风险。