问题描述
/
解决方案
在 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 并规范代码逻辑,可以有效避免服务器重启带来的策略异常风险。