🚀 AI 一键生成 qmt 策略代码

pause_task 与 resume_task:灵活控制算法交易进程

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

问题描述

如何通过代码暂停和恢复正在进行的算法交易任务?

解决方案

在 QMT 量化交易平台中,可以通过调用 pause_taskresume_task 函数来实现对正在进行的算法交易任务的暂停与恢复。

这两个操作通常需要配合 get_trade_detail_data 函数使用,先获取当前账号下的任务列表和任务 ID (taskId),然后再针对特定的任务进行操作。

核心函数说明

  1. 暂停任务 (pause_task)

    • 功能:暂停指定的智能算法任务。
    • 参数taskId (任务编号,传空字符串则暂停该账号下所有可暂停任务), accountId (资金账号), accountType (账号类型), ContextInfo
    • 返回bool (True 表示发送信号成功)。
  2. 恢复任务 (resume_task)

    • 功能:恢复(继续)已暂停的智能算法任务。
    • 参数taskId (任务编号,传空字符串则启动该账号下所有已暂停任务), accountId (资金账号), accountType (账号类型), ContextInfo
    • 返回bool (True 表示发送信号成功)。
  3. 获取任务信息 (get_trade_detail_data)

    • 功能:获取账号的任务列表,用于提取 m_nTaskId(任务ID)和 m_eStatus(任务状态)。
    • 参数accountID, accountType, 'task'

代码实现示例

以下代码展示了如何遍历当前账号下的所有任务,将“执行中”的任务暂停,并将“已暂停”的任务恢复。

# -*- coding: gbk -*-

def init(ContextInfo):
    # 设置资金账号
    ContextInfo.accid = '6000000248'
    # 设置账号类型:'STOCK'股票, 'FUTURE'期货, 'CREDIT'信用 等
    ContextInfo.accType = 'STOCK'
    
    print("策略初始化完成,账号: {}".format(ContextInfo.accid))

def handlebar(ContextInfo):
    # 1. 获取当前账号下的所有任务列表
    # 参数 'task' 表示获取任务数据
    task_list = get_trade_detail_data(ContextInfo.accid, ContextInfo.accType, 'task')
    
    if not task_list:
        print("当前没有查询到任务")
        return

    # 2. 遍历任务列表进行操作
    for task_obj in task_list:
        task_id = task_obj.m_nTaskId
        task_status = task_obj.m_eStatus
        
        # 打印任务信息
        print("发现任务 ID: {}, 当前状态: {}".format(task_id, task_status))
        
        # 状态说明 (参考文档附录):
        # TASK_STATUS_RUNNING (执行中) 通常对应枚举值
        # TASK_STATUS_PAUSE (暂停) 通常对应枚举值
        
        # 示例逻辑 A:如果任务正在运行,则暂停它
        # 注意:这里仅为演示,实际使用请根据 task_status 的具体数值或业务逻辑判断
        # 假设我们要暂停所有任务:
        is_paused = pause_task(task_id, ContextInfo.accid, ContextInfo.accType, ContextInfo)
        if is_paused:
            print("已发送暂停信号: 任务ID {}".format(task_id))
            
        # 示例逻辑 B:如果任务已暂停,则恢复它
        # is_resumed = resume_task(task_id, ContextInfo.accid, ContextInfo.accType, ContextInfo)
        # if is_resumed:
        #     print("已发送恢复信号: 任务ID {}".format(task_id))

    # 示例逻辑 C:批量操作
    # 如果想暂停该账号下所有任务,taskId 传空字符串即可
    # pause_task('', ContextInfo.accid, ContextInfo.accType, ContextInfo)
    
    # 如果想恢复该账号下所有已暂停任务,taskId 传空字符串即可
    # resume_task('', ContextInfo.accid, ContextInfo.accType, ContextInfo)

注意事项

  1. 任务 ID 类型get_trade_detail_data 返回的对象中,m_nTaskId 通常是字符串或数字,直接透传给 pause_taskresume_task 即可。
  2. 批量操作:如果将 taskId 参数设置为空字符串 '',系统会尝试对该账号下所有符合条件的任务进行批量暂停或恢复。
  3. 实盘环境:这些函数仅在实盘模拟交易模式下有效,回测模式下没有实际的算法交易任务交互。
  4. 文档勘误:在部分旧版文档中,恢复任务的章节标题可能被错误标记为 cancel_task,但实际函数名为 resume_task,请以代码示例为准。

Q&A

Q: 如何判断任务当前的运行状态?
A: 使用 get_trade_detail_data(accId, accType, 'task') 获取任务对象列表,访问对象的 m_eStatus 属性。常见的状态包括执行中(Running)、暂停(Pause)、已完成(Completed)等。

Q: pause_taskcancel_task 有什么区别?
A: pause_task 是暂时停止算法的执行,任务仍然存在,后续可以通过 resume_task 继续运行;而 cancel_task 是彻底撤销任务,任务结束后无法直接恢复,需要重新下单。

Q: 为什么调用了 resume_task 但任务没有反应?
A: 请检查以下几点:1. 确保传入的 taskId 正确;2. 确保账号 ID 和类型匹配;3. 只有处于“暂停”状态的任务才能被恢复,如果任务已经完成或被撤销,无法恢复。