|
|
|
|
|
# 数据源切换指南
|
|
|
|
|
|
|
|
|
|
|
|
本指南详细说明了如何在AlphaFutures系统中切换不同的数据源(TQSDK、RQData等)。
|
|
|
|
|
|
|
|
|
|
|
|
## 方法一:通过环境变量配置(推荐)
|
|
|
|
|
|
|
|
|
|
|
|
### 1. Windows系统环境变量配置
|
|
|
|
|
|
|
|
|
|
|
|
1. **打开系统属性**:
|
|
|
|
|
|
- 右键点击"此电脑" → 选择"属性"
|
|
|
|
|
|
- 点击"高级系统设置"
|
|
|
|
|
|
|
|
|
|
|
|
2. **进入环境变量设置**:
|
|
|
|
|
|
- 点击"环境变量"按钮
|
|
|
|
|
|
|
|
|
|
|
|
3. **添加/修改系统变量**:
|
|
|
|
|
|
- 在"系统变量"区域点击"新建"(如果已存在则点击"编辑")
|
|
|
|
|
|
- 变量名:`DATA_ADAPTER_TYPE`
|
|
|
|
|
|
- 变量值:
|
|
|
|
|
|
- `tqsdk` - 使用TQSDK数据源
|
|
|
|
|
|
- `rqdata` - 使用RQData数据源
|
|
|
|
|
|
|
|
|
|
|
|
4. **设置账号信息**(可选):
|
|
|
|
|
|
- **TQSDK账号**:
|
|
|
|
|
|
- 新建变量 `TQSDK_USERNAME`,值为你的TQSDK用户名
|
|
|
|
|
|
- 新建变量 `TQSDK_PASSWORD`,值为你的TQSDK密码
|
|
|
|
|
|
- **RQData账号**:
|
|
|
|
|
|
- 新建变量 `RQDATA_USERNAME`,值为你的RQData用户名
|
|
|
|
|
|
- 新建变量 `RQDATA_PASSWORD`,值为你的RQData密码
|
|
|
|
|
|
|
|
|
|
|
|
5. **生效配置**:
|
|
|
|
|
|
- 点击"确定"保存所有设置
|
|
|
|
|
|
- **重启应用程序**:环境变量变更需要重启应用才能生效
|
|
|
|
|
|
|
|
|
|
|
|
### 2. Linux/Mac系统环境变量配置
|
|
|
|
|
|
|
|
|
|
|
|
1. **编辑配置文件**:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 对于bash用户
|
|
|
|
|
|
nano ~/.bashrc
|
|
|
|
|
|
|
|
|
|
|
|
# 对于zsh用户
|
|
|
|
|
|
nano ~/.zshrc
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
2. **添加环境变量**:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 设置数据源类型
|
|
|
|
|
|
export DATA_ADAPTER_TYPE="rqdata"
|
|
|
|
|
|
|
|
|
|
|
|
# 设置RQData账号(可选)
|
|
|
|
|
|
export RQDATA_USERNAME="your_username"
|
|
|
|
|
|
export RQDATA_PASSWORD="your_password"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
3. **生效配置**:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 对于bash用户
|
|
|
|
|
|
source ~/.bashrc
|
|
|
|
|
|
|
|
|
|
|
|
# 对于zsh用户
|
|
|
|
|
|
source ~/.zshrc
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 方法二:在代码中临时切换
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 临时设置环境变量
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
|
|
# 临时切换到RQData数据源
|
|
|
|
|
|
os.environ["DATA_ADAPTER_TYPE"] = "rqdata"
|
|
|
|
|
|
|
|
|
|
|
|
# 设置RQData账号(可选)
|
|
|
|
|
|
os.environ["RQDATA_USERNAME"] = "your_username"
|
|
|
|
|
|
os.environ["RQDATA_PASSWORD"] = "your_password"
|
|
|
|
|
|
|
|
|
|
|
|
# 然后创建DataFetcher实例
|
|
|
|
|
|
from qihuo_analyzer.data.data_fetcher import DataFetcher
|
|
|
|
|
|
fetcher = DataFetcher()
|
|
|
|
|
|
|
|
|
|
|
|
# 现在fetcher会使用RQData数据源
|
|
|
|
|
|
kline_data = fetcher.get_kline_data("SHFE.rb2409", 3600, start_time, end_time)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 直接指定适配器
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
from qihuo_analyzer.data.api_adapters.adapter_factory import DataAdapterFactory
|
|
|
|
|
|
|
|
|
|
|
|
# 直接创建RQData适配器
|
|
|
|
|
|
rqdata_adapter = DataAdapterFactory.create_adapter("rqdata")
|
|
|
|
|
|
rqdata_adapter.connect()
|
|
|
|
|
|
|
|
|
|
|
|
# 使用RQData获取数据
|
|
|
|
|
|
data = rqdata_adapter.get_kline_data("SHFE.rb2409", 3600, start_time, end_time)
|
|
|
|
|
|
|
|
|
|
|
|
# 关闭连接
|
|
|
|
|
|
rqdata_adapter.disconnect()
|
|
|
|
|
|
|
|
|
|
|
|
# 切换到TQSDK适配器
|
|
|
|
|
|
tqsdk_adapter = DataAdapterFactory.create_adapter("tqsdk")
|
|
|
|
|
|
tqsdk_adapter.connect()
|
|
|
|
|
|
|
|
|
|
|
|
# 使用TQSDK获取数据
|
|
|
|
|
|
data = tqsdk_adapter.get_kline_data("SHFE.rb2409", 3600, start_time, end_time)
|
|
|
|
|
|
|
|
|
|
|
|
# 关闭连接
|
|
|
|
|
|
tqsdk_adapter.disconnect()
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 方法三:在配置文件中设置
|
|
|
|
|
|
|
|
|
|
|
|
如果系统支持配置文件,可以在配置文件中添加数据源设置:
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 创建配置文件
|
|
|
|
|
|
|
|
|
|
|
|
在项目根目录创建 `config.py` 文件:
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
# config.py
|
|
|
|
|
|
DATA_ADAPTER_TYPE = "rqdata" # 可选值: tqsdk, rqdata
|
|
|
|
|
|
|
|
|
|
|
|
# RQData账号配置(可选)
|
|
|
|
|
|
RQDATA_USERNAME = "your_username"
|
|
|
|
|
|
RQDATA_PASSWORD = "your_password"
|
|
|
|
|
|
|
|
|
|
|
|
# TQSDK账号配置(可选)
|
|
|
|
|
|
TQSDK_USERNAME = "your_username"
|
|
|
|
|
|
TQSDK_PASSWORD = "your_password"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 在代码中加载配置
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
import os
|
|
|
|
|
|
from config import DATA_ADAPTER_TYPE, RQDATA_USERNAME, RQDATA_PASSWORD, TQSDK_USERNAME, TQSDK_PASSWORD
|
|
|
|
|
|
|
|
|
|
|
|
# 设置环境变量
|
|
|
|
|
|
os.environ["DATA_ADAPTER_TYPE"] = DATA_ADAPTER_TYPE
|
|
|
|
|
|
|
|
|
|
|
|
# 设置账号信息
|
|
|
|
|
|
if RQDATA_USERNAME:
|
|
|
|
|
|
os.environ["RQDATA_USERNAME"] = RQDATA_USERNAME
|
|
|
|
|
|
if RQDATA_PASSWORD:
|
|
|
|
|
|
os.environ["RQDATA_PASSWORD"] = RQDATA_PASSWORD
|
|
|
|
|
|
if TQSDK_USERNAME:
|
|
|
|
|
|
os.environ["TQSDK_USERNAME"] = TQSDK_USERNAME
|
|
|
|
|
|
if TQSDK_PASSWORD:
|
|
|
|
|
|
os.environ["TQSDK_PASSWORD"] = TQSDK_PASSWORD
|
|
|
|
|
|
|
|
|
|
|
|
# 创建DataFetcher实例
|
|
|
|
|
|
from qihuo_analyzer.data.data_fetcher import DataFetcher
|
|
|
|
|
|
fetcher = DataFetcher()
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 查看当前使用的数据源
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 代码中查看
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
from qihuo_analyzer.data.data_fetcher import DataFetcher
|
|
|
|
|
|
|
|
|
|
|
|
# 创建DataFetcher实例
|
|
|
|
|
|
fetcher = DataFetcher()
|
|
|
|
|
|
|
|
|
|
|
|
# 查看当前使用的适配器类型
|
|
|
|
|
|
print(f"当前使用的数据源: {fetcher.adapter.__class__.__name__}")
|
|
|
|
|
|
|
|
|
|
|
|
# 查看适配器配置信息
|
|
|
|
|
|
print(f"适配器配置: {fetcher.adapter.config}")
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 检查环境变量
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
|
|
# 查看当前数据源类型
|
|
|
|
|
|
adapter_type = os.environ.get("DATA_ADAPTER_TYPE", "tqsdk")
|
|
|
|
|
|
print(f"当前配置的数据源类型: {adapter_type}")
|
|
|
|
|
|
|
|
|
|
|
|
# 查看账号配置
|
|
|
|
|
|
if adapter_type == "rqdata":
|
|
|
|
|
|
username = os.environ.get("RQDATA_USERNAME", "未配置")
|
|
|
|
|
|
print(f"RQData账号: {username}")
|
|
|
|
|
|
elif adapter_type == "tqsdk":
|
|
|
|
|
|
username = os.environ.get("TQSDK_USERNAME", "未配置")
|
|
|
|
|
|
print(f"TQSDK账号: {username}")
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 切换数据源的注意事项
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 账号配置
|
|
|
|
|
|
|
|
|
|
|
|
- **切换到TQSDK**:需要配置TQSDK账号密码,否则使用模拟数据
|
|
|
|
|
|
- **切换到RQData**:需要配置RQData账号密码,否则使用模拟数据
|
|
|
|
|
|
- **未配置账号**:系统会自动使用模拟数据,确保系统正常运行
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 数据一致性
|
|
|
|
|
|
|
|
|
|
|
|
- 不同数据源的数据格式可能略有差异,但统一接口会确保返回格式一致
|
|
|
|
|
|
- 历史数据的时间范围和精度可能因数据源而异
|
|
|
|
|
|
- 实时数据的更新频率可能不同
|
|
|
|
|
|
|
|
|
|
|
|
### 3. 性能考虑
|
|
|
|
|
|
|
|
|
|
|
|
- **TQSDK**:适合实时数据和高频交易策略
|
|
|
|
|
|
- **RQData**:适合历史数据回测和研究分析
|
|
|
|
|
|
- 选择适合你使用场景的数据源
|
|
|
|
|
|
|
|
|
|
|
|
### 4. 错误处理
|
|
|
|
|
|
|
|
|
|
|
|
- 切换数据源后,建议测试基本功能确保连接正常
|
|
|
|
|
|
- 如遇连接问题,检查账号配置和网络连接
|
|
|
|
|
|
- 系统会自动处理API错误并使用模拟数据作为降级方案
|
|
|
|
|
|
|
|
|
|
|
|
## 常见问题解决
|
|
|
|
|
|
|
|
|
|
|
|
### Q: 切换数据源后连接失败
|
|
|
|
|
|
|
|
|
|
|
|
**A:**
|
|
|
|
|
|
1. 检查账号密码是否正确
|
|
|
|
|
|
2. 检查网络连接是否正常
|
|
|
|
|
|
3. 检查API服务是否正常运行
|
|
|
|
|
|
4. 尝试重启应用程序
|
|
|
|
|
|
|
|
|
|
|
|
### Q: 如何在运行时动态切换数据源
|
|
|
|
|
|
|
|
|
|
|
|
**A:**
|
|
|
|
|
|
```python
|
|
|
|
|
|
import os
|
|
|
|
|
|
from qihuo_analyzer.data.data_fetcher import DataFetcher
|
|
|
|
|
|
|
|
|
|
|
|
# 先使用TQSDK
|
|
|
|
|
|
os.environ["DATA_ADAPTER_TYPE"] = "tqsdk"
|
|
|
|
|
|
fetcher1 = DataFetcher()
|
|
|
|
|
|
|
|
|
|
|
|
# 再使用RQData
|
|
|
|
|
|
os.environ["DATA_ADAPTER_TYPE"] = "rqdata"
|
|
|
|
|
|
fetcher2 = DataFetcher()
|
|
|
|
|
|
|
|
|
|
|
|
# 现在fetcher1使用TQSDK,fetcher2使用RQData
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Q: 数据源切换后数据格式不一致
|
|
|
|
|
|
|
|
|
|
|
|
**A:**
|
|
|
|
|
|
统一接口已处理数据格式问题,确保返回格式一致。如果遇到问题,请检查:
|
|
|
|
|
|
1. 确认使用的是最新版本的统一接口
|
|
|
|
|
|
2. 检查数据获取参数是否正确
|
|
|
|
|
|
3. 查看日志中的错误信息
|
|
|
|
|
|
|
|
|
|
|
|
## 示例:完整的数据源切换流程
|
|
|
|
|
|
|
|
|
|
|
|
### 场景:从TQSDK切换到RQData
|
|
|
|
|
|
|
|
|
|
|
|
1. **设置环境变量**:
|
|
|
|
|
|
- `DATA_ADAPTER_TYPE` = "rqdata"
|
|
|
|
|
|
- `RQDATA_USERNAME` = "your_rqdata_username"
|
|
|
|
|
|
- `RQDATA_PASSWORD` = "your_rqdata_password"
|
|
|
|
|
|
|
|
|
|
|
|
2. **重启应用**:确保环境变量生效
|
|
|
|
|
|
|
|
|
|
|
|
3. **验证切换**:
|
|
|
|
|
|
```python
|
|
|
|
|
|
from qihuo_analyzer.data.data_fetcher import DataFetcher
|
|
|
|
|
|
|
|
|
|
|
|
# 创建DataFetcher实例
|
|
|
|
|
|
fetcher = DataFetcher()
|
|
|
|
|
|
|
|
|
|
|
|
# 测试数据获取
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 获取K线数据
|
|
|
|
|
|
data = fetcher.get_kline_data(
|
|
|
|
|
|
symbol="SHFE.rb2409",
|
|
|
|
|
|
interval=3600,
|
|
|
|
|
|
start_time="2024-01-01 00:00:00",
|
|
|
|
|
|
end_time="2024-01-02 00:00:00"
|
|
|
|
|
|
)
|
|
|
|
|
|
print("数据获取成功!")
|
|
|
|
|
|
print(f"获取到 {len(data)} 条数据")
|
|
|
|
|
|
print(f"当前使用的数据源: {fetcher.adapter.__class__.__name__}")
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"数据获取失败: {e}")
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
4. **确认切换成功**:
|
|
|
|
|
|
- 查看输出中的"当前使用的数据源"信息
|
|
|
|
|
|
- 检查数据获取是否正常
|
|
|
|
|
|
|
|
|
|
|
|
## 总结
|
|
|
|
|
|
|
|
|
|
|
|
通过以上方法,你可以轻松在不同的数据源之间切换,选择最适合你使用场景的数据源。统一接口的设计确保了切换数据源不会影响业务逻辑,为系统提供了更大的灵活性。
|