Show strategy stats in control monitor detail modal.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-08-02 09:49:27 +08:00
parent 0e3b9e53ac
commit 079dc83132
5 changed files with 211 additions and 7 deletions
+8
View File
@@ -278,6 +278,14 @@ async def fleet_status(_tok: Annotated[str, Depends(require_fleet_token)]) -> di
}
@router.get("/stats")
async def fleet_stats(_tok: Annotated[str, Depends(require_fleet_token)]) -> dict:
"""中控拉取策略机整体统计(同 /api/stats/summaryFleet Token 鉴权)。"""
from .stats import build_stats_summary
return build_stats_summary()
@router.post("/start")
async def fleet_start(_tok: Annotated[str, Depends(require_fleet_token)]) -> dict:
return await get_engine().start()
+11 -6
View File
@@ -1,6 +1,6 @@
from __future__ import annotations
from typing import Annotated
from typing import Annotated, Any
from fastapi import APIRouter, Depends
@@ -12,12 +12,12 @@ from .auth import require_user
router = APIRouter(prefix="/api/stats", tags=["stats"])
@router.get("/summary")
async def stats_summary(_user: Annotated[str, Depends(require_user)]) -> dict:
db = get_db()
def build_stats_summary(db: Any | None = None) -> dict[str, Any]:
"""已平仓组汇总(策略页统计 / 中控 Fleet 共用)。"""
database = db or get_db()
s = get_settings()
mode = "LIVE" if not s.is_sim else "SIM"
rows = db.fetchall("SELECT * FROM groups WHERE status='closed'")
rows = database.fetchall("SELECT * FROM groups WHERE status='closed'")
n = len(rows)
wins = sum(1 for r in rows if float(r["realized_pnl"] or 0) > 0)
total_pnl = sum(float(r["realized_pnl"] or 0) for r in rows)
@@ -26,7 +26,7 @@ async def stats_summary(_user: Annotated[str, Depends(require_user)]) -> dict:
fees_option = 0.0
total_slip = 0.0
for r in rows:
fills = db.fetchall(
fills = database.fetchall(
"SELECT * FROM fills WHERE group_id=? ORDER BY id ASC",
(r["group_id"],),
)
@@ -65,3 +65,8 @@ async def stats_summary(_user: Annotated[str, Depends(require_user)]) -> dict:
"close_reasons": reasons,
"equity_curve": curve,
}
@router.get("/summary")
async def stats_summary(_user: Annotated[str, Depends(require_user)]) -> dict:
return build_stats_summary()