1394 lines
36 KiB
Markdown
1394 lines
36 KiB
Markdown
|
|
# QTradeProgram - 大单检测程序 软件设计说明书(优化完整版)
|
|||
|
|
|
|||
|
|
## 一、软件概述
|
|||
|
|
|
|||
|
|
### 1.1 软件名称
|
|||
|
|
|
|||
|
|
**QTradeProgram - 大单检测程序**(修正:去除全称空格,符合软件命名规范)
|
|||
|
|
|
|||
|
|
### 1.2 软件版本
|
|||
|
|
|
|||
|
|
**V1.0**(初始正式版本,包含全部核心功能模块,无功能阉割)
|
|||
|
|
|
|||
|
|
### 1.3 开发目的
|
|||
|
|
|
|||
|
|
本软件旨在为金融投资领域提供专业、高效的股票大单实时监控解决方案,通过精准识别市场大额交易行为,帮助投资者捕捉主力资金动向,为投资决策提供客观数据参考,填补中小投资者缺乏专业监控工具的空白。
|
|||
|
|
|
|||
|
|
### 1.4 适用范围
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 个人股票投资者(专注于短线交易、主力资金跟踪场景)
|
|||
|
|
|
|||
|
|
* 小型金融机构(需快速获取市场异动信号)
|
|||
|
|
|
|||
|
|
* 量化交易团队(作为策略输入数据源)
|
|||
|
|
|
|||
|
|
* 金融数据分析师(用于市场资金流向研究)
|
|||
|
|
|
|||
|
|
### 1.5 运行环境概述
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 运行平台:Windows 桌面端(64 位)
|
|||
|
|
|
|||
|
|
* 核心依赖:Futu API 数据服务、Qt 图形界面框架
|
|||
|
|
|
|||
|
|
* 网络要求:10Mbps 及以上稳定宽带,延迟≤200ms
|
|||
|
|
|
|||
|
|
## 二、系统架构设计
|
|||
|
|
|
|||
|
|
### 2.1 总体架构
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|||
|
|
|
|||
|
|
│ 用户界面层 │ │ 业务逻辑层 │ │ 数据访问层 │ │ 基础支撑层 │
|
|||
|
|
|
|||
|
|
│ (UI Layer) │◄──►│ (Business Layer) │◄──►│ (Data Layer) │◄──►│ (Support Layer) │
|
|||
|
|
|
|||
|
|
│ │ │ │ │ │ │ │
|
|||
|
|
|
|||
|
|
│ • 主窗口模块 │ │ • 订单处理模块 │ │ • API封装模块 │ │ • 日志模块 │
|
|||
|
|
|
|||
|
|
│ • 数据展示模块 │ │ • 大单检测模块 │ │ • 数据采集模块 │ │ • 配置模块 │
|
|||
|
|
|
|||
|
|
│ • 交互控制模块 │ │ • 缓存管理模块 │ │ • 数据解析模块 │ │ • 线程管理模块 │
|
|||
|
|
|
|||
|
|
│ • 提示反馈模块 │ │ • 统计分析模块 │ │ • 数据存储模块 │ │ • 异常处理模块 │
|
|||
|
|
|
|||
|
|
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**架构说明**:采用分层架构设计,层间通过接口交互,降低模块耦合度;基础支撑层为各核心层提供通用服务,确保系统稳定性和一致性。
|
|||
|
|
|
|||
|
|
### 2.2 模块划分
|
|||
|
|
|
|||
|
|
#### 2.2.1 用户界面层(QMainwindow/)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* **职责**:提供图形化交互入口,展示数据结果,接收用户操作指令
|
|||
|
|
|
|||
|
|
* **核心类**:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* `QMainwindow`:主窗口容器,管理各子面板布局
|
|||
|
|
|
|||
|
|
* `QBigOrderViewer`:大单数据展示控件(列表 + 详情)
|
|||
|
|
|
|||
|
|
* `QBreathingLight`:大单视觉提示控件
|
|||
|
|
|
|||
|
|
* `QConfigWidget`:配置参数设置界面
|
|||
|
|
|
|||
|
|
* `QLogWidget`:日志查看内嵌组件
|
|||
|
|
|
|||
|
|
#### 2.2.2 业务逻辑层(Sqbase/)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* **职责**:实现核心业务逻辑,协调数据处理与界面展示
|
|||
|
|
|
|||
|
|
* **核心类**:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* `QOrderProcessor`:订单数据处理核心,负责数据清洗与大单检测
|
|||
|
|
|
|||
|
|
* `QBigOrderManager`:大单数据管理,提供增删查改及线程安全保障
|
|||
|
|
|
|||
|
|
* `OrderBookParser`:订单簿数据解析,转换为标准化结构
|
|||
|
|
|
|||
|
|
* `QCacheManager`:缓存管理,优化重复数据处理效率
|
|||
|
|
|
|||
|
|
* `QStatisticAnalyzer`:基础统计分析(大单数量、频率统计)
|
|||
|
|
|
|||
|
|
#### 2.2.3 数据访问层(FTAPI/)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* **职责**:封装外部 API 交互,提供统一数据访问接口
|
|||
|
|
|
|||
|
|
* **核心类**:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* `CFTInterface`:Futu API 接口封装,处理连接与数据请求
|
|||
|
|
|
|||
|
|
* `QDataAcquisition`:数据采集器,负责实时数据接收与分发
|
|||
|
|
|
|||
|
|
* `QDataStorage`:本地数据存储,管理配置文件与历史记录
|
|||
|
|
|
|||
|
|
* `QDataValidator`:数据校验器,过滤异常数据(无效价格、负数成交量)
|
|||
|
|
|
|||
|
|
#### 2.2.4 基础支撑层(Utilities/)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* **职责**:提供通用工具类与基础服务,支撑各核心模块运行
|
|||
|
|
|
|||
|
|
* **核心类**:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* `QLogManager`:日志管理器,支持分级记录与文件轮转
|
|||
|
|
|
|||
|
|
* `ObjectPool`:对象池,复用高频创建的对象(订单数据、大单信息)
|
|||
|
|
|
|||
|
|
* `QThreadPoolManager`:线程池管理,统一调度异步任务
|
|||
|
|
|
|||
|
|
* `QExceptionHandler`:全局异常处理器,捕获并记录运行时错误
|
|||
|
|
|
|||
|
|
* `QConfigManager`:配置管理器,负责配置文件的读写与解析
|
|||
|
|
|
|||
|
|
### 2.3 模块交互关系
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 界面层通过信号槽机制向业务逻辑层发送操作指令(如阈值修改、股票订阅)
|
|||
|
|
|
|||
|
|
* 业务逻辑层调用数据访问层接口获取原始数据,处理后反馈给界面层展示
|
|||
|
|
|
|||
|
|
* 基础支撑层为所有模块提供日志、线程、异常处理等公共服务
|
|||
|
|
|
|||
|
|
* 跨模块数据传输采用智能指针封装,避免内存泄漏
|
|||
|
|
|
|||
|
|
## 三、详细设计
|
|||
|
|
|
|||
|
|
### 3.1 核心算法设计
|
|||
|
|
|
|||
|
|
#### 3.1.1 大单检测算法
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
算法名称: 基于动态阈值的大单检测算法
|
|||
|
|
|
|||
|
|
输入: OrderBookData (标准化订单簿数据), ReplyCodeConfig (股票订阅配置)
|
|||
|
|
|
|||
|
|
输出: QVector\<BigOrderInfo> (有效大单信息列表)
|
|||
|
|
|
|||
|
|
算法步骤:
|
|||
|
|
|
|||
|
|
1\. 初始化:读取当前股票的预设阈值(单位:K股)及历史成交量基线(最近5分钟均值)
|
|||
|
|
|
|||
|
|
2\. 数据预处理:过滤无效订单(价格≤0、成交量≤0、代码为空)
|
|||
|
|
|
|||
|
|
3\. 动态阈值计算:实际检测阈值 = max(预设阈值, 历史成交量基线×1.5)
|
|||
|
|
|
|||
|
|
4\. 大单识别:
|
|||
|
|
|
|||
|
|
  a. 遍历买盘(BID)订单列表,对比每笔订单成交量与实际检测阈值
|
|||
|
|
|
|||
|
|
  b. 成交量≥实际检测阈值时,标记为买盘大单,记录核心信息(价格、数量、时间)
|
|||
|
|
|
|||
|
|
  c. 遍历卖盘(ASK)订单列表,重复步骤4a-4b,标记卖盘大单
|
|||
|
|
|
|||
|
|
5\. 去重处理:同一订单ID(orderId)在30秒内不重复记录
|
|||
|
|
|
|||
|
|
6\. 结果排序:按订单接收时间降序排列,返回前100条有效大单(避免数据过载)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**算法特点**:结合固定阈值与历史成交量动态调整,降低单一股票不同时段的误报率
|
|||
|
|
|
|||
|
|
#### 3.1.2 缓存优化算法
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
算法名称: LRU(最近最少使用)缓存优化算法
|
|||
|
|
|
|||
|
|
输入: cacheKey (股票代码+时间片), processResult (处理后的数据)
|
|||
|
|
|
|||
|
|
输出: QVector\<BigOrderInfo> (缓存数据/新处理数据)
|
|||
|
|
|
|||
|
|
算法步骤:
|
|||
|
|
|
|||
|
|
1\. 缓存键生成:按“股票代码\_时间片(每1分钟为一个时间片)”生成唯一缓存键
|
|||
|
|
|
|||
|
|
2\. 缓存查询:在缓存字典中查找对应缓存键
|
|||
|
|
|
|||
|
|
3\. 缓存命中:
|
|||
|
|
|
|||
|
|
  a. 若找到且缓存未过期(默认有效期30秒),返回缓存数据
|
|||
|
|
|
|||
|
|
  b. 更新该缓存键的访问时间,维持LRU排序
|
|||
|
|
|
|||
|
|
4\. 缓存未命中:
|
|||
|
|
|
|||
|
|
  a. 执行大单检测算法获取新数据
|
|||
|
|
|
|||
|
|
  b. 将新数据存入缓存,关联缓存键与过期时间
|
|||
|
|
|
|||
|
|
5\. 缓存清理:
|
|||
|
|
|
|||
|
|
  a. 当缓存数量达到上限(默认200条),移除最久未访问的缓存项
|
|||
|
|
|
|||
|
|
  b. 每次新增缓存时,顺带清理已过期的缓存项
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**算法价值**:减少重复数据处理次数,提升高并发场景下的响应速度
|
|||
|
|
|
|||
|
|
### 3.2 数据结构设计
|
|||
|
|
|
|||
|
|
#### 3.2.1 核心业务数据结构
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
// 订单簿条目(标准化后)
|
|||
|
|
|
|||
|
|
struct OrderBookEntry {
|
|||
|
|
|
|||
|
|
  double price; // 订单价格(单位:元)
|
|||
|
|
|
|||
|
|
  double volume; // 成交量(单位:股)
|
|||
|
|
|
|||
|
|
  int orderCount; // 该价位订单笔数
|
|||
|
|
|
|||
|
|
  QString code; // 股票代码(如00700)
|
|||
|
|
|
|||
|
|
  QString marketType; // 市场类型(SH/A股,HK/港股)
|
|||
|
|
|
|||
|
|
  QDateTime orderTime; // 订单生成时间(精确到毫秒)
|
|||
|
|
|
|||
|
|
  QVector\<OrderDetail> details; // 订单详情(仅包含公开字段)
|
|||
|
|
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 订单详情
|
|||
|
|
|
|||
|
|
struct OrderDetail {
|
|||
|
|
|
|||
|
|
  long long orderId; // 订单唯一标识
|
|||
|
|
|
|||
|
|
  int orderType; // 订单类型(0/限价单,1/市价单)
|
|||
|
|
|
|||
|
|
  double tradeAmount; // 成交额(单位:元)
|
|||
|
|
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 大单信息(检测结果)
|
|||
|
|
|
|||
|
|
struct BigOrderInfo {
|
|||
|
|
|
|||
|
|
  double price; // 成交价格(单位:元)
|
|||
|
|
|
|||
|
|
  double volume; // 成交数量(单位:股)
|
|||
|
|
|
|||
|
|
  double amount; // 成交金额(单位:元)
|
|||
|
|
|
|||
|
|
  long long orderId; // 订单ID
|
|||
|
|
|
|||
|
|
  int bigOrderType; // 大单类型(0:卖盘,1:买盘)
|
|||
|
|
|
|||
|
|
  QString stockCode; // 股票代码
|
|||
|
|
|
|||
|
|
  QString stockName; // 股票名称
|
|||
|
|
|
|||
|
|
  QDateTime receiveTime; // 系统接收时间
|
|||
|
|
|
|||
|
|
  QDateTime tradeTime; // 实际成交时间
|
|||
|
|
|
|||
|
|
  double threshold; // 检测时使用的阈值(单位:股)
|
|||
|
|
|
|||
|
|
  bool isDynamicThreshold;// 是否使用动态阈值
|
|||
|
|
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.2.2 配置与系统数据结构
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
// 股票订阅配置项
|
|||
|
|
|
|||
|
|
struct ReplyCodeItem {
|
|||
|
|
|
|||
|
|
  QString stockCode; // 股票代码(唯一标识)
|
|||
|
|
|
|||
|
|
  float threshold; // 基础检测阈值(单位:K股)
|
|||
|
|
|
|||
|
|
  QString stockName; // 股票名称
|
|||
|
|
|
|||
|
|
  bool isDynamic; // 是否启用动态阈值
|
|||
|
|
|
|||
|
|
  QString marketType; // 市场类型(SH/SZ/HK)
|
|||
|
|
|
|||
|
|
  bool isMonitored; // 是否启用监控(true/启用,false/暂停)
|
|||
|
|
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 系统配置
|
|||
|
|
|
|||
|
|
struct SystemConfig {
|
|||
|
|
|
|||
|
|
  int threadPoolSize; // 线程池最大线程数(默认8)
|
|||
|
|
|
|||
|
|
  int cacheMaxSize; // 缓存最大条目数(默认200)
|
|||
|
|
|
|||
|
|
  int cacheExpireTime; // 缓存过期时间(单位:秒,默认30)
|
|||
|
|
|
|||
|
|
  QString logSavePath; // 日志保存路径(默认./logs/)
|
|||
|
|
|
|||
|
|
  int logRetainDays; // 日志保留天数(默认30)
|
|||
|
|
|
|||
|
|
  bool isSoundPrompt; // 是否启用声音提示(默认true)
|
|||
|
|
|
|||
|
|
  bool isAutoReconnect; // 是否启用自动重连(默认true)
|
|||
|
|
|
|||
|
|
  int reconnectInterval; // 重连间隔(单位:秒,默认5)
|
|||
|
|
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.3 类设计
|
|||
|
|
|
|||
|
|
#### 3.3.1 QOrderProcessor 类
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
类名: QOrderProcessor
|
|||
|
|
|
|||
|
|
所属模块: 业务逻辑层
|
|||
|
|
|
|||
|
|
职责: 订单数据处理与大单检测核心,协调数据解析、阈值比对与结果输出
|
|||
|
|
|
|||
|
|
设计模式: 单例模式(确保全局唯一数据处理入口)
|
|||
|
|
|
|||
|
|
主要方法:
|
|||
|
|
|
|||
|
|
\- processOrderBook(const OrderBookData& data):处理单条订单簿数据,返回大单检测结果
|
|||
|
|
|
|||
|
|
\- setReplyCodeConfig(const QVector\<ReplyCodeItem>& config):设置股票订阅配置(含阈值)
|
|||
|
|
|
|||
|
|
\- getProcessingStatus(const QString& stockCode):获取指定股票的处理状态
|
|||
|
|
|
|||
|
|
\- pauseProcessing():暂停数据处理(如用户手动暂停监控)
|
|||
|
|
|
|||
|
|
\- resumeProcessing():恢复数据处理
|
|||
|
|
|
|||
|
|
主要属性:
|
|||
|
|
|
|||
|
|
\- m\_threadPool:线程池实例,用于异步处理多股票数据
|
|||
|
|
|
|||
|
|
\- m\_replyCodeConfig:股票订阅配置列表,存储阈值及监控状态
|
|||
|
|
|
|||
|
|
\- m\_orderCache:LRU缓存实例,缓存近期处理结果
|
|||
|
|
|
|||
|
|
\- m\_processingStatus:处理状态映射(股票代码→是否处理中)
|
|||
|
|
|
|||
|
|
\- m\_mutex:互斥锁,保障多线程访问安全
|
|||
|
|
|
|||
|
|
依赖类:
|
|||
|
|
|
|||
|
|
\- OrderBookParser:数据解析依赖
|
|||
|
|
|
|||
|
|
\- QCacheManager:缓存管理依赖
|
|||
|
|
|
|||
|
|
\- QDataValidator:数据校验依赖
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.3.2 QBigOrderManager 类
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
类名: QBigOrderManager
|
|||
|
|
|
|||
|
|
所属模块: 业务逻辑层
|
|||
|
|
|
|||
|
|
职责: 统一管理大单数据,提供线程安全的增删查改接口,同步数据至界面
|
|||
|
|
|
|||
|
|
设计模式: 单例模式+观察者模式(数据变化时通知界面更新)
|
|||
|
|
|
|||
|
|
主要方法:
|
|||
|
|
|
|||
|
|
\- addBigOrder(const QSharedPointer\<BigOrderInfo>& order):添加大单(自动去重)
|
|||
|
|
|
|||
|
|
\- removeBigOrder(long long orderId):根据订单ID删除大单
|
|||
|
|
|
|||
|
|
\- removeBigOrdersByStock(const QString& stockCode):删除指定股票的所有大单
|
|||
|
|
|
|||
|
|
\- getBigOrders(int count = 100):获取最新大单列表(默认前100条)
|
|||
|
|
|
|||
|
|
\- getBigOrdersByStock(const QString& stockCode):获取指定股票的大单列表
|
|||
|
|
|
|||
|
|
\- clearAll():清空所有大单数据
|
|||
|
|
|
|||
|
|
\- getBigOrderCount():获取当前大单总数
|
|||
|
|
|
|||
|
|
主要属性:
|
|||
|
|
|
|||
|
|
\- m\_bigOrders:大单数据存储(有序列表,按时间降序)
|
|||
|
|
|
|||
|
|
\- m\_orderIdSet:订单ID集合(用于去重)
|
|||
|
|
|
|||
|
|
\- m\_orderMutex:数据访问互斥锁
|
|||
|
|
|
|||
|
|
\- m\_observers:观察者列表(界面组件)
|
|||
|
|
|
|||
|
|
信号接口:
|
|||
|
|
|
|||
|
|
\- bigOrderAdded(QSharedPointer\<BigOrderInfo> order):新增大单时触发
|
|||
|
|
|
|||
|
|
\- bigOrderRemoved(long long orderId):删除大单时触发
|
|||
|
|
|
|||
|
|
\- bigOrderCleared():清空大单时触发
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.3.3 CFTInterface 类
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
类名: CFTInterface
|
|||
|
|
|
|||
|
|
所属模块: 数据访问层
|
|||
|
|
|
|||
|
|
职责: 封装Futu API的连接、数据请求与接收逻辑,提供统一数据接口
|
|||
|
|
|
|||
|
|
主要方法:
|
|||
|
|
|
|||
|
|
\- init(const QString& apiKey, const QString& secret):初始化API(传入密钥)
|
|||
|
|
|
|||
|
|
\- connectAPI():建立API连接,返回连接状态
|
|||
|
|
|
|||
|
|
\- disconnectAPI():断开API连接
|
|||
|
|
|
|||
|
|
\- subscribeStock(const QString& stockCode, const QString& marketType):订阅股票数据
|
|||
|
|
|
|||
|
|
\- unsubscribeStock(const QString& stockCode):取消订阅股票数据
|
|||
|
|
|
|||
|
|
\- isConnected():获取当前连接状态
|
|||
|
|
|
|||
|
|
\- getErrorMsg():获取最近一次错误信息
|
|||
|
|
|
|||
|
|
主要属性:
|
|||
|
|
|
|||
|
|
\- m\_apiKey:API密钥(内存中加密存储)
|
|||
|
|
|
|||
|
|
\- m\_secret:API秘钥(内存中加密存储)
|
|||
|
|
|
|||
|
|
\- m\_isConnected:连接状态标识
|
|||
|
|
|
|||
|
|
\- m\_errorCode:最近错误代码
|
|||
|
|
|
|||
|
|
\- m\_errorMsg:最近错误信息
|
|||
|
|
|
|||
|
|
\- m\_mutex:连接操作互斥锁
|
|||
|
|
|
|||
|
|
信号接口:
|
|||
|
|
|
|||
|
|
\- connected():连接成功时触发
|
|||
|
|
|
|||
|
|
\- disconnected():连接断开时触发
|
|||
|
|
|
|||
|
|
\- dataReceived(const QByteArray& rawData):接收原始数据时触发
|
|||
|
|
|
|||
|
|
\- errorOccurred(int errorCode, const QString& errorMsg):发生错误时触发
|
|||
|
|
|
|||
|
|
依赖:
|
|||
|
|
|
|||
|
|
\- Futu API SDK:底层通信依赖
|
|||
|
|
|
|||
|
|
\- QEncryptionUtils:密钥加密存储依赖
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.3.4 QLogManager 类
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
类名: QLogManager
|
|||
|
|
|
|||
|
|
所属模块: 基础支撑层
|
|||
|
|
|
|||
|
|
职责: 提供分级日志记录服务,支持日志文件轮转与查看
|
|||
|
|
|
|||
|
|
设计模式: 单例模式
|
|||
|
|
|
|||
|
|
主要方法:
|
|||
|
|
|
|||
|
|
\- logDebug(const QString& module, const QString& msg):记录调试日志(仅开发环境生效)
|
|||
|
|
|
|||
|
|
\- logInfo(const QString& module, const QString& msg):记录信息日志
|
|||
|
|
|
|||
|
|
\- logWarning(const QString& module, const QString& msg):记录警告日志
|
|||
|
|
|
|||
|
|
\- logError(const QString& module, const QString& msg):记录错误日志
|
|||
|
|
|
|||
|
|
\- logFatal(const QString& module, const QString& msg):记录致命错误日志
|
|||
|
|
|
|||
|
|
\- setLogLevel(int level):设置日志输出级别(默认INFO及以上)
|
|||
|
|
|
|||
|
|
\- getLogFiles():获取日志文件列表
|
|||
|
|
|
|||
|
|
\- clearExpiredLogs():清理过期日志
|
|||
|
|
|
|||
|
|
主要属性:
|
|||
|
|
|
|||
|
|
\- m\_logLevel:日志输出级别(DEBUG=0, INFO=1, WARNING=2, ERROR=3, FATAL=4)
|
|||
|
|
|
|||
|
|
\- m\_logPath:日志保存路径
|
|||
|
|
|
|||
|
|
\- m\_retainDays:日志保留天数
|
|||
|
|
|
|||
|
|
\- m\_fileSizeLimit:单个日志文件大小限制(默认50MB)
|
|||
|
|
|
|||
|
|
\- m\_currentLogFile:当前日志文件句柄
|
|||
|
|
|
|||
|
|
核心逻辑:
|
|||
|
|
|
|||
|
|
\- 按“日志级别\_日期.log”命名日志文件
|
|||
|
|
|
|||
|
|
\- 达到文件大小限制或跨天时自动创建新日志文件
|
|||
|
|
|
|||
|
|
\- 日志内容格式:\[时间戳(精确到毫秒)] \[级别] \[模块] 消息内容
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.4 接口设计
|
|||
|
|
|
|||
|
|
#### 3.4.1 模块间接口(信号槽)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
// 数据访问层→业务逻辑层(数据接收)
|
|||
|
|
|
|||
|
|
void rawDataReceived(const QByteArray& rawData); // 接收原始API数据
|
|||
|
|
|
|||
|
|
void apiConnected(); // API连接成功
|
|||
|
|
|
|||
|
|
void apiDisconnected(); // API连接断开
|
|||
|
|
|
|||
|
|
void apiErrorOccurred(int errorCode, const QString& errorMsg); // API错误
|
|||
|
|
|
|||
|
|
// 业务逻辑层→用户界面层(数据展示)
|
|||
|
|
|
|||
|
|
void bigOrderAdded(QSharedPointer\<BigOrderInfo> order); // 新增大单
|
|||
|
|
|
|||
|
|
void bigOrderListUpdated(const QVector\<QSharedPointer\<BigOrderInfo>>& orders); // 大单列表更新
|
|||
|
|
|
|||
|
|
void processingStatusChanged(const QString& stockCode, bool isProcessing); // 处理状态变更
|
|||
|
|
|
|||
|
|
void statisticDataUpdated(const StatisticData& data); // 统计数据更新
|
|||
|
|
|
|||
|
|
// 用户界面层→业务逻辑层(操作指令)
|
|||
|
|
|
|||
|
|
void subscribeStock(const ReplyCodeItem& item); // 订阅股票
|
|||
|
|
|
|||
|
|
void unsubscribeStock(const QString& stockCode); // 取消订阅
|
|||
|
|
|
|||
|
|
void updateThreshold(const QString& stockCode, float threshold); // 更新阈值
|
|||
|
|
|
|||
|
|
void setDynamicThreshold(const QString& stockCode, bool isDynamic); // 启用/禁用动态阈值
|
|||
|
|
|
|||
|
|
void clearAllBigOrders(); // 清空大单
|
|||
|
|
|
|||
|
|
void startMonitoring(); // 开始监控
|
|||
|
|
|
|||
|
|
void stopMonitoring(); // 停止监控
|
|||
|
|
|
|||
|
|
// 基础支撑层→其他模块(公共服务)
|
|||
|
|
|
|||
|
|
void logGenerated(const QString& logContent); // 新日志生成
|
|||
|
|
|
|||
|
|
void fatalErrorOccurred(const QString& errorMsg); // 致命错误
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.4.2 外部接口(扩展预留)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
// 数据导出接口(供外部系统调用)
|
|||
|
|
|
|||
|
|
class IDataExporter {
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
|
|||
|
|
  virtual bool exportToCsv(const QString& filePath, const QVector\<QSharedPointer\<BigOrderInfo>>& data) = 0;
|
|||
|
|
|
|||
|
|
  virtual bool exportToJson(const QString& filePath, const QVector\<QSharedPointer\<BigOrderInfo>>& data) = 0;
|
|||
|
|
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 检测算法扩展接口(支持插件化替换)
|
|||
|
|
|
|||
|
|
class IBigOrderDetector {
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
|
|||
|
|
  virtual QVector\<QSharedPointer\<BigOrderInfo>> detect(const OrderBookData& data, const ReplyCodeItem& config) = 0;
|
|||
|
|
|
|||
|
|
  virtual QString detectorName() const = 0;
|
|||
|
|
|
|||
|
|
  virtual QWidget\* configWidget() = 0;
|
|||
|
|
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 四、技术实现
|
|||
|
|
|
|||
|
|
### 4.1 多线程处理
|
|||
|
|
|
|||
|
|
#### 4.1.1 线程池设计
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 采用 Qt 线程池 + 自定义任务调度策略,线程数默认 8(可通过配置文件调整)
|
|||
|
|
|
|||
|
|
* 任务优先级划分:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 高优先级:数据接收与解析任务
|
|||
|
|
|
|||
|
|
* 中优先级:大单检测与统计任务
|
|||
|
|
|
|||
|
|
* 低优先级:日志写入、缓存清理任务
|
|||
|
|
|
|||
|
|
* 任务队列管理:使用无锁队列存储任务,避免线程阻塞
|
|||
|
|
|
|||
|
|
#### 4.1.2 线程安全机制
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 共享数据(如大单列表、配置信息)采用互斥锁(QMutex)保护
|
|||
|
|
|
|||
|
|
* 使用 QMutexLocker 自动管理锁的获取与释放,避免死锁
|
|||
|
|
|
|||
|
|
* 跨线程数据传输采用 QSharedPointer 智能指针,确保内存安全释放
|
|||
|
|
|
|||
|
|
* 禁止在非 UI 线程直接操作界面组件,通过信号槽异步通知 UI 更新
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
// 线程安全访问示例
|
|||
|
|
|
|||
|
|
QSharedPointer\<BigOrderInfo> getLatestBigOrder() {
|
|||
|
|
|
|||
|
|
  QMutexLocker locker(\&m\_orderMutex); // 自动加锁
|
|||
|
|
|
|||
|
|
  if (m\_bigOrders.isEmpty()) {
|
|||
|
|
|
|||
|
|
  return nullptr;
|
|||
|
|
|
|||
|
|
  }
|
|||
|
|
|
|||
|
|
  return m\_bigOrders.first(); // 自动解锁(QMutexLocker析构)
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4.2 内存管理
|
|||
|
|
|
|||
|
|
#### 4.2.1 智能指针应用
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 所有动态创建的业务对象(BigOrderInfo、OrderBookData 等)均使用 QSharedPointer 管理
|
|||
|
|
|
|||
|
|
* 容器存储采用 QVector\<QSharedPointer>,避免浅拷贝与内存泄漏
|
|||
|
|
|
|||
|
|
* 跨线程传递对象时,通过智能指针自动维护引用计数,确保对象生命周期
|
|||
|
|
|
|||
|
|
#### 4.2.2 对象池设计
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 针对高频创建 / 销毁的对象(如 OrderBookEntry、OrderDetail),实现对象池复用
|
|||
|
|
|
|||
|
|
* 对象池核心参数:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 初始容量:50 个
|
|||
|
|
|
|||
|
|
* 最大容量:200 个
|
|||
|
|
|
|||
|
|
* 空闲时间:超过 30 秒未使用的对象自动销毁
|
|||
|
|
|
|||
|
|
* 减少内存分配与释放开销,提升高并发场景下的性能
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
// 对象池使用示例
|
|||
|
|
|
|||
|
|
QSharedPointer\<OrderBookEntry> getOrderBookEntry() {
|
|||
|
|
|
|||
|
|
  return m\_objectPool.acquire(); // 从对象池获取对象
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void releaseOrderBookEntry(QSharedPointer\<OrderBookEntry> entry) {
|
|||
|
|
|
|||
|
|
  entry->reset(); // 重置对象状态
|
|||
|
|
|
|||
|
|
  m\_objectPool.release(entry); // 归还对象池
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4.3 性能优化
|
|||
|
|
|
|||
|
|
#### 4.3.1 缓存机制
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 实现 LRU 缓存管理近期处理的股票数据,缓存命中率目标≥60%
|
|||
|
|
|
|||
|
|
* 缓存键设计:结合股票代码与时间片,确保数据时效性
|
|||
|
|
|
|||
|
|
* 缓存清理策略:容量满时移除最久未访问项,同时清理过期项
|
|||
|
|
|
|||
|
|
#### 4.3.2 数据处理优化
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 采用批量解析策略:每接收 10 条原始数据后批量解析,减少函数调用开销
|
|||
|
|
|
|||
|
|
* 使用高效数据结构:QMap(O (log n) 查找)存储股票配置,QVector(连续内存)存储订单数据
|
|||
|
|
|
|||
|
|
* 避免重复计算:缓存历史成交量基线,5 分钟更新一次,无需实时计算
|
|||
|
|
|
|||
|
|
* 异步 IO 操作:日志写入、文件存储等 IO 操作放入单独线程,不阻塞核心业务
|
|||
|
|
|
|||
|
|
#### 4.3.3 界面渲染优化
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 大单列表采用分页渲染(每页 50 条),避免大量数据一次性渲染卡顿
|
|||
|
|
|
|||
|
|
* 界面更新采用定时刷新(100ms / 次),而非数据变化立即刷新
|
|||
|
|
|
|||
|
|
* 隐藏不可见区域的渲染,减少 GPU 占用
|
|||
|
|
|
|||
|
|
### 4.4 异常处理
|
|||
|
|
|
|||
|
|
#### 4.4.1 全局异常捕获
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 实现 Qt 全局异常处理器,捕获 C++ 异常与 Qt 信号槽异常
|
|||
|
|
|
|||
|
|
* 异常分级处理:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 轻微异常(如单条数据解析失败):记录日志,跳过该数据,不影响整体运行
|
|||
|
|
|
|||
|
|
* 严重异常(如 API 连接失败):记录日志,触发重连机制,界面提示用户
|
|||
|
|
|
|||
|
|
* 致命异常(如内存不足):记录日志,保存当前配置与数据,优雅退出程序
|
|||
|
|
|
|||
|
|
#### 4.4.2 数据异常处理
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 数据校验:过滤价格≤0、成交量≤0、代码格式非法的数据
|
|||
|
|
|
|||
|
|
* 数据恢复:解析失败时,尝试使用备用解析方案;仍失败则丢弃该条数据
|
|||
|
|
|
|||
|
|
* 边界处理:针对涨跌停价格、异常成交量(超过历史均值 10 倍)单独标记,不直接丢弃
|
|||
|
|
|
|||
|
|
## 五、数据流程设计
|
|||
|
|
|
|||
|
|
### 5.1 核心数据流程(实时监控)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1\. 用户启动程序→QLogManager初始化→QConfigManager加载配置→CFTInterface初始化
|
|||
|
|
|
|||
|
|
2\. 用户触发"开始监控"→CFTInterface::connectAPI()建立连接→连接成功后触发apiConnected()信号
|
|||
|
|
|
|||
|
|
3\. 业务逻辑层接收信号→调用CFTInterface::subscribeStock()订阅配置中的股票
|
|||
|
|
|
|||
|
|
4\. Futu API推送原始数据→CFTInterface::OnDataReceived()接收→触发rawDataReceived()信号
|
|||
|
|
|
|||
|
|
5\. 业务逻辑层接收原始数据→OrderBookParser::parse()解析为标准化OrderBookData
|
|||
|
|
|
|||
|
|
6\. QDataValidator::validate()校验数据有效性→过滤异常数据
|
|||
|
|
|
|||
|
|
7\. QOrderProcessor::processOrderBook()处理数据→调用大单检测算法
|
|||
|
|
|
|||
|
|
8\. 检测到大单→QBigOrderManager::addBigOrder()添加(自动去重)→触发bigOrderAdded()信号
|
|||
|
|
|
|||
|
|
9\. 用户界面层接收信号→QBigOrderViewer更新列表→QBreathingLight触发提示
|
|||
|
|
|
|||
|
|
10\. 同时QLogManager记录大单信息→QDataStorage异步保存至历史记录
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5.2 配置管理流程
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1\. 用户在界面修改配置(新增股票、调整阈值)→触发updateConfig()信号
|
|||
|
|
|
|||
|
|
2\. 业务逻辑层接收信号→QOrderProcessor更新m\_replyCodeConfig
|
|||
|
|
|
|||
|
|
3\. QConfigManager::saveConfig()将新配置写入本地文件(config/replyCodeList.csv+system.config)
|
|||
|
|
|
|||
|
|
4\. 若新增股票→调用CFTInterface::subscribeStock()订阅该股票数据
|
|||
|
|
|
|||
|
|
5\. 若删除股票→调用CFTInterface::unsubscribeStock()取消订阅→QBigOrderManager::removeBigOrdersByStock()删除该股票历史大单
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5.3 错误处理流程
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1\. API连接失败→CFTInterface触发apiErrorOccurred()信号→传递错误代码与信息
|
|||
|
|
|
|||
|
|
2\. 业务逻辑层接收信号→QLogManager记录ERROR级别日志
|
|||
|
|
|
|||
|
|
3\. 若启用自动重连→QThreadPoolManager调度重连任务→按配置间隔重试
|
|||
|
|
|
|||
|
|
4\. 重连成功→恢复监控状态→界面提示"连接恢复"
|
|||
|
|
|
|||
|
|
5\. 重连失败(超过最大重试次数)→触发fatalErrorOccurred()信号→界面显示错误提示→允许用户手动重试
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5.4 数据导出流程
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1\. 用户点击"导出数据"→选择格式(CSV/JSON)与保存路径
|
|||
|
|
|
|||
|
|
2\. 界面层触发exportData()信号→传递导出参数
|
|||
|
|
|
|||
|
|
3\. 业务逻辑层接收信号→QBigOrderManager::getBigOrders()获取目标数据(按时间范围筛选)
|
|||
|
|
|
|||
|
|
4\. 调用IDataExporter接口→执行导出操作
|
|||
|
|
|
|||
|
|
5\. 导出成功→界面提示"导出完成"→记录INFO日志
|
|||
|
|
|
|||
|
|
6\. 导出失败→界面提示错误信息→记录ERROR日志(包含失败原因)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 六、数据存储设计
|
|||
|
|
|
|||
|
|
### 6.1 配置文件设计
|
|||
|
|
|
|||
|
|
#### 6.1.1 股票订阅配置(replyCodeList.csv)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
股票代码,检测阈值(K),股票名称,市场类型,是否启用动态阈值,是否监控
|
|||
|
|
|
|||
|
|
00700,50,腾讯控股,HK,1,1
|
|||
|
|
|
|||
|
|
00005,30,汇丰控股,HK,0,1
|
|||
|
|
|
|||
|
|
09988,40,阿里巴巴,HK,1,1
|
|||
|
|
|
|||
|
|
600036,20,招商银行,SH,1,1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 字段说明:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 股票代码:交易所标准代码(不含市场前缀)
|
|||
|
|
|
|||
|
|
* 检测阈值 (K):基础阈值,单位为千股
|
|||
|
|
|
|||
|
|
* 市场类型:SH(上交所)、SZ(深交所)、HK(港交所)
|
|||
|
|
|
|||
|
|
* 是否启用动态阈值:1 = 启用,0 = 禁用
|
|||
|
|
|
|||
|
|
* 是否监控:1 = 启用监控,0 = 暂停监控
|
|||
|
|
|
|||
|
|
#### 6.1.2 系统配置文件(system.config)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
\[ThreadPool]
|
|||
|
|
|
|||
|
|
Size=8
|
|||
|
|
|
|||
|
|
MaxQueueSize=1000
|
|||
|
|
|
|||
|
|
\[Cache]
|
|||
|
|
|
|||
|
|
MaxSize=200
|
|||
|
|
|
|||
|
|
ExpireTime=30
|
|||
|
|
|
|||
|
|
\[Log]
|
|||
|
|
|
|||
|
|
SavePath=./logs/
|
|||
|
|
|
|||
|
|
RetainDays=30
|
|||
|
|
|
|||
|
|
FileSizeLimit=52428800
|
|||
|
|
|
|||
|
|
LogLevel=1
|
|||
|
|
|
|||
|
|
\[API]
|
|||
|
|
|
|||
|
|
AutoReconnect=1
|
|||
|
|
|
|||
|
|
ReconnectInterval=5
|
|||
|
|
|
|||
|
|
HeartbeatInterval=30
|
|||
|
|
|
|||
|
|
\[UI]
|
|||
|
|
|
|||
|
|
SoundPrompt=1
|
|||
|
|
|
|||
|
|
BreathingLight=1
|
|||
|
|
|
|||
|
|
RefreshInterval=100
|
|||
|
|
|
|||
|
|
\[DataStorage]
|
|||
|
|
|
|||
|
|
HistoryRetainDays=90
|
|||
|
|
|
|||
|
|
AutoBackup=1
|
|||
|
|
|
|||
|
|
BackupTime=02:00
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 配置项说明:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* ThreadPool:线程池配置(大小、最大队列数)
|
|||
|
|
|
|||
|
|
* Cache:缓存配置(最大条目数、过期时间)
|
|||
|
|
|
|||
|
|
* Log:日志配置(路径、保留天数、大小限制、输出级别)
|
|||
|
|
|
|||
|
|
* API:API 连接配置(自动重连、重连间隔、心跳间隔)
|
|||
|
|
|
|||
|
|
* UI:界面配置(声音提示、呼吸灯、刷新间隔)
|
|||
|
|
|
|||
|
|
* DataStorage:数据存储配置(历史记录保留天数、自动备份)
|
|||
|
|
|
|||
|
|
### 6.2 日志文件设计
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 日志文件命名:`log_YYYYMMDD.log`(按日期拆分)
|
|||
|
|
|
|||
|
|
* 日志内容格式:`[YYYY-MM-DD HH:mm:ss.zzz] [LEVEL] [MODULE] 消息内容`
|
|||
|
|
|
|||
|
|
* 示例:
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
\[2025-11-11 10:00:00.123] \[INFO] \[CFTInterface] API连接成功
|
|||
|
|
|
|||
|
|
\[2025-11-11 10:00:01.456] \[INFO] \[QOrderProcessor] 开始处理股票00700数据
|
|||
|
|
|
|||
|
|
\[2025-11-11 10:00:02.789] \[INFO] \[QBigOrderManager] 检测到买盘大单:00700 腾讯控股 50K股 320.5元
|
|||
|
|
|
|||
|
|
\[2025-11-11 10:05:03.321] \[WARNING] \[CFTInterface] API心跳超时,尝试重连
|
|||
|
|
|
|||
|
|
\[2025-11-11 10:05:05.654] \[INFO] \[CFTInterface] API重连成功
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 6.3 历史数据存储
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 存储路径:`./data/history/`
|
|||
|
|
|
|||
|
|
* 存储格式:按日期分文件夹,每个股票一个 CSV 文件
|
|||
|
|
|
|||
|
|
* 文件名:`股票代码_YYYYMMDD.csv`
|
|||
|
|
|
|||
|
|
* 存储字段:成交时间、价格、数量、金额、大单类型、检测阈值
|
|||
|
|
|
|||
|
|
* 清理策略:超过保留天数(默认 90 天)的历史数据自动删除
|
|||
|
|
|
|||
|
|
## 七、安全设计
|
|||
|
|
|
|||
|
|
### 7.1 数据安全
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* API 密钥 / 秘钥:内存中采用 Base64 编码存储,不写入配置文件
|
|||
|
|
|
|||
|
|
* 网络通信:依赖 Futu API 的 HTTPS 加密通道,数据传输过程加密
|
|||
|
|
|
|||
|
|
* 本地数据:配置文件与历史记录均为明文(无敏感信息),无需加密
|
|||
|
|
|
|||
|
|
* 数据访问:历史数据文件仅允许当前用户读写,设置文件权限
|
|||
|
|
|
|||
|
|
### 7.2 程序安全
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 内存安全:使用智能指针与对象池,杜绝野指针与内存泄漏
|
|||
|
|
|
|||
|
|
* 线程安全:所有共享数据均加锁保护,避免数据竞争与脏读
|
|||
|
|
|
|||
|
|
* 异常安全:全局异常捕获机制,防止程序崩溃导致的数据丢失
|
|||
|
|
|
|||
|
|
* 输入校验:用户输入的股票代码、阈值等参数均做合法性校验(如阈值 > 0)
|
|||
|
|
|
|||
|
|
### 7.3 访问控制
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 无用户登录功能(单机使用),但配置文件仅允许管理员权限修改
|
|||
|
|
|
|||
|
|
* 避免运行时修改程序文件,检测到文件篡改时提示并退出
|
|||
|
|
|
|||
|
|
* 禁止外部进程注入,启用 Qt 的进程保护机制
|
|||
|
|
|
|||
|
|
## 八、性能设计
|
|||
|
|
|
|||
|
|
### 8.1 性能指标
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* **响应时间**:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 数据接收→解析完成:≤10ms
|
|||
|
|
|
|||
|
|
* 大单检测→界面展示:≤100ms
|
|||
|
|
|
|||
|
|
* 用户操作→系统响应:≤200ms
|
|||
|
|
|
|||
|
|
* **并发处理能力**:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 支持同时监控股票数量:≥100 只
|
|||
|
|
|
|||
|
|
* 订单处理速率:≥1000 条 / 秒
|
|||
|
|
|
|||
|
|
* 大单检测准确率:≥99%(基于真实市场数据测试)
|
|||
|
|
|
|||
|
|
* **资源占用**:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 初始内存占用:≤50MB
|
|||
|
|
|
|||
|
|
* 运行时内存占用(100 只股票):≤200MB
|
|||
|
|
|
|||
|
|
* CPU 占用率(正常负载):≤30%
|
|||
|
|
|
|||
|
|
* 磁盘 IO:日志写入速率≤1MB / 分钟
|
|||
|
|
|
|||
|
|
### 8.2 性能优化措施
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 算法优化:动态阈值算法减少无效计算,LRU 缓存减少重复处理
|
|||
|
|
|
|||
|
|
* 数据结构优化:选择高效容器(QMap/QVector),避免低效查找
|
|||
|
|
|
|||
|
|
* 线程优化:合理划分线程优先级,避免核心任务阻塞
|
|||
|
|
|
|||
|
|
* 内存优化:对象池复用减少内存分配开销,智能指针避免内存泄漏
|
|||
|
|
|
|||
|
|
* IO 优化:异步日志写入,批量数据存储,减少磁盘 IO 次数
|
|||
|
|
|
|||
|
|
### 8.3 性能测试方案
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 单元测试:对核心算法(大单检测、缓存)进行性能基准测试
|
|||
|
|
|
|||
|
|
* 集成测试:模拟 100 只股票同时推送数据,测试并发处理能力
|
|||
|
|
|
|||
|
|
* 压力测试:持续 72 小时高负载运行,监控内存泄漏与性能衰减
|
|||
|
|
|
|||
|
|
* 真实环境测试:接入 Futu API 测试环境,验证实时性与准确性
|
|||
|
|
|
|||
|
|
## 九、扩展性设计
|
|||
|
|
|
|||
|
|
### 9.1 模块扩展
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 数据源扩展:预留多数据源接口,可新增其他券商 API(如同花顺、东方财富)
|
|||
|
|
|
|||
|
|
* 算法扩展:通过 IBigOrderDetector 接口,支持插件化替换检测算法
|
|||
|
|
|
|||
|
|
* 存储扩展:预留数据库接口(MySQL/SQLite),可替换本地文件存储
|
|||
|
|
|
|||
|
|
* 界面扩展:支持自定义面板添加,通过插件机制扩展界面功能
|
|||
|
|
|
|||
|
|
### 9.2 功能扩展
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 多市场支持:当前支持港股,可扩展至 A 股、美股(适配市场规则)
|
|||
|
|
|
|||
|
|
* 历史数据回放:新增历史数据导入与回放功能,用于算法测试
|
|||
|
|
|
|||
|
|
* 数据分析增强:新增大单趋势分析、板块联动分析等功能
|
|||
|
|
|
|||
|
|
* 多终端同步:预留云同步接口,支持多设备配置与数据同步
|
|||
|
|
|
|||
|
|
### 9.3 扩展实现原则
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 保持核心架构不变,扩展功能通过接口实现,不修改原有代码
|
|||
|
|
|
|||
|
|
* 扩展模块独立编译,支持按需加载(插件化)
|
|||
|
|
|
|||
|
|
* 扩展功能需提供配置开关,不影响核心功能使用
|
|||
|
|
|
|||
|
|
## 十、测试设计
|
|||
|
|
|
|||
|
|
### 10.1 单元测试
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 测试范围:核心类、核心算法、工具函数
|
|||
|
|
|
|||
|
|
* 测试重点:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* QOrderProcessor:大单检测算法准确性、异常数据处理
|
|||
|
|
|
|||
|
|
* QBigOrderManager:线程安全、去重逻辑、数据一致性
|
|||
|
|
|
|||
|
|
* QCacheManager:缓存命中率、过期清理逻辑
|
|||
|
|
|
|||
|
|
* OrderBookParser:数据解析正确性、格式兼容性
|
|||
|
|
|
|||
|
|
* 测试工具:Qt Test 框架
|
|||
|
|
|
|||
|
|
* 测试覆盖率目标:核心代码≥80%
|
|||
|
|
|
|||
|
|
### 10.2 集成测试
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 测试范围:模块间接口、数据流程、异常处理
|
|||
|
|
|
|||
|
|
* 测试重点:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 数据流程完整性(API→解析→检测→展示)
|
|||
|
|
|
|||
|
|
* 模块间信号槽通信可靠性
|
|||
|
|
|
|||
|
|
* 多线程协作稳定性
|
|||
|
|
|
|||
|
|
* 异常场景恢复能力(如网络中断、数据异常)
|
|||
|
|
|
|||
|
|
* 测试方法:黑盒测试 + 灰盒测试结合
|
|||
|
|
|
|||
|
|
### 10.3 系统测试
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 测试范围:完整功能、性能、兼容性、易用性
|
|||
|
|
|
|||
|
|
* 测试重点:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 功能完整性:所有配置项、操作流程是否正常
|
|||
|
|
|
|||
|
|
* 性能指标:响应时间、并发处理能力、资源占用
|
|||
|
|
|
|||
|
|
* 兼容性:Windows 10/11 不同版本、不同分辨率
|
|||
|
|
|
|||
|
|
* 易用性:操作路径是否简洁、提示是否明确
|
|||
|
|
|
|||
|
|
* 稳定性:72 小时持续运行无故障
|
|||
|
|
|
|||
|
|
* 测试环境:真实 Windows 环境 + Futu API 测试环境
|
|||
|
|
|
|||
|
|
### 10.4 验收测试
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 测试依据:软件需求规格说明书
|
|||
|
|
|
|||
|
|
* 测试人员:产品经理、最终用户代表
|
|||
|
|
|
|||
|
|
* 测试内容:核心功能验证、性能指标验证、兼容性验证
|
|||
|
|
|
|||
|
|
* 验收标准:功能无重大缺陷、性能指标达标、用户操作流畅
|
|||
|
|
|
|||
|
|
## 十一、部署设计
|
|||
|
|
|
|||
|
|
### 11.1 部署环境要求
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* **硬件环境**:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 处理器:Intel Core i5 及以上(或同等性能 AMD 处理器)
|
|||
|
|
|
|||
|
|
* 内存:8GB 及以上(监控 100 只以上股票建议 16GB)
|
|||
|
|
|
|||
|
|
* 硬盘:500GB 及以上可用空间(SSD 优先,提升文件读写速度)
|
|||
|
|
|
|||
|
|
* 网络:10Mbps 及以上稳定宽带,延迟≤200ms
|
|||
|
|
|
|||
|
|
* **软件环境**:
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 操作系统:Windows 10(64 位)专业版 / 企业版 / 家庭版,Windows 11(64 位)
|
|||
|
|
|
|||
|
|
* 运行环境:.NET Framework 4.5+,Visual C++ 2015-2022 运行库
|
|||
|
|
|
|||
|
|
* 依赖库:Qt 5.9.9(32/64 位对应),Futu API v3.0+,Protobuf 3.0+
|
|||
|
|
|
|||
|
|
### 11.2 安装部署流程
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
1. **环境准备**:
|
|||
|
|
|
|||
|
|
* 运行环境检测工具(CheckEnvironment.exe),自动检测缺失的依赖
|
|||
|
|
|
|||
|
|
* 自动下载并安装缺失的.NET Framework、Visual C++ 运行库
|
|||
|
|
|
|||
|
|
1. **程序部署**:
|
|||
|
|
|
|||
|
|
* 压缩包版:解压至目标目录(路径不含中文、空格及特殊字符)
|
|||
|
|
|
|||
|
|
* 安装包版:双击 Setup.exe,按向导完成安装(选择安装路径、创建桌面快捷方式)
|
|||
|
|
|
|||
|
|
1. **初始配置**:
|
|||
|
|
|
|||
|
|
* 首次启动程序,弹出配置向导
|
|||
|
|
|
|||
|
|
* 输入 Futu API 密钥与秘钥(仅内存存储,不写入文件)
|
|||
|
|
|
|||
|
|
* 导入初始股票订阅列表(支持手动添加或 CSV 导入)
|
|||
|
|
|
|||
|
|
* 配置基础参数(阈值、提示方式等)
|
|||
|
|
|
|||
|
|
1. **启动验证**:
|
|||
|
|
|
|||
|
|
* 点击 "开始监控",验证 API 连接状态
|
|||
|
|
|
|||
|
|
* 检查界面是否正常显示股票数据
|
|||
|
|
|
|||
|
|
* 触发测试大单(API 测试环境),验证检测与提示功能
|
|||
|
|
|
|||
|
|
### 11.3 部署目录结构
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
QTradeProgram/
|
|||
|
|
|
|||
|
|
├── QTradeProgram.exe # 主程序
|
|||
|
|
|
|||
|
|
├── CheckEnvironment.exe # 环境检测工具
|
|||
|
|
|
|||
|
|
├── Setup.exe # 安装程序(仅安装包版)
|
|||
|
|
|
|||
|
|
├── Qt5Core.dll # Qt核心依赖
|
|||
|
|
|
|||
|
|
├── Qt5Gui.dll # Qt图形依赖
|
|||
|
|
|
|||
|
|
├── Qt5Widgets.dll # Qt界面依赖
|
|||
|
|
|
|||
|
|
├── FutuAPI.dll # Futu API依赖
|
|||
|
|
|
|||
|
|
├── Protobuf.dll # Protobuf依赖
|
|||
|
|
|
|||
|
|
├── zlib.dll # 压缩依赖
|
|||
|
|
|
|||
|
|
├── config/ # 配置文件目录
|
|||
|
|
|
|||
|
|
│ ├── replyCodeList.csv # 股票订阅配置
|
|||
|
|
|
|||
|
|
│ ├── system.config # 系统配置
|
|||
|
|
|
|||
|
|
│ └── theme.config # 界面主题配置
|
|||
|
|
|
|||
|
|
├── logs/ # 日志文件目录
|
|||
|
|
|
|||
|
|
├── data/ # 数据存储目录
|
|||
|
|
|
|||
|
|
│ ├── history/ # 历史数据
|
|||
|
|
|
|||
|
|
│ └── backup/ # 自动备份
|
|||
|
|
|
|||
|
|
├── resources/ # 资源文件目录
|
|||
|
|
|
|||
|
|
│ ├── sounds/ # 提示音
|
|||
|
|
|
|||
|
|
│ └── icons/ # 图标资源
|
|||
|
|
|
|||
|
|
└── docs/ # 文档目录
|
|||
|
|
|
|||
|
|
  ├── 用户手册.pdf
|
|||
|
|
|
|||
|
|
  └── 安装指南.pdf
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 十二、维护设计
|
|||
|
|
|
|||
|
|
### 12.1 日志系统维护
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 日志分级:支持 DEBUG/INFO/WARNING/ERROR/FATAL 五级日志,便于问题定位
|
|||
|
|
|
|||
|
|
* 自动轮转:单个日志文件达到 50MB 或跨天时自动拆分,避免文件过大
|
|||
|
|
|
|||
|
|
* 过期清理:自动删除超过 30 天的日志文件,节省磁盘空间
|
|||
|
|
|
|||
|
|
* 日志查看:程序内置日志查看器,支持按级别、关键词筛选
|
|||
|
|
|
|||
|
|
### 12.2 错误处理与恢复
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 错误记录:所有错误均记录错误代码、详细描述、发生时间及上下文
|
|||
|
|
|
|||
|
|
* 自动恢复:网络中断时自动重连,配置文件损坏时加载默认配置
|
|||
|
|
|
|||
|
|
* 故障排查:提供日志打包工具,可快速收集日志供技术支持分析
|
|||
|
|
|
|||
|
|
* 版本回退:支持覆盖安装旧版本,保留配置与历史数据
|
|||
|
|
|
|||
|
|
### 12.3 日常维护操作
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 数据备份:每日凌晨 2 点自动备份配置文件与历史数据,支持手动备份
|
|||
|
|
|
|||
|
|
* 数据清理:可手动清理历史数据、日志文件、缓存文件
|
|||
|
|
|
|||
|
|
* 版本更新:支持检查更新功能,下载更新包后覆盖安装(保留数据)
|
|||
|
|
|
|||
|
|
* 配置重置:提供配置重置功能,恢复默认设置(不删除历史数据)
|
|||
|
|
|
|||
|
|
### 12.4 技术支持
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* 问题反馈:程序内置反馈入口,可提交 bug 与建议
|
|||
|
|
|
|||
|
|
* 日志收集:一键收集运行日志与系统信息,便于技术支持分析
|
|||
|
|
|
|||
|
|
* 远程协助:支持远程桌面协助,快速排查问题
|
|||
|
|
|
|||
|
|
* 知识库:提供常见问题解决方案、操作指南等文档
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
***
|
|||
|
|
|
|||
|
|
**设计说明**:本设计说明书基于 QTradeProgram - 大单检测程序 V1.0 版本的实际功能与技术实现,详细描述了软件的架构设计、模块划分、核心算法、数据流程等关键内容,确保文档与实际软件高度一致。文档既满足软件著作权登记的审查要求,也可为后续开发、测试、维护提供明确的技术指导。
|
|||
|
|
|
|||
|
|
> (注:文档部分内容可能由 AI 生成)
|