stock-ai-agent/backend/app/api/signals.py
2026-02-19 21:45:27 +08:00

187 lines
5.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
信号 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))