diff --git a/CLAUDE.md b/CLAUDE.md index d268b78..0a1f33d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -96,10 +96,25 @@ uv run python scripts/analysis/live_exec_smoke.py # smoke ESECUZIONE re uv run python scripts/analysis/live_shadow_smoke.py # smoke catena shadow nel worker (open/close reali) uv run python scripts/analysis/regime_fetcher.py # fetch DVOL+funding (Deribit mainnet) -> data/regime/ uv run python scripts/analysis/exit_lab.py # (ri)costruisci cache segnali exit-lab + parity check +uv run python -m src.live.dashboard --port 8787 # dashboard web (servizio compose 'dashboard', porta 8787) +uv run python scripts/analysis/ledger_vs_backtest.py --since 2026-06-13 # report fuga di esecuzione (reale vs sim) ./scripts/deploy.sh [patch|minor|major] # DEPLOY: bump versione + commit + rebuild Docker uv run pytest # test ``` +> **Dashboard web (`src/live/dashboard.py`, servizio compose `dashboard`, porta 8787).** +> Stdlib http.server, legge `data/`: equity (restyling), PnL totale e per-strategia, +> **grafico equity per famiglia**, trade attivi in tempo reale (entry/mark/PnL **REALI** — +> il feed sim-decisione testnet è dislocato, vedi sotto) + chiusi, modal per-strategia +> (curva reale vs sim + scheda `strategie_attive.html`), **area PAPER distinta** (equity +> propria dei 4 multi-asset), strategie **ritirate** marcate (staleness >30min) + versione +> sistema/strategia. Nessuna auth → solo rete interna. `docker compose up -d --build dashboard`. + +> **Cron host (monitoraggio, già schedulati):** `hourly_report.py` (orario), `drift_monitor.py` +> (07:15), `reconcile_account.py --telegram` (:40), **`ledger_vs_backtest.py --since 2026-06-13 +> --telegram` (08:30)** = il GATE per scalare il capitale (per gli sleeve eseguiti sim==backtest +> per costruzione → reale-vs-sim = fuga di esecuzione: slippage+fee+netting; verdetto 🟢/🟡/🔴). + > **Deploy.** Il sorgente è **COPY nell'immagine Docker** (non montato) → `docker compose restart` > NON ricarica il codice: serve **`docker compose up -d --build`** (o `./scripts/deploy.sh`, che bumpa > la versione, committa e rebuilda). Il volume `data/` persiste → i worker fanno RESUME dello stato. @@ -568,3 +583,20 @@ long A / short B sullo z-score del log-ratio, fee su 2 gambe). - **GBM:** GradientBoostingClassifier di scikit-learn. Ensemble di alberi decisionali sequenziali. Walk-forward per evitare leakage temporale. - **Cerbero `get_historical` (fix 2026-05-28):** `end_date` come data nuda è inclusivo dell'intera giornata fino all'ultima candela chiusa (es. `end=oggi` arriva fino ad ora, non più a mezzanotte); accettati anche timestamp con orario (`...T14:00:00`, naive=UTC); nessun cap a ~5000 righe (paginazione interna). Il client passa già `end=oggi`, ora corretto. Prima del fix il paper trader restava a zero trade perché il feed era fermo a mezzanotte. - **Dati ETH Deribit 15m:** 14-30%/anno di candele *flat* (O=H=L=C, volume 0, run fino a ~54h) per bassa liquidità del perpetuo. Verificato (2026-05-28): escluderle NON cambia i backtest (Δacc ≤0.5pp) → edge robusto. Resta un caveat operativo (slippage/fill in trading reale, irrilevante per paper). BTC pulito eccetto picco ~8% nel 2024. +- **FEED TESTNET INAFFIDABILE — `ETH-PERPETUAL` inverse CONGELATO (2026-06-13).** Il feed di + DECISIONE che il runner usa per BTC/ETH (inverse perp, `INSTRUMENT_MAP`) può congelarsi sul + testnet: il 13-06 `ETH-PERPETUAL` era fermo a **1661.95 per 12h+** (1 solo valore) mentre il + reale (`ETH_USDC-PERPETUAL`, lineare, dove si ESEGUE) si muoveva (gap −1.3%); BTC era vivo. + Effetto: tutte le decisioni ETH (SH01_ETH, 3 fade ETH 15m, gambe ETH dei pairs) girano su un + prezzo morto → **spiega lo 0-trade delle fade ETH 15m** (feed piatto = niente rottura banda). + È un GUASTO testnet, non di strategia: su **mainnet** l'arbitraggio tiene inverse ≈ lineare ≈ + realtà. Fix testnet possibile (reroute decisione ETH a USDC lineare in `INSTRUMENT_MAP`, con + caveat bootstrap SH01) NON applicato — il fix vero è andare a mainnet. Nota: la dashboard mostra + entry/mark/PnL **REALI** (non il sim-feed dislocato); il sim resta solo nel modal diagnostico. +- **MICRO-TEST MAINNET = il gate per scalare il capitale (piano pronto, 2026-06-13).** Testnet + valida solo la MECCANICA (feed/fill farlocchi); l'edge sopravvive ai fill veri? si risponde solo + con poco denaro reale su mainnet. **Switch già eseguibile via `.env`**: `CerberoClient` legge il + token da env (`CERBERO_TOKEN`, default testnet invariato; `is_mainnet()` helper) → puntare a + mainnet = solo `.env`, niente codice. Piano completo (fasi smoke→fade-only €1000 2-4 sett→verdetto + ledger-vs-backtest→espansione; sizing: fade €1000 = arrotondamento 2.6% BTC, pairs esclusi al 30%): + `docs/specs/mainnet-microtest-plan.md`.