187 lines
5.5 KiB
Python
187 lines
5.5 KiB
Python
"""
|
||
信号 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))
|