AI股票小助手05-用 Flask 把 MiniQMT 变成 REST API

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 了------不可替代,但可以归零。

谢谢大家 🙏

祝你们写的代码一次跑通,买的股票天天涨停。

相关推荐
Elastic 中国社区官方博客5 小时前
搜索倍增器:推动收入、生产力和 AI 实现规模化
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
wjkjpcba5 小时前
机器人控制板PCBA怎么加工?从SMT贴片到BGA焊接解析机器人电子制造工艺
大数据·人工智能
青 春 记 忆5 小时前
Dify Docker Compose 通用无损升级指南:从备份、双版本预演到切换与回滚
运维·人工智能·python·docker·容器
小猪妈咪爱学法5 小时前
欧盟最新发布《AI数字综合法案(Digital Omnibus‑on‑AI,AI综合修订法案)
人工智能·网络安全
ZGIAI6 小时前
ZGI Workflow 变量池:接住节点输出
人工智能·架构
梵构广告6 小时前
提升品牌识别度有哪些方法?
人工智能
ZGIAI6 小时前
ZGI 记忆隔离:多人共用不串号
人工智能·架构
东风破_6 小时前
从输入 juejin.cn 到看到页面:DNS、Nginx、服务器集群与 CDN 到底在做什么?
后端·mysql
东风破_6 小时前
从 0 设计一个博客数据库:用户、头像与文章表应该怎么建?
后端·mysql
星栈独行6 小时前
决定 Agent 交付下限的「操作系统」:Harness 六层架构拆解
人工智能·架构