# miniQMT
**Repository Path**: vx-qa/miniQMT
## Basic Information
- **Project Name**: miniQMT
- **Description**: miniQMT 是一个基于迅投QMT API的量化交易系统,实现了自动化交易策略执行、持仓管理、止盈止损和网格交易等功能。系统支持模拟交易和实盘交易两种模式。
- **Primary Language**: Python
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2025-12-14
- **Last Updated**: 2025-12-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## 变更记录 (Changelog)
### 2024-10-11
- 全面优化文档结构,增加模块依赖关系图
- 补充环境配置和依赖说明
- 新增前端界面说明和线程架构详解
- 完善配置文件格式和测试指南
- 增加架构流程图和信号处理机制说明
---
## ⚠️ 重要提示
**在修改代码前必读**:
1. **配置集中管理**:所有可配置参数都在 [config.py](config.py) 中,严禁在其他文件硬编码配置值
2. **模拟交易优先**:测试新功能前务必设置 `ENABLE_SIMULATION_MODE = True`
3. **线程安全**:修改共享数据时必须使用 `threading.Lock()` 保护
4. **信号验证机制**:任何交易信号都要经过 `validate_trading_signal()` 验证
5. **双层存储架构**:理解内存数据库和SQLite的同步机制再修改持仓管理代码
6. **QMT路径配置**:系统支持自动检测QMT路径,修改路径逻辑需测试 [test_qmt_path_config.py](test/test_qmt_path_config.py)
7. **Git提交规范**:如用户未明确要求,不要主动执行 git 提交和分支操作
**常见错误**:
- ❌ 在 `strategy.py` 中硬编码止盈比例 → ✅ 使用 `config.INITIAL_TAKE_PROFIT_RATIO`
- ❌ 直接修改内存数据库不调用 `_increment_data_version()` → ✅ 修改后立即更新版本号
- ❌ 交易信号未验证直接执行 → ✅ 先调用 `validate_trading_signal()`
---
## 项目概述
miniQMT 是一个基于迅投QMT API的量化交易系统,实现了自动化交易策略执行、持仓管理、止盈止损和网格交易等功能。系统支持模拟交易和实盘交易两种模式。
**核心特性**:
- 双层存储架构(内存数据库 + SQLite 持久化)
- 信号检测与执行分离设计
- 多线程协同工作(数据更新、持仓监控、策略执行、Web 服务)
- 动态止盈止损策略
- 可选的网格交易功能
- Web 前端实时监控界面
## 系统架构
### 整体架构图
```mermaid
graph TD
A[main.py 系统入口] --> B[data_manager.py 数据管理]
A --> C[position_manager.py 持仓管理]
A --> D[strategy.py 交易策略]
A --> E[web_server.py Web服务]
B --> B1[xtquant.xtdata 行情接口]
B --> B2[SQLite 数据库]
C --> C1[内存数据库]
C --> C2[SQLite 持久化]
C --> C3[easy_qmt_trader QMT交易]
D --> C
D --> F[trading_executor.py 交易执行]
D --> G[indicator_calculator.py 指标计算]
E --> C
E --> F
E --> H[web1.0/ 前端界面]
F --> C3
style A fill:#f9f,stroke:#333,stroke-width:4px
style C fill:#bbf,stroke:#333,stroke-width:2px
style D fill:#bfb,stroke:#333,stroke-width:2px
```
### 模块化设计原则
系统采用严格的模块化设计,每个py文件对应一个独立功能模块:
```
miniQMT/
├── config.py # 集中管理所有可配置参数
├── logger.py # 统一日志管理(自动清理)
├── main.py # 系统启动入口和线程管理
├── data_manager.py # 历史数据获取与存储(xtdata接口)
├── indicator_calculator.py # 技术指标计算(MACD、均线等)
├── position_manager.py # 持仓管理核心(内存+SQLite双层架构)
├── trading_executor.py # 交易执行器(xttrader接口)
├── strategy.py # 交易策略逻辑
├── web_server.py # RESTful API服务(Flask)
├── easy_qmt_trader.py # QMT交易API封装
├── utils.py / Methods.py # 工具函数集合
├── MyTT.py # 技术指标计算工具
├── account_config.json # 账户配置文件(敏感信息)
├── stock_pool.json # 股票池配置
├── data/ # 数据存储目录
│ ├── trading.db # SQLite数据库
│ └── stock2buy.json # 备选股票池
├── logs/ # 日志文件目录
├── test/ # 测试文件目录
│ ├── unit_test.py # 单元测试
│ ├── StopLossTakeProfitTest.py # 止盈止损测试
│ ├── GridTradingTest.py # 网格交易测试
│ ├── test_qmt_position_interface.py # QMT持仓接口测试
│ ├── test_qmt_path_config.py # QMT路径配置测试
│ └── test_qmt_fix_verification.py # QMT修复验证测试
├── web1.0/ # Web前端界面
│ ├── index.html # 主页面
│ ├── script.js # 前端逻辑
│ └── readme.md # 前端说明
├── xtquant/ # 迅投QMT SDK
└── CLAUDE.md # 本文档
```
### 模块依赖关系
```mermaid
graph LR
config[config.py] --> |配置参数| all[所有模块]
logger[logger.py] --> |日志记录| all
main[main.py] --> |初始化| dm[data_manager]
main --> |初始化| pm[position_manager]
main --> |初始化| st[strategy]
main --> |初始化| ws[web_server]
dm --> |数据| ic[indicator_calculator]
ic --> |指标| st
pm --> |持仓信息| st
pm --> |持仓信息| ws
pm --> |交易API| eqt[easy_qmt_trader]
st --> |交易指令| te[trading_executor]
te --> |执行交易| eqt
ws --> |API调用| st
ws --> |API调用| te
ws --> |API调用| pm
style config fill:#ffd,stroke:#333
style logger fill:#ffd,stroke:#333
style main fill:#f9f,stroke:#333,stroke-width:2px
```
### 线程架构
系统采用多线程并发架构,各线程职责如下:
| 线程名称 | 启动位置 | 主要职责 | 运行频率 |
|---------|---------|---------|---------|
| **数据更新线程** | `data_manager.start_data_update_thread()` | 更新股票池中所有股票的最新行情数据 | 每60秒 |
| **持仓监控线程** | `position_manager.start_position_monitor_thread()` | 1. 同步实盘持仓到内存
2. 更新当前价格
3. 检测止盈止损信号 | 每3秒 |
| **策略执行线程** | `strategy.start_strategy_thread()` | 1. 获取待处理信号
2. 执行交易决策
3. 网格交易检查 | 每5秒 |
| **定时同步线程** | `position_manager.start_sync_thread()` | 将内存数据库的关键字段同步到SQLite | 每5秒 |
| **日志清理线程** | `logger.schedule_log_cleanup()` | 清理过期日志文件 | 每天凌晨 |
| **Web服务线程** | `web_server.start_web_server()` | 提供RESTful API和前端页面服务 | 持续运行 |
**线程安全机制**:
- 使用 `threading.Lock()` 保护共享数据结构
- SQLite 连接使用 `check_same_thread=False`
- 内存数据库操作使用版本号机制避免竞态
### 数据流架构
**实盘模式数据流**:
```mermaid
sequenceDiagram
participant QMT as QMT实盘账户
participant PM as position_manager
participant MEM as 内存数据库
participant DB as SQLite数据库
loop 每3秒
QMT->>PM: qmt_trader.position()
PM->>MEM: _sync_real_positions_to_memory()
Note over MEM: volume, available, cost_price
end
loop 每5秒
MEM->>DB: _sync_memory_to_db()
Note over DB: 持久化: open_date, profit_triggered, etc.
end
loop 实时更新
PM->>MEM: update_all_positions_price()
Note over MEM: current_price, market_value, profit_ratio
end
```
**模拟模式数据流**:
```mermaid
sequenceDiagram
participant UI as Web界面
participant TE as trading_executor
participant PM as position_manager
participant MEM as 内存数据库
UI->>TE: 模拟买入/卖出指令
TE->>PM: simulate_buy/sell_position()
PM->>MEM: 直接修改持仓数据
Note over MEM: 跳过QMT接口
资金从SIMULATION_BALANCE扣除/增加
PM->>MEM: 生成模拟订单ID: SIM{timestamp}{counter}
```
### 信号检测与执行流程
系统采用**信号检测与执行分离**的设计模式:
```mermaid
flowchart TD
A[持仓监控线程] --> B{检测交易信号}
B --> C[止损信号]
B --> D[首次止盈信号]
B --> E[动态止盈信号]
C --> F[写入 latest_signals 队列]
D --> F
E --> F
F --> G[策略执行线程]
G --> H{ENABLE_AUTO_TRADING?}
H -->|False| I[仅监控不执行]
H -->|True| J[get_pending_signals]
J --> K{validate_trading_signal}
K -->|验证失败| L[拒绝执行]
K -->|验证通过| M{模拟/实盘模式?}
M -->|模拟| N[simulate_sell_position]
M -->|实盘| O[trading_executor.sell_stock]
O --> P[QMT API执行]
N --> Q[直接修改内存数据库]
style H fill:#faa,stroke:#333
style M fill:#afa,stroke:#333
```
**关键设计要点**:
1. 监控线程**始终运行**,持续检测信号(即使 ENABLE_AUTO_TRADING=False)
2. `ENABLE_AUTO_TRADING` 开关只控制**是否执行**检测到的信号
3. 每个信号都要经过 `validate_trading_signal()` 验证,防止重复执行
4. 信号验证包括:持仓数据一致性、信号是否过期、是否已处理
### 关键设计模式
1. **单例模式**: 所有核心模块通过 `get_*()` 函数返回单例实例
```python
# 示例
def get_position_manager():
global _position_manager_instance
if _position_manager_instance is None:
_position_manager_instance = PositionManager()
return _position_manager_instance
```
2. **双层存储架构**:
- 内存数据库(`sqlite3.connect(":memory:")`)存储高频更新数据
- SQLite文件数据库持久化关键状态(避免重启丢失)
3. **信号检测与执行分离**:
- 监控线程负责信号检测(始终运行)
- `ENABLE_AUTO_TRADING`开关控制是否执行交易
## 环境配置
### Python 版本要求
- Python 3.8 或以上(推荐 3.9)
### 依赖包安装
```bash
pip install pandas numpy talib flask flask-cors xtquant mootdx sqlite3
```
**关键依赖说明**:
- `pandas`, `numpy`: 数据处理和计算
- `flask`, `flask-cors`: Web服务框架
- `xtquant`: 迅投QMT交易和行情接口(需要安装QMT客户端)
- `mootdx`: 备用行情数据源
- `talib` (可选): 高级技术指标计算
### 配置文件
#### 1. account_config.json(必需)
```json
{
"account_id": "您的交易账号",
"account_type": "STOCK"
}
```
#### 2. stock_pool.json(可选)
```json
[
"000001.SZ",
"600036.SH",
"000333.SZ"
]
```
如果不存在,系统将使用 `config.py` 中的 `DEFAULT_STOCK_POOL`。
#### 3. config.py 关键配置
```python
# QMT路径配置
QMT_PATH = r'C:/光大证券金阳光QMT实盘/userdata_mini'
# 功能开关
ENABLE_SIMULATION_MODE = True # True=模拟交易, False=实盘交易
ENABLE_AUTO_TRADING = False # 自动交易执行开关
ENABLE_DYNAMIC_STOP_PROFIT = True # 止盈止损功能
ENABLE_GRID_TRADING = False # 网格交易功能
# 调试开关
DEBUG = False
DEBUG_SIMU_STOCK_DATA = False # 绕过交易时间限制
```
## 快速开始
### 常用命令速查
```bash
# 启动系统
python main.py
# 运行测试
python -m pytest test/unit_test.py # 单元测试
python test/StopLossTakeProfitTest.py # 止盈止损测试
python test/GridTradingTest.py # 网格交易测试
python test/easy_qmt_trader_test.py # QMT接口测试
python test/test_qmt_position_interface.py # 持仓接口测试
python test/test_qmt_path_config.py # 路径配置测试
# 清理日志
python -c "from logger import clean_old_logs; clean_old_logs()"
# 检查数据库
sqlite3 data/trading.db ".tables" # 查看所有表
sqlite3 data/trading.db "SELECT * FROM positions;" # 查看持仓
```
### Windows 环境特别注意
- 使用 Anaconda Python 3.10 虚拟环境(默认)
- 日志文件使用 UTF-8 编码(避免中文乱码)
- 路径使用正斜杠 `/` 或双反斜杠 `\\`
## 运行系统
### 启动命令
```bash
python main.py
```
### 前端访问
打开浏览器访问:
```
http://localhost:5000
```
**前端功能**:
- 账户信息实时显示(可用资金、总资产、持仓市值)
- 持仓列表实时更新(股票代码、数量、成本价、当前价、盈亏比例)
- 全局开关控制(监控开关、自动交易开关、模拟/实盘切换)
- 手动买入/卖出操作
- 系统状态监控(QMT连接状态、各线程运行状态)
### 重要开关配置 (config.py)
```python
ENABLE_SIMULATION_MODE = True # 模拟/实盘切换
ENABLE_AUTO_TRADING = False # 自动交易执行开关
ENABLE_DYNAMIC_STOP_PROFIT = True # 止盈止损功能
ENABLE_GRID_TRADING = False # 网格交易功能
DEBUG = False # 调试模式
```
**开关说明**:
- `ENABLE_SIMULATION_MODE`:
- `True`: 模拟交易,不调用真实交易API,使用虚拟资金
- `False`: 实盘交易,通过QMT API执行真实订单
- `ENABLE_AUTO_TRADING`:
- `True`: 检测到信号后自动执行交易
- `False`: 仅监控信号,不执行交易(适合观察策略)
- `ENABLE_MONITORING` (前端控制):
- 控制前端界面的监控状态显示
- 不影响后台线程运行
## 交易策略核心逻辑
### 止盈止损策略执行优先级
1. **止损检查**(最高优先级): 成本价下跌7%触发全仓止损
2. **首次止盈**: 浮盈6%时卖出60%仓位 → 标记`profit_triggered=True`
3. **动态止盈**: 已触发首次止盈后,根据最高价设置动态止盈位
4. **补仓策略**: 价格跌至93%/86%等格点时补仓(最大持仓限制70000元)
### 止盈止损配置详解
```python
# config.py
# 统一止损比例
STOP_LOSS_RATIO = -0.07 # 成本价下跌7%触发止损
# 首次止盈配置
INITIAL_TAKE_PROFIT_RATIO = 0.06 # 盈利6%触发首次止盈
INITIAL_TAKE_PROFIT_RATIO_PERCENTAGE = 0.6 # 卖出60%仓位
# 动态止盈配置(最高盈利比例, 止盈位系数)
DYNAMIC_TAKE_PROFIT = [
(0.05, 0.96), # 最高浮盈5%时,止盈位=最高价*96%
(0.10, 0.93), # 最高浮盈10%时,止盈位=最高价*93%
(0.15, 0.90), # 最高浮盈15%时,止盈位=最高价*90%
(0.20, 0.87), # 最高浮盈20%时,止盈位=最高价*87%
(0.30, 0.85), # 最高浮盈30%时,止盈位=最高价*85%
]
```
### 止盈止损信号验证机制
```python
# position_manager.py 中的核心验证逻辑
validate_trading_signal(stock_code, signal_type, signal_info):
- 检查持仓数据一致性
- 验证信号是否仍然有效
- 防止重复执行同一信号
- 检查持仓数量是否充足
```
**验证失败场景**:
- 持仓已清空但信号仍在队列
- 价格已回调,信号条件不再满足
- 同一信号在冷却期内(防抖动)
- 持仓可用数量不足
### 模拟交易 vs 实盘交易
| 特性 | 模拟交易 | 实盘交易 |
|------|---------|---------|
| 执行方式 | `simulate_buy/sell_position()` 直接修改内存 | 通过 `qmt_trader.buy/sell()` 调用QMT API |
| 资金来源 | `config.SIMULATION_BALANCE` | 实际账户资金 |
| 订单ID | `SIM{timestamp}{counter}` | QMT API返回的真实订单号 |
| 数据持久化 | 仅内存,不写入SQLite | 内存+SQLite双写 |
| 交易时间限制 | 无限制(DEBUG_SIMU_STOCK_DATA=True) | 严格遵守交易时间 |
| 手续费 | 模拟手续费(买0.0003/卖0.0013) | 实际手续费 |
## 开发和测试
### 运行测试
```bash
# 单元测试
python -m pytest test/unit_test.py
# 止盈止损策略测试
python test/StopLossTakeProfitTest.py
# 网格交易测试
python test/GridTradingTest.py
# QMT交易接口测试
python test/easy_qmt_trader_test.py
# QMT持仓接口测试(验证持仓数据同步)
python test/test_qmt_position_interface.py
# QMT路径配置测试(验证路径自动检测)
python test/test_qmt_path_config.py
# QMT修复验证测试(验证接口修复)
python test/test_qmt_fix_verification.py
```
### 调试技巧
**启用详细日志**:
```python
# config.py
DEBUG = True
LOG_LEVEL = "DEBUG"
```
**测试模拟交易**:
```python
# config.py
ENABLE_SIMULATION_MODE = True
DEBUG_SIMU_STOCK_DATA = True # 绕过交易时间限制
```
**监控关键数据流**:
```python
# 查看内存持仓数据
position_manager.get_all_positions()
# 查看待执行信号
position_manager.get_pending_signals()
# 检查账户信息
position_manager.get_account_info()
# 查看信号队列
position_manager.latest_signals
```
**调试止盈止损逻辑**:
```python
# 在 strategy.py 中添加断点
def execute_trading_signal_direct(self, stock_code, signal_type, signal_info):
# 在此处设置断点,观察信号内容
logger.debug(f"执行信号: {signal_type}, 信息: {signal_info}")
```
## API接口说明
### Web API端点 (web_server.py)
**系统状态**:
- `GET /api/status` - 获取系统运行状态
- 返回:账户信息、监控状态、全局开关状态
- `GET /api/connection/status` - 检查QMT连接状态
**持仓管理**:
- `GET /api/positions` - 获取所有持仓
- 返回:持仓列表、数据版本号
- `GET /api/positions/` - 获取单只股票持仓
- `GET /api/positions/stream` - SSE实时推送持仓数据
**交易操作**:
- `POST /api/actions/execute_buy` - 执行买入操作
- 参数:`stock_code`, `amount`, `strategy`(可选)
- `POST /api/actions/execute_sell` - 执行卖出操作
- 参数:`stock_code`, `volume`, `strategy`(可选)
- `POST /api/actions/execute_trading_signal` - 执行指定交易信号
- 参数:`stock_code`, `signal_type`, `signal_info`
**配置管理**:
- `GET /api/config` - 获取系统配置
- `POST /api/config/update` - 更新配置参数
- 支持动态更新:止盈止损比例、仓位限制等
**信号查询**:
- `GET /api/signals/pending` - 获取待处理信号列表
- `GET /api/signals/latest/` - 获取指定股票的最新信号
**数据查询**:
- `GET /api/data/history/` - 获取历史K线数据
- `GET /api/data/realtime/` - 获取实时行情
## QMT API集成要点
### xtdata(行情接口)
```python
# data_manager.py
import xtquant.xtdata as xt
# 连接行情服务
xt.connect()
# 获取历史数据
xt.get_market_data(
field_list=['open', 'high', 'low', 'close', 'volume'],
stock_list=['000001.SZ'],
period='1d',
start_time='20230101',
end_time='20231231'
)
# 获取实时Tick数据
xt.get_full_tick(['000001.SZ'])
```
### xttrader(交易接口)
```python
# easy_qmt_trader.py
from xtquant.xttrader import XtQuantTrader
from xtquant.xttype import StockAccount
# 创建交易对象
xt_trader = XtQuantTrader(path, session_id)
# 启动交易线程
xt_trader.start()
# 连接账户
acc = StockAccount(account_id, account_type)
xt_trader.connect()
# 下单
xt_trader.order_stock(
acc,
stock_code,
order_type, # 23=限价买入, 24=限价卖出
order_volume,
order_price
)
# 查询持仓
xt_trader.query_stock_positions(acc)
# 查询资产
xt_trader.query_stock_asset(acc)
```
### API异常处理
- 始终检查`xt.connect()`连接状态
- 交易接口调用需要捕获超时和网络异常
- 使用`check_same_thread=False`处理多线程SQLite操作
- 实盘交易前必须验证 QMT 客户端运行状态
```python
# 连接检查示例
try:
if not xt.connect():
logger.error("xtquant行情服务连接失败")
return False
# 验证连接
test_data = xt.get_full_tick(['000001.SZ'])
if test_data:
logger.info("xtquant连接验证成功")
except Exception as e:
logger.error(f"连接异常: {str(e)}")
```
## 数据库表结构
### positions (持仓表 - 内存+SQLite)
```sql
CREATE TABLE positions (
stock_code TEXT PRIMARY KEY, -- 股票代码
stock_name TEXT, -- 股票名称
volume REAL, -- 持仓数量(来自QMT)
available REAL, -- 可用数量(来自QMT)
cost_price REAL, -- 成本价(来自QMT)
base_cost_price REAL, -- 基础成本价
current_price REAL, -- 当前价(来自行情接口)
market_value REAL, -- 市值(计算得出)
profit_ratio REAL, -- 盈亏比例(计算得出)
last_update TIMESTAMP, -- 最后更新时间
open_date TIMESTAMP, -- 开仓日期(持久化)
profit_triggered BOOLEAN, -- 是否触发首次止盈(持久化)
highest_price REAL, -- 历史最高价(持久化)
stop_loss_price REAL, -- 止损价(持久化)
profit_breakout_triggered BOOLEAN, -- 是否触发突破止盈
breakout_highest_price REAL -- 突破后最高价
)
```
**数据来源说明**:
| 字段 | 数据来源 | 更新时机 |
|------|---------|---------|
| `stock_code`, `volume`, `available`, `cost_price` | QMT实盘 `qmt_trader.position()` | 每3秒同步一次 |
| `current_price` | `data_manager.get_latest_data()` | 实时更新 |
| `market_value`, `profit_ratio` | 计算 | 价格更新时重新计算 |
| `open_date`, `profit_triggered`, `highest_price`, `stop_loss_price` | 持久化字段 | 策略触发时更新并立即同步到SQLite |
### trade_records (交易记录表)
```sql
CREATE TABLE trade_records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
stock_code TEXT, -- 股票代码
stock_name TEXT, -- 股票名称
trade_time TIMESTAMP, -- 交易时间
trade_type TEXT, -- BUY, SELL
price REAL, -- 交易价格
volume INTEGER, -- 交易数量
amount REAL, -- 交易金额
trade_id TEXT, -- 订单ID
commission REAL, -- 手续费
strategy TEXT -- 策略标识(simu/auto_partial/stop_loss/grid等)
)
```
### stock_daily_data (历史K线数据表)
```sql
CREATE TABLE stock_daily_data (
stock_code TEXT,
stock_name TEXT,
date TEXT,
open REAL,
high REAL,
low REAL,
close REAL,
volume REAL,
amount REAL,
PRIMARY KEY (stock_code, date)
)
```
### stock_indicators (指标数据表)
```sql
CREATE TABLE stock_indicators (
stock_code TEXT,
date TEXT,
ma10 REAL,
ma20 REAL,
ma30 REAL,
ma60 REAL,
macd REAL,
macd_signal REAL,
macd_hist REAL,
PRIMARY KEY (stock_code, date)
)
```
## 常见问题
### 1. 止盈止损信号重复执行
**原因**: 信号验证失败或信号未被正确标记为已处理
**解决方案**:
- 检查`validate_trading_signal()`和`mark_signal_processed()`调用链
- 确认信号时间戳机制正常工作
- 查看日志中的信号验证详情
```python
# 添加日志以追踪信号处理
logger.debug(f"信号队列: {position_manager.latest_signals}")
logger.debug(f"信号时间戳: {position_manager.signal_timestamps}")
```
### 2. 模拟交易持仓不更新
**原因**: 模拟交易只修改内存,未触发数据版本号更新
**解决方案**:
- 确保调用`_increment_data_version()`
- 检查前端是否正确订阅 SSE 推送
- 验证 `config.ENABLE_SIMULATION_MODE = True`
```python
# position_manager.py
def simulate_buy_position(self, ...):
# ... 执行模拟买入逻辑 ...
self._increment_data_version() # 必须调用
```
### 3. QMT连接断开
**原因**: QMT客户端未运行或网络问题
**解决方案**:
```python
# 检查连接状态
position_manager.qmt_trader.xt_trader.is_connected()
# 重新连接
position_manager.qmt_trader.connect()
# 检查QMT客户端路径配置
# config.py
QMT_PATH = r'C:/光大证券金阳光QMT实盘/userdata_mini' # 确保路径正确
```
### 4. 持仓监控线程未运行
**原因**: 线程异常退出或未正确启动
**排查步骤**:
```python
# 1. 检查配置开关
config.ENABLE_POSITION_MONITOR # 应为 True
# 2. 检查线程状态
import threading
print(threading.enumerate()) # 查看所有活动线程
# 3. 查看日志
# 搜索 "启动持仓监控线程" 或 "持仓监控线程异常"
```
### 5. 前端无法连接后端
**原因**: 端口被占用或防火墙阻止
**解决方案**:
```bash
# 检查端口占用
netstat -ano | findstr 5000
# 修改端口配置
# config.py
WEB_SERVER_PORT = 5001 # 改为其他端口
# 允许防火墙通过
# Windows: 控制面板 -> 防火墙 -> 允许应用
```
### 6. 策略信号检测异常
**原因**: 价格数据获取失败或计算错误
**排查步骤**:
```python
# 1. 检查数据源连接
data_manager.xt.connect() # 确保 xtquant 已连接
# 2. 手动获取价格
latest_quote = data_manager.get_latest_data('000001.SZ')
print(latest_quote)
# 3. 检查持仓数据完整性
position = position_manager.get_position('000001.SZ')
print(f"成本价: {position['cost_price']}, 当前价: {position['current_price']}")
```
## 代码规范
1. **所有可配置参数集中在config.py** - 不要硬编码魔法数字
```python
# 错误示例
if profit_ratio > 0.06: # 硬编码
...
# 正确示例
if profit_ratio > config.INITIAL_TAKE_PROFIT_RATIO:
...
```
2. **日志级别使用**:
- `logger.debug()` - 详细调试信息(变量值、执行路径)
- `logger.info()` - 关键流程节点(系统启动、交易执行)
- `logger.warning()` - 异常但可恢复的情况(数据缺失、连接超时)
- `logger.error()` - 严重错误(模块初始化失败、数据库错误)
3. **异常处理**: 所有外部API调用必须有try-except包裹
```python
try:
result = qmt_trader.order_stock(...)
logger.info(f"下单成功: {result}")
except Exception as e:
logger.error(f"下单失败: {str(e)}")
return None
```
4. **线程安全**: 使用`threading.Lock()`保护共享数据结构
```python
with self.signal_lock:
self.latest_signals[stock_code] = signal_info
```
5. **数据库操作**: 使用参数化查询防止SQL注入
```python
# 正确示例
cursor.execute("SELECT * FROM positions WHERE stock_code=?", (stock_code,))
# 错误示例
cursor.execute(f"SELECT * FROM positions WHERE stock_code='{stock_code}'")
```
6. **函数文档**: 所有公共函数必须包含 docstring
```python
def calculate_stop_loss_price(self, position):
"""
计算止损价格
参数:
position (dict): 持仓信息字典
返回:
float: 计算出的止损价格
"""
...
```
## 扩展开发建议
1. **新增交易策略**: 在`strategy.py`中添加新的`execute_*_strategy()`方法
```python
def execute_custom_strategy(self, stock_code):
"""自定义策略实现"""
# 1. 获取必要数据
position = self.position_manager.get_position(stock_code)
latest_quote = self.data_manager.get_latest_data(stock_code)
# 2. 策略逻辑判断
if self._check_custom_condition(position, latest_quote):
# 3. 执行交易
self.trading_executor.buy_stock(...)
```
2. **新增技术指标**: 在`indicator_calculator.py`中实现计算函数
```python
def calculate_rsi(self, df, period=14):
"""计算RSI指标"""
delta = df['close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean()
rs = gain / loss
return 100 - (100 / (1 + rs))
```
3. **新增Web接口**: 在`web_server.py`中添加路由装饰器
```python
@app.route('/api/custom/action', methods=['POST'])
def custom_action():
"""自定义API端点"""
try:
data = request.json
# 处理逻辑
return jsonify({'status': 'success', 'data': result})
except Exception as e:
return jsonify({'status': 'error', 'message': str(e)}), 500
```
4. **修改止盈止损逻辑**: 修改`config.py`中的`DYNAMIC_TAKE_PROFIT`配置数组
```python
DYNAMIC_TAKE_PROFIT = [
(0.08, 0.95), # 新增:8%盈利时止盈位为最高价的95%
(0.12, 0.92), # 调整原有配置
...
]
```
5. **增加回测功能**: 创建新模块`backtest.py`
```python
class Backtester:
def __init__(self, strategy, start_date, end_date):
self.strategy = strategy
self.start_date = start_date
self.end_date = end_date
def run_backtest(self):
# 回测逻辑实现
pass
```
## 性能优化建议
1. **数据库查询优化**:
- 为高频查询字段添加索引
```sql
CREATE INDEX idx_positions_code ON positions(stock_code);
CREATE INDEX idx_trade_records_time ON trade_records(trade_time);
```
2. **缓存机制**:
- 对不常变化的数据使用缓存
```python
# position_manager.py
self.positions_cache = None
self.cache_expire_time = 3 # 3秒缓存
```
3. **批量操作**:
- 批量更新数据库而非逐条插入
```python
cursor.executemany(
"INSERT INTO positions VALUES (?, ?, ...)",
positions_list
)
```
4. **线程池**:
- 对耗时操作使用线程池
```python
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(process_stock, code) for code in stock_pool]
```
## 安全注意事项
1. **敏感信息保护**:
- `account_config.json` 不要提交到版本控制
- 添加到 `.gitignore`
```
account_config.json
*.log
data/trading.db
```
2. **实盘交易风控**:
- 设置最大单日亏损限制
- 实现紧急停止机制
```python
# config.py
MAX_DAILY_LOSS_RATIO = 0.05 # 单日最大亏损5%
EMERGENCY_STOP_LOSS_RATIO = 0.10 # 紧急止损阈值10%
```
3. **API调用限制**:
- 控制调用频率避免被限流
```python
import time
def rate_limited_api_call(func, *args, **kwargs):
time.sleep(0.5) # 限制调用频率
return func(*args, **kwargs)
```
## 参考资源
- **QMT API文档**: https://dict.thinktrader.net
- **项目详细文档**: [MiniQMT.md](MiniQMT.md)
- **xtquant 官方文档**: 参考QMT客户端帮助文档
- **技术指标库**: MyTT.py (自定义技术指标工具)
## 最近更新(Recent Updates)
### QMT路径自动检测功能
系统现在支持自动检测QMT安装路径,无需手动配置:
- 自动扫描常见安装位置(C盘、D盘、E盘)
- 支持多个券商版本(光大证券、国金证券等)
- 自动验证路径有效性
- 详见:[test_qmt_path_config.py](test/test_qmt_path_config.py)
### QMT持仓接口修复
修复了持仓数据同步问题:
- 解决 `base_cost_price` 数据不一致问题
- 优化实盘持仓到内存数据库的同步逻辑
- 增强数据验证机制
- 详见:[test_qmt_fix_verification.py](test/test_qmt_fix_verification.py)、[docs/QMT持仓接口修复测试报告.md](docs/QMT持仓接口修复测试报告.md)
### 文档完善
- 新增路径配置指南:[docs/QMT路径配置指南.md](docs/QMT路径配置指南.md)
- 新增路径灵活配置说明:[docs/QMT路径灵活配置功能说明.md](docs/QMT路径灵活配置功能说明.md)
## 开发路线图
**短期目标(已实现)**:
- [x] 双层存储架构
- [x] 模拟交易功能
- [x] 止盈止损策略
- [x] Web界面监控
- [x] 信号检测与执行分离
- [x] QMT路径自动检测
- [x] 持仓接口修复和验证
**中期目标**:
- [ ] 完善网格交易策略
- [ ] 增加更多技术指标
- [ ] 实现回测功能
- [ ] 优化前端界面(React重构)
- [ ] 增加风控模块
**长期目标**:
- [ ] 支持多账户管理
- [ ] 策略市场(共享自定义策略)
- [ ] 机器学习模型集成
- [ ] 移动端应用
- [ ] 云端部署支持
---
## 变更日志(Change Log)
查看 `docs/` 目录下的相关文档了解具体功能更新详情:
- QMT持仓接口修复:[docs/QMT持仓接口修复测试报告.md](docs/QMT持仓接口修复测试报告.md)
- QMT路径配置:[docs/QMT路径配置指南.md](docs/QMT路径配置指南.md)、[docs/QMT路径灵活配置功能说明.md](docs/QMT路径灵活配置功能说明.md)