3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台中,如果遇到服务器环境重启拉起交易时,initialize 和 before_trading_start 函数被重复调用导致策略异常(如变量被重置、重复委托等),可以通过以下两种主要方式来解决:
set_parameters 配置参数ptrade 提供了 set_parameters 接口,允许你在 initialize 函数中设置特定的参数来控制服务器重启时的行为。
禁止交易时间段自动重拉交易 (not_restart_trade)
not_restart_trade 入参设置为 "1",在交易时间段避免重复执行的问题(交易时间段默认为09:00-11:30、13:00-15:30,实际以券商配置为准)。set_parameters(not_restart_trade="1")禁止重复执行盘前函数 (server_restart_not_do_before)
before_trading_start 函数默认会被调用。为了避免重复调用带来的一系列问题,你可以将 server_restart_not_do_before 入参设置为 "1",即一个交易日内 before_trading_start 函数仅调用一次。set_parameters(server_restart_not_do_before="1")注意:这两个参数必须在 initialize 模块中设置。
除了修改系统配置,更稳妥的做法是规范策略的编写逻辑,使其具备“幂等性”(即多次执行结果一致):
initialize 和 before_trading_start 函数中设置无法被系统持久化保存的变量。变量一旦被初始化,会导致策略逻辑异常。如果必须使用,请结合 pickle 模块或全局私有变量(以 __ 开头)进行合理的持久化管理。order 等),否则一旦重启必然造成重复委托。以下是如何在策略中应用上述配置参数的示例:
def initialize(context):
# 初始化策略
g.security = "600570.SS"
set_universe(g.security)
# 核心解决代码:
# 设置交易时间段服务器重启不再拉起本交易
# 设置服务器重启重拉交易时不再执行before_trading_start函数
set_parameters(not_restart_trade="1", server_restart_not_do_before="1")
def before_trading_start(context, data):
# 这里的逻辑在一个交易日内只会被执行一次,即使服务器重启
log.info("执行盘前逻辑")
# 注意:不要在这里写下单逻辑!
def handle_data(context, data):
# 正常的盘中交易逻辑
pass
通过合理配置 set_parameters 并规范代码逻辑,可以有效避免服务器重启带来的策略异常风险。