""" 信号 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("/stock") async def get_stock_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('stock', symbol) return { 'success': True, 'symbol': symbol, 'signal': signal, 'count': 1 if signal else 0 } else: # 获取所有信号 signals = service.get_stock_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("/all") async def get_all_signals( limit: int = Query(50, ge=1, le=200, description="每种类型返回数量限制"), days: int = Query(7, ge=1, le=30, description="查询最近多少天的信号") ) -> Dict[str, Any]: """ 获取所有信号(加密货币 + 美股) Args: limit: 每种类型返回数量限制(默认50) days: 查询最近多少天的信号(默认7天) Returns: 所有信号 """ try: service = get_signal_db_service() signals = service.get_all_signals(limit=limit, days=days) return { 'success': True, 'crypto': { 'signals': signals['crypto'], 'count': len(signals['crypto']) }, 'stock': { 'signals': signals['stock'], 'count': len(signals['stock']) }, 'total_count': len(signals['crypto']) + len(signals['stock']) } 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_latest_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, **stats } except Exception as e: logger.error(f"获取信号统计失败: {e}") raise HTTPException(status_code=500, detail=str(e))