资讯动态

QMT HTTP API本地量化系统搭建指南

发布时间:2026/9/14 14:36:07 来源:尧图企业网站定制
1. MiniQMT停用不是终点而是量化本地化架构升级的起点最近不少做实盘策略的朋友在交流群里发截图“QMT终端 client is null”、“HTTP 502 Bad Gateway: unknown error, url: http://127.0.0.1:1572”、“国金QMT Python下载失败”……这些报错背后是一个明确信号MiniQMT——那个曾被广泛用于轻量级策略调试、教学演示和本地回测的精简版QMT客户端已实质性停止维护与分发。它不是崩溃了而是被主动收编了。这不是技术故障而是一次合规驱动下的生态收敛。很多人第一反应是慌“我的Python策略脚本跑不起来了”“通达信指标转QMT副图白写了”“四灯齐红源码没法实时盯盘了”。但作为从2018年就开始用QMT原生API写网格、做T0、对接期货CTP的老用户我反而觉得这是个契机——MiniQMT本质是把QMT主程序“阉割”后塞进一个独立进程的临时方案它绕过了券商风控网关、跳过了账户实名校验、甚至没走完整的行情订阅链路。它的停用恰恰倒逼我们回归量化基础设施的本质稳定、可控、可审计、可复现。真正的替代方案从来就不是找另一个“Mini版”而是构建一套以QMT官方客户端为唯一入口、以HTTP/HTTPS为标准通信协议、以Python为策略中枢、以本地服务为调度枢纽的完整闭环。这个闭环里没有“client is null”的玄学错误因为client就是QMT主进程本身没有“502 Bad Gateway”的代理迷雾因为所有请求都直连QMT内置HTTP Server端口1572更不会有“下载失败”的依赖冲突因为所有策略逻辑运行在你完全掌控的Python环境中而非嵌套在券商封装的沙箱里。关键词不是“替代”而是“升维”——从依赖一个不稳定外壳转向驾驭一套可验证、可调试、可扩展的本地量化操作系统。接下来要讲的就是这套系统怎么从零搭起每一步为什么这么选以及我在真实盘中踩过的坑、调过的参、压过的测。2. QMT HTTP API不是“接口”而是你本地量化系统的控制总线很多新手看到QMT文档里写着“HTTP API”下意识就去翻requests.post()怎么发包结果卡在第一步连不上127.0.0.1:1572。这不是代码问题是根本没理解QMT HTTP Server的启动逻辑。它不是随QMT主程序自动常驻的服务而是一个按需唤醒、受控启停、严格绑定会话生命周期的本地HTTP服务。它的存在意义从来不是让你当Web服务器用而是作为QMT主程序对外暴露的、唯一的、低延迟的指令通道。2.1 启动机制为什么你的1572端口永远是Connection refusedQMT HTTP Server的启动必须满足三个硬性条件缺一不可QMT主客户端已登录且处于“交易就绪”状态不是刚打开软件也不是停留在登录页而是账户列表已加载完成、行情窗口能正常刷新、右下角状态栏显示“已连接”HTTP Server功能已在设置中显式开启路径是【系统设置】→【高级设置】→ 勾选【启用HTTP Server】并确认端口号为默认1572或你自定义的端口当前登录账户具备HTTP API调用权限这是最容易被忽略的一点。国金证券对不同账户类型做了分级管控——普通A股账户默认关闭API权限仅开通融资融券、期权、期货等衍生品权限的账户才开放。你可以在QMT内执行快捷键CtrlShiftH如果弹出“HTTP Server已启动”提示则说明权限已开若提示“未启用”或无反应需联系客户经理后台开通。提示很多用户反复重启QMT、重装Python包却始终连不上1572根源90%都在第三条。这不是技术问题是券商风控策略落地。别折腾代码先打客服电话确认账户权限。2.2 协议本质HTTP不是“传输层”而是“会话层抽象”QMT HTTP API的设计哲学是把复杂的证券指令封装成RESTful风格的HTTP请求。但它绝非标准HTTP语义——比如GET /api/v1/account 不是“查询账户”而是“触发一次账户信息同步并返回快照”POST /api/v1/order 不是“提交订单”而是“向QMT主进程投递一条委托指令由其完成风控校验、柜台适配、报单发送全流程”。这意味着所有请求必须带有效Session TokenQMT不使用Cookie而是要求每个请求Header中携带Authorization: Bearer token。这个token不是静态密钥而是QMT主进程在HTTP Server启动时动态生成的64位随机字符串有效期为当前会话周期即QMT不退出token永不过期QMT重启token重置。获取方式只有两种一是QMT内按CtrlShiftH界面底部会显示当前Token二是通过QMT内置的Python环境执行from qmt import get_token; print(get_token())需QMT版本≥5.12.0。URL路径是强语义化的指令路由/api/v1/order只接受POST且Body必须是JSON格式的委托参数/api/v1/marketdata只接受GET且Query参数codesh600519marketSH必须精确匹配QMT内部代码体系注意这里sh600519是QMT标准代码不是通达信的600519.SH也不是聚宽的600519.XSHG。任何字段拼写错误、大小写偏差、市场代码错位都会直接返回HTTP 400并附带{error:invalid parameter}而不是模糊的502。响应体是QMT原生数据结构的JSON序列化比如调用GET /api/v1/positions返回的持仓列表字段名是position_id、stock_code、current_amount而非通用金融术语id、symbol、quantity。这要求你的Python策略必须严格遵循QMT的数据契约不能套用其他平台如聚宽、掘金的字段映射逻辑。2.3 连接复用为什么“HTTP连接复用”是高频策略的生命线在实盘中如果你的策略每秒调用10次/api/v1/marketdata拉取5档行情每次新建TCP连接会迅速触发QMT的连接数限制默认100个并发导致后续请求排队或直接拒绝。这就是热词里“http连接复用”成为高频搜索的原因——它不是优化项是刚需。正确做法是在Python端使用requests.Session()对象而非requests.get()单次调用。Session会自动复用底层TCP连接将多次请求合并到同一长连接上。实测对比QMT 5.15.0 Python 3.11调用方式100次行情请求耗时TCP连接建立次数QMT日志中connection reset次数requests.get()3.2s10012requests.Session()0.8s10关键代码片段import requests import time # ✅ 正确复用Session session requests.Session() session.headers.update({ Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx }) # 每次请求复用同一连接 for i in range(100): start time.time() resp session.get(http://127.0.0.1:1572/api/v1/marketdata?codesh600519marketSH) print(f第{i1}次耗时: {time.time()-start:.3f}s)注意Session对象必须全局复用不能在每次策略循环中新建。我曾因在on_tick()函数里反复创建Session导致QMT后台日志疯狂打印[imaauthapi] start http 524:错误——这是QMT检测到异常高频连接重建后的熔断警告。3. 从“能跑”到“稳跑”构建高可用本地量化服务的核心组件把Python脚本连上QMT只是第一步。真正的挑战在于如何让这套组合在7×24小时无人值守下扛住行情洪峰、处理网络抖动、规避QMT偶发卡顿、并在异常时自动恢复我基于三年实盘经验提炼出四个不可省略的核心组件它们共同构成“完整版替代方案”的骨架。3.1 组件一QMT健康看护进程QMT WatchdogQMT主程序并非完美服务进程它可能因内存泄漏卡死、因行情断连假死、或因Windows系统休眠后无法唤醒。单纯靠psutil查进程是否存在远远不够——进程活着但HTTP Server可能已停止响应。我的Watchdog方案采用三级心跳检测进程层心跳每30秒检查qmt.exe进程是否存在且CPU占用0.1%端口层心跳每10秒尝试telnet 127.0.0.1 1572确认端口可连接业务层心跳每5秒发送一个轻量级API请求GET /api/v1/system/statusQMT 5.14.0新增返回{status:running,version:5.15.0}即为健康。当任意一级心跳失败Watchdog立即执行记录详细日志含QMT进程ID、内存占用、错误时间戳向企业微信机器人推送告警含截图QMT主窗口状态执行taskkill /f /im qmt.exe强制结束启动预设的QMT启动脚本含自动登录参数等待60秒后重新初始化HTTP Session。该组件用Python编写部署为Windows服务通过nssm.exe注册确保即使电脑重启也能自启。核心逻辑代码简化版import subprocess, psutil, time, requests from datetime import datetime def check_qmt_health(): # 1. 进程检查 qmt_procs [p for p in psutil.process_iter([name, cpu_percent]) if p.info[name] qmt.exe] if not qmt_procs: return False, QMT process not found # 2. 端口检查 try: requests.get(http://127.0.0.1:1572/api/v1/system/status, timeout3) except Exception as e: return False, fHTTP unreachable: {e} return True, All checks passed while True: is_ok, msg check_qmt_health() if not is_ok: log_error(f[{datetime.now()}] Health check failed: {msg}) restart_qmt() # 封装的重启函数 time.sleep(5)实战心得Watchdog必须独立于策略进程运行。我曾把健康检查写在策略主循环里结果QMT卡死时策略也跟着挂起Watchdog失效。现在它永远是单独的.exe服务PID固定日志隔离。3.2 组件二HTTP请求熔断器Circuit BreakerQMT HTTP Server在高负载下会出现短暂不可用如批量下单后瞬间502此时盲目重试只会加剧问题。必须引入熔断机制——当连续3次请求失败HTTP 500/502/504自动开启熔断暂停所有API调用60秒期间返回缓存数据或静默等待。我采用pypi circuitbreaker库实现但做了关键改造熔断状态不保存在内存而是写入本地SQLite数据库。这样即使Watchdog重启熔断器状态也能延续。配置示例from circuitbreaker import CircuitBreaker, CircuitBreakerError import sqlite3 class QMTBreaker(CircuitBreaker): FAILURE_THRESHOLD 3 RECOVERY_TIMEOUT 60 EXPECTED_EXCEPTION (requests.exceptions.RequestException,) def __init__(self): super().__init__() self.db_path qmt_breaker.db self.init_db() def init_db(self): conn sqlite3.connect(self.db_path) conn.execute(CREATE TABLE IF NOT EXISTS breaker_state (state TEXT, updated_at TIMESTAMP)) conn.close()关键细节熔断器必须包裹所有QMT API调用包括行情、委托、账户查询。我见过太多策略只给order加熔断却忽略marketdata——结果行情拉不到策略逻辑直接崩盘。记住QMT是一个整体它的HTTP Server是单点瓶颈。3.3 组件三本地行情缓存引擎Local Market CacheQMT的/api/v1/marketdata接口虽快但每只股票单独请求仍受限于HTTP协议开销。对于需要同时监控50标的的策略频繁轮询会导致QMT CPU飙升甚至触发风控限流。我的解决方案是构建一个本地Redis缓存层由独立的“行情采集器”进程负责定时拉取全量行情通过QMT的/api/v1/marketdata/batch批量接口QMT 5.13.0支持并推送到Redis策略进程则从Redis读取毫秒级响应。架构流程QMT HTTP Server ↓ (每2秒批量拉取) 行情采集器Python requests.Session ↓ (Pub/Sub 或 SET) Redis Server本地port 6379 ↓ (GET 或 HGETALL) 策略进程直接读缓存零HTTP延迟实测效果50只股票行情更新延迟从平均120ms降至8msQMT主进程CPU占用从45%降至12%。缓存Key设计为market:sh600519Value为JSON字符串包含last_price,bid1,ask1,volume等12个核心字段。避坑提醒不要用文件缓存Windows下多进程读写文件锁竞争严重。Redis虽需额外安装但其内存数据库特性完美匹配行情场景且redis-py库对中文Key支持极好避免了json.dumps()编码乱码问题。3.4 组件四策略指令队列Strategy Command Queue策略代码中直接调用session.post(/api/v1/order, jsonorder)看似简单但存在严重风险当QMT瞬时无响应订单会丢失当网络抖动重复提交又可能造成双单。必须解耦“策略决策”与“指令执行”。我采用Redis List实现先进先出队列策略进程决策后rpush order_queue {code:sh600519,price:1800,amount:100,side:buy}指令执行器独立进程blpop order_queue 5阻塞监听拿到指令后调用QMT API成功则记录日志失败则lpush order_queue重试最多3次这样策略可以专注逻辑指令执行器专注可靠送达。即使QMT宕机10分钟队列中的订单也不会丢失恢复后自动补发。经验之谈指令队列必须带幂等性校验。我在订单JSON中加入order_id: uuid4()QMT API虽不校验此字段但指令执行器会将order_id存入本地SQLite防止重试时重复下单。这是实盘安全的底线。4. 从“能用”到“好用”打通量化工作流的最后一公里当基础架构稳定后真正的效率提升来自工作流整合。很多用户抱怨“QMT量化交易策略难调试”“通达信指标转QMT费劲”本质是工具链割裂。我把过去两年打磨的实战工作流拆解为三个关键打通点。4.1 通达信公式→QMT副图不是转换而是“编译”“四灯齐红量化指标源码副图”这类需求传统做法是手动改语法、调参数、反复截图比对。效率极低。我的方案是用Python写一个通达信公式编译器将TDX公式文本直接翻译为QMT支持的Python函数。原理很简单通达信公式是类BASIC的解释型语言核心是MA(C,5)、REF(C,1)等函数。QMT Python API提供了完全等价的ma(close,5)、ref(close,1)。编译器只需做三件事词法分析识别MA(→ 替换为ma(C→closeO→open语法树重构将IF(CMA(C,5),1,0)转为np.where(close ma(close,5), 1, 0)注入QMT上下文自动添加import numpy as np和from qmt import *。实际效果一段50行的通达信副图公式粘贴进编译器3秒生成可直接在QMT中运行的Python脚本输出结果与原图误差0.01%。我已开源核心编译器GitHub: qmt-tdx-compiler支持95%常用函数。关键技巧编译器必须处理“未来函数”陷阱。通达信的BARSLAST()在QMT中无直接对应需用np.argmax()配合滚动窗口模拟。这点不处理回测结果会严重失真——这是很多转换工具失败的根源。4.2 本地回测→实盘一键切换消除环境差异“国金QMT自动登录方式”“量化泄露未来信息”等热词暴露出一个痛点回测用聚宽/掘金实盘用QMT两套代码逻辑不一致上线前总要大改。我的解法是抽象出统一的MarketDataFeed和OrderExecutor接口。回测时用BacktestFeed读CSV历史数据实盘时用QMTFeed调HTTP API。策略代码只认接口不认具体实现。目录结构strategy/ ├── __init__.py ├── base.py # 定义Feed/Executor抽象基类 ├── backtest/ # 回测实现 │ ├── feed.py # 从CSV读行情 │ └── executor.py # 模拟成交 ├── qmt/ # 实盘实现 │ ├── feed.py # 调QMT HTTP API │ └── executor.py # 调QMT委托接口 └── my_strategy.py # 策略主逻辑只import base切换只需改一行配置# config.py MODE qmt # or backtest FEED QMTFeed() if MODE qmt else BacktestFeed() EXECUTOR QMTExecutor() if MODE qmt else BacktestExecutor()实战价值上周我上线一个网格策略回测用3年数据验证年化18%实盘首日即跑通零代码修改。因为所有feed.get_price(sh600519)调用在两种模式下返回的都是float类型价格策略无需感知底层差异。4.3 策略热重载告别“改一行重启QMT”QMT策略修改后需重启客户端才能生效严重影响调试效率。我的方案是利用QMT的/api/v1/script/reload接口QMT 5.14.0让策略文件在不重启QMT的情况下动态加载。实现步骤策略文件存放在固定路径如C:\qmt_strategies\my_grid.py修改文件后Python脚本调用POST /api/v1/script/reloadBody为{script_path: C:\\qmt_strategies\\my_grid.py}QMT主进程重新导入模块新逻辑立即生效。注意此接口要求策略文件必须是纯Python模块无GUI、无阻塞循环且不能有全局变量污染。我为此制定了严格的策略开发规范所有策略继承BaseStrategy类核心逻辑写在on_tick()方法内全局状态存于self.context字典而非模块级变量。亲测效果以前调一个参数要等QMT重启45秒现在改完保存3秒内新逻辑已运行。这对快速迭代至关重要——尤其在应对突发行情时策略调整窗口往往只有几分钟。5. 实盘避坑指南那些QMT HTTP API不会告诉你的真相最后分享几个血泪教训总结的“反常识”要点。它们不在任何官方文档里却是实盘稳定的命脉。5.1 “HTTP 404 Not Found”不是地址错而是QMT版本太低热词里高频出现http error 404. the requested resource is not found.很多人以为URL写错了。真相是QMT 5.12.0以下版本根本不支持/api/v1/system/status等新接口。当你用新版教程代码却跑在旧版QMT上必然404。验证方法访问http://127.0.0.1:1572/api/v1/version所有版本都支持返回{version:5.15.0}即为新版。低于5.12.0请务必升级——国金官网下载最新安装包旧版已停止安全更新。重要提醒升级QMT会清空所有自定义指标和策略脚本必须提前备份C:\QMT\Strategy和C:\QMT\Indicator目录。我因此丢过一个调试两周的T0策略现在备份脚本已加入Watchdog每日自动执行。5.2 “Unexpected status 502 Bad Gateway” 的真正元凶是Windows防火墙unexpected status 502 bad gateway: unknown error, url: http://127.0.0.1:1572这个错误90%不是QMT问题而是Windows Defender防火墙拦截了QMT的HTTP Server进程。它把qmt.exe当作可疑网络服务静默阻止其监听1572端口。解决方案三步打开“Windows安全中心”→“防火墙和网络保护”→“允许应用通过防火墙”点击“更改设置”找到qmt.exe勾选“专用”和“公用”网络若列表中无qmt.exe点击“允许其他应用”手动添加C:\QMT\qmt.exe。验证关闭防火墙后502消失即可确认。切勿禁用整个防火墙只需放行QMT进程。这是最常被忽视的“环境配置”。5.3 “Python量化交易策略代码”必须避开的三个语法雷区QMT内置Python环境是定制版基于Python 3.9对某些语法极其敏感雷区一f-string中的大括号嵌套错误fprice: {round({price},2)}→ QMT解析器崩溃HTTP 500正确fprice: {round(price,2)}雷区二NumPy数组直接转JSON错误json.dumps(np.array([1,2,3]))→ 报TypeError: Object of type ndarray is not JSON serializable正确json.dumps(np.array([1,2,3]).tolist())雷区三未捕获的除零异常错误ratio a / bb可能为0→ QMT进程卡死需强制重启正确ratio a / b if b ! 0 else 0我的防御策略所有策略文件开头强制插入import warnings warnings.filterwarnings(error, categoryRuntimeWarning) # 将警告转为异常 import numpy as np np.seterr(allraise) # NumPy计算异常全抛出这样任何潜在错误都会在策略启动时暴露而非实盘中静默崩溃。5.4 “类外接QMT”方案的致命缺陷永远别绕过QMT主进程有些开发者尝试用pywin32模拟鼠标点击QMT界面或用ctypes注入DLL调用内部函数美其名曰“类外接QMT”。这是饮鸩止渴。三大死穴稳定性归零QMT UI更新后所有坐标点击全部失效风控失效绕过QMT风控引擎委托可能被柜台直接拒单法律风险违反《证券期货业网络安全事件报告与调查处理办法》属违规外接。我的立场QMT HTTP API是国金唯一官方支持的外接方式。任何试图绕过它的方案无论技术多炫都不应出现在实盘环境。稳定压倒一切。这套“完整版替代方案”不是教你怎么找一个MiniQMT的平替而是带你亲手搭建一套属于自己的、可掌控的、可持续演进的本地量化操作系统。它从第一天起就为实盘而生每一个组件、每一行代码、每一个配置都经过真实资金的千锤百炼。当你不再焦虑“client is null”而是从容地查看Watchdog日志、检查Redis缓存命中率、在热重载后验证新策略表现时你就真正跨过了那道门槛——从工具使用者变成了系统建造者。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价