本页说明如何使用 MT5 实时行情数据 API,以及如何按需动态增加交易对。数据链路:MT5 终端 → 采集网关 → 采集+存储(SQLite)→ 数据服务(本面板)。
两个入口等价,推荐内网直连 109:
你当前从这个入口打开: …(下面所有示例地址已自动按此入口生成)
| 入口 | 地址 | 适用 |
|---|---|---|
| 公共域名 (HTTPS) | https://mt5.9cat.win | 外网程序/智能体。仅只读行情 + 加/删品种, 无任何交易权限 |
| 直连采集机 | http://192.168.2.109:51243 | 内网程序(最快, 单线程勿并发轰炸, 全端点) |
| 面板代理 | http://192.168.2.238:51430 | 内网面板代理, 带 2s 缓存 |
| 端点 | 说明 |
|---|---|
GET /price | 全部追踪品种最新 tick(bid/ask/age/market_open) |
GET /price/{symbol} | 单品种 + 点差。美股要带后缀,如 TSLA.NAS GME.NYS |
GET /price/{symbol}/history?limit=N | tick 历史 |
GET /bars/{symbol}/{tf}?count=N | OHLCV K线,tf = M1/M5/M15/H1/H4/D1。非主力品种只有 M1 |
GET /bars/{symbol}/{tf}/latest?count=N | 最新 N 根(本页迷你走势就用 count=60 的 close) |
GET /health | 链路健康 + DB 统计 |
GET /stats | 采集速率 |
GET /account /positions | 账户/持仓(TMG demo 30009177) |
GET /symbols/tracked | 当前追踪品种清单(≈ 即 /price 返回的那些) |
GET /symbols | MT5 网关全部 453 可见品种(含未追踪) |
想要新的美股/外汇/商品数据?不用改代码、不用重启,一条 HTTP POST,约 60 秒后 tick+M1 K线自动开始入库。
curl -X POST BASE/symbols/add \
-H 'Content-Type: application/json' \
-d '{"symbols": ["AAPL.NAS", "SPY.NYS"]}'
或公共域名 HTTPS:
curl -X POST BASE/api/symbols/add \
-H 'Content-Type: application/json' \
-d '{"symbols": ["AAPL.NAS"]}'
参数 symbols 接受数组或单个字符串。美股可省略后缀("TSLA" 自动匹配 TSLA.NAS,前提是无歧义)。
返回示例:
{
"added": ["AAPL.NAS"], // 本次新增
"already_tracked": [], // 已在追踪
"results": [
{"symbol": "AAPL.NAS", "ok": true},
{"symbol": "INTC.NAS", "ok": false,
"reason": "tick is zeros (Market Watch not enabled on MT5 terminal)"}
],
"note": "capture.py hot-reloads symbols.txt every 60s..."
}
/pricecurl -X POST BASE/symbols/remove \
-H 'Content-Type: application/json' \
-d '{"symbols": ["AAPL.NAS"]}'
立即停止采集(60s 内),历史数据保留。
import requests
BASE = "BASE"
# 1. 加一个美股(自动校验+热加载)
r = requests.post(f"{BASE}/symbols/add", json={"symbols": ["TSLA.NAS"]})
print(r.json()) # {'added': ['TSLA.NAS'], ...}
# 2. 等 70 秒后取数据
import time; time.sleep(70)
tick = requests.get(f"{BASE}/price/TSLA.NAS").json() # bid/ask
bars = requests.get(f"{BASE}/bars/TSLA.NAS/M1/latest?count=60").json()
closes = [b["close"] for b in bars["bars"]] # 迷你走势数据源
# 3. 查当前追踪清单
tracked = requests.get(f"{BASE}/symbols/tracked").json()["tracked"]
mt5_time 是经纪商时钟(快 UTC 约 3h,仅作序列号用);判断新鲜度用 age/captured_at(109 本地钟,可信)market_open:false 属正常last 恒为 0、volume 恒为 0 — 网关只给 bid/ask(点差报价源)Windows .25 (MT5终端+网关:51423)
│ HTTP poll (9-30 品种 × 1s)
▼
TK-109 capture.py (tick 1s / bar 60s / account 10s → SQLite 1.4G+)
mt5-api.py :51243 (REST + symbols/add|remove 动态管理)
│
▼
TK-238 mt5-dashboard :51430 (本面板, Go, 3s 缓存快照)
└ /api/symbols/add|remove|tracked (代理到109)
└ /docs (本页)
MT5 data service v1.3.0 · 2026-10-30