返回列表 发布新帖

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

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

量化交易≠画几条K线就完事。真正的实盘,必须让策略能听、能说、能记录。 今天这份QMT(MiniQMT通用)保姆级教程,让你的账户:

  • 成交即打印
  • 失败即报警
  • 断连即重连 全部代码已放文末

前言:

xtquant 是 QMT 官方维护的 Python 接口,把“下单-回报-成交-异常”全部封装成事件回调。 今天全文只围绕一份代码展开,逐行讲透:一个事件驱动的回调

  1. 如何建立柜台连接;
  2. 如何监听委托、成交、撤单、断线等 7 大事件;
  3. 如何把事件打印成结构化日志,方便后续扩展成资金风控、推送微信、入库 MySQL。

二、运行环境

  • Windows 10/11(QMT 仅支持 Win)
  • Python ≥3.7,64 位
  • pip install xtquant (2025-10 官方已支持 3.11)
  • 券商版 QMT 交易端(模拟盘也可)已启动并登录

三、完整代码(共 92 行,含空行)

Python复制#coding=utf-8 :这是 Python 文件中的编码声明,用来告诉 Python 解释器这个文件是用 UTF-8 编码的。这通常用于确保文件中的非 ASCII 字符(如中文)能被正确处理。

from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback from xtquant.xttype import StockAccount from xtquant import xtconstant:这段代码的目的是为了使用 xtquant 这个量化交易库中的功能,包括创建交易者实例、处理交易回调、管理股票账户以及使用预定义的常量。

  • xtquant.xttrader:这是一个模块的路径,可能是一个量化交易相关的库。
  • XtQuantTrader:从 xtquant.xttrader 模块中导入的类,可能用于创建量化交易的交易者实例。
  • XtQuantTraderCallback:同样是从 xtquant.xttrader 模块中导入的类,可能是一个回调类,用于处理交易过程中的回调事件。
  1. from xtquant.xttype import StockAccount
  • xtquant.xttype:这是另一个模块的路径,可能包含与量化交易相关的数据类型。
  • StockAccount:从 xtquant.xttype 模块中导入的类,可能代表一个股票账户,用于管理股票交易相关的账户信息。
  1. from xtquant import xtconstant
  • xtquant:这是一个包(package),可能包含量化交易相关的多个模块。
  • xtconstant:从 xtquant 包中导入的模块,可能包含一些常量定义,如股票代码、交易状态等

【2-4】官方三大模块:

  • XtQuantTrader —— 柜台会话,负责发单、撤单、查持仓;
  • XtQuantTraderCallback —— 抽象基类,我们继承它即可“挂”到事件总线;
  • StockAccount —— 账户对象,用资金账号初始化;
  • xtconstant —— 常量集合,如买卖方向、市价限价等,后续扩展策略时会用到。

Python复制class MyXtQuantTraderCallback(XtQuantTraderCallback):

继承基类,相当于“告诉柜台:以下函数指针是我关心的事件,有消息就扔给我”。


事件 1 连接断开

Python复制def on_disconnected(self):

""" 连接断开

return:

"""

print("connection lost")

  • 触发时机:QMT 被手动关闭、网络掉线、柜台夜切;
  • 生产环境建议:发邮件/微信、暂停策略、尝试重连。

事件 2 委托回报(最关键)

on_stock_order(self, order)

Python复制def on_stock_order(self, order): print("on order callback:") print(order.stock_code, order.order_status, order.order_sysid)

  • 触发时机:当你下单后,券商系统返回委托回报(即订单状态更新)。
  • 参数说明
    • order.stock_code:股票代码
    • order.order_status:订单状态(如已报、已成交、已撤等)
    • order.order_sysid:系统订单号(券商内部编号)

事件 3 成交变动

on_stock_trade(self, trade)

Python复制def on_stock_trade(self, trade): print("on trade callback") print(trade.account_id, trade.stock_code, trade.order_id)

  • 触发时机:当订单成交时推送。
  • 参数说明
    • trade.account_id:账户ID
    • trade.stock_code:成交的股票代码
    • trade.order_id:对应的订单ID

一笔委托可能分多笔成交,每次成交都会单独触发;这里打印的 order_id 是本地编号,与 on_stock_order 里的 order_id 一致,可用来“拼单”计算平均成交价。


事件 4 委托失败

on_order_error(self, order_error)

Python复制def on_order_error(self, order_error): print("on order_error callback") print(order_error.order_id, order_error.error_id, order_error.error_msg)

  • 触发时机:当下单失败时(如价格非法、余额不足、停牌等)。
  • 参数说明
    • order_error.order_id:出错的订单ID
    • order_error.error_id:错误代码
    • order_error.error_msg:错误描述(如“余额不足”)

四、常见踩坑

  • 端口占用:QMT 只能开一个客户端,否则 58605 被占用;
  • 编码错误:文件必须保存为 UTF-8,否则中文策略名会乱码;
  • 32 位 Python:xtquant 只提供 64 位 whl,装错位数会 ImportError
  • 异步/同步混用:同一笔委托不要既调 order_stock 又调 order_stock_async,会重复。

五、结语

全文完,下期将继续讲解 撤单失败推送、 异步下单回报推送等内容。

六、彩蛋

全套量化资料分享

回复

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

客服专线

400-080-8112

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