返回列表 发布新帖

[量化软件QMT怎么创建一个策略|保姆级教程2]

28 0
发表于 3 小时前 | 显示全部楼层 阅读模式

前言:

上一篇我们讲了 4 个高频事件:

  • on_disconnected(断线)
  • on_stock_order(委托回报)
  • on_stock_trade(成交)
  • on_order_error(下单失败)

但实盘里还有 3 个“隐形炸弹”经常被忽略:

  1. 撤单失败——你以为撤掉了,其实还在场,风险敞口瞬间爆炸;
  2. 异步下单回执——用 order_stock_async 时,柜台先给你一个“受理号”,后续才真正挂单;
  3. 账户状态——密码被改、会话掉线、备用账户切换,都必须第一时间感知。

今天把最后 3 个回调补完,加上逐行解析,凑齐 100% 官方事件。

二、运行环境(与上篇完全一致)

  • Windows 10/11
  • Python ≥3.7 64 bit
  • pip install xtquant (2025-10 已支持 3.11)
  • 券商 QMT 客户端已登录(模拟盘亦可)

三、完整代码(含新增 3 大事件,共 106 行)

下面给出 全部源码,老事件不再赘述

一、on_cancel_error —— 撤单失败通知

def on_cancel_error(self, cancel_error): """ 撤单失败推送 :param cancel_error: XtCancelError 对象 :return: """ print("on cancel_error callback") print(cancel_error.order_id, cancel_error.error_id, cancel_error.error_msg)

  1. 什么时候触发
  • 你代码里调用 cancel_order(...)cancel_order_async(...) 后,柜台返回“撤单失败”就会立刻进这个函数。
  • 失败常见原因:原单已成交、已撤、已过期、非法 order_id、集合竞价不允许撤等。
  1. 字段详解
字段 类型 举例 用途
cancel_error.order_id str '12345678' 你刚才想撤的那笔单的系统编号
cancel_error.error_id int 9803 柜台给出的错误码,可对照券商文档
cancel_error.error_msg str '该委托已成交,不能撤销' 人能直接看懂的失败原因

二、on_order_stock_async_response —— 异步下单“已受理”回执

def on_order_stock_async_response(self, response): """ 异步下单回报推送 :param response: XtOrderResponse 对象 :return: """ print("on_order_stock_async_response") print(response.account_id, response.order_id, response.seq)

  1. 什么时候触发
  • 你调用 order_stock_async(...) 之后,柜台第一次收到指令就会立刻推送这个响应;
  • 注意:它只是“已受理”,不代表已成交甚至已报!真正的成交/状态变化后面还会走 on_stock_order
  1. 字段详解
字段 类型 举例 用途
response.account_id str '888888' 下单所用账户
response.order_id str 'abc123' 柜台生成的临时订单编号,后面撤单、查单都要用它
response.seq int 10086 你调用 order_stock_async 时自己传的序列号,用来把“请求”和“响应”对上

三、on_account_status —— 账户状态变化

def on_account_status(self, status): """ :param status: XtAccountStatus 对象 :return: """ print("on_account_status") print(status.account_id, status.account_type, status.status)

  1. 什么时候触发
  • 终端登录成功、断开、被踢、资金账号冻结、柜台维护等任何账户级事件都会推送;
  • 一天可能只收到一两次,但关键时刻必须知道。
  • 字段详解 | 字段 | 类型 | 举例 | 用途 | | -------------------- | ---- | -------- | ------------------------------------------------ | | status.account_id | str | '888888' | 账户号 | | status.account_type | int | 1 | 1=普通股票 2=信用 3=期权 …(具体看 xtconstant) | | status.status | int | 3 | 0=未登录 1=正在登录 2=登录成功 3=断开 4=冻结 … |

快速记忆口诀

  • 撤单失败on_cancel_error(order_id + 原因)
  • 异步下单受理on_order_stock_async_response(seq ↔ order_id 对钥匙)
  • 账户掉线/登录on_account_status(account_id + 状态码)

彩蛋:

回复

您需要登录后才可以回帖 登录 | 立即注册

客服专线

400-080-8112

用思考的速度交易,用真诚的态度合作,我们是认真的!
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2025 迅投QMT社区 版权所有 All Rights Reserved. 京ICP备2025122616号-3
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表