245 lines
7.4 KiB
Markdown
245 lines
7.4 KiB
Markdown
|
|
# QTradeProgram 大单检测程序分析文档
|
|||
|
|
|
|||
|
|
## 项目概述
|
|||
|
|
|
|||
|
|
**项目名称**: QTradeProgram - 大单检测程序
|
|||
|
|
**开发环境**: VS2015 + Qt5.9 + Futu API
|
|||
|
|
**主要功能**: 实时监控股票订单数据,当某个订单中的股票数量超过设定的阈值时,在主界面显示大单信息
|
|||
|
|
|
|||
|
|
## 项目结构分析
|
|||
|
|
|
|||
|
|
### 目录结构
|
|||
|
|
```
|
|||
|
|
QTradeProgram/
|
|||
|
|
├── QMainwindow/ # 主窗口UI和应用程序逻辑
|
|||
|
|
├── Sqbase/ # 核心业务逻辑模块
|
|||
|
|
├── FTAPI/ # Futu API接口封装
|
|||
|
|
├── include/ # 头文件和协议定义
|
|||
|
|
├── config/ # 配置文件目录
|
|||
|
|
└── lib/ # 库文件目录
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 核心模块说明
|
|||
|
|
|
|||
|
|
#### 1. 主程序模块 (QMainwindow/)
|
|||
|
|
- **main.cpp**: 程序入口点,初始化QApplication和主窗口
|
|||
|
|
- **QMainwindow.h/cpp**: 主窗口类,负责UI管理、订阅列表管理、组件连接
|
|||
|
|
- **QDataAcquisition.h/cpp**: 数据采集类,封装Futu API接口
|
|||
|
|
- **QBreathingLight.h/cpp**: 呼吸灯控件,用于大单提示
|
|||
|
|
|
|||
|
|
#### 2. 业务逻辑模块 (Sqbase/)
|
|||
|
|
- **qorderprocessor.h/cpp**: 订单处理核心类,负责大单检测算法
|
|||
|
|
- **qbigordermanager.h/cpp**: 大单管理器,单例模式管理所有大单数据
|
|||
|
|
- **qbigorderviewer.h/cpp**: 大单查看器,显示大单信息的表格界面
|
|||
|
|
- **qlogmanager.h/cpp**: 日志管理系统
|
|||
|
|
- **OrderBookParser.h/cpp**: 订单簿数据解析器
|
|||
|
|
|
|||
|
|
#### 3. 数据接口模块 (FTAPI/)
|
|||
|
|
- **FTInterface.h/cpp**: Futu API接口封装
|
|||
|
|
- **FTAPI.h/cpp**: API实现类
|
|||
|
|
- **FTSPI.h**: API回调接口
|
|||
|
|
|
|||
|
|
#### 4. 数据结构定义
|
|||
|
|
- **BZStruct.h**: 定义所有核心数据结构,包括订单簿条目、大单信息等
|
|||
|
|
|
|||
|
|
## 核心数据结构
|
|||
|
|
|
|||
|
|
### OrderBookEntry (订单簿条目)
|
|||
|
|
```cpp
|
|||
|
|
struct OrderBookEntry {
|
|||
|
|
double price; // 价格
|
|||
|
|
double volume; // 成交量
|
|||
|
|
int orderCount; // 订单数量
|
|||
|
|
QString code; // 股票代码
|
|||
|
|
QVector<OrderDetail> details; // 订单详情
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### OrderBookData (订单簿数据)
|
|||
|
|
```cpp
|
|||
|
|
struct OrderBookData {
|
|||
|
|
QString name; // 股票名称
|
|||
|
|
QString code; // 股票代码
|
|||
|
|
QString askTime; // 卖盘时间
|
|||
|
|
QString bidTime; // 买盘时间
|
|||
|
|
QVector<OrderBookEntry> bids; // 买盘数据
|
|||
|
|
QVector<OrderBookEntry> asks; // 卖盘数据
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### BigOrderInfo (大单信息)
|
|||
|
|
```cpp
|
|||
|
|
struct BigOrderInfo {
|
|||
|
|
double price; // 价格
|
|||
|
|
double volume; // 成交量
|
|||
|
|
long long orderId; // 订单ID
|
|||
|
|
int nBigOrderType; // 大单类型 (0:空/1:多)
|
|||
|
|
int level; // 价格挡位
|
|||
|
|
bool isBigOrder; // 是否为大单
|
|||
|
|
QString name; // 股票名称
|
|||
|
|
QString code; // 股票代码
|
|||
|
|
QString svrRecvTime; // 交易所接收时间
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 调用关系分析
|
|||
|
|
|
|||
|
|
### 程序启动流程
|
|||
|
|
```
|
|||
|
|
main()
|
|||
|
|
→ QApplication::exec()
|
|||
|
|
→ QMainwindow 构造函数
|
|||
|
|
→ QDataAcquisition 初始化
|
|||
|
|
→ QBigOrderViewer 创建
|
|||
|
|
→ 信号槽连接建立
|
|||
|
|
→ 订阅列表加载
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 核心调用关系链
|
|||
|
|
|
|||
|
|
#### 1. 数据采集与处理链
|
|||
|
|
```
|
|||
|
|
Futu API 推送订单数据
|
|||
|
|
→ CFTInterface::OnReply()
|
|||
|
|
→ QOrderProcessor::processOrderBook()
|
|||
|
|
→ OrderBookParser 解析数据
|
|||
|
|
→ findExtremeOrders() 检测大单
|
|||
|
|
→ findMaxVolumeItem() 查找最大成交量
|
|||
|
|
→ emit maxOrderReady(BigOrderInfo)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2. 大单管理链
|
|||
|
|
```
|
|||
|
|
QOrderProcessor::maxOrderReady 信号
|
|||
|
|
→ QMainwindow 槽函数
|
|||
|
|
→ QBigOrderManager::addBigOrder()
|
|||
|
|
→ 存储大单数据
|
|||
|
|
→ emit bigOrderAdded() 信号
|
|||
|
|
→ QBigOrderViewer::onBigOrderAdded()
|
|||
|
|
→ QBreathingLight::triggerSignal() 视觉提示
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3. UI交互链
|
|||
|
|
```
|
|||
|
|
用户操作 (添加/删除订阅)
|
|||
|
|
→ QMainwindow 处理函数
|
|||
|
|
→ 更新 m_replyCodes 列表
|
|||
|
|
→ 更新 m_replyCodeQuantity 映射
|
|||
|
|
→ QOrderProcessor::setreplyCodeQuantity() 更新阈值
|
|||
|
|
→ 保存到配置文件
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 关键信号槽连接
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
// 大单检测信号
|
|||
|
|
connect(processor, &QOrderProcessor::maxOrderReady,
|
|||
|
|
this, [this](BigOrderInfo bigOrderInfo) {
|
|||
|
|
QBigOrderManager::instance()->addBigOrder(bigOrderInfo);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 大单显示信号
|
|||
|
|
connect(manager, &QBigOrderManager::bigOrderAdded,
|
|||
|
|
viewer, &QBigOrderViewer::onBigOrderAdded);
|
|||
|
|
|
|||
|
|
// 视觉提示信号
|
|||
|
|
connect(manager, &QBigOrderManager::markBigOrderSignal,
|
|||
|
|
m_lightWidget, &QBreathingLight::triggerSignal);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 大单检测算法
|
|||
|
|
|
|||
|
|
### 检测逻辑流程
|
|||
|
|
1. **数据接收**: 通过Futu API实时接收订单簿数据
|
|||
|
|
2. **数据解析**: OrderBookParser解析原始数据为OrderBookData结构
|
|||
|
|
3. **阈值比较**: 对每个订单条目,比较成交量与预设阈值
|
|||
|
|
4. **大单识别**: 使用findMaxVolumeItem()算法识别大单
|
|||
|
|
5. **结果发射**: 通过信号机制传递大单信息
|
|||
|
|
|
|||
|
|
### 核心算法函数
|
|||
|
|
```cpp
|
|||
|
|
// 在QOrderProcessor中
|
|||
|
|
QVector<BigOrderInfo> findExtremeOrders(const OrderBookData& data) const;
|
|||
|
|
OrderBookEntry findMaxVolumeItemEx(const QVector<OrderBookEntry>& items,
|
|||
|
|
double volumeRatio) const;
|
|||
|
|
QVector<BigOrderInfo> findMaxVolumeItem(const OrderBookData& data) const;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 配置管理
|
|||
|
|
|
|||
|
|
### 订阅列表管理
|
|||
|
|
- **文件格式**: CSV文件 (config/replyCodeList.csv)
|
|||
|
|
- **数据结构**: 股票代码,检测阈值
|
|||
|
|
- **阈值单位**: 千股 (界面显示为K,内部存储为实际数量)
|
|||
|
|
|
|||
|
|
### 阈值设置
|
|||
|
|
- 每个股票可单独设置检测阈值
|
|||
|
|
- 阈值在界面以"K"为单位显示,内部乘以1000处理
|
|||
|
|
- 实时更新到QOrderProcessor进行处理
|
|||
|
|
|
|||
|
|
## 线程与并发处理
|
|||
|
|
|
|||
|
|
### 多线程架构
|
|||
|
|
- **QOrderProcessor**: 使用QThreadPool进行订单处理
|
|||
|
|
- **异步信号**: 所有跨组件通信使用QueuedConnection确保线程安全
|
|||
|
|
- **数据保护**: 使用QMutex保护共享数据访问
|
|||
|
|
|
|||
|
|
### 线程安全措施
|
|||
|
|
```cpp
|
|||
|
|
// 大单管理器使用互斥锁
|
|||
|
|
mutable QMutex m_orderMutex;
|
|||
|
|
QList<QSharedPointer<BigOrderInfo>> m_bigOrders;
|
|||
|
|
|
|||
|
|
// 订单处理器使用线程池
|
|||
|
|
QThreadPool m_threadPool;
|
|||
|
|
mutable QMutex m_dataMutex;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 错误处理与日志
|
|||
|
|
|
|||
|
|
### 日志系统
|
|||
|
|
- 使用QLogManager进行分级日志记录
|
|||
|
|
- 支持INFO、WARNING、ERROR、FATAL等级别
|
|||
|
|
- 日志查看器集成在主界面中
|
|||
|
|
|
|||
|
|
### 错误处理策略
|
|||
|
|
- API连接状态实时监控
|
|||
|
|
- 数据解析异常处理
|
|||
|
|
- 文件操作错误处理
|
|||
|
|
- 内存分配安全检查
|
|||
|
|
|
|||
|
|
## 性能优化特性
|
|||
|
|
|
|||
|
|
### 内存优化
|
|||
|
|
- 数据结构内存对齐 (BZStruct.h)
|
|||
|
|
- 使用QSharedPointer智能指针管理对象生命周期
|
|||
|
|
- 定期清理历史数据
|
|||
|
|
|
|||
|
|
### 处理效率
|
|||
|
|
- 线程池处理订单数据
|
|||
|
|
- 批量数据处理能力
|
|||
|
|
- 高效的信号槽通信机制
|
|||
|
|
|
|||
|
|
## 扩展性与维护性
|
|||
|
|
|
|||
|
|
### 模块化设计
|
|||
|
|
- 各功能模块职责清晰,耦合度低
|
|||
|
|
- 易于扩展新的数据源或检测算法
|
|||
|
|
- 配置驱动,无需代码修改即可调整参数
|
|||
|
|
|
|||
|
|
### 接口设计
|
|||
|
|
- 标准的Qt信号槽机制
|
|||
|
|
- 清晰的数据结构定义
|
|||
|
|
- 完善的错误处理接口
|
|||
|
|
|
|||
|
|
## 总结
|
|||
|
|
|
|||
|
|
该程序是一个典型的事件驱动型金融监控应用,具有以下特点:
|
|||
|
|
1. **实时性**: 基于Futu API的实时数据推送
|
|||
|
|
2. **准确性**: 精确的大单检测算法
|
|||
|
|
3. **易用性**: 直观的Qt图形界面
|
|||
|
|
4. **稳定性**: 完善的错误处理和日志系统
|
|||
|
|
5. **扩展性**: 模块化设计便于功能扩展
|
|||
|
|
|
|||
|
|
程序架构合理,调用关系清晰,适合作为股票大单监控的基础平台进行进一步开发。
|