# 最后交易日获取接口 ## 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调用或代码调用,用户可以轻松获取所需的最后交易日信息,为交易策略和风险管理提供支持。