3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT (迅投 Quant) 实盘自动化交易中,网络波动、资金不足、超过涨跌停限制或柜台拒单等原因都可能导致委托下单失败。为了保证策略的高可用性与交易信号的完整执行,我们需要在策略中建立完备的异常处理机制。
QMT 提供了专门用于接收下单异常通知的实时回调函数 orderError_callback(ContextInfo, orderArgs, errMsg)。当发起的交易委托出现异常时,客户端系统会自动触发该函数。
PassorderArguments),包含引发异常的完整订单信息:
opType: 操作类型(如股票买入 23、卖出 24 等)orderType: 下单方式accountID: 资金账号orderCode: 证券/合约代码prType: 报价类型modelPrice: 下单价格modelVolume: 下单数量strategyName: 策略名称与备注信息注意:使用此回调函数前,必须在
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} 次),停止重试,请人工干预!")
order_callback(委托状态主推)与 deal_callback(成交主推),可以实时维护策略内部的挂单与成交清单,防止重复下单或漏单。errMsg 进行关键字匹配(如“资金不足”、“非交易时间”等),对于资金不足等无法通过重试恢复的报错,应直接触发阻断并发送报警(如邮件/钉钉通知),避免无意义的无效重试。