🚀 AI 一键生成 joinquant 策略代码

JoinQuant 进阶技巧:如何动态取消所有定时运行任务?

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

问题描述

如何取消策略中所有已设置的定时任务?

解决方案

在 JoinQuant(聚宽)平台中,如果您需要取消策略中所有已经设置的定时任务(即通过 run_dailyrun_weeklyrun_monthly 设置的任务),可以使用 unschedule_all() 函数。

核心函数

unschedule_all()

该函数没有参数,调用后会清空当前策略中所有已注册的定时运行函数。

常见使用场景

这个函数最常用于 模拟交易 中更新策略代码时。

当您在模拟交易运行过程中修改了代码(例如修改了定时运行的时间),如果不先取消旧的任务,新的定时任务可能会与旧任务叠加,导致函数被重复调用。因此,通常在 after_code_changed(context) 函数中先调用 unschedule_all(),然后再重新定义定时任务。

代码示例

以下代码展示了如何在策略更新后,清除旧任务并重新设置新任务:

# -*- coding: utf-8 -*-

def initialize(context):
    # 初始化时设置定时任务
    run_daily(market_open, time='09:30')

def market_open(context):
    log.info("市场开盘,执行任务")

# 模拟交易中,当您修改代码并保存后,会触发此函数
def after_code_changed(context):
    # 1. 取消所有之前设置的定时运行任务(清除旧的 run_daily/weekly/monthly)
    unschedule_all()
    
    # 2. 重新设置定时任务
    # 例如:我们想把时间从 09:30 改为 10:00,或者只是为了防止任务重复叠加
    run_daily(market_open, time='10:00')
    
    log.info("代码已更新,定时任务已重置")

注意事项

  1. 作用范围unschedule_all() 仅取消由 run_dailyrun_weeklyrun_monthly 注册的定时任务。它不会影响 handle_databefore_trading_startafter_trading_end 等标准生命周期函数的运行。
  2. 执行逻辑:调用该函数后,必须重新调用 run_xxx 系列函数来注册您需要的任务,否则策略将没有任何定时任务在运行。

Q&A

Q: unschedule_all() 会取消 handle_data 的执行吗?
A: 不会。handle_data 是策略引擎的基础回调函数,unschedule_all() 仅针对通过 run_dailyrun_weeklyrun_monthly 手动添加的定时任务。

Q: 在回测模式下需要使用 unschedule_all() 吗?
A: 通常不需要。在回测模式下,每次点击“运行回测”都是一个新的进程,initialize 会重新执行,不存在旧任务残留的问题。这个函数主要用于模拟交易(实盘模拟)中,当策略进程不重启但代码发生变更时使用。

Q: 如果我只想取消某一个特定的定时任务怎么办?
A: JoinQuant API 目前没有提供直接取消“单个”特定任务的函数。标准的做法是使用 unschedule_all() 取消所有任务,然后只重新注册您需要保留的那些任务。