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
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", ""),
|
|
"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)
|