by 雪隐 from juejin.cn/user/143341...
欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可联系授权。
给量化交易加个"外挂"------用 Flask 把 MiniQMT 变成 REST API
前言:一切为了给 OpenClaw 当"小弟"
先交代一下背景:我后面会跟大家介绍一个叫 OpenClaw 的东西,功能贼强,强到我想给它单独搞一个隔离环境(怕它造反)。为了让 OpenClaw 能优雅地指挥我的股票账户,我需要一个 HTTP API 当翻译官------OpenClaw 发个 GET 请求,我的 MiniQMT 就乖乖去干活。
所以就有了这个项目:基于 Flask 把 xtquant 的行情+交易接口包装成 RESTful API。
⚠️ 重要警告(敲黑板)
这个接口可以直接操作你的股票账户------下单、撤单、查持仓、转钱(如果开放的话)。
千万不要把它暴露到公网! 老老实实在自己家内网玩。
万一被黑客盯上,他不仅能偷走你的钱,还可能顺手帮你全仓买入"退市概念股"......那画面太美我不敢看。
一、这玩意儿能干啥?
一句话:让你的其他程序(前端、脚本、手机 App,甚至家里的小爱同学)都能通过 HTTP 请求调取股票数据、甚至下单交易。
核心功能清单
行情类(不用登录也能用)
| 接口 | 方法 | 说明 |
|---|---|---|
/api/quote |
GET | 查单只股票实时行情 |
/api/quotes |
POST | 批量查(最多50只,多了怕你网卡) |
/api/history |
GET | 历史K线(日线/分钟线都行) |
交易类(需要先登录QMT客户端)
| 接口 | 方法 | 说明 |
|---|---|---|
/api/order |
POST | 下单(代码里默认禁用了,怕你手滑) |
/api/cancel |
POST | 撤单(同上,保险起见先关着) |
/api/orders |
GET | 查当日订单(看看自己冲动了几次) |
/api/positions |
GET | 查持仓(绿油油的持仓就不展示了) |
/api/account |
GET | 查账户资产(看一次心痛一次) |
其他(彩蛋)
| 接口 | 方法 | 说明 |
|---|---|---|
/api/financial |
GET | 查财务指标(帮你避雷) |
/api/health |
GET | 健康检查(类似"还活着吗?") |
二、代码里的几个"心机"设计
1. 交易接口的延迟初始化(懒汉模式)
python
def _get_trader_and_account():
global _trader, _account_info
if _trader is None:
with _trader_lock:
if _trader is None:
from xtquant import xttrader
path = r'<miniqmt软件安装位置>'
_trader = xttrader.XtQuantTrader(path, int(time.time()))
_trader.start()
# ... 连接和订阅逻辑
为什么这么写?
因为很多人(包括我)启动 Flask 服务的时候,QMT 客户端还没登录。如果一上来就初始化交易接口,它会报错然后闹脾气。
所以我们搞了个 "你什么时候叫我,我什么时候连" 的懒加载模式,还加了双重锁,防止多线程下重复初始化------这叫 线程安全的单身狗模式。
2. 股票代码自动补全(妈妈再也不用担心我写 .SH 还是 .SZ)
python
def _code_with_market(code):
code = str(code).strip()
if '.' in code:
return code
if code.startswith('6'):
return f"{code}.SH"
return f"{code}.SZ"
逻辑很简单:
- 6 开头 → 上海(.SH)
- 0 或 3 开头 → 深圳(.SZ)
- 你非要在代码里写
600519.SZ?那我也认,直接返回原样。
示例:
输入 600519 → 输出 600519.SH(茅台,永远的神)
输入 000001 → 输出 000001.SZ(平安银行,老牌蓝筹)
3. 实时行情接口(一次性把家底都给你)
python
@app.route('/api/quote', methods=['GET'])
def get_quote():
ticks = xtdata.get_full_tick([full_code])
t = ticks[full_code]
# 返回 price, change_pct, volume, amount, high, low, open, close, pe, pb 等
get_full_tick 这个函数很实在,一次返回几十个字段:现价、涨跌幅、成交量、成交额、最高、最低、开盘、昨收、市盈率、市净率......
就差告诉你"这家公司老板今天吃啥了"。
三、试试看:调用示例
启动服务后(默认端口 8080),你可以用浏览器或 curl 测试。
获取贵州茅台实时行情:
bash
curl "http://localhost:8080/api/quote?code=600519"
返回(大概长这样):
json
{
"code": "600519.SH",
"price": 1685.00,
"change_pct": 0.82,
"volume": 123456,
"amount": 2.08e8,
"pe": 28.5,
"pb": 9.2
}
获取历史K线(日线,从今年元旦到今天):
bash
curl "http://localhost:8080/api/history?code=600519&period=1d&start=20240101&end=20240601"
返回是一堆 [时间, 开, 高, 低, 收, 成交量] 的数组,适合直接画 K 线图。
四、技术栈 & 启动方式
- Web 框架:Flask(轻量级,启动快,适合这种小服务)
- 数据源:xtquant(MiniQMT 的 Python API,券商提供的正规军)
- 默认端口 :
8080(你可以在代码里改成别的,只要不跟别的服务打架)
启动命令
bash
python app.py
启动后你会看到类似输出:
csharp
* Serving Flask app 'app'
* Running on http://0.0.0.0:8080
注意:行情接口不需要 QMT 客户端登录就能用,但交易相关接口(查询持仓、下单等)需要你先打开 QMT 客户端并登录,否则会报"未连接"。
五、完整代码
代码已经传到 Gitee,结构清晰,注释详细,下载即用(当然你得先装好 xtquant 和 Flask)。
写在最后
如果你觉得这篇文章帮你省了(或者赚了)几顿饭钱,请点赞、评论、转发------你的支持是我继续写"OpenClaw 调教指南"的动力。
最后再唠叨一遍:
不要把这个接口暴露到公网! 内网用用就挺好。
万一哪天你的智能音箱被黑,黑客对着它喊一声"全仓买入某股票",那你家的资产瞬间就变成 NFT 了------不可替代,但可以归零。
谢谢大家 🙏
祝你们写的代码一次跑通,买的股票天天涨停。