我在策略研究回测时,before_trading、open_auction和after_trading里的代码逻辑都可以正常运行并输出结果,但一进入模拟交易后,只有before_trading、open_auction里的能正常运行,after_trading里面的代码死活不执行。刚开始以为是否after_trading里面的代码有问题,所以精简到只打印几个固定的字符串,但即使这样任何没有任何输出。这是什么原因啊?
我在策略研究回测时,before_trading、open_auction和after_trading里的代码逻辑都可以正常运行并输出结果,但一进入模拟交易后,只有before_trading、open_auction里的能正常运行,after_trading里面的代码死活不执行。刚开始以为是否after_trading里面的代码有问题,所以精简到只打印几个固定的字符串,但即使这样任何没有任何输出。这是什么原因啊?
好的,我现在需要解决用户的问题。用户提到在策略回测中,after_trading函数不执行,而before_trading和open_auction正常运行。用户尝试精简代码,但问题依旧存在。
首先,我需要回顾SuperMind平台的文档,特别是关于定时函数的部分。根据文档,after_trading函数是在每个交易日收盘后调用的,用于执行收盘后的任务。而before_trading和open_auction分别在开盘前和集合竞价阶段调用。
用户的问题可能出在几个方面:
函数调用时机:after_trading是否在模拟交易中被正确触发?文档提到,在回测时,after_trading在收盘后调用,但在模拟交易中可能不触发。用户可能在模拟交易环境中测试,导致函数不执行。
函数定义错误:用户是否正确定义了after_trading函数?例如,函数名是否正确,参数是否正确传递(如context和bar_dict)。
环境设置问题:是否在策略框架中正确初始化了相关函数?例如,enable_profile或其他设置可能影响函数执行。
日志输出问题:用户提到after_trading中的打印语句没有输出,可能是因为日志级别设置错误,或者函数未被调用。
接下来,我需要检查用户提供的代码示例。用户提到在回测时,before_trading和open_auction正常,但after_trading不执行。这可能意味着问题出在模拟交易环境中的设置,或者函数未正确注册。
根据文档,after_trading函数在回测中是有效的,但在模拟交易中可能不会触发。用户可能在模拟交易环境中运行策略,导致after_trading不执行。需要确认用户是在回测还是模拟交易环境中遇到问题。
另外,用户提到在策略中使用了enable_open_bar函数,这可能影响函数的执行顺序。需要检查enable_open_bar是否正确使用,以及是否影响了after_trading的触发。
可能的解决方案包括:
最后,建议用户检查策略运行环境,确保在回测中使用after_trading,并验证函数定义和参数是否正确。如果问题依旧,可能需要进一步查看平台文档或联系支持。
根据文档内容,after_trading函数在回测环境中是有效的,但在模拟交易中可能不会触发。以下是可能的原因及解决方案:
运行环境差异
after_trading在收盘后自动触发,用于执行收盘后任务(如持仓调整、数据记录)。after_trading可能不会触发,因为模拟交易更关注实时交易逻辑。函数定义错误
after_trading函数正确定义,参数为context和bar_dict,且无语法错误。日志输出问题
after_trading中的打印语句未输出,可能是日志级别设置过低。可通过set_log_level调整日志级别。init函数中添加set_benchmark('000300.SH'),确保策略在回测模式下运行。after_trading可能不触发,需使用run_daily/run_weekly等定时函数替代。def after_trading(context, bar_dict):
log.info("收盘后执行逻辑")
# 例如:记录持仓信息
log.info(context.portfolio.positions)
def init(context):
# 设置日志级别为'info',确保打印语句生效
set_log_level('info')
如果需要在模拟交易中执行收盘后逻辑,可使用run_daily函数:
def init(context):
# 每日收盘后执行函数
run_daily(after_trading, time_rule='after_close')
def after_trading(context):
log.info("收盘后执行逻辑")
def init(context):
# 设置基准收益
set_benchmark('000300.SH')
# 设置日志级别
set_log_level('info')
# 启用开盘前逻辑
enable_open_bar()
def before_trading(context):
log.info("开盘前执行逻辑")
def open_auction(context, bar_dict):
log.info("集合竞价阶段执行逻辑")
def after_trading(context, bar_dict):
log.info("收盘后执行逻辑")
# 例如:记录当日收益
log.info(f"当日收益:{context.portfolio.returns}")
回测与模拟交易差异
before_trading/after_trading全生命周期函数。run_daily/run_weekly等定时函数实现收盘后逻辑。函数参数
after_trading在回测中接收bar_dict参数,模拟交易中需通过run_daily等函数实现。日志记录
如果问题仍存在,建议检查策略运行环境(回测/模拟交易)及函数定义是否符合文档要求。

