3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
您的理解完全正确!
after_code_changed 的触发机制在 JoinQuant 聚宽平台中,模拟盘在每天的交易时间结束后会休眠,第二天开盘时会恢复。如果在恢复时发现策略代码发生了任何修改,系统就会在恢复时执行一次 after_code_changed 函数。
如果您在代码中写了:
def after_code_changed(context):
inout_cash(80000, pindex=0)
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 进行一次性操作(如修改参数、追加资金)时,一定要注意其“每次代码变更都会触发”的特性,及时清理或加锁。