问题描述
解决方案
在 QMT 量化交易平台中,可以通过调用 pause_task 和 resume_task 函数来实现对正在进行的算法交易任务的暂停与恢复。
这两个操作通常需要配合 get_trade_detail_data 函数使用,先获取当前账号下的任务列表和任务 ID (taskId),然后再针对特定的任务进行操作。
核心函数说明
-
暂停任务 (
pause_task)- 功能:暂停指定的智能算法任务。
- 参数:
taskId(任务编号,传空字符串则暂停该账号下所有可暂停任务),accountId(资金账号),accountType(账号类型),ContextInfo。 - 返回:
bool(True 表示发送信号成功)。
-
恢复任务 (
resume_task)- 功能:恢复(继续)已暂停的智能算法任务。
- 参数:
taskId(任务编号,传空字符串则启动该账号下所有已暂停任务),accountId(资金账号),accountType(账号类型),ContextInfo。 - 返回:
bool(True 表示发送信号成功)。
-
获取任务信息 (
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)
注意事项
- 任务 ID 类型:
get_trade_detail_data返回的对象中,m_nTaskId通常是字符串或数字,直接透传给pause_task或resume_task即可。 - 批量操作:如果将
taskId参数设置为空字符串'',系统会尝试对该账号下所有符合条件的任务进行批量暂停或恢复。 - 实盘环境:这些函数仅在实盘或模拟交易模式下有效,回测模式下没有实际的算法交易任务交互。
- 文档勘误:在部分旧版文档中,恢复任务的章节标题可能被错误标记为
cancel_task,但实际函数名为resume_task,请以代码示例为准。
Q&A
Q: 如何判断任务当前的运行状态?
A: 使用 get_trade_detail_data(accId, accType, 'task') 获取任务对象列表,访问对象的 m_eStatus 属性。常见的状态包括执行中(Running)、暂停(Pause)、已完成(Completed)等。
Q: pause_task 和 cancel_task 有什么区别?
A: pause_task 是暂时停止算法的执行,任务仍然存在,后续可以通过 resume_task 继续运行;而 cancel_task 是彻底撤销任务,任务结束后无法直接恢复,需要重新下单。
Q: 为什么调用了 resume_task 但任务没有反应?
A: 请检查以下几点:1. 确保传入的 taskId 正确;2. 确保账号 ID 和类型匹配;3. 只有处于“暂停”状态的任务才能被恢复,如果任务已经完成或被撤销,无法恢复。