🚀 AI 一键生成 joinquant 策略代码

JoinQuant 模拟盘中 after_code_changed 会重复执行吗?如何正确追加资金?

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

问题描述

关于after_code_changed

def after_code_changed(context):
inout_cash(80000, pindex=0)
请教一个问题,模拟盘增加8万资金,这么写应该没问题;
如果下次修改了其他代码,这个after_code_changed会再执行一次吗?如果执行,是不是又要往模拟盘增加8万资金。
如果是,那么这次增加后,后面修改代码应该把inout_cash(80000, pindex=0)给注释掉或删除。

解决方案

您的理解完全正确

after_code_changed 的触发机制

在 JoinQuant 聚宽平台中,模拟盘在每天的交易时间结束后会休眠,第二天开盘时会恢复。如果在恢复时发现策略代码发生了任何修改,系统就会在恢复时执行一次 after_code_changed 函数

资金重复追加问题

如果您在代码中写了:

def after_code_changed(context):
    inout_cash(80000, pindex=0)
  1. 第一次修改代码并保存后:第二天模拟盘重启时,检测到代码变更,执行该函数,您的账户成功增加 8 万资金。
  2. 第二次修改代码(即使是修改了其他毫不相关的逻辑):第二天模拟盘重启时,再次检测到代码变更,after_code_changed再次被执行。如果此时 inout_cash(80000, pindex=0) 这行代码还在,系统就会再次给您的模拟盘增加 8 万资金

正确的处理方法(最佳实践)

为了避免意外的重复入金,建议采取以下措施:

方法一:用完即删(推荐)
在确认资金已经成功追加到模拟盘账户后,在下一次修改策略代码时,务必将 inout_cash(80000, pindex=0) 这行代码注释掉或者直接删除

def after_code_changed(context):
    # 资金已追加,注释掉以防重复执行
    # inout_cash(80000, pindex=0)
    pass

方法二:增加状态标记
如果您不想频繁修改这部分代码,可以利用全局变量 g 来做一个状态标记(注意:g 对象在模拟盘重启时会被持久化保存恢复)。

def after_code_changed(context):
    # 检查是否已经追加过这笔特定资金
    if not hasattr(g, 'has_added_80k'):
        inout_cash(80000, pindex=0)
        g.has_added_80k = True
        log.info("成功追加8万资金")

这样写的话,即使以后代码发生变更导致 after_code_changed 再次执行,由于 g.has_added_80k 已经存在且为 True,就不会再重复追加资金了。

总结:您的思路非常严谨,在模拟盘中使用 after_code_changed 进行一次性操作(如修改参数、追加资金)时,一定要注意其“每次代码变更都会触发”的特性,及时清理或加锁。