Files
PythagorasGoal/docs/diary/2026-06-13-dashboard.md
T
Adriano Dal Pastro 31f08ddf32 feat(dashboard): frontend web PORT06 — stato live, PnL totale/per-strategia, grafici, trade
Server stdlib http.server (zero dipendenze nuove) che legge data/: KPI equity/PnL/DD,
grafico equity (Chart.js CDN + fallback), PnL per-strategia (barre, realizzato reale),
trade attivi in TEMPO REALE (mark Cerbero best-effort, PnL non realizzato, barre, eta
stantio) e chiusi (ultimi 50). Servizio docker-compose 'dashboard' porta 8787, stessa
immagine, monta data/, restart unless-stopped + healthcheck. Nessuna auth -> rete interna.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-13 19:46:47 +00:00

1.9 KiB

2026-06-13 — Dashboard web PORT06 (stato live + PnL + grafici + trade)

Richiesta utente: frontend per visualizzare lo stato con PnL totale e per-strategia, grafici, e liste trade (attivi in tempo reale + chiusi).

Cosa

src/live/dashboard.py — server stdlib http.server (zero nuove dipendenze), legge i file data/ e serve:

  • GET /api/state → JSON con tutto lo stato calcolato
  • GET / → single-page HTML (vanilla JS, polling ogni 5s)

Contenuto della pagina:

  • KPI: equity, PnL totale (€ e %), max DD, peak
  • Grafico equity (Chart.js da CDN, fallback testuale se offline) dalla equity.jsonl del ledger (downsample a 400 punti)
  • PnL per strategia (barre verdi/rosse): realizzato netto fee = Σ pnl reali dai CLOSE (REAL-TRUTH), n trade, win-rate, capitale; tag paper per i multi-asset non eseguiti, •aperta se in posizione
  • Trade attivi in tempo reale: lato, entry, mark corrente (Cerbero best-effort, cache 20s), PnL non realizzato (€ e %, da real_entry_notional), barre/max_bars, distanza al TP, età dello status (⚠ se >15min = stantio)
  • Trade chiusi (ultimi 50): ora, strategia, motivo, PnL reale, sim, esito

Deploy

Servizio docker-compose dashboard (stessa immagine del runner, monta gli stessi data/, porta 8787), restart: unless-stopped + healthcheck sull'API. Accesso: http://<host>:8787. Nessuna auth → solo rete interna/VPN, non esporre pubblicamente. Avvio: docker compose up -d --build dashboard (il runner non viene toccato).

uv run python -m src.live.dashboard --port 8787   # anche standalone su host

Note

  • Il PnL per-strategia usa il PnL REALE (real_truth), coerente col report orario.
  • I 6 fade 1h ritirati dallo swap restano in lista (hanno storico CLOSE): flat, mostrano il loro PnL realizzato storico accanto ai gemelli 15m attivi.
  • Unrealized € sui pairs non mostrato (posizione a 2 gambe, z-based) → "pairs (z)".