平台入门与三种开发方式
第一次接触 QMT,先弄清「它是什么、有哪几条开发路径、回测和实盘差别在哪、一个交易日里引擎在什么时间点做什么」。本章帮你建立全局认知,后面写策略才不会在选型和时机上踩坑。
QMT 是什么
QMT(迅投量化投研交易平台)是迅投(ThinkTrader)出品的本地客户端型量化交易系统,内置了 3.6 版本的 Python 运行环境,提供行情数据与交易下单两大核心能力。它的特点是:
- 本地运行:策略跑在自己电脑上的 QMT 客户端里,行情落本地、信号本地计算、直接连券商柜台报单,延迟可控。
- 券商发行:国信 iQuant、华鑫、国金、中信建投等多家券商以 QMT 为底座做定制,登录的是券商资金账号,实盘走券商通道。
- 多语言多模式:同一套行情和交易能力,既能在客户端内用内置 Python 写,也能用外部 Python 通过 XtQuant 连进来,还能用类 VB 的公式语言写。
它最擅长的是 A 股场景:普通股票、ETF、可转债、国债逆回购、融资融券、新股新债申购都有现成 API;同时也支持期货、期权的行情与交易。
回测模型 vs 实盘模型
QMT 的策略分两类模型,写代码前先分清自己在哪种模式:
| 模型 | 数据来源 | 撮合规则 | 典型用途 |
|---|---|---|---|
| 回测模型 | 本地历史 K 线,自左向右逐根遍历 | 指定价在当根 K 线高低点内按指定价撮合,超出按收盘价;量超可用按可用量 | 验证策略在历史上的净值走势 |
| 实盘模型 | 盘中最新动态行情 | 以交易所规则为准(股票有 ±2% 价格笼子,超价/超量废单) | 接收未来 K 线生成信号并真实报单 |
「实盘」指的是接收未来 K 线下单,它又分
模拟柜台模拟交易和真实柜台实盘交易两种,取决于你登录的账号是模拟账号还是真实账号。运行模式选的「模拟/实盘」与账号本身是模拟还是真实无关——模拟模式下只显示信号不发单,实盘模式才会真把委托发出去。
回测前要先下载历史数据:客户端左上角「操作 → 数据管理」,选周期(如日线)和板块(如沪深 A 股)、时间范围选「全部」补一次,再在右下角「行情 → 批量下载」勾「定时下载」做每日增量。回测取本地数据用 get_market_data_ex 并把 subscribe 设为 False,速度快、不需要订阅实时行情。
三种开发方式
这是 QMT 最容易让人混淆的地方——同一套能力有三条入口,先选对路径:
内置 Python(主流)
策略脚本直接写在 QMT 客户端的策略编辑器里,引擎按事件回调(init/handlebar)或订阅/定时机制执行。回测和实盘同一份代码,函数库最全(下单 passorder、行情 get_market_data_ex、查询 get_trade_detail_data 等)。
#coding:gbk
def init(C):
C.stock = C.stockcode + '.' + C.market
def handlebar(C):
... # 每个 K 线触发一次
适合:绝大多数「写策略 → 回测 → 实盘」的需求。详见 内置Python运行机制。
XtQuant(外部 Python)
把 XtQuant 当作普通 Python 库,在自己的 Python 3.6~3.12 环境里 import xtquant,连接到正在运行的 MiniQMT 客户端,用 xtdata 取行情、xttrader 下单。脱离了客户端编辑器的束缚,可以自由用 pandas/numpy/任意第三方库,也方便对接其它系统、做研究脚本或自建框架。
from xtquant import xttrader, xtdata
session = xttrader.XtQuantTrader(path, session_id)
session.start()
account = xttrader.StockAccount(account_id)
xttrader.order_stock(account, '600000.SH', 1, 100, 5, 0.0)
适合:想用自己的 IDE 和依赖环境、做研究型脚本、或把交易能力嵌入已有系统。详见 XtQuant外部接口。
VBA 公式(公式写法)
QMT 的公式编写系统,用类 VB 的公式语言写指标、选股、图表化和程序化交易策略,支持序列模式和逐 K 线模式两种运行原理。从通达信、文华麦语言等公式平台迁移过来的用户最容易上手。
MA5:=MA(CLOSE,5);
MA20:=MA(CLOSE,20);
适合:指标/选股/图表化策略,或习惯公式语言的交易者。详见 VBA公式模型。
三种方式怎么选
| 你的情况 | 推荐方式 |
|---|---|
| 第一次做量化、要回测+实盘一条龙 | 内置 Python |
| 已经有成熟的 Python 研究框架,想把 QMT 接进来 | XtQuant |
| 从通达信/文华/同花顺公式过来,习惯写公式 | VBA 公式 |
| 要做盘中高频/分笔级响应 | 内置 Python(subscribe/run_time)或 XtQuant |
| 跨周期、多指标叠加的技术分析 | VBA 公式(跨周期引用方便) |
三种方式并不互斥:很多人用内置 Python 做实盘报单,同时用 XtQuant 在外部脚本里做盘后研究和复盘。
一个交易日的运行节奏(内置 Python 实盘)
理解引擎在盘中什么时候回调,是写对实盘策略的基础。以逐 K 线模式(handlebar)为例:
| 时机 | 触发 | 典型动作 |
|---|---|---|
| 模型启动 | init 调用一次 | 初始化变量、设置参数、订阅品种 |
| 盘中每个分笔(约 3 秒) | handlebar 调用 | 计算信号、暂存委托 |
| 新 K 线首笔到达 | 上一根 K 线暂存的信号发出 | 真实报单(逐 K 线生效) |
| 非交易时段 | 跳过 | 用时间判断过滤 |
- 逐 K 线生效:默认
passorder的quicktrade=0,信号暂存到当前 K 线结束、下一根首笔时才发;想立即下单把quicktrade填2,但此时不能用ContextInfo存状态,要改用普通全局变量(如自定义class a())。 - 价格笼子:股票品种报价不能超最新价 ±2%,否则废单;数量超可用也会废单。
- 跳过历史 K 线:实盘
handlebar启动时会先把历史 K 线重放一遍,通常用C.is_last_bar()跳过,只在最新 K 线处理。
业务类型与品种
QMT 覆盖的品种与业务:
| 类别 | 支持 |
|---|---|
| 股票 | 沪深 A 股普通买卖、融资融券 |
| 基金 | ETF 申赎、场内基金买卖 |
| 债券 | 可转债、国债逆回购 |
| 申购 | 新股、新债申购 |
| 期货 | 商品期货、股指期货 |
| 期权 | 个股及 ETF 期权 |
| 指数 | 行情与成分数据 |
各品种的字段、代码格式、合约信息查询方式,见 数据字典与品种数据。
写策略前的三条铁律
- 第一行必须
#coding:gbk:QMT 脚本统一 GBK 编码,不写中文会乱码甚至报错。 - 缩进统一:全文要么全用空格、要么全用 Tab,不能混用。
- 回测 vs 实盘的状态存放不同:逐 K 线模式(
quicktrade=0)可存ContextInfo;立即下单(quicktrade=2)必须用普通全局变量。
下一步
选定内置 Python 后,去 内置Python运行机制 看清 init/handlebar/subscribe/run_time 四种触发何时调用。