From 57dcfe7adbf5a4ae5a8314ad2e384553ebd27485 Mon Sep 17 00:00:00 2001 From: matitos Date: Tue, 22 Sep 2026 23:11:18 +0000 Subject: [PATCH] Aggregate the top status cards across strategies With several strategies the header cards showed only the first one. Expose day_pnl and drawdown_pct per strategy and add aggregateStatus() (frontend) so the cards show the whole account: summed cash/equity/P&L/trades/positions, worst drawdown, and any halt. Single-strategy runs are unchanged. Adds tests. --- backend/app/engine/manager.py | 2 + backend/app/schemas.py | 2 + backend/tests/test_api.py | 2 + frontend/src/App.vue | 9 ++-- frontend/src/aggregate.js | 34 +++++++++++++ frontend/src/aggregate.test.js | 87 ++++++++++++++++++++++++++++++++++ 6 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 frontend/src/aggregate.js create mode 100644 frontend/src/aggregate.test.js diff --git a/backend/app/engine/manager.py b/backend/app/engine/manager.py index 33ea652..96f1f18 100644 --- a/backend/app/engine/manager.py +++ b/backend/app/engine/manager.py @@ -158,6 +158,8 @@ class MultiStrategyManager: halted=engine_status.halted, halt_reason=engine_status.halt_reason, trades_today=engine_status.trades_today, + day_pnl=engine_status.day_pnl, + drawdown_pct=engine_status.drawdown_pct, error=engine_status.error, ) ) diff --git a/backend/app/schemas.py b/backend/app/schemas.py index 93f3a13..486cada 100644 --- a/backend/app/schemas.py +++ b/backend/app/schemas.py @@ -177,6 +177,8 @@ class StrategyStatusOut(BaseModel): halted: bool = False halt_reason: str | None = None trades_today: int = 0 + day_pnl: float = 0.0 + drawdown_pct: float = 0.0 error: str | None = None diff --git a/backend/tests/test_api.py b/backend/tests/test_api.py index 95b5686..abd06fb 100644 --- a/backend/tests/test_api.py +++ b/backend/tests/test_api.py @@ -134,6 +134,8 @@ def test_start_many_and_multi_status(runtime: Runtime, market: FakeMarketData) - assert status["running"] is True assert len(status["strategies"]) == 2 assert status["equity"] == 10000 + # Per-strategy fields the dashboard aggregates must be present. + assert {"day_pnl", "drawdown_pct"} <= set(status["strategies"][0]) client.post("/api/bot/stop") diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 4b8d9eb..40663ff 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,5 +1,6 @@