Architecture
本地 Web 到 QMT 的交易与行情桥接
统一处理鉴权、账号路由、行情订阅和交易请求,让外部程序通过稳定接口接入 QMT 能力。
外部程序
cfquant Web
Socket / Pipe
QMT 终端
项目在本机启动 Web 服务,外部 Python 默认先通过 LTtx 发现 Web 路由,网页请求直接进入 Web;两者最终都由账号配置自动路由到通用端或高级端。新用户优先使用通用模式,一个 QMT 加载一个 ctypes 文件即可完成资金、持仓、委托、下单、撤单和回调验证。
| 账号 | 首选模式 | 实际模式 | QMT 目录 | 数据源 |
|---|
| 代码 | 名称 | 持仓 | 可用 | 成本价 | 市值 | 盈亏 |
|---|
| 序号 | 最后回调 |
|---|
| 代码 | 名称 | 持仓 | 可用 | 成本价 | 市值 | 盈亏 |
|---|
| 序号 | 最后回调 |
|---|
| 时间 | 代码 | 名称 | 价格 | 数量 | 金额 |
|---|
| 操作 | 账号名称 | 资金账号 | 连接状态 | 首选模式 | 实际模式 | 内部通道 | QMT 目录 | 数据源 |
|---|
| 代码 | 名称 | 持仓 | 可用 | 市值 |
|---|
| 接收时间 | 事件 | 账号 | 代码 | 委托编号 | 价格 | 数量 | 成交 | 状态 / 摘要 | 来源 | 完整信息 |
|---|
--
本地服务日志统一写入项目 log/ 目录,默认自动保留最近 30 天;根目录旧日志也会纳入过期清理。
一次更新完整版本,并把最新 cfquant 核心同步到所有已绑定 QMT 目录。
按向导填账号、选模式、部署脚本、验证数据。其他说明以后再看。
bin.x64。
bin.x64。
高级模式
需要两个 QMT,普通端和极速交易端都在线后再使用。
排查
先看绑定状态和 QMT 日志,再看 PipeHub 是否在线。
cfquant 是本机 QMT 桥接控制台。它把 Web 页面、外部 Python 和大 QMT 策略脚本连在一起,由 Web 统一管理账号、运行模式、回调和更新。
| 模式 | QMT 入口 | 适合场景 |
|---|---|---|
| 通用模式 | CFQUANT_CTYPE_ALL_LOWLAT.py |
默认推荐。一个 QMT 即可跑通行情、查询、交易和回调。 |
| 极致模式 | CFQUANT_LITE.py |
入口自包含,适合国泰君安、国泰海通等导入受限环境。 |
| 高级模式 | CFQUANT.py + CFQUANT_TRADE_LOWLAT.py |
两个 QMT,普通端做查询和回调,极速交易端做低延迟交易请求。 |
| 位置 | 作用 |
|---|---|
runtime/config/cfquant_web_config.json |
保存账号、QMT 目录、运行模式、共享行情源和市场路由。 |
qmt_scripts/ |
放给 QMT 加载的入口脚本。 |
bin.x64/cfquant_bridge_config.json |
Web 为 QMT 写入的身份文件,用于区分不同 QMT 终端。 |
log/ |
Web、PipeHub、LTtx 和 QMT 桥接日志。 |
start_cfquant.bat,或执行 cfquant --open-browser。bin.x64 目录和运行模式。网页端负责配置、验证和排查。外部策略接入前,先用网页确认账号和 QMT 链路是通的。
外部程序优先使用默认 auto 路由。Web 在线时请求进入 Web 统一路由,再按账号配置选择通用、极致或高级模式。
pip install cfquant pip install "cfquant[zmq]" # 需要 ZMQ 能力时再安装
cfquant --open-browser cfquant qmt-scripts --output D:\QMT\cfquant
from cfquant import xtdata
from cfquant.xttrader import XtQuantTrader
from cfquant.xttype import StockAccount
account = StockAccount("YOUR_ACCOUNT_ID")
trader = XtQuantTrader("", 0, account=account)
trader.start()
print(xtdata.get_full_tick(["000001.SZ"]))
print(trader.query_stock_asset(account))
正常多账号部署不用写 configure()。只有固定走某条链路、改 LTtx 端口、改 Pipe 名称或排查连接问题时再手动指定。
from cfquant import configure configure(transport="ctypes", pipe_name=r"\\.\pipe\cfquant_pipe_hub") # 或:configure(transport="web_lttx", host="127.0.0.1", port=2049, token="LTtx")
本教程介绍如何在大 QMT 中部署 cfquant,并通过本地 Web 控制台或外部 Python 调用行情、查询、交易和回调能力。
start_cfquant.bat 或 cfquant --open-browser 打开 Web 控制台,默认地址是 http://127.0.0.1:8765/。
bin.x64 和运行模式,能查到资产、持仓或行情即部署成功。
| 模式 | 入口脚本 | QMT 数量 | 说明 |
|---|---|---|---|
| 通用模式 | CFQUANT_CTYPE_ALL_LOWLAT.py |
1 个 | 默认推荐,适合大多数行情、查询、下单、撤单和回调场景。 |
| 极致模式 | CFQUANT_LITE.py |
1 个 | 适合 QMT 对 Python 包导入有限制,或国泰君安、国泰海通等环境。 |
| 高级模式 | CFQUANT.py + CFQUANT_TRADE_LOWLAT.py |
2 个 | 部署复杂,但外部程序到 QMT 内部的下单链路延迟更低。 |
bin.x64,系统会自动复制 cfquant 核心包。
CFQUANT_CTYPE_ALL_LOWLAT.py。
CFQUANT_LITE.py。
CFQUANT_LITE.py,不要求 QMT 侧导入 cfquant 包。
CFQUANT_LITE.py。
qmt_scripts/CFQUANT.py 放到第一个 QMT,将 qmt_scripts/CFQUANT_TRADE_LOWLAT.py 放到第二个安装的 QMT。不要在同一个 QMT 里同时运行这两个脚本;国泰海通无法部署高级模式。
bin.x64,系统会自动复制 cfquant 核心包。
CFQUANT.py,第二个 QMT 启动 CFQUANT_TRADE_LOWLAT.py。
13696119612,服务费 100 元/次。适合同一资金账号拆成上海、深圳两个 QMT 交易端的场景。网页保存一个主账号,交易请求按证券后缀自动分流。
*.SH
走上海 QMT 子桥。
*.SZ
走深圳 QMT 子桥。
批量下单
自动拆成 SH、SZ 两组请求,再合并返回。
bin.x64 目录。_SH.py,深圳 QMT 加载 _SZ.py。| 模式 | 上海 | 深圳 |
|---|---|---|
| 通用 | CFQUANT_CTYPE_ALL_LOWLAT_SH.py |
CFQUANT_CTYPE_ALL_LOWLAT_SZ.py |
| 极致 | CFQUANT_LITE_SH.py |
CFQUANT_LITE_SZ.py |
| 高级交易端 | CFQUANT_TRADE_LOWLAT_SH.py |
CFQUANT_TRADE_LOWLAT_SZ.py |
bridge_id 是内部路由标识。普通用户只需要填写账号和 QMT 目录,Web 会按目录复用或分配通道。
| 场景 | 建议 |
|---|---|
| 单 QMT 单账号 | 使用默认通道 default。 |
| 单 QMT 多账号 | 多个账号可共用同一个 QMT 目录。 |
| 多 QMT 多账号 | 每个账号填写实际登录它的 QMT bin.x64 目录。 |
bridge_id 要和网页绑定状态一致。account_id,不要手动写死 bridge_id。账号绑定是运行配置的核心。每个账号保存自己的账户类型、QMT 目录、首选模式、启用状态和共享行情源标记。
| 字段 | 说明 |
|---|---|
| 资金账号 | 外部请求按它路由,普通和信用账户要区分账户类型。 |
| QMT 目录 | 填写对应 QMT 的安装目录或 bin.x64,用于自动复制核心包、身份文件和后续更新。 |
| 运行模式 | ctypes、lite、lttx 三选一。 |
| 高级模式第二目录 | 选择高级模式时必须填写另一个 QMT 的安装目录或 bin.x64。 |
| 共享行情源 | 多账号时只选一个稳定账号,避免重复订阅全推行情。 |
交易页适合做实盘前验证:先查资金和持仓,再用小数量测试下单、撤单和回调。
| 能力 | 说明 |
|---|---|
| 单笔下单 | POST /api/order,对应 order_stock。 |
| 批量下单 | POST /api/orders/batch,逐笔提交并合并结果。 |
| 撤单 | POST /api/cancel,委托状态仍以 QMT 和回调为准。 |
| 信用查询 | 支持信用资产、标的、担保品、合约等只读探测。 |
| 回调 | GET /api/callbacks 或 WS /ws/callbacks 接收委托、成交和错误事件。 |
延迟只表示本机程序到 QMT 脚本的链路量级,不代表券商柜台或交易所确认速度。实际结果会受 QMT 版本、券商环境、机器负载和交易时段影响。
| 链路 | 查询量级 | 下单请求样本 | 适合场景 |
|---|---|---|---|
| 通用 ctypes | 约 180-260 ms | 约 20 ms | 部署简单、功能验证、多账号日常使用。 |
| 高级普通端 | 约 250 ms | 约 176 ms | 查询、行情、账号级回调。 |
| 高级极速交易端 | 约 1-4 ms | 约 1 ms | 追求更低本机到 QMT 下单链路。 |
“接口”页就是在线调试台。外部程序接入前,先在这里跑通同一个账号和参数。
curl -H "X-API-Key: your-api-key" ^ "http://127.0.0.1:8765/api/account?account_id=YOUR_ACCOUNT_ID§ions=asset,positions&force=1"
启用 API Key 后,HTTP 使用 X-API-Key 请求头;WebSocket 使用 apikey 查询参数。
| 接口 | 用途 |
|---|---|
GET /api/account | 资金、持仓、委托、成交。 |
POST /api/order | 单笔下单。 |
POST /api/orders/batch | 批量下单。 |
POST /api/cancel | 撤单。 |
POST /api/data/full-tick | 实时 Tick。 |
POST /api/data/market | K 线和行情数据。 |
POST /api/data/history/download | 历史行情下载。 |
POST /api/data/financial | 财务数据读取。 |
GET /api/callbacks | 读取交易回调。 |
WS /ws/callbacks | 实时交易回调。 |
WS /ws/quotes | 实时行情事件。 |
按层排查最快:先确认 Web 能访问,再看本地服务,再看 QMT 脚本,最后看账号和权限。
| 现象 | 优先检查 | 处理 |
|---|---|---|
| 网页打不开 | Web 端口、启动日志 | 重启服务,查看 log/cfquant_web_server.stderr.log。 |
| QMT 离线 | 入口脚本、QMT 登录、bridge_id |
重启 QMT 入口,确认加载了当前模式对应脚本。 |
| 高级模式缺交易端 | 第二个 QMT 目录、CFQUANT_TRADE_LOWLAT.py |
在绑定页补充极速交易端目录并重新保存。 |
| 查不到账号数据 | 账号类型、QMT 登录账号、绑定目录 | 在绑定页点击验证,确认资金和持仓来自预期账号。 |
| 下单失败 | 确认文本、价格数量、权限、回调错误 | 先小数量测试,再查看回调页和 QMT 日志。 |
| 版本或缓存异常 | 前端版本、浏览器缓存 | 重启 Web 后用 Ctrl + F5 强制刷新。 |