基于 QMT(miniQMT)的 A 股量化交易执行框架。框架搭骨架,策略你来写。
- 信号接入:HTTP API + WebSocket 双通道,断线自动重连 + 心跳保活
- 队列调度:消费者池并行处理新信号,ticker 周期推进存量任务
- QMT 适配:封装 xtquant 的下单/撤单/查询/行情,统一异常处理 + 自动重连
- 通知抽象:Notifier 接口,钉钉/企微/飞书/邮件自己实现一个
push()就接上 - 策略插件化:继承
BuyStrategy/SellStrategy,注册到引擎即可 - 开箱即用:自带一套功能完整的默认策略,改 config 就能跑实盘
| 策略 | 文件 | 说明 |
|---|---|---|
| 分档累积买入 | default/accumulate_buy.py |
按涨幅分流:抢买/首笔保底+回撤加仓/等回落,带撤单重挂 |
| 高开止盈 | default/open_high_sell.py |
9:30:02 并发池抢卖高开票 |
| 分档盈利止盈 | default/profit_tier_sell.py |
涨幅达标分档卖出,实时查持仓防超卖 |
- Windows(QMT 只支持 Windows)
- Python 3.8+(推荐用 QMT 自带的 Python)
- miniQMT 已登录运行
- xtquant(QMT 自带 SDK,无需 pip 安装)
git clone https://github.com/lotey/lite-qmt-executor.git
cd lite-qmt-executor
pip install -r requirements.txt编辑 app/config.py:
# 必填
QMT_PATH = r'D:\你的券商QMT\userdata_mini'
ACCOUNT_ID = '你的资金账号'
# 可选:WebSocket 信号网关(不需要就保持 None)
GATEWAY_HOST = None
GATEWAY_PORT = None
GATEWAY_TOKEN = Nonepython main.py或双击 qmt-run.bat。
curl -X POST http://localhost:30015/api/buy \
-H "Content-Type: application/json" \
-d "{\"code\":\"sz000001\"}" 外部信号
ws_server ──┐ ┌── http_server
│ │
▼ ▼
┌─────────────────────────────────┐
│ TradingEngine │
│ │
│ ┌────────┐ ┌──────────┐ │
│ │ Broker │ │ Notifier │ │
│ └────────┘ └──────────┘ │
│ │
│ ┌───────────────────────────┐ │
│ │ BuyEngine(调度骨架) │ │
│ │ signal_queue → 消费者池 │ │
│ │ ticker 周期扫存量 │ │
│ └──────────┬────────────────┘ │
│ ▼ │
│ BuyStrategy(你写) │
│ │
│ ┌───────────────────────────┐ │
│ │ SellEngine(调度骨架) │ │
│ └──────────┬────────────────┘ │
│ ▼ │
│ SellStrategy(你写) │
└─────────────────────────────────┘
并发模型:
- 新信号首评估:并行(8 worker 线程池)
- 存量任务推进:串行(5 秒一轮 ticker)
- 卖出策略:各自独立线程,互不阻塞
lite-qmt-executor/
├── main.py # 装配入口(改这里注册你的策略)
├── qmt-run.bat # Windows 启动脚本
├── requirements.txt
├── app/
│ ├── config.py # 所有配置项
│ ├── core/
│ │ ├── broker.py # QMT 券商适配层
│ │ ├── notifier.py # 通知器接口 + 默认实现
│ │ └── trading_engine.py # 引擎装配
│ ├── engine/
│ │ ├── buy_engine.py # 买入调度骨架
│ │ └── sell_engine.py # 卖出调度骨架
│ ├── server/
│ │ ├── http_server.py # Flask HTTP API
│ │ └── ws_server.py # WebSocket 客户端
│ └── strategy/
│ ├── buy_strategy.py # BuyStrategy 抽象类
│ ├── sell_strategy.py # SellStrategy 抽象类
│ └── default/ # 默认策略实现
│ ├── accumulate_buy.py
│ ├── open_high_sell.py
│ └── profit_tier_sell.py
└── doc/
├── 定制开发指南.md # ⭐ 二开必读
└── qmt实盘调试文档.md
| 方法 | 路径 | 说明 |
|---|---|---|
POST |
/api/buy |
买入信号入队 {code, sentCode, strategy} |
GET |
/api/tasks |
查当前买入任务状态 |
POST |
/api/sell |
手动卖出 {code, volume, price} |
GET |
/api/positions |
查持仓 |
GET |
/api/orders |
查委托 |
GET |
/api/account |
查账户 |
POST |
/api/cancel/<order_id> |
撤单 |
GET |
/health |
健康检查 |
按改动量从小到大:
| 档位 | 做什么 | 难度 |
|---|---|---|
| 不改 | 默认策略 + 改 config 直接跑 | ⭐ |
| 调参数 | 改 config.py 里的阈值/金额/档位 |
⭐ |
| 换通知 | 实现 Notifier.push() 接钉钉/企微 |
⭐⭐ |
| 写策略 | 继承 BuyStrategy/SellStrategy |
⭐⭐⭐ |
详见 doc/定制开发指南.md,含完整代码模板和常见问题。
配置 GATEWAY_HOST / GATEWAY_PORT / GATEWAY_TOKEN 三个都填了才启动 WebSocket 客户端。
重连策略:
- 从未连上过:连续失败 3 次放弃(配置错误早发现)
- 曾经连上过:永不放弃,持续重连(网络抖动自动恢复)
不配置 WebSocket 也能用——HTTP API 始终可用,curl 发信号一样跑。
- 买入默认关闭:
BUY_ENABLED = False,调试确认无误后改为True再接实盘信号 - xtquant 不要 pip 安装。用 QMT 客户端自带的 SDK,broker.py 会自动加载
- 首次启动如果 QMT 连接失败,会自动重试一次(间隔
QMT_RECONNECT_INTERVAL秒) - 非交易时段(9:00 前 / 15:00 后)信号自动丢弃,策略不会空转
- 单实例锁:同一台机器不能重复启动,第二个进程会直接退出
本项目仅供学习和技术研究使用,不构成任何投资建议。
- 股票交易存在风险,使用本软件进行实盘交易造成的任何损失,由使用者自行承担
- 作者不对代码的正确性、稳定性、实时性做任何保证
- 使用前请充分了解 A 股交易规则、QMT 接口特性,并在小资金下充分测试
- 本项目与任何券商、交易所无关,不提供任何金融服务
- 请遵守所在地区的法律法规,合规使用
使用本软件即表示你已理解并接受以上风险。