""" 信号 API - 提供加密货币信号查询接口 """ from fastapi import APIRouter, HTTPException, Query from typing import Dict, List, Optional, Any from app.services.signal_database_service import get_signal_db_service from app.utils.logger import logger router = APIRouter(prefix="/api/signals", tags=["信号管理"]) @router.get("/crypto") async def get_crypto_signals( limit: int = Query(50, ge=1, le=200, description="返回数量限制"), symbol: Optional[str] = Query(None, description="过滤指定交易对"), days: int = Query(7, ge=1, le=30, description="查询最近多少天的信号") ) -> Dict[str, Any]: """ 获取加密货币信号列表 Args: limit: 返回数量限制(默认50) symbol: 过滤指定交易对 days: 查询最近多少天的信号(默认7天) Returns: 信号列表 """ try: service = get_signal_db_service() if symbol: # 获取指定交易对的最新信号 signal = service.get_latest_signal('crypto', symbol) return { 'success': True, 'symbol': symbol, 'signal': signal, 'count': 1 if signal else 0 } else: # 获取所有信号 signals = service.get_crypto_signals(limit=limit, days=days) return { 'success': True, 'signals': signals, 'count': len(signals) } except Exception as e: logger.error(f"获取加密货币信号失败: {e}") raise HTTPException(status_code=500, detail=str(e)) @router.get("/latest") async def get_latest_signals( limit: int = Query(20, ge=1, le=100, description="返回数量限制"), days: int = Query(7, ge=1, le=30, description="查询最近多少天的信号") ) -> Dict[str, Any]: """ 获取最新的加密货币信号(按时间排序) Args: limit: 返回数量限制(默认20) days: 查询最近多少天的信号(默认7天) Returns: 最新信号列表 """ try: service = get_signal_db_service() signals = service.get_crypto_signals(limit=limit, days=days) return { 'success': True, 'signals': signals, 'count': len(signals) } except Exception as e: logger.error(f"获取最新信号失败: {e}") raise HTTPException(status_code=500, detail=str(e)) @router.get("/stats") async def get_signal_stats( days: int = Query(7, ge=1, le=30, description="统计最近多少天的信号") ) -> Dict[str, Any]: """ 获取信号统计信息 Args: days: 统计最近多少天的信号(默认7天) Returns: 统计数据 """ try: service = get_signal_db_service() stats = service.get_signal_stats(days=days) return { 'success': True, **{ 'crypto': stats.get('crypto', {'total': 0, 'buy': 0, 'sell': 0, 'recent_24h': 0}), 'grades': stats.get('grades', {}), 'total': stats.get('crypto', {}).get('total', 0), } } except Exception as e: logger.error(f"获取信号统计失败: {e}") raise HTTPException(status_code=500, detail=str(e))