问题描述
def after_code_changed(context)在第一次修改initialize的设置后(比如说,unschedule_all()), 是否可以理解initialize已经被修改过来了,后续再替换代码的时候,只要没有再修改,
不需要再写after_code_changed,可以删除该函数了?
还是之后都要保留after_code_changed?
解决方案
可以删除,不需要一直保留。
详细原理解释:
-
initialize的单次执行特性:
在 JoinQuant 的模拟交易生命周期中,initialize(context)函数只会在模拟盘创建时执行一次。即使你后续替换了代码,initialize也绝对不会再次执行。 -
状态的持久化保存:
模拟盘在每天运行结束后会保存当前的状态(包括g对象中的全局变量、定时运行任务run_daily等)。第二天恢复时,是基于前一天保存的状态继续运行的。 -
after_code_changed的触发机制:
当模拟盘在第二天开盘恢复时,如果系统检测到你的策略代码发生了修改,并且代码中定义了after_code_changed函数,系统就会执行一次这个函数。
结论:
当你通过 after_code_changed 执行了 unschedule_all() 并重新设定了定时任务,或者修改了 g.xxx 的值,这些修改后的状态在当天运行结束后就会被系统持久化保存下来。
因此,只要这些修改已经生效并被保存,后续你再次替换代码时,只要不需要进行新的状态修改,你完全可以把 after_code_changed 函数删除,或者将其内容清空(写个 pass)。系统会继续按照你之前修改过并保存下来的状态(新的定时任务、新的全局变量值)继续运行。
最佳实践建议:
为了保持代码整洁,在确认 after_code_changed 已经成功执行并修正了模拟盘状态后,在下一次更新策略逻辑时,可以直接将该函数移除。