"""测试K线数据扩展字段获取""" import asyncio import os import sys sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from app.adapters.amazingdata_adapter import AmazingDataAdapter from datetime import datetime async def test_klines_with_extended_fields(): """测试获取带有扩展字段的K线数据""" print("\n" + "="*60) print("测试K线数据扩展字段") print("="*60) adapter = AmazingDataAdapter() # 连接配置(请根据实际情况修改) config = { "username": os.getenv("AMAZINGDATA_USERNAME", ""), "password": os.getenv("AMAZINGDATA_PASSWORD", ""), "host": os.getenv("AMAZINGDATA_HOST", "140.206.44.234"), "port": int(os.getenv("AMAZINGDATA_PORT", "8600")), "local_path": "./amazing_data_cache/", "use_local_cache": True } try: # 连接适配器 print("\n[1/3] 正在连接 AmazingData...") await adapter.connect(config) print("✓ 连接成功") # 获取K线数据 symbol = "000001.SZ" # 平安银行 start_date = "20260301" end_date = "20260310" print(f"\n[2/3] 正在获取 {symbol} 的K线数据 ({start_date} ~ {end_date})...") klines = await adapter.fetch_klines(symbol, start_date, end_date, "1d") print(f"✓ 获取到 {len(klines)} 条K线数据") # 显示第一条数据的完整信息 if klines: print(f"\n[3/3] 数据字段验证") print("-"*60) k = klines[0] print(f"\n标的代码: {k.symbol}") print(f"交易日: {k.trade_date}") print(f"时间戳: {datetime.fromtimestamp(k.time)}") print(f"\n基础行情:") print(f" 开盘价: {k.open}") print(f" 最高价: {k.high}") print(f" 最低价: {k.low}") print(f" 收盘价: {k.close}") print(f" 成交量: {k.volume}") print(f" 成交额: {k.amount}") print(f"\n扩展字段:") print(f" 是否涨停: {k.is_limit_up} {'✓' if k.is_limit_up is not None else '✗'}") print(f" 是否跌停: {k.is_limit_down} {'✓' if k.is_limit_down is not None else '✗'}") print(f" 总市值: {k.total_market_cap:,.0f} 元" if k.total_market_cap else " 总市值: None ✗") print(f" 流通市值: {k.float_market_cap:,.0f} 元" if k.float_market_cap else " 流通市值: None ✗") print(f" 机构持仓占比: {k.inst_holding_ratio}%" if k.inst_holding_ratio else " 机构持仓占比: None") print(f" 可交易日数: {k.trading_days} {'✓' if k.trading_days else '✗'}") # 验证字段完整性 print(f"\n{'='*60}") print("字段完整性检查:") print("-"*60) checks = [ ("symbol", k.symbol is not None), ("time", k.time > 0), ("open", k.open > 0), ("high", k.high > 0), ("low", k.low > 0), ("close", k.close > 0), ("volume", k.volume > 0), ("amount", k.amount > 0), ("trade_date", k.trade_date is not None), ("is_limit_up", k.is_limit_up is not None), ("is_limit_down", k.is_limit_down is not None), ("total_market_cap", k.total_market_cap is not None and k.total_market_cap > 0), ("float_market_cap", k.float_market_cap is not None and k.float_market_cap > 0), ("trading_days", k.trading_days is not None and k.trading_days > 0), ] passed = 0 for field, check in checks: status = "✓" if check else "✗" print(f" {status} {field}") if check: passed += 1 print(f"\n通过: {passed}/{len(checks)}") # 显示涨跌停判断逻辑验证 print(f"\n{'='*60}") print("涨跌停判断示例:") print("-"*60) for k in klines[:3]: # 显示前3条 limit_status = "" if k.is_limit_up: limit_status = "📈 涨停" elif k.is_limit_down: limit_status = "📉 跌停" else: limit_status = "—" print(f" {k.trade_date}: 收盘{k.close} {limit_status}") # 断开连接 await adapter.close() print(f"\n{'='*60}") print("测试完成!") print("="*60 + "\n") return True except Exception as e: print(f"\n✗ 测试失败: {e}") import traceback traceback.print_exc() return False if __name__ == "__main__": success = asyncio.run(test_klines_with_extended_fields()) sys.exit(0 if success else 1)