🚀 AI 一键生成 joinquant 策略代码

JoinQuant 策略中如何使用 unschedule_all 动态取消定时任务?

joinquant | 发布时间: 2025/12/24
以下内容由 EasyQuant 生成。

问题描述

在回测过程中,我想要取消之前设定的所有定时运行任务,应该用什么函数?

解决方案

在 JoinQuant 回测或模拟交易中,若要取消之前设定的所有定时运行任务,应使用的函数是 unschedule_all()

函数说明

unschedule_all() 用于取消所有通过 run_dailyrun_weeklyrun_monthly 注册的定时任务。

使用场景

通常在以下情况使用:

  1. 动态调整任务:策略逻辑发生变化,需要清空旧的计划任务并重新设置。
  2. 模拟交易更新代码:在 after_code_changed(context) 函数中,为了防止代码更新后旧的定时任务重复累积或执行逻辑冲突,通常先调用此函数清空任务,再重新注册。

代码示例

def after_code_changed(context):
    # 取消所有之前注册的定时运行任务
    unschedule_all()
    
    # 重新设定新的定时运行函数
    run_daily(market_open, time='09:30')
    run_daily(market_close, time='15:00')

Q&A

Q: unschedule_all() 会取消 handle_data 的执行吗?
A: 不会。unschedule_all() 仅取消由 run_dailyrun_weeklyrun_monthly 注册的定时函数。handle_data 是策略引擎默认的回调函数(按天或按分钟),不受此函数影响。

Q: 如果我不调用 unschedule_all() 直接再次调用 run_daily 会怎样?
A: run_xxx 函数每次调用都会产生一个新的定时任务。如果不先取消,新的任务会叠加在旧的任务之上,导致同一个时间点可能会执行多次相同的逻辑(除非那是你预期的行为)。

Q: 这个函数可以在 initialize 中使用吗?
A: 可以,但通常没有必要。因为 initialize 在策略启动时只运行一次,此时还没有任何定时任务被注册(除非你在 initialize 内部先注册再取消,但这没有意义)。它主要用于 after_code_changed 或其他动态控制逻辑中。