3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant 平台上,模拟交易替换代码后仍然执行旧逻辑,通常是因为模拟盘的状态持久化机制导致的。以下是具体原因及处理方法:
initialize 函数只执行一次:模拟盘在整个生命周期中,initialize 函数仅在创建时执行一次。即使你替换了代码,新代码中的 initialize 也不会被执行。g 被保留:模拟盘每天运行结束后会保存状态(包括全局变量 g 和 context)。第二天恢复时,会加载这些保存的状态。如果你的新策略逻辑依赖于在 initialize 中修改的 g 变量,由于它没有被重新执行,策略依然使用的是旧的 g 变量值。run_daily 等定时任务,替换代码后,旧的定时任务依然存在于系统中,可能会继续触发旧的逻辑。要解决这个问题,你需要使用 JoinQuant 提供的专用 API:after_code_changed(context)。当模拟盘在第二天开盘恢复时,如果发现代码被修改过,就会自动执行这个函数。
g如果你在新代码中修改了需要初始化的全局变量,必须在 after_code_changed 中重新赋值。
def after_code_changed(context):
# 在这里更新你需要修改的全局变量
g.my_new_stock_list = ['000001.XSHE', '000002.XSHE']
g.my_new_parameter = 0.05
log.info("代码已替换,全局变量已更新")
如果你修改了定时运行的函数或时间,必须先取消所有旧任务,再重新注册新任务。
def after_code_changed(context):
# 1. 取消所有旧的定时任务
unschedule_all()
# 2. 重新注册新的定时任务
run_daily(my_new_market_open, time='09:30')
run_daily(my_new_market_close, time='14:50')
log.info("代码已替换,定时任务已重新注册")
请确保你用来替换的回测代码的 Python 版本(Python 2 或 Python 3)与当前运行的模拟交易版本完全一致。版本不一致会导致替换失败或无法正常运行。
after_code_changed 函数。after_code_changed 中更新了所有必要的 g 变量。run_daily,是否在 after_code_changed 中调用了 unschedule_all() 并重新注册。按照上述方法修改代码并再次替换后,明天早盘模拟交易就会按照新的逻辑执行了。