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

qmt 如何在下单失败或报错时捕获异常并自动进行重试?

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

问题描述

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

Title: qmt 实盘风控:利用 orderError_callback 捕获下单异常并自动重试

Question: qmt 如何在下单失败或报错时捕获异常并自动进行处理?

解决方案

在 QMT (迅投 Quant) 实盘自动化交易中,网络波动、资金不足、超过涨跌停限制或柜台拒单等原因都可能导致委托下单失败。为了保证策略的高可用性与交易信号的完整执行,我们需要在策略中建立完备的异常处理机制。

一、核心机制:orderError_callback 主推函数

QMT 提供了专门用于接收下单异常通知的实时回调函数 orderError_callback(ContextInfo, orderArgs, errMsg)。当发起的交易委托出现异常时,客户端系统会自动触发该函数。

参数说明:

  1. ContextInfo: 策略全局上下文对象。
  2. orderArgs: 下单参数对象(PassorderArguments),包含引发异常的完整订单信息:
    • opType: 操作类型(如股票买入 23、卖出 24 等)
    • orderType: 下单方式
    • accountID: 资金账号
    • orderCode: 证券/合约代码
    • prType: 报价类型
    • modelPrice: 下单价格
    • modelVolume: 下单数量
    • strategyName: 策略名称与备注信息
  3. errMsg: 具体的错误信息提示(字符串)。

注意:使用此回调函数前,必须在 init() 函数中通过 ContextInfo.set_account(account) 绑定对应的资金账号。


二、代码实现:捕获下单异常并实现自动重试

以下为一个完整示例,展示如何在捕获废单/异常后,记录错误日志并自动调整价格(如以最新价)进行自动重试下单:

#encoding:gbk
import time

# 记录下单重试次数的字典
RETRY_DICT = {}
MAX_RETRY_COUNT = 3  # 最大重试次数

def init(ContextInfo):
    # 1. 绑定资金账号(必须)
    ContextInfo.account = '6000000058'
    ContextInfo.set_account(ContextInfo.account)
    print("策略初始化完成,已绑定账号:", ContextInfo.account)

def handlebar(ContextInfo):
    # 示例:仅在最后一根 K 线上触发一次下单测试
    if ContextInfo.is_last_bar():
        stock_code = '600000.SH'
        # 发起下单委托(例如以指定价买入)
        passorder(23, 1101, ContextInfo.account, stock_code, 11, 10.5, 100, 'MyStrategy', 1, ContextInfo)

def orderError_callback(ContextInfo, orderArgs, errMsg):
    """
    下单异常实时主推函数
    """
    print(f"[异常警告] 收到下单报错信息!")
    print(f"错误提示: {errMsg}")
    print(f"报错订单信息: 代码={orderArgs.orderCode}, 操作={orderArgs.opType}, 数量={orderArgs.modelVolume}, 价格={orderArgs.modelPrice}")
    
    # 构造唯一标识以追踪重试
    order_key = f"{orderArgs.orderCode}_{orderArgs.opType}"
    current_retry = RETRY_DICT.get(order_key, 0)
    
    if current_retry < MAX_RETRY_COUNT:
        RETRY_DICT[order_key] = current_retry + 1
        print(f"[自动风控] 正在尝试第 {RETRY_DICT[order_key]} 次重新下单...")
        
        # 策略调整:例如将报价方式从指定价(11)切换为对手价(14)或最新价(5),以提高成交概率
        new_pr_type = 5  # 最新价
        new_price = -1   # 最新价模式下价格填 -1
        
        # 重新补单
        passorder(
            orderArgs.opType,
            orderArgs.orderType,
            orderArgs.accountID,
            orderArgs.orderCode,
            new_pr_type,
            new_price,
            orderArgs.modelVolume,
            'MyStrategy_Retry',
            1,
            ContextInfo
        )
    else:
        print(f"[风控阻断] 订单 {order_key} 重试已达上限 ({MAX_RETRY_COUNT} 次),停止重试,请人工干预!")

三、QMT 风控最佳实践建议

  1. 结合订单/成交主推建立状态闭环
    配合 order_callback(委托状态主推)与 deal_callback(成交主推),可以实时维护策略内部的挂单与成交清单,防止重复下单或漏单。
  2. 精准区分错误类型
    针对 errMsg 进行关键字匹配(如“资金不足”、“非交易时间”等),对于资金不足等无法通过重试恢复的报错,应直接触发阻断并发送报警(如邮件/钉钉通知),避免无意义的无效重试。