🚀 AI 一键生成 joinquant 策略代码
立即体验

joinquant 动态定时任务管理:如何使用 unschedule_all 取消与重设置运行函数

joinquant | 发布时间: 2026/7/23
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 动态定时任务管理:unschedule_all 取消与重设置运行函数

Question: 在 joinquant 中如何动态修改或取消已设置的定时运行函数?

解决方案

joinquant 动态定时任务管理:unschedule_all 取消与重设置运行函数

在 JoinQuant(聚宽)策略开发中,我们通常在 initialize 函数中使用 run_dailyrun_weeklyrun_monthly 来注册定时运行的函数。然而,在模拟交易或者特定策略逻辑中(例如代码更新、策略状态切换),可能需要动态修改或删除旧的定时任务。聚宽提供了 unschedule_all() 函数来实现这一需求。


1. 为什么需要 unschedule_all()?

每次调用 run_dailyrun_weeklyrun_monthly 时,系统都会创建一个新的定时任务。如果直接重新调用这些函数,会导致多个任务同时存在并重复执行。

为了修改彻底删除已有的定时任务,必须:

  1. 先调用 unschedule_all() 清空所有已注册的定时任务。
  2. 再根据需要重新添加新的定时任务。

2. API 语法与说明

unschedule_all()

  • 功能:取消当前策略中所有通过 run_daily / run_weekly / run_monthly 注册的定时任务。
  • 参数:无。
  • 返回值:None。

3. 典型使用场景与代码示例

场景:模拟交易更新代码后重置定时任务 (after_code_changed)

在模拟交易中,当策略代码被修改并重新载入时,聚宽会执行 after_code_changed(context) 函数。为了防止旧的定时任务叠加,我们可以在该函数中重置定时任务:

# 导入聚宽函数库
import jqdata

def initialize(context):
    # 开启动态复权模式
    set_option('use_real_price', True)
    # 初始设置:每天 10:00 运行
    run_daily(my_daily_func, time='10:00')

def my_daily_func(context):
    log.info("执行定时任务,当前时间: %s" % context.current_dt)

def new_daily_func(context):
    log.info("执行新的定时任务,当前时间: %s" % context.current_dt)

# 模拟交易更换代码后调用的函数
def after_code_changed(context):
    # 1. 取消所有旧的定时任务
    unschedule_all()
    
    # 2. 重新设定新的定时运行函数(例如改为每天 14:00 运行)
    run_daily(new_daily_func, time='14:00')
    log.info("已更新定时任务为每天 14:00 运行")

4. 注意事项

  1. 不能单独删除某个特定任务unschedule_all() 会一次性清除所有注册的定时任务。如果只需要修改部分任务,请在清除后将不需要修改的任务一并重新注册。
  2. 执行顺序:在同一个时间点,系统总是先运行 run_xxx 指定的函数,然后运行 before_trading_start,最后运行 handle_dataafter_trading_end
  3. 参数限制:重新绑定的回调函数(如 func)必须接受 context 作为唯一参数,不能传入 data