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.
4.0 KiB
4.0 KiB
期货K线接口修复报告
问题描述
期货K线接口 /v1/futures/klines/{symbol} 返回的 items 为空列表。
根本原因
代码中硬编码了使用 amazingdata 适配器,但配置文件中配置的是 custom 适配器。导致:
- 配置文件中
sources.futures.active = "custom" - 但代码中尝试连接
amazingdata适配器 _connect_adapter方法中尝试从file_config.sources.stock.list["amazingdata"]获取配置- 配置中不存在
amazingdata,导致KeyError: 'amazingdata' - 异常被捕获后返回空列表
修复内容
1. 修复硬编码适配器名称
修改文件:
app/services/futures_service.pyapp/services/stock_service.py
修改内容: 将以下代码:
if not adapter:
loop.run_until_complete(adapter_service._connect_adapter("amazingdata"))
改为:
if not adapter:
# 从配置获取当前激活的适配器名称
from app.core.config import get_config
config = get_config()
active_source = config.sources.futures.active # 或 config.sources.stock.active
info(f"Connecting to configured adapter: {active_source}")
loop.run_until_complete(adapter_service._connect_adapter(active_source))
2. 修复适配器配置获取逻辑
修改文件:
app/services/adapter_service.py
修改内容: 将以下代码:
if name == "amazingdata":
source_info = file_config.sources.stock.list["amazingdata"]
adapter_config = dict(source_info.config) if source_info else {}
else:
adapter_config = self.configs[name].get("config", {})
改为:
# 尝试从配置文件中获取适配器配置
adapter_config = None
# 1. 首先检查 stock 配置
if name in file_config.sources.stock.list:
source_info = file_config.sources.stock.list[name]
adapter_config = dict(source_info.config) if source_info else {}
# 2. 然后检查 futures 配置
elif name in file_config.sources.futures.list:
source_info = file_config.sources.futures.list[name]
adapter_config = dict(source_info.config) if source_info else {}
# 3. 使用默认配置
else:
adapter_config = self.configs[name].get("config", {})
3. 修复期货仓库的频率映射
修改文件:
app/repositories/futures_repository.py
修改内容: 添加了对其他频率的映射(虽然数据库只支持1分钟和日线,但避免KeyError):
def _get_kline_model(self, freq: Frequency):
mapping = {
Frequency.FREQ_1M: FuturesKLine1M,
Frequency.FREQ_1D: FuturesKLine1D,
Frequency.FREQ_5M: FuturesKLine1D, # 默认使用日线
Frequency.FREQ_15M: FuturesKLine1D,
Frequency.FREQ_30M: FuturesKLine1D,
Frequency.FREQ_60M: FuturesKLine1D,
Frequency.FREQ_1W: FuturesKLine1D,
Frequency.FREQ_1MONTH: FuturesKLine1D,
}
return mapping.get(freq, FuturesKLine1D)
当前状态
API现在可以正常返回响应:
{
"code": 0,
"message": "success",
"data": {
"symbol": "CU2504.SHFE",
"name": null,
"freq": "1d",
"adjust": "",
"count": 0,
"items": []
}
}
items 为空是因为:
- 数据库中没有数据
- 配置的
custom适配器未注册(只注册了amazingdata)
使用建议
要使接口返回实际数据,需要:
-
配置 AmazingData 适配器: 修改
config.json:{ "sources": { "futures": { "active": "amazingdata", "list": { "amazingdata": { "type": "sdk", "config": { "username": "your_username", "password": "your_password", "host": "your_host", "port": "8600" } } } } } } -
安装 AmazingData SDK:
pip install AmazingData tgw -
或者注册自定义适配器: 在
AdapterService._register_builtin_adapters()中添加:self.register_adapter("custom", lambda: YourCustomAdapter())