问题描述
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)
- 第一次修改代码并保存后:第二天模拟盘重启时,检测到代码变更,执行该函数,您的账户成功增加 8 万资金。
- 第二次修改代码(即使是修改了其他毫不相关的逻辑):第二天模拟盘重启时,再次检测到代码变更,
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 进行一次性操作(如修改参数、追加资金)时,一定要注意其“每次代码变更都会触发”的特性,及时清理或加锁。