问题描述
我是上个月中替换了最新的代码,
按理昨天早盘应该开仓的,
但是仍旧没有开仓,
而且日志上显示的日志进程仍旧是在执行以前的代码,
请问下这种情况怎么处理?
解决方案
在 JoinQuant 平台上,模拟交易替换代码后仍然执行旧逻辑,通常是因为模拟盘的状态持久化机制导致的。以下是具体原因及处理方法:
为什么会发生这种情况?
initialize函数只执行一次:模拟盘在整个生命周期中,initialize函数仅在创建时执行一次。即使你替换了代码,新代码中的initialize也不会被执行。- 全局变量
g被保留:模拟盘每天运行结束后会保存状态(包括全局变量g和context)。第二天恢复时,会加载这些保存的状态。如果你的新策略逻辑依赖于在initialize中修改的g变量,由于它没有被重新执行,策略依然使用的是旧的g变量值。 - 定时任务未更新:如果你在旧代码中使用了
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)与当前运行的模拟交易版本完全一致。版本不一致会导致替换失败或无法正常运行。
总结排查步骤:
- 检查新代码中是否包含了
after_code_changed函数。 - 检查是否在
after_code_changed中更新了所有必要的g变量。 - 如果修改了
run_daily,是否在after_code_changed中调用了unschedule_all()并重新注册。 - 确认替换的回测版本与模拟盘版本一致。
按照上述方法修改代码并再次替换后,明天早盘模拟交易就会按照新的逻辑执行了。