auto_trade_sys/backend/api/routes/trades.py
薇薇安 8a89592cb5 a
2026-01-13 17:30:59 +08:00

65 lines
2.0 KiB
Python

"""
交易记录API
"""
from fastapi import APIRouter, Query, HTTPException
from typing import Optional
import sys
from pathlib import Path
project_root = Path(__file__).parent.parent.parent.parent
sys.path.insert(0, str(project_root))
sys.path.insert(0, str(project_root / 'backend'))
from database.models import Trade
router = APIRouter()
@router.get("/")
async def get_trades(
start_date: Optional[str] = Query(None),
end_date: Optional[str] = Query(None),
symbol: Optional[str] = Query(None),
status: Optional[str] = Query(None),
limit: int = Query(100, ge=1, le=1000)
):
"""获取交易记录"""
try:
trades = Trade.get_all(start_date, end_date, symbol, status)
return {
"total": len(trades),
"trades": trades[:limit]
}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/stats")
async def get_trade_stats(
start_date: Optional[str] = Query(None),
end_date: Optional[str] = Query(None),
symbol: Optional[str] = Query(None)
):
"""获取交易统计"""
try:
from fastapi import HTTPException
trades = Trade.get_all(start_date, end_date, symbol, None)
closed_trades = [t for t in trades if t['status'] == 'closed']
win_trades = [t for t in closed_trades if float(t['pnl']) > 0]
stats = {
"total_trades": len(trades),
"closed_trades": len(closed_trades),
"open_trades": len(trades) - len(closed_trades),
"win_trades": len(win_trades),
"loss_trades": len(closed_trades) - len(win_trades),
"win_rate": len(win_trades) / len(closed_trades) * 100 if closed_trades else 0,
"total_pnl": sum(float(t['pnl']) for t in closed_trades),
"avg_pnl": sum(float(t['pnl']) for t in closed_trades) / len(closed_trades) if closed_trades else 0,
}
return stats
except Exception as e:
from fastapi import HTTPException
raise HTTPException(status_code=500, detail=str(e))