""" 交易记录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))