3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台的实盘运行中,服务器重启或节假日开机可能会导致 before_trading_start 函数被重复调用。这不仅会消耗不必要的计算资源,还可能因为在盘前函数中编写了初始化逻辑或委托逻辑,从而导致重复委托或全局变量被意外覆盖等严重问题。
为了解决这一痛点,ptrade 提供了 set_parameters 接口,允许用户通过参数配置来精准控制 before_trading_start 的执行逻辑。
set_parameters 关键参数你需要在策略的 initialize 函数中,通过 set_parameters 设置以下两个关键参数:
holiday_not_do_before="1":
before_trading_start。默认值为 "0"(执行)。server_restart_not_do_before="1":
before_trading_start 函数仅调用一次,避免重复执行。默认值为 "0"(重复执行)。重要提示:
set_parameters的入参格式必须为a="b"样式(字符串类型的数字)。- 建议同时配合
not_restart_trade="1"(交易时间段若服务器重启,不自动重新拉起本交易),以确保极端异常下的资金安全。
以下是一个完整的 ptrade 策略结构示例,展示了如何正确配置参数以规避重启与节假日异常:
def initialize(context):
# 1. 设置操作的股票池
g.security = '600570.SS'
set_universe(g.security)
# 2. 使用 set_parameters 进行实盘安全调优
set_parameters(
holiday_not_do_before="1", # 节假日不执行 before_trading_start
server_restart_not_do_before="1", # 服务器重启时不重复执行 before_trading_start
not_restart_trade="1" # 交易时间内服务器重启不自动拉起交易(可选,根据安全级别配置)
)
log.info("策略初始化完成,已启用防重复执行与防重启干扰配置。")
def before_trading_start(context, data):
# 这里的代码在节假日不会执行;且在同一个交易日内,即使服务器重启也只会执行一次
log.info("【盘前准备】开始执行,当前时间:%s" % context.blotter.current_dt)
# 示例:获取历史数据作为当日策略因子
history = get_history(5, '1d', 'close', g.security)
g.last_close = history['close'].values[-1]
log.info("昨日收盘价已成功初始化:%s" % g.last_close)
def handle_data(context, data):
# 盘中主交易逻辑
pass
initialize 和 before_trading_start 中下单:
order 系列委托接口。如果必须在盘前或特定时间下单,请使用 run_daily 注册定时任务(例如 time='09:15')来执行。initialize,再恢复持久化数据(覆盖 g 中的同名变量)。initialize 中将其命名为以双下划线 __ 开头的私有变量(例如 g.__temp_var),这样该变量在落地持久化时会被跳过。