3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant (聚宽) 量化平台中,关于 handle_data 和 run_daily(..., time='every_bar') 的执行机制,官方文档有明确的规定。以下是针对您三个问题的详细解答:
run_daily 先执行。
根据 JoinQuant API 文档的说明:“同一个时间点, 总是先运行 run_xxx 指定的函数, 然后是 before_trading_start , handle_data 和 after_trading_end”。
因此,在每一分钟(或每一天)的同一个 Bar 触发时,通过 run_daily(func, time='every_bar') 注册的函数会优先于 handle_data 执行。
触发频率和基本效果是一样的,但官方推荐使用 run_daily。
run_daily 提供了更高的灵活性,不仅可以设置为 every_bar,还可以精确到具体的时分秒(如 time='14:50'),而 handle_data 只能被动跟随全局频率触发。不能直接修改系统底层的触发顺序,且不建议依赖注册顺序。
run_xxx 优先于 handle_data 的执行顺序,您无法将其反转。run_daily 注册了多个函数,文档也强调:“用户策略不应该依赖于这些计划任务执行的顺序。”最佳实践(如何严格控制执行顺序):
如果您有严格的先后执行逻辑需求,请放弃使用 handle_data,并将所有逻辑封装在普通的 Python 函数中,然后通过一个 run_daily 调用的主函数来按顺序执行它们。例如:
def initialize(context):
# 只注册一个 every_bar 的定时任务
run_daily(main_logic, time='every_bar')
def main_logic(context):
# 在这里严格控制执行顺序
step_one_logic(context) # 先执行逻辑1
step_two_logic(context) # 后执行逻辑2
def step_one_logic(context):
# 您的第一步逻辑
pass
def step_two_logic(context):
# 您的第二步逻辑
pass
通过这种方式,您可以 100% 掌控代码的执行顺序,避免因平台底层调度机制带来的不确定性。