🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant模拟交易替换代码后为何仍执行旧策略?如何解决?

joinquant | 发布时间: 2026/6/8
以下内容由 EasyQuant 生成。

问题描述

请问下我模拟交易替换代码后,怎么还是执行的原来代码的策略?

我是上个月中替换了最新的代码,
按理昨天早盘应该开仓的,
但是仍旧没有开仓,
而且日志上显示的日志进程仍旧是在执行以前的代码,
请问下这种情况怎么处理?

解决方案

在 JoinQuant 平台上,模拟交易替换代码后仍然执行旧逻辑,通常是因为模拟盘的状态持久化机制导致的。以下是具体原因及处理方法:

为什么会发生这种情况?

  1. initialize 函数只执行一次:模拟盘在整个生命周期中,initialize 函数仅在创建时执行一次。即使你替换了代码,新代码中的 initialize不会被执行。
  2. 全局变量 g 被保留:模拟盘每天运行结束后会保存状态(包括全局变量 gcontext)。第二天恢复时,会加载这些保存的状态。如果你的新策略逻辑依赖于在 initialize 中修改的 g 变量,由于它没有被重新执行,策略依然使用的是旧的 g 变量值。
  3. 定时任务未更新:如果你在旧代码中使用了 run_daily 等定时任务,替换代码后,旧的定时任务依然存在于系统中,可能会继续触发旧的逻辑。

如何处理?

要解决这个问题,你需要使用 JoinQuant 提供的专用 API:after_code_changed(context)。当模拟盘在第二天开盘恢复时,如果发现代码被修改过,就会自动执行这个函数。

1. 更新全局变量 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("代码已替换,全局变量已更新")

2. 更新定时任务 (run_daily / run_weekly / run_monthly)

如果你修改了定时运行的函数或时间,必须先取消所有旧任务,再重新注册新任务。

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("代码已替换,定时任务已重新注册")

3. 检查 Python 版本

请确保你用来替换的回测代码的 Python 版本(Python 2 或 Python 3)与当前运行的模拟交易版本完全一致。版本不一致会导致替换失败或无法正常运行。

总结排查步骤:

  1. 检查新代码中是否包含了 after_code_changed 函数。
  2. 检查是否在 after_code_changed 中更新了所有必要的 g 变量。
  3. 如果修改了 run_daily,是否在 after_code_changed 中调用了 unschedule_all() 并重新注册。
  4. 确认替换的回测版本与模拟盘版本一致。

按照上述方法修改代码并再次替换后,明天早盘模拟交易就会按照新的逻辑执行了。