efactor(qmt): 重构架构 - 统一信号发送和消息处理
- 修复 qmt_engine.py 中 initialize() 的重复代码 - 新增 message_processor.py: Redis Stream 消息处理器 - 新增 logger.py: 细粒度日志模块 - 新增 qmt_sender.py: 统一信号发送端(槽位+百分比模式) - 新增 backtest_consumer.py: 回测消息消费者 - 删除旧模块: qmt_trader.py, qmt_signal_sender.py, qmt_percentage_sender.py - 更新文档: qmt_functionality.md 反映新架构
This commit is contained in:
@@ -4,9 +4,9 @@
|
||||
|
||||
QMT 模块是 NewStock 量化交易系统的实盘交易执行模块,通过 `xtquant` 库连接 QMT 交易终端,实现自动化交易功能。该模块采用多终端架构设计,支持同时管理多个 QMT 终端实例,并提供 Web 仪表盘和 RESTful API 接口进行监控和操作。
|
||||
|
||||
系统核心特性包括:多终端并行管理、异步订单处理、断线自动重连、收盘自动清算、实时心跳检测等。所有交易信号通过 Redis 消息队列接收,确保交易指令的可靠传递和执行。
|
||||
系统核心特性包括:多终端并行管理、异步订单处理、断线自动重连、收盘自动清算、实时心跳检测等。所有交易信号通过 Redis Stream 消息队列接收,确保交易指令的可靠传递和执行。
|
||||
|
||||
系统分为**信号发送端**和**交易执行端**两部分。信号发送端(`qmt_signal_sender.py`)运行在聚宽策略环境中,将策略产生的买卖信号推送至 Redis 队列;交易执行端(`qmt_engine.py` + `run.py`)运行在本地,从 Redis 消费信号并通过 QMT 终端执行实盘交易。
|
||||
系统分为**信号发送端**和**交易执行端**两部分。信号发送端(`qmt_sender.py`)运行在聚宽策略环境中,将策略产生的买卖信号推送至 Redis Stream;交易执行端(`qmt_engine.py` + `run.py`)运行在本地,从 Redis Stream 消费信号并通过 QMT 终端执行实盘交易。
|
||||
|
||||
## 2. 核心组件
|
||||
|
||||
@@ -16,8 +16,10 @@ 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 队列 |
|
||||
| [`qmt_sender.py`](qmt_sender.py) | 统一信号发送端,支持槽位模式和百分比模式,运行于聚宽策略侧 |
|
||||
| [`backtest_consumer.py`](backtest_consumer.py) | 回测消息消费者,模拟交易执行并记录完整日志 |
|
||||
| [`message_processor.py`](message_processor.py) | Redis Stream 消息处理器,封装消息发送、消费、确认等功能 |
|
||||
| [`logger.py`](logger.py) | 细粒度日志模块,追踪消息处理全流程 |
|
||||
| [`api_server.py`](api_server.py) | FastAPI Web 服务,提供 RESTful API 接口 |
|
||||
| [`dashboard.html`](dashboard.html) | Web 仪表盘前端页面 |
|
||||
| [`start.bat`](start.bat) | Windows 启动脚本 |
|
||||
@@ -37,14 +39,30 @@ QMT 模块是 NewStock 量化交易系统的实盘交易执行模块,通过 `x
|
||||
| `UnitCallback` | 终端回调处理器,处理成交回报和错误通知 |
|
||||
| `TerminalStatus` | 终端状态数据类,封装终端连接状态信息 |
|
||||
|
||||
#### qmt_trader.py
|
||||
#### qmt_sender.py
|
||||
|
||||
| 函数 | 功能说明 |
|
||||
|------|----------|
|
||||
| `send_qmt_signal()` | 发送槽位模式信号(基于 total_slots) |
|
||||
| `send_qmt_percentage_signal()` | 发送百分比模式信号(基于 position_pct) |
|
||||
|
||||
#### backtest_consumer.py
|
||||
|
||||
| 类名 | 功能说明 |
|
||||
|------|----------|
|
||||
| `SystemState` | 全局状态管理器,维护交易系统运行状态 |
|
||||
| `PositionManager` | 虚拟持仓管理器,管理策略与股票的持仓映射 |
|
||||
| `DailySettlement` | 日终清算处理器,处理收盘后的撤单和持仓修正 |
|
||||
| `MyXtQuantTraderCallback` | QMT 交易回调,处理成交和错误事件 |
|
||||
| `BacktestConsumer` | 回测消息消费者,支持守护模式和单次运行模式 |
|
||||
|
||||
#### message_processor.py
|
||||
|
||||
| 类名 | 功能说明 |
|
||||
|------|----------|
|
||||
| `StreamMessageProcessor` | Redis Stream 消息处理器,支持消息发送、消费、确认、失败处理 |
|
||||
|
||||
#### logger.py
|
||||
|
||||
| 类名 | 功能说明 |
|
||||
|------|----------|
|
||||
| `QMTLogger` | 细粒度日志记录器,追踪消息接收、解析、校验、执行、确认全流程 |
|
||||
|
||||
## 3. 功能详细说明
|
||||
|
||||
@@ -56,7 +74,7 @@ QMT 模块是 NewStock 量化交易系统的实盘交易执行模块,通过 `x
|
||||
|
||||
### 3.2 交易消息处理
|
||||
|
||||
交易信号通过 Redis 消息队列传递,每个策略对应一个独立的队列。消息格式为 JSON 对象,包含股票代码、操作类型、价格、时间戳等字段。系统对每条消息进行严格校验,包括日期校验、时间戳校验、必填字段校验等,确保只有当天的有效指令才会被执行。
|
||||
交易信号通过 Redis Stream 消息队列传递,每个策略对应一个独立的 Stream。消息格式为 JSON 对象,包含股票代码、操作类型、价格、时间戳等字段。系统对每条消息进行严格校验,包括日期校验、时间戳校验、必填字段校验等,确保只有当天的有效指令才会被执行。
|
||||
|
||||
买入逻辑支持两种模式:
|
||||
|
||||
@@ -88,7 +106,13 @@ QMT 模块是 NewStock 量化交易系统的实盘交易执行模块,通过 `x
|
||||
|
||||
系统采用增强型日志系统,支持文件和控制台双路输出。日志格式包含时间戳、线程名、级别和消息内容,便于追踪问题。文件日志按日期命名,自动存放在 `logs/` 目录下。控制台输出强制刷新流,确保在 Windows 环境下日志实时显示。
|
||||
|
||||
日志级别分为 INFO、WARNING、ERROR 三级,重要操作和状态变化都会记录。交易相关日志特别标注策略名称和股票代码,方便后续分析和审计。
|
||||
新增 `logger.py` 模块提供细粒度日志记录,追踪消息处理全流程:
|
||||
- 消息接收(`log_message_receive`)
|
||||
- 消息解析(`log_message_parse`)
|
||||
- 业务校验(`log_validation`)
|
||||
- 订单执行(`log_order_execution`)
|
||||
- 消息确认(`log_message_ack`)
|
||||
- 失败处理(`log_failure`)
|
||||
|
||||
## 4. API 接口列表
|
||||
|
||||
@@ -234,6 +258,21 @@ QMT 模块是 NewStock 量化交易系统的实盘交易执行模块,通过 `x
|
||||
}
|
||||
```
|
||||
|
||||
### 5.3 环境变量配置
|
||||
|
||||
系统支持通过 `.env.local` 文件或环境变量配置以下参数:
|
||||
|
||||
| 变量名 | 默认值 | 说明 |
|
||||
|--------|--------|------|
|
||||
| `REDIS_HOST` | localhost | Redis 主机地址 |
|
||||
| `REDIS_PORT` | 6379 | Redis 端口 |
|
||||
| `REDIS_PASSWORD` | None | Redis 密码 |
|
||||
| `REDIS_DB` | 0 | Redis 数据库 |
|
||||
| `BACKTEST_CONSUMER_ID` | backtest-consumer-1 | 回测消费者 ID |
|
||||
| `BACKTEST_STRATEGIES` | "" | 默认策略列表,逗号分隔 |
|
||||
| `LOG_LEVEL` | DEBUG | 日志级别 |
|
||||
| `LOG_FILE` | logs/backtest_consumer.log | 日志文件路径 |
|
||||
|
||||
## 6. Web 仪表盘功能
|
||||
|
||||
### 6.1 功能概览
|
||||
@@ -256,16 +295,20 @@ Web 仪表盘基于 Vue 3 和 Naive UI 组件库开发,提供可视化的系
|
||||
|
||||
仪表盘默认访问地址为 `http://localhost:8001`,该地址在系统启动时打印在控制台。首次访问时会自动加载所有终端状态、持仓信息和系统日志。
|
||||
|
||||
## 7. 信号发送端(qmt_signal_sender.py)
|
||||
## 7. 信号发送端(qmt_sender.py)
|
||||
|
||||
### 7.1 模块定位
|
||||
|
||||
`qmt_signal_sender.py` 是 QMT 交易系统的**信号生产端**,部署在聚宽(JoinQuant)策略运行环境中。它负责将策略产生的买卖信号序列化后推送到 Redis 队列,由本地 QMT 交易引擎消费并执行。该模块是连接"策略研究/回测平台"与"实盘交易执行"的桥梁。
|
||||
`qmt_sender.py` 是 QMT 交易系统的**信号生产端**,部署在聚宽(JoinQuant)策略运行环境中。它负责将策略产生的买卖信号序列化后推送到 Redis Stream,由本地 QMT 交易引擎消费并执行。该模块是连接"策略研究/回测平台"与"实盘交易执行"的桥梁。
|
||||
|
||||
该模块统一了槽位模式和百分比模式,通过不同函数发送不同类型的信号。
|
||||
|
||||
### 7.2 核心函数
|
||||
|
||||
#### `send_qmt_signal(code, target_total_slots, price, context, redis_config)`
|
||||
|
||||
发送槽位模式信号。
|
||||
|
||||
| 参数 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `code` | str | 股票代码,聚宽格式(如 `000001.XSHE`、`600519.XSHG`) |
|
||||
@@ -274,6 +317,20 @@ Web 仪表盘基于 Vue 3 和 Naive UI 组件库开发,提供可视化的系
|
||||
| `context` | object | 聚宽上下文对象,提供 `run_params.type`(运行类型)和 `current_dt`(当前时间) |
|
||||
| `redis_config` | dict | Redis 连接配置,包含 `host`、`port`、`password`、`db`、`strategy_name` 等字段 |
|
||||
|
||||
#### `send_qmt_percentage_signal(code, position_pct, action, price, is_backtest, timestamp, redis_config)`
|
||||
|
||||
发送百分比模式信号。
|
||||
|
||||
| 参数 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `code` | str | 股票代码,聚宽格式(如 `000001.XSHE`、`600519.XSHG`) |
|
||||
| `position_pct` | float | 目标持仓占总资产的比例,范围 0.0 ~ 1.0(如 0.2 表示 20%) |
|
||||
| `action` | str | 交易动作,固定为 `"BUY"` 或 `"SELL"` |
|
||||
| `price` | float | 当前最新价格,用于实盘限价单参考 |
|
||||
| `is_backtest` | bool | 是否为回测模式(True/False) |
|
||||
| `timestamp` | str | 时间戳字符串,格式 `"YYYY-MM-DD HH:MM:SS"` |
|
||||
| `redis_config` | dict | Redis 连接配置,包含 `host`、`port`、`password`、`db`、`strategy_name` 等字段 |
|
||||
|
||||
### 7.3 处理流程
|
||||
|
||||
```
|
||||
@@ -285,20 +342,20 @@ Web 仪表盘基于 Vue 3 和 Naive UI 组件库开发,提供可视化的系
|
||||
└─ 回测模式 → 限制最多发送 10 条(防止回测刷爆队列)
|
||||
│
|
||||
▼
|
||||
2. 建立 Redis 连接(socket_timeout=1s)
|
||||
2. 建立 Redis Stream 连接
|
||||
│
|
||||
▼
|
||||
3. 数据转换与规范化
|
||||
├─ 股票代码格式转换:.XSHE → .SZ,.XSHG → .SH
|
||||
└─ 动作判定:target_total_slots > 0 → BUY,= 0 → SELL
|
||||
└─ 动作判定(槽位模式):target_total_slots > 0 → BUY,= 0 → SELL
|
||||
│
|
||||
▼
|
||||
4. 构建 JSON 消息体
|
||||
│
|
||||
▼
|
||||
5. 队列路由
|
||||
├─ 回测 → {strategy_name}_backtest(TTL: 1 小时)
|
||||
└─ 实盘 → {strategy_name}_real(TTL: 7 天)
|
||||
5. Stream 路由
|
||||
├─ 回测 → qmt:{strategy_name}:backtest
|
||||
└─ 实盘 → qmt:{strategy_name}:real
|
||||
│
|
||||
▼
|
||||
6. 控制台日志输出
|
||||
@@ -306,8 +363,9 @@ Web 仪表盘基于 Vue 3 和 Naive UI 组件库开发,提供可视化的系
|
||||
|
||||
### 7.4 消息格式
|
||||
|
||||
发送到 Redis 队列的 JSON 消息结构:
|
||||
发送到 Redis Stream 的 JSON 消息结构:
|
||||
|
||||
**槽位模式:**
|
||||
```json
|
||||
{
|
||||
"strategy_name": "my_strategy",
|
||||
@@ -320,94 +378,7 @@ Web 仪表盘基于 Vue 3 和 Naive UI 组件库开发,提供可视化的系
|
||||
}
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `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. 百分比下单信号发送端(qmt_percentage_sender.py)
|
||||
|
||||
### 8.1 模块定位
|
||||
|
||||
`qmt_percentage_sender.py` 是基于**仓位百分比**的 QMT 信号发送端,与槽位模式的 `qmt_signal_sender.py` 并行存在。该模块用于配置为 `order_mode: "percentage"` 的策略,通过指定目标持仓占账户总资产的比例来触发交易。
|
||||
|
||||
### 8.2 核心函数
|
||||
|
||||
#### `send_qmt_percentage_signal(code, position_pct, action, price, is_backtest, timestamp, redis_config)`
|
||||
|
||||
| 参数 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `code` | str | 股票代码,聚宽格式(如 `000001.XSHE`、`600519.XSHG`) |
|
||||
| `position_pct` | float | 目标持仓占总资产的比例,范围 0.0 ~ 1.0(如 0.2 表示 20%) |
|
||||
| `action` | str | 交易动作,固定为 `"BUY"` 或 `"SELL"` |
|
||||
| `price` | float | 当前最新价格,用于实盘限价单参考 |
|
||||
| `is_backtest` | bool | 是否为回测模式(True/False) |
|
||||
| `timestamp` | str | 时间戳字符串,格式 `"YYYY-MM-DD HH:MM:SS"` |
|
||||
| `redis_config` | dict | Redis 连接配置,包含 `host`、`port`、`password`、`db`、`strategy_name` 等字段 |
|
||||
|
||||
### 8.3 处理流程
|
||||
|
||||
```
|
||||
策略触发信号
|
||||
│
|
||||
▼
|
||||
1. 环境判断与流量控制
|
||||
├─ 实盘模式 → 直接通过
|
||||
└─ 回测模式 → 限制最多发送 10 条(防止回测刷爆队列)
|
||||
│
|
||||
▼
|
||||
2. 建立 Redis 连接(socket_timeout=1s)
|
||||
│
|
||||
▼
|
||||
3. 数据转换与规范化
|
||||
└─ 股票代码格式转换:.XSHE → .SZ,.XSHG → .SH
|
||||
│
|
||||
▼
|
||||
4. 构建 JSON 消息体(包含 position_pct 字段)
|
||||
│
|
||||
▼
|
||||
5. 队列路由
|
||||
├─ 回测 → {strategy_name}_backtest(TTL: 1 小时)
|
||||
└─ 实盘 → {strategy_name}_real(TTL: 7 天)
|
||||
│
|
||||
▼
|
||||
6. 控制台日志输出
|
||||
```
|
||||
|
||||
### 8.4 消息格式
|
||||
|
||||
发送到 Redis 队列的 JSON 消息结构:
|
||||
|
||||
**百分比模式:**
|
||||
```json
|
||||
{
|
||||
"strategy_name": "my_strategy",
|
||||
@@ -426,47 +397,43 @@ Web 仪表盘基于 Vue 3 和 Naive UI 组件库开发,提供可视化的系
|
||||
| `stock_code` | str | QMT 格式的股票代码(`.SZ` / `.SH`) |
|
||||
| `action` | str | 交易动作,`BUY` 或 `SELL` |
|
||||
| `price` | float | 信号触发时的最新价格 |
|
||||
| `position_pct` | float | 目标持仓占账户总资产的比例,范围 0.0 ~ 1.0 |
|
||||
| `total_slots` | int | 策略的总槽位数(槽位模式) |
|
||||
| `position_pct` | float | 目标持仓占账户总资产的比例(百分比模式) |
|
||||
| `timestamp` | str | 信号生成时间,格式 `YYYY-MM-DD HH:MM:SS` |
|
||||
| `is_backtest` | bool | 是否为回测环境发出的信号 |
|
||||
|
||||
### 8.5 买卖意图判定逻辑
|
||||
### 7.5 买卖意图判定逻辑
|
||||
|
||||
与槽位模式不同,百分比模式需要**显式指定**交易动作:
|
||||
**槽位模式**:通过 `target_total_slots` 参数的值进行语义推断:
|
||||
- **`target_total_slots > 0`**(BUY):策略意向持有该股票,`total_slots` 传递策略的总持仓上限,供交易引擎计算单只股票的资金分配。
|
||||
- **`target_total_slots = 0`**(SELL):策略意向清仓该股票,释放所占槽位。
|
||||
|
||||
**百分比模式**:需要**显式指定**交易动作:
|
||||
- **`action = "BUY"`**:策略意向买入该股票,目标持仓占比为 `position_pct`。交易引擎根据账户总资产计算目标金额,然后转换为具体股数下单。
|
||||
- **`action = "SELL"`**:策略意向清仓该股票。百分比模式下卖出采用简化逻辑,直接执行清仓操作。
|
||||
|
||||
### 8.6 买入计算公式
|
||||
### 7.6 回测流量控制
|
||||
|
||||
当 QMT 端接收到百分比模式的买入信号时,按以下公式计算买入股数:
|
||||
模块级全局变量 `_BACKTEST_SEND_COUNT` 用于限制回测模式下的信号发送数量,上限为 10 条。这一机制防止长周期回测期间大量无效信号涌入 Redis 队列。
|
||||
|
||||
```
|
||||
目标金额 = 账户总资产 × position_pct
|
||||
可用金额 = min(目标金额, 可用资金)
|
||||
买入股数 = int(可用金额 / 价格 / 100) × 100
|
||||
```
|
||||
### 7.7 Stream 命名规则
|
||||
|
||||
**边界处理:**
|
||||
- 单笔金额 < 2000 元 → 拦截不下单
|
||||
- 计算股数 < 100 股 → 拦截不下单
|
||||
- 价格 ≤ 0 → 强制设为 1.0(仅测试用)
|
||||
| 运行模式 | Stream 键名格式 |
|
||||
|----------|----------------|
|
||||
| 实盘 | `qmt:{strategy_name}:real` |
|
||||
| 回测 | `qmt:{strategy_name}:backtest` |
|
||||
|
||||
### 8.7 与槽位模式的对比
|
||||
### 7.8 股票代码格式转换
|
||||
|
||||
| 特性 | 槽位模式 (slots) | 百分比模式 (percentage) |
|
||||
|------|------------------|------------------------|
|
||||
| 核心参数 | `total_slots` | `position_pct` |
|
||||
| 持仓限制 | 有(同时持仓数量限制) | 无 |
|
||||
| 资金分配 | 按剩余槽位均分资金 | 按总资产比例计算 |
|
||||
| 卖出逻辑 | 按持仓数量计算 | 清仓 |
|
||||
| 配置方式 | 配置文件设置 `order_mode: "slots"` | 配置文件设置 `order_mode: "percentage"` |
|
||||
| 信号发送 | `send_qmt_signal()` | `send_qmt_percentage_signal()` |
|
||||
| 来源平台 | 格式 | 示例 |
|
||||
|----------|------|------|
|
||||
| 聚宽 | `.XSHE` / `.XSHG` | `000001.XSHE`、`600519.XSHG` |
|
||||
| QMT | `.SZ` / `.SH` | `000001.SZ`、`600519.SH` |
|
||||
|
||||
### 8.8 使用示例
|
||||
### 7.9 使用示例
|
||||
|
||||
```python
|
||||
from qmt_percentage_sender import send_qmt_percentage_signal
|
||||
from qmt_sender import send_qmt_signal, send_qmt_percentage_signal
|
||||
|
||||
# Redis 配置
|
||||
redis_config = {
|
||||
@@ -474,10 +441,19 @@ redis_config = {
|
||||
"port": 6379,
|
||||
"password": None,
|
||||
"db": 0,
|
||||
"strategy_name": "MyPercentageStrategy"
|
||||
"strategy_name": "MyStrategy"
|
||||
}
|
||||
|
||||
# 买入信号:目标持仓占账户总资产的 20%
|
||||
# 槽位模式买入信号
|
||||
send_qmt_signal(
|
||||
code="000001.XSHE",
|
||||
target_total_slots=5,
|
||||
price=15.5,
|
||||
context=context, # 聚宽上下文
|
||||
redis_config=redis_config
|
||||
)
|
||||
|
||||
# 百分比模式买入信号(目标持仓 20%)
|
||||
send_qmt_percentage_signal(
|
||||
code="000001.XSHE",
|
||||
position_pct=0.2,
|
||||
@@ -487,22 +463,43 @@ send_qmt_percentage_signal(
|
||||
timestamp="2026-02-17 14:30:00",
|
||||
redis_config=redis_config
|
||||
)
|
||||
|
||||
# 卖出信号:清仓
|
||||
send_qmt_percentage_signal(
|
||||
code="000001.XSHE",
|
||||
position_pct=0,
|
||||
action="SELL",
|
||||
price=15.8,
|
||||
is_backtest=False,
|
||||
timestamp="2026-02-17 14:35:00",
|
||||
redis_config=redis_config
|
||||
)
|
||||
```
|
||||
|
||||
## 8. 回测消息消费者(backtest_consumer.py)
|
||||
|
||||
### 8.1 模块定位
|
||||
|
||||
`backtest_consumer.py` 是独立的回测消息消费脚本,用于消费回测消息流、记录完整的处理流程日志、模拟订单执行(不执行真实交易),并支持 ACK 确认消息。
|
||||
|
||||
### 8.2 使用方式
|
||||
|
||||
```bash
|
||||
# 守护模式(持续运行,处理所有配置的策略)
|
||||
python backtest_consumer.py
|
||||
|
||||
# 单次运行模式(处理一次后退出)
|
||||
python backtest_consumer.py --once
|
||||
|
||||
# 指定策略运行
|
||||
python backtest_consumer.py --strategy StrategyA
|
||||
python backtest_consumer.py --once --strategy StrategyA,StrategyB
|
||||
```
|
||||
|
||||
### 8.3 配置说明
|
||||
|
||||
可通过环境变量或 `.env.local` 文件配置:
|
||||
- `REDIS_HOST`: Redis 主机地址(默认: localhost)
|
||||
- `REDIS_PORT`: Redis 端口(默认: 6379)
|
||||
- `REDIS_PASSWORD`: Redis 密码(默认: None)
|
||||
- `REDIS_DB`: Redis 数据库(默认: 0)
|
||||
- `BACKTEST_CONSUMER_ID`: 消费者ID(默认: backtest-consumer-1)
|
||||
- `BACKTEST_STRATEGIES`: 默认策略列表,逗号分隔
|
||||
- `LOG_LEVEL`: 日志级别(默认: DEBUG)
|
||||
- `LOG_FILE`: 日志文件路径(默认: logs/backtest_consumer.log)
|
||||
|
||||
## 9. 系统架构
|
||||
|
||||
### 8.1 组件关系图
|
||||
### 9.1 组件关系图
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
@@ -520,7 +517,7 @@ send_qmt_percentage_signal(
|
||||
│ ▼ ▼ ▼ │
|
||||
│ ┌─────────────┐ ┌─────────────────┐ ┌─────────────────────────┐ │
|
||||
│ │ 日志系统 │ │ 终端执行单元 │ │ Web 仪表盘 │ │
|
||||
│ │ logs/ │ │ TradingUnit │ │ dashboard.html │ │
|
||||
│ │ logger.py │ │ TradingUnit │ │ dashboard.html │ │
|
||||
│ └─────────────┘ │ × N │ │ │ │
|
||||
│ └────────┬────────┘ └─────────────────────────┘ │
|
||||
│ │ │
|
||||
@@ -534,22 +531,22 @@ send_qmt_percentage_signal(
|
||||
│ 外部依赖 │
|
||||
│ ┌─────────────┐ ┌─────────────────┐ ┌─────────────────────────┐ │
|
||||
│ │ Redis │ │ QMT 终端 │ │ 浏览器客户端 │ │
|
||||
│ │ 消息队列 │ │ 实盘交易 │ │ HTTP 请求 │ │
|
||||
│ │ Stream │ │ 实盘交易 │ │ HTTP 请求 │ │
|
||||
│ └─────────────┘ └─────────────────┘ └─────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 8.2 数据流向图
|
||||
### 9.2 数据流向图
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ 数据流向 │
|
||||
├─────────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 聚宽策略 ──> qmt_signal_sender ──> Redis 队列 ──> 消息处理循环 │
|
||||
│ (信号发送端) {strategy}_real │ │
|
||||
│ 聚宽策略 ──> qmt_sender ──> Redis Stream ──> 消息处理循环 │
|
||||
│ (信号发送端) qmt:{strategy}:real │ │
|
||||
│ ▼ │
|
||||
│ 槽位检查 ──> 资金检查 │
|
||||
│ 槽位/百分比检查 │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ 订单执行 (QMT API) │
|
||||
@@ -572,20 +569,21 @@ send_qmt_percentage_signal(
|
||||
└─────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 8.3 消息处理流程
|
||||
### 9.3 消息处理流程
|
||||
|
||||
1. **消息接收**:系统从 Redis 队列 `{strategy_name}_real` 中取出消息
|
||||
1. **消息接收**:系统从 Redis Stream `qmt:{strategy_name}:real` 中读取消息
|
||||
2. **消息解析**:将 JSON 消息解析为结构化数据,验证必填字段
|
||||
3. **日期校验**:检查消息日期是否为当天,过期消息丢弃
|
||||
4. **槽位检查**:查询策略已占用槽位,判断是否允许新买入
|
||||
5. **资金检查**:查询账户可用资金,计算单只股票可买入金额
|
||||
4. **模式检查**:根据策略配置确定使用槽位模式或百分比模式
|
||||
5. **槽位/资金检查**:查询策略已占用槽位或账户总资产,判断是否允许新买入
|
||||
6. **数量计算**:根据资金和价格计算买入股数(向下取整为百股)
|
||||
7. **订单执行**:调用 QMT API 下单,成功则缓存订单信息
|
||||
8. **状态更新**:标记虚拟持仓,异步等待成交回调
|
||||
9. **消息确认**:发送 ACK 确认消息已处理
|
||||
|
||||
## 10. 启动与停止
|
||||
|
||||
### 9.1 Windows 启动
|
||||
### 10.1 Windows 启动
|
||||
|
||||
使用提供的 `start.bat` 脚本启动系统:
|
||||
|
||||
@@ -600,11 +598,11 @@ cd qmt
|
||||
python run.py
|
||||
```
|
||||
|
||||
### 9.2 日志文件位置
|
||||
### 10.2 日志文件位置
|
||||
|
||||
系统日志保存在 `qmt/logs/{日期}.log` 目录下,文件名格式为 `2026-01-27.log`。日志按日期自动切分,当日期变化时创建新的日志文件。
|
||||
|
||||
### 9.3 端口说明
|
||||
### 10.3 端口说明
|
||||
|
||||
| 服务 | 默认端口 | 说明 |
|
||||
|------|----------|------|
|
||||
@@ -617,3 +615,4 @@ python run.py
|
||||
3. **交易日时间**:交易逻辑仅在 09:15-11:30 和 13:00-15:00 期间执行
|
||||
4. **维护时段**:每日 21:32-21:50 为 QMT 维护时段,此时段不执行重连
|
||||
5. **权限要求**:确保程序有权限写入 `logs/` 目录
|
||||
6. **配置文件**:Redis 配置优先从 `.env.local` 文件加载,如不存在则使用 `config.json` 中的配置
|
||||
|
||||
Reference in New Issue
Block a user