fix(qmt): 修复交易模块核心缺陷
- 修复重复的重连逻辑代码块,避免重复连接 - 修复卖出逻辑:增加实盘持仓校验,一切以实盘为准 - 修复幽灵持仓自动清理机制 - 修复消息处理的静默异常,添加完整日志记录 - 统一 qmt 模块所有静默处理问题 - 添加 qmt_signal_sender.py 信号发送器 - 生成 TODO_FIX.md 缺陷修复任务清单
This commit is contained in:
@@ -6,6 +6,8 @@ QMT 模块是 NewStock 量化交易系统的实盘交易执行模块,通过 `x
|
||||
|
||||
系统核心特性包括:多终端并行管理、异步订单处理、断线自动重连、收盘自动清算、实时心跳检测等。所有交易信号通过 Redis 消息队列接收,确保交易指令的可靠传递和执行。
|
||||
|
||||
系统分为**信号发送端**和**交易执行端**两部分。信号发送端(`qmt_signal_sender.py`)运行在聚宽策略环境中,将策略产生的买卖信号推送至 Redis 队列;交易执行端(`qmt_engine.py` + `run.py`)运行在本地,从 Redis 消费信号并通过 QMT 终端执行实盘交易。
|
||||
|
||||
## 2. 核心组件
|
||||
|
||||
### 2.1 文件结构
|
||||
@@ -15,6 +17,7 @@ QMT 模块是 NewStock 量化交易系统的实盘交易执行模块,通过 `x
|
||||
| [`run.py`](run.py) | 系统启动入口,负责初始化多终端管理器并启动 API 服务 |
|
||||
| [`qmt_engine.py`](qmt_engine.py) | 核心引擎模块,包含多终端管理器和交易执行单元 |
|
||||
| [`qmt_trader.py`](qmt_trader.py) | 旧版单终端交易引擎(保留兼容) |
|
||||
| [`qmt_signal_sender.py`](qmt_signal_sender.py) | 信号发送端,运行于聚宽策略侧,将交易信号推送至 Redis 队列 |
|
||||
| [`api_server.py`](api_server.py) | FastAPI Web 服务,提供 RESTful API 接口 |
|
||||
| [`dashboard.html`](dashboard.html) | Web 仪表盘前端页面 |
|
||||
| [`start.bat`](start.bat) | Windows 启动脚本 |
|
||||
@@ -215,9 +218,108 @@ Web 仪表盘基于 Vue 3 和 Naive UI 组件库开发,提供可视化的系
|
||||
|
||||
仪表盘默认访问地址为 `http://localhost:8001`,该地址在系统启动时打印在控制台。首次访问时会自动加载所有终端状态、持仓信息和系统日志。
|
||||
|
||||
## 7. 系统架构
|
||||
## 7. 信号发送端(qmt_signal_sender.py)
|
||||
|
||||
### 7.1 组件关系图
|
||||
### 7.1 模块定位
|
||||
|
||||
`qmt_signal_sender.py` 是 QMT 交易系统的**信号生产端**,部署在聚宽(JoinQuant)策略运行环境中。它负责将策略产生的买卖信号序列化后推送到 Redis 队列,由本地 QMT 交易引擎消费并执行。该模块是连接"策略研究/回测平台"与"实盘交易执行"的桥梁。
|
||||
|
||||
### 7.2 核心函数
|
||||
|
||||
#### `send_qmt_signal(code, target_total_slots, price, context, redis_config)`
|
||||
|
||||
| 参数 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `code` | str | 股票代码,聚宽格式(如 `000001.XSHE`、`600519.XSHG`) |
|
||||
| `target_total_slots` | int | 目标总槽位数。大于 0 表示买入意图,等于 0 表示卖出(清仓)意图 |
|
||||
| `price` | float | 当前最新价格,用于实盘限价单参考 |
|
||||
| `context` | object | 聚宽上下文对象,提供 `run_params.type`(运行类型)和 `current_dt`(当前时间) |
|
||||
| `redis_config` | dict | Redis 连接配置,包含 `host`、`port`、`password`、`db`、`strategy_name` 等字段 |
|
||||
|
||||
### 7.3 处理流程
|
||||
|
||||
```
|
||||
策略触发信号
|
||||
│
|
||||
▼
|
||||
1. 环境判断与流量控制
|
||||
├─ 实盘模式 → 直接通过
|
||||
└─ 回测模式 → 限制最多发送 10 条(防止回测刷爆队列)
|
||||
│
|
||||
▼
|
||||
2. 建立 Redis 连接(socket_timeout=1s)
|
||||
│
|
||||
▼
|
||||
3. 数据转换与规范化
|
||||
├─ 股票代码格式转换:.XSHE → .SZ,.XSHG → .SH
|
||||
└─ 动作判定:target_total_slots > 0 → BUY,= 0 → SELL
|
||||
│
|
||||
▼
|
||||
4. 构建 JSON 消息体
|
||||
│
|
||||
▼
|
||||
5. 队列路由
|
||||
├─ 回测 → {strategy_name}_backtest(TTL: 1 小时)
|
||||
└─ 实盘 → {strategy_name}_real(TTL: 7 天)
|
||||
│
|
||||
▼
|
||||
6. 控制台日志输出
|
||||
```
|
||||
|
||||
### 7.4 消息格式
|
||||
|
||||
发送到 Redis 队列的 JSON 消息结构:
|
||||
|
||||
```json
|
||||
{
|
||||
"strategy_name": "my_strategy",
|
||||
"stock_code": "000001.SZ",
|
||||
"action": "BUY",
|
||||
"price": 15.50,
|
||||
"total_slots": 5,
|
||||
"timestamp": "2026-02-17 14:30:00",
|
||||
"is_backtest": false
|
||||
}
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `strategy_name` | str | 策略名称,来自 `redis_config['strategy_name']`,用于队列路由和持仓管理 |
|
||||
| `stock_code` | str | QMT 格式的股票代码(`.SZ` / `.SH`) |
|
||||
| `action` | str | 交易动作,`BUY` 或 `SELL` |
|
||||
| `price` | float | 信号触发时的最新价格 |
|
||||
| `total_slots` | int | 策略的总槽位数(BUY 时为策略设定值,SELL 时为 0) |
|
||||
| `timestamp` | str | 信号生成时间,格式 `YYYY-MM-DD HH:MM:SS` |
|
||||
| `is_backtest` | bool | 是否为回测环境发出的信号 |
|
||||
|
||||
### 7.5 买卖意图判定逻辑
|
||||
|
||||
信号发送端不直接区分"买入函数"和"卖出函数",而是通过 `target_total_slots` 参数的值进行语义推断:
|
||||
|
||||
- **`target_total_slots > 0`**(BUY):策略意向持有该股票,`total_slots` 传递策略的总持仓上限,供交易引擎计算单只股票的资金分配。
|
||||
- **`target_total_slots = 0`**(SELL):策略意向清仓该股票,释放所占槽位。
|
||||
|
||||
### 7.6 回测流量控制
|
||||
|
||||
模块级全局变量 `_BACKTEST_SEND_COUNT` 用于限制回测模式下的信号发送数量,上限为 10 条。这一机制防止长周期回测期间大量无效信号涌入 Redis 队列,回测队列的 TTL 也相应缩短为 1 小时(实盘为 7 天)。
|
||||
|
||||
### 7.7 队列命名规则
|
||||
|
||||
| 运行模式 | 队列名格式 | TTL |
|
||||
|----------|-----------|-----|
|
||||
| 实盘 | `{strategy_name}_real` | 604800 秒(7 天) |
|
||||
| 回测 | `{strategy_name}_backtest` | 3600 秒(1 小时) |
|
||||
|
||||
### 7.8 股票代码格式转换
|
||||
|
||||
| 来源平台 | 格式 | 示例 |
|
||||
|----------|------|------|
|
||||
| 聚宽 | `.XSHE` / `.XSHG` | `000001.XSHE`、`600519.XSHG` |
|
||||
| QMT | `.SZ` / `.SH` | `000001.SZ`、`600519.SH` |
|
||||
|
||||
## 8. 系统架构
|
||||
|
||||
### 8.1 组件关系图
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
@@ -254,14 +356,17 @@ Web 仪表盘基于 Vue 3 和 Naive UI 组件库开发,提供可视化的系
|
||||
└─────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 7.2 数据流向图
|
||||
### 8.2 数据流向图
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ 数据流向 │
|
||||
├─────────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 策略信号 ──> Redis 队列 ──> 消息处理循环 ──> 槽位检查 ──> 资金检查 │
|
||||
│ 聚宽策略 ──> qmt_signal_sender ──> Redis 队列 ──> 消息处理循环 │
|
||||
│ (信号发送端) {strategy}_real │ │
|
||||
│ ▼ │
|
||||
│ 槽位检查 ──> 资金检查 │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ 订单执行 (QMT API) │
|
||||
@@ -284,7 +389,7 @@ Web 仪表盘基于 Vue 3 和 Naive UI 组件库开发,提供可视化的系
|
||||
└─────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 7.3 消息处理流程
|
||||
### 8.3 消息处理流程
|
||||
|
||||
1. **消息接收**:系统从 Redis 队列 `{strategy_name}_real` 中取出消息
|
||||
2. **消息解析**:将 JSON 消息解析为结构化数据,验证必填字段
|
||||
@@ -295,9 +400,9 @@ Web 仪表盘基于 Vue 3 和 Naive UI 组件库开发,提供可视化的系
|
||||
7. **订单执行**:调用 QMT API 下单,成功则缓存订单信息
|
||||
8. **状态更新**:标记虚拟持仓,异步等待成交回调
|
||||
|
||||
## 8. 启动与停止
|
||||
## 9. 启动与停止
|
||||
|
||||
### 8.1 Windows 启动
|
||||
### 9.1 Windows 启动
|
||||
|
||||
使用提供的 `start.bat` 脚本启动系统:
|
||||
|
||||
@@ -312,17 +417,17 @@ cd qmt
|
||||
python run.py
|
||||
```
|
||||
|
||||
### 8.2 日志文件位置
|
||||
### 9.2 日志文件位置
|
||||
|
||||
系统日志保存在 `qmt/logs/{日期}.log` 目录下,文件名格式为 `2026-01-27.log`。日志按日期自动切分,当日期变化时创建新的日志文件。
|
||||
|
||||
### 8.3 端口说明
|
||||
### 9.3 端口说明
|
||||
|
||||
| 服务 | 默认端口 | 说明 |
|
||||
|------|----------|------|
|
||||
| API 服务 | 8001 | Web 仪表盘和 RESTful API 监听端口 |
|
||||
|
||||
## 9. 注意事项
|
||||
## 10. 注意事项
|
||||
|
||||
1. **QMT 终端要求**:确保 QMT 终端已登录且路径配置正确
|
||||
2. **Redis 服务**:系统依赖 Redis 运行,请确保 Redis 服务可用
|
||||
|
||||
Reference in New Issue
Block a user