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.

134 lines
5.0 KiB

"""测试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", "11200008169"),
"password": os.getenv("AMAZINGDATA_PASSWORD", "11200008169@2026"),
"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)