3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在聚宽(JoinQuant)的模拟交易中,不能仅仅把 initialize 函数里的参数改成 5 就完事,但你也不需要重新设置(新建)模拟运行。
initialize 无效?根据聚宽的底层机制,initialize 函数在整个模拟盘的生命周期中只执行一次(即创建模拟交易的那一刻)。在模拟交易运行途中替换代码,initialize 函数是不会被再次执行的。因此,直接修改里面的 run_monthly 参数,系统根本读取不到新的设置,依然会按照原来的“每月第3个交易日”执行。
after_code_changed 和 unschedule_all为了在不中断模拟交易的情况下修改定时任务,你需要利用聚宽提供的 after_code_changed(context) 函数。当模拟盘在每天开盘前恢复并发现代码被修改时,会自动执行这个函数。
具体步骤如下:
unschedule_all() 取消之前设定的所有定时任务。run_monthly 以及其他原本在 initialize 里的 run_daily 等)。假设你原来的代码是这样的:
def initialize(context):
# 原来的设置:每月第3个交易日
run_monthly(before_market_open, 3, time='16:15', reference_security='000300.XSHG', force=False)
# 假设你还有其他的定时任务
run_daily(market_open, time='09:30')
你需要将代码修改并替换为如下形式:
def initialize(context):
# 这里改成5,虽然对当前运行的模拟盘无效,但为了代码一致性和以后回测,建议同步修改
run_monthly(before_market_open, 5, time='16:15', reference_security='000300.XSHG', force=False)
run_daily(market_open, time='09:30')
# 添加这个函数来处理代码变更
def after_code_changed(context):
# 1. 取消所有旧的定时运行任务
unschedule_all()
# 2. 重新设定新的定时运行任务(注意:要把 initialize 里所有的 run_xxx 都重新写一遍)
# 将参数修改为每月第5个交易日
run_monthly(before_market_open, 5, time='16:15', reference_security='000300.XSHG', force=False)
# 别忘了把其他的定时任务也加回来
run_daily(market_open, time='09:30')
log.info("代码已更新,定时任务已修改为每月第5个交易日执行。")
unschedule_all() 会无差别地清除所有已注册的定时任务。因此,如果你在 initialize 中还定义了其他的 run_daily 或 run_weekly,必须在 after_code_changed 中一并重新注册,否则它们将不再执行。after_code_changed,从而成功更新你的定时任务。