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.

161 lines
5.0 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. 功能概述
本接口用于获取期货合约的最后一个交易日支持通过TQSDK实时获取或使用模拟数据作为fallback。
## 2. 实现方案
### 2.1 核心代码位置
- **TQSDK适配器**`backend/service_implementation/qihuo_analyzer/data/api_adapters/tqsdk_adapter.py`
- 实现了`get_last_trading_day(symbol)`方法使用TQSDK获取最后一个交易日
- **数据获取器**`backend/service_implementation/qihuo_analyzer/data/data_fetcher.py`
- 实现了`get_last_trading_day(symbol)`方法,作为适配器方法的包装
- **API服务**`backend/service_implementation/service/app.py`
- 添加了`/api/last-trading-day`接口提供HTTP访问方式
### 2.2 技术实现
#### TQSDK适配器实现
```python
def get_last_trading_day(self, symbol: str) -> Optional[str]:
"""获取最后一个交易日
Args:
symbol: 合约代码,如 'CU2603'
Returns:
str: 最后一个交易日,格式为 'YYYY-MM-DD'
"""
try:
if TQSDK_AVAILABLE and self.api:
# 转换合约代码为TQSDK格式
tq_symbol = self._convert_symbol(symbol)
# 获取日线数据
klines = self.api.get_kline_serial(tq_symbol, 86400, data_length=30) # 86400秒 = 1天
# 等待数据准备就绪
# 处理数据...
# 转换为DataFrame并提取最后交易日
if not df.empty:
last_trading_day = df['datetime'].iloc[-1].strftime('%Y-%m-%d')
return last_trading_day
else:
# 返回模拟数据
import datetime
last_trading_day = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
return last_trading_day
except Exception as e:
# 异常处理,返回模拟数据
import datetime
last_trading_day = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
return last_trading_day
```
#### API接口实现
```python
# 最后交易日获取接口
@app.route('/api/last-trading-day', methods=['GET'])
def get_last_trading_day():
try:
symbol = request.args.get('symbol', 'CU2603') # 默认使用CU2603合约
last_trading_day = data_fetcher.get_last_trading_day(symbol)
return jsonify({'status': 'success', 'data': {
'symbol': symbol,
'last_trading_day': last_trading_day
}})
except Exception as e:
return jsonify({'status': 'error', 'message': str(e)}), 500
```
## 3. 使用方法
### 3.1 API接口调用
**请求URL**`http://localhost:5000/api/last-trading-day`
**请求方法**GET
**参数说明**
- `symbol`(可选):合约代码,如 'CU2603',默认值为 'CU2603'
**返回格式**
```json
{
"status": "success",
"data": {
"symbol": "CU2603",
"last_trading_day": "2026-02-23"
}
}
```
**示例请求**
```
GET http://localhost:5000/api/last-trading-day?symbol=AU2603
```
**示例响应**
```json
{
"status": "success",
"data": {
"symbol": "AU2603",
"last_trading_day": "2026-02-23"
}
}
```
### 3.2 代码调用
```python
from qihuo_analyzer.data.data_fetcher import DataFetcher
data_fetcher = DataFetcher()
data_fetcher.connect()
last_trading_day = data_fetcher.get_last_trading_day('CU2603')
print(f"最后一个交易日: {last_trading_day}") # 输出:最后一个交易日: 2026-02-23
```
## 4. 技术特点
1. **实时数据**通过TQSDK获取实时的最后交易日数据
2. **容错机制**当TQSDK不可用时自动使用模拟数据
3. **异常处理**:实现了多层异常捕获,确保接口稳定性
4. **灵活调用**支持通过API接口或直接代码调用
5. **默认值**当未指定合约代码时默认使用CU2603合约
## 5. 注意事项
1. **网络连接**使用TQSDK获取数据需要稳定的网络连接
2. **合约代码格式**:请使用正确的合约代码格式,如 'CU2603'
3. **数据延迟**由于需要从TQSDK获取数据可能会有一定的网络延迟
4. **模拟数据**当TQSDK不可用时会返回前一天的日期作为模拟数据
## 6. 故障排查
### 6.1 常见问题
| 问题 | 可能原因 | 解决方案 |
|------|---------|--------|
| 返回模拟数据 | TQSDK连接失败或网络问题 | 检查网络连接确保TQSDK账号配置正确 |
| 接口返回错误 | 合约代码格式错误 | 使用正确的合约代码格式,如 'CU2603' |
| 数据延迟 | 网络延迟或TQSDK服务器响应慢 | 耐心等待,或使用模拟数据 |
### 6.2 日志查看
- **Python服务日志**在启动Python服务的终端中查看
- **API日志**通过访问API端点查看返回结果和错误信息
## 7. 总结
本接口提供了一种便捷的方式来获取期货合约的最后一个交易日支持实时数据和模拟数据两种模式。通过简单的API调用或代码调用用户可以轻松获取所需的最后交易日信息为交易策略和风险管理提供支持。