平台入门与三种开发方式

第一次接触 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 期权
指数行情与成分数据

各品种的字段、代码格式、合约信息查询方式,见 数据字典与品种数据。

写策略前的三条铁律

  1. 第一行必须 #coding:gbk:QMT 脚本统一 GBK 编码,不写中文会乱码甚至报错。
  2. 缩进统一:全文要么全用空格、要么全用 Tab,不能混用。
  3. 回测 vs 实盘的状态存放不同:逐 K 线模式(quicktrade=0)可存 ContextInfo;立即下单(quicktrade=2)必须用普通全局变量。

下一步

选定内置 Python 后,去 内置Python运行机制 看清 init/handlebar/subscribe/run_time 四种触发何时调用。