""" 测试市场信号分析 - 验证趋势判断功能 """ 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()