You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
3.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 合约数据获取逻辑
## 核心流程
系统启动后,根据合约数据使用配置的数据源获取合约具体数据的整体逻辑如下:
1. **系统初始化**
- 后端服务启动时加载配置文件(`config.ts`
- 注册市场相关API路由`market.ts`
2. **数据源管理**
- 通过`DataSourceFactory`创建和管理数据源实例
- 支持多种数据源类型TQSDK实盘数据、测试数据源模拟数据
3. **数据获取流程**
- 客户端请求市场数据时,`marketService`中的方法被调用
- 方法首先检查数据源配置,确定使用哪个数据源
- 尝试使用配置的数据源获取合约数据
- 如果主数据源失败,自动切换到备用数据源
- 处理数据并返回给客户端
4. **合约数据处理**
- 使用预定义的合约列表(`futuresList`)作为基础
- 为每个合约构建完整的合约符号(如`SHFE.rb2505`
- 调用数据源的方法获取实时行情、K线等数据
- 转换数据格式为前端需要的结构
## 代码位置
### 数据源管理
- **数据源工厂**`backend/src/services/datasource/DataSourceFactory.ts`
- 负责创建和管理数据源实例
- 支持数据源的初始化、切换和关闭
- **数据源接口**`backend/src/services/datasource/DataSource.ts`
- 定义了数据源必须实现的方法如获取合约列表、合约详情、K线数据等
- **TQSDK数据源实现**`backend/src/services/datasource/TQDataSource.ts`
- 基于TQSDK库实现的实盘数据源
- 提供获取合约数据的具体方法
### 数据服务
- **市场服务**`backend/src/services/marketService.ts`
- 实现了获取市场概览、品种详情、K线数据等方法
- 处理数据源的选择和切换逻辑
- 提供数据转换和错误处理
### API接口
- **市场API**`backend/src/api/market.ts`
- 提供RESTful API接口如`/api/market/overview`、`/api/market/detail/:symbol`等
- 调用市场服务的方法获取数据并返回给客户端
### 配置管理
- **配置文件**`backend/src/config/index.ts`
- 存储数据源配置信息如TQSDK的启用状态和参数
## 数据源切换机制
系统实现了智能的数据源切换机制:
1. 优先使用配置的主数据源如TQSDK
2. 如果主数据源失败,自动尝试使用备用数据源(如测试数据源)
3. 如果所有数据源都不可用,返回友好的错误提示
## 数据获取示例
以获取市场概览为例:
1. 客户端请求 `/api/market/overview`
2. `marketService.fetchMarketOverview()` 被调用
3. 检查数据源配置确定使用TQSDK还是测试数据源
4. 如果使用TQSDK创建TQSDK数据源实例并初始化
5. 遍历合约列表,为每个合约构建完整符号
6. 调用数据源的 `getTickData()` 方法获取实时行情
7. 处理数据并返回给客户端
8. 如果TQSDK失败自动切换到测试数据源
## 技术特点
1. **工厂模式**:使用工厂模式管理数据源实例,提高代码可维护性
2. **接口隔离**:通过接口定义数据源行为,便于扩展新的数据源类型
3. **容错机制**:实现了数据源故障自动切换,提高系统可靠性
4. **配置驱动**:数据源配置通过配置文件管理,便于运维和部署
5. **模块化设计**将数据获取逻辑与API接口分离提高代码可读性