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.
5.4 KiB
5.4 KiB
内部接口层文档
架构设计
对外接口 (AmazingDataAdapter)
│
├── 内部接口层 (InternalDataService)
│ ├── _MarketDataInternal (市场数据)
│ ├── _BaseDataInternal (基础数据)
│ └── _InfoDataInternal (信息数据)
│
└── AmazingData SDK
├── _market_data
├── _base_data
└── _info_data
设计原则
- 对外接口不直接调用 SDK - 所有 SDK 调用都通过内部接口层
- 统一错误处理 - 内部接口层统一处理 SDK 异常
- 日志记录 - 内部接口层统一记录调用日志
- 便于测试 - 可以 mock 内部接口进行单元测试
内部接口类
_MarketDataInternal
封装 _market_data SDK 对象的方法:
| 方法 | SDK 方法 | 说明 |
|---|---|---|
login() |
_market_data.login() |
登录 |
is_login() |
_market_data.is_login() |
检查登录状态 |
query_kline() |
_market_data.query_kline() |
查询K线 |
query_snapshot() |
_market_data.query_snapshot() |
查询快照 |
_BaseDataInternal
封装 _base_data SDK 对象的方法:
| 方法 | SDK 方法 | 说明 |
|---|---|---|
get_code_list() |
_base_data.get_code_list() |
获取股票代码列表 |
get_future_code_list() |
_base_data.get_future_code_list() |
获取期货代码列表 |
get_code_info() |
_base_data.get_code_info() |
获取代码信息 |
get_calendar() |
_base_data.get_calendar() |
获取交易日历 |
get_adj_factor() |
_base_data.get_adj_factor() |
获取复权因子 |
get_backward_factor() |
_base_data.get_backward_factor() |
获取后复权因子 |
get_etf_pcf() |
_base_data.get_etf_pcf() |
获取ETF申赎数据 |
get_hist_code_list() |
_base_data.get_hist_code_list() |
获取历史代码列表 |
_InfoDataInternal
封装 _info_data SDK 对象的方法:
| 方法 | SDK 方法 | 说明 |
|---|---|---|
get_equity_structure() |
_info_data.get_equity_structure() |
股本结构 |
get_share_holder() |
_info_data.get_share_holder() |
股东数据 |
get_holder_num() |
_info_data.get_holder_num() |
股东户数 |
get_income() |
_info_data.get_income() |
利润表 |
get_balance_sheet() |
_info_data.get_balance_sheet() |
资产负债表 |
get_cash_flow() |
_info_data.get_cash_flow() |
现金流量表 |
get_profit_express() |
_info_data.get_profit_express() |
业绩预告 |
get_profit_notice() |
_info_data.get_profit_notice() |
业绩快报 |
get_margin_summary() |
_info_data.get_margin_summary() |
融资融券汇总 |
get_margin_detail() |
_info_data.get_margin_detail() |
融资融券明细 |
get_long_hu_bang() |
_info_data.get_long_hu_bang() |
龙虎榜 |
get_block_trading() |
_info_data.get_block_trading() |
大宗交易 |
get_index_constituent() |
_info_data.get_index_constituent() |
指数成分股 |
get_index_weight() |
_info_data.get_index_weight() |
指数权重 |
get_fund_share() |
_info_data.get_fund_share() |
基金份额 |
get_kzz_issuance() |
_info_data.get_kzz_issuance() |
可转债发行 |
get_history_stock_status() |
_info_data.get_history_stock_status() |
历史股票状态(涨停/跌停/ST/停牌) |
使用方式
在 AmazingDataAdapter 中
class AmazingDataAdapter(DataSourceAdapter):
def __init__(self):
# ... 其他初始化 ...
self._internal: Optional[InternalDataService] = None
async def connect(self, config: dict) -> None:
# ... 登录和初始化 SDK ...
# 初始化内部数据服务层
self._internal = InternalDataService(self)
def _fetch_klines_sync(self, ...):
# 使用内部接口,而不是直接调用 SDK
kline_dict = self._internal.market.query_kline(...)
code_info = self._internal.base.get_code_info(...)
equity = self._internal.info.get_equity_structure(...)
错误处理
内部接口统一处理 SDK 异常,返回空数据或默认值:
class _BaseDataInternal:
def get_code_info(self, security_type: str) -> pd.DataFrame:
try:
return self._base_data.get_code_info(security_type=security_type)
except Exception as e:
error(f"[_BaseDataInternal] Get code info failed: {e}")
return pd.DataFrame() # 返回空数据而不是抛出异常
文件结构
app/adapters/
├── __init__.py
├── base.py # 适配器基类
├── amazingdata_adapter.py # 对外适配器(使用内部接口)
└── internal_data_service.py # 内部接口层
迁移说明
之前的调用方式(已废弃)
# 直接调用 SDK
code_info = self._base_data.get_code_info(security_type=...)
kline = self._market_data.query_kline(...)
equity = self._info_data.get_equity_structure(...)
现在的调用方式
# 通过内部接口调用
code_info = self._internal.base.get_code_info(security_type=...)
kline = self._internal.market.query_kline(...)
equity = self._internal.info.get_equity_structure(...)
优势
- 解耦 - 对外接口与 SDK 解耦,便于更换数据源
- 可测试性 - 可以 mock 内部接口进行单元测试
- 错误处理 - 统一的错误处理和日志记录
- 扩展性 - 可以在内部接口层添加缓存、限流等功能