fix(report): conta i CHIUSI col flag win del worker (PnL REALE), non col net_return sim

Col real-truth ledger net_return resta il numero SIM diagnostico: sui TP fantasma
da spike-print testnet (ETH, bars_held=0: lo spike genera il segnale E tocca il TP
intrabar; il reale chiude a mercato pagando fee/spread) il report Telegram diceva
26 positivi / 0 negativi mentre il reale era 11/15. Ora collect() usa ev.win
(real-truth-aware, fallback nr>0 per eventi storici); i PnL per-motivo erano gia'
reali. TODO: nota monitor sul churn da spike (niente filtri anti-spike nei segnali:
artefatto testnet, real-truth gia' contabilizza giusto).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-06-11 19:18:55 +00:00
parent b208417f2d
commit 2ae6d7afe6
2 changed files with 16 additions and 1 deletions
+11
View File
@@ -66,6 +66,17 @@
## Monitoraggio (osservare, non agire subito)
- [ ] **Churn da spike-print testnet su ETH (2026-06-11)**: il feed testnet stampa wick
anomali sulla barra 1h ETH che (a) generano segnali short MR01/MR07 (lo spike È lo
z-score estremo) e (b) "toccano" il TP intrabar della stessa barra → il sim booka
+4% fantasma a bars_held=0, il reale apre+chiude pagando solo fee/spread (~0.17€
a giro, 14 giri oggi ≈ 2.3€). Il real-truth ledger contabilizza GIUSTO (per questo
esiste) e il report orario ora conta i win dal flag reale. NON aggiungere filtri
anti-spike ai segnali (= fit su un artefatto del testnet, divergenza dal backtest);
su feed mainnet il fenomeno non esiste. Osservare la frequenza: se il churn cresce,
valutare un gate di QUALITÀ FEED a monte (validazione barre nel data layer, non
nella strategia).
- [ ] **FADE in coda storica (2026-06-11)**: il rolling 120g equal-weight delle 6 fade è al
**2° percentile** della propria storia (1.0% vs p5 +0.4%); il PORT06 complessivo resta
in variazione normale (19-28° pct). NESSUN ritocco parametri (= fit sul regime corrente);
+5 -1
View File
@@ -115,7 +115,11 @@ def collect():
nr = ev.get("net_return", 0.0)
pnl = ev.get("pnl", 0.0)
realized += pnl
closed.append((_short(wid), ev.get("reason", "?"), nr, pnl, nr > 0))
# win = flag del worker (col real-truth segue il PnL REALE; net_return
# resta il sim diagnostico: sui TP fantasma da spike testnet diceva
# 26/0 mentre il reale era 11/15). Fallback nr>0 per eventi storici.
closed.append((_short(wid), ev.get("reason", "?"), nr, pnl,
bool(ev.get("win", nr > 0))))
if "positions" in st or "weights" in st:
continue # multi-asset (TR01/ROT02/TSM01): sezione dedicata
if st.get("in_position"):