143 lines
5.2 KiB
Python
143 lines
5.2 KiB
Python
"""
|
||
测试市场信号分析 - 验证趋势判断功能
|
||
"""
|
||
import asyncio
|
||
import sys
|
||
import os
|
||
import json
|
||
|
||
# 添加项目路径
|
||
sys.path.insert(0, os.path.dirname(__file__))
|
||
|
||
from app.crypto_agent.market_signal_analyzer import MarketSignalAnalyzer
|
||
from app.utils.logger import logger
|
||
from app.services.bitget_service import BitgetService
|
||
|
||
|
||
async def test_trend_analysis(symbol: str = "BTCUSDT"):
|
||
"""测试趋势分析"""
|
||
|
||
logger.info("=" * 60)
|
||
logger.info(f"开始测试市场信号分析: {symbol}")
|
||
logger.info("=" * 60)
|
||
|
||
# 1. 获取 K 线数据
|
||
logger.info(f"\n[1/3] 获取 {symbol} 的 K 线数据...")
|
||
bitget_service = BitgetService()
|
||
data = bitget_service.get_multi_timeframe_data(symbol)
|
||
|
||
if not data:
|
||
logger.error(f"❌ 无法获取 {symbol} 的 K 线数据")
|
||
return
|
||
|
||
logger.info(f"✅ K 线数据获取成功")
|
||
for tf, df in data.items():
|
||
if df is not None and len(df) > 0:
|
||
latest_price = float(df.iloc[-1]['close'])
|
||
logger.info(f" {tf}: 最新价格 ${latest_price:,.2f}, 数据量 {len(df)} 条")
|
||
|
||
# 2. 分析市场信号
|
||
logger.info(f"\n[2/3] 分析市场信号...")
|
||
analyzer = MarketSignalAnalyzer()
|
||
result = await analyzer.analyze(symbol, data)
|
||
|
||
# 3. 打印分析结果
|
||
logger.info(f"\n[3/3] 分析结果:")
|
||
logger.info("-" * 60)
|
||
|
||
# 打印趋势判断(新功能)
|
||
logger.info("\n📊 趋势判断(新增):")
|
||
logger.info(f" 趋势方向: {result.get('trend_direction', 'unknown')}")
|
||
logger.info(f" 趋势强度: {result.get('trend_strength', 'unknown')}")
|
||
|
||
# 打印市场状态
|
||
logger.info(f"\n📈 市场状态:")
|
||
logger.info(f" {result.get('market_state', 'unknown')}")
|
||
logger.info(f" 分析摘要: {result.get('analysis_summary', 'unknown')}")
|
||
logger.info(f" 量价分析: {result.get('volume_analysis', 'unknown')}")
|
||
|
||
# 打印关键价位
|
||
if result.get('key_levels'):
|
||
logger.info(f"\n💰 关键价位:")
|
||
levels = result['key_levels']
|
||
if levels.get('support'):
|
||
logger.info(f" 支撑位: {[f'${s:,.0f}' for s in levels['support'] if s]}")
|
||
if levels.get('resistance'):
|
||
logger.info(f" 阻力位: {[f'${r:,.0f}' for r in levels['resistance'] if r]}")
|
||
|
||
# 打印信号
|
||
logger.info(f"\n🎯 交易信号:")
|
||
signals = result.get('signals', [])
|
||
if not signals:
|
||
logger.warning(" ⚠️ 无交易信号(观望)")
|
||
else:
|
||
for i, sig in enumerate(signals, 1):
|
||
action_emoji = "🟢" if sig.get('action') == 'buy' else "🔴" if sig.get('action') == 'sell' else "⏪"
|
||
grade_icon = {'A': '⭐⭐⭐', 'B': '⭐⭐', 'C': '⭐', 'D': ''}.get(sig.get('grade', ''), '')
|
||
entry_type_emoji = "⚡现价" if sig.get('entry_type') == 'market' else "⏳挂单"
|
||
|
||
logger.info(f"\n 信号 #{i} {action_emoji} {grade_icon}")
|
||
logger.info(f" ├─ 类型: {sig.get('timeframe', 'unknown')} | {entry_type_emoji}")
|
||
logger.info(f" ├─ 操作: {sig.get('action', 'unknown').upper()}")
|
||
logger.info(f" ├─ 信心度: {sig.get('confidence', 0)}% | 等级: {sig.get('grade', 'unknown')}")
|
||
logger.info(f" ├─ 入场价: ${sig.get('entry_zone', 0):,.2f}")
|
||
logger.info(f" ├─ 止损: ${sig.get('stop_loss', 0):,.2f} | 止盈: ${sig.get('take_profit', 0):,.2f}")
|
||
logger.info(f" └─ 理由: {sig.get('reasoning', 'unknown')}")
|
||
|
||
# 检查是否顺势
|
||
trend_dir = result.get('trend_direction', 'neutral')
|
||
action = sig.get('action', '')
|
||
if trend_dir == 'uptrend' and action == 'sell':
|
||
logger.warning(f" ⚠️ 警告: 上升趋势中做空(逆势)")
|
||
elif trend_dir == 'downtrend' and action == 'buy':
|
||
logger.warning(f" ⚠️ 警告: 下降趋势中做多(逆势)")
|
||
elif trend_dir == 'uptrend' and action == 'buy':
|
||
logger.info(f" ✅ 顺势交易")
|
||
elif trend_dir == 'downtrend' and action == 'sell':
|
||
logger.info(f" ✅ 顺势交易")
|
||
|
||
logger.info("\n" + "=" * 60)
|
||
logger.info("测试完成")
|
||
logger.info("=" * 60)
|
||
|
||
return result
|
||
|
||
|
||
async def test_multiple_symbols():
|
||
"""测试多个交易对"""
|
||
symbols = ['BTCUSDT', 'ETHUSDT', 'SOLUSDT']
|
||
|
||
for symbol in symbols:
|
||
logger.info(f"\n\n{'#' * 60}")
|
||
logger.info(f"# 测试 {symbol}")
|
||
logger.info(f"{'#' * 60}")
|
||
|
||
try:
|
||
await test_trend_analysis(symbol)
|
||
except Exception as e:
|
||
logger.error(f"❌ {symbol} 测试失败: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
|
||
# 等待一段时间,避免 API 限流
|
||
await asyncio.sleep(2)
|
||
|
||
|
||
def main():
|
||
import argparse
|
||
|
||
parser = argparse.ArgumentParser(description='测试市场信号分析')
|
||
parser.add_argument('--symbol', default='BTCUSDT', help='交易对(默认: BTCUSDT)')
|
||
parser.add_argument('--multi', action='store_true', help='测试多个交易对')
|
||
|
||
args = parser.parse_args()
|
||
|
||
if args.multi:
|
||
asyncio.run(test_multiple_symbols())
|
||
else:
|
||
asyncio.run(test_trend_analysis(args.symbol))
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main()
|