14522262e6
Reset del progetto su fondamenta verificate dopo la scoperta che l'intera libreria "validata OOS" era artefatto di feed contaminato (print fantasma del feed Cerbero TESTNET + storico Binance/USDT). - Storico ricostruito da Deribit MAINNET (ccxt pubblico, tokenless) e CERTIFICATO (certify_feed.py): BTC/ETH puliti su TUTTA la storia (mediana 2-6 bps vs Coinbase USD), integrita' OHLC + coerenza resample (maxΔ 0.00) + cross-venue OK. Alt esclusi (illiquidi/divergenti: LTC/DOGE 50-82% barre flat; XRP/BNB non certificabili). - Verdetto sul feed pulito: FADE / PAIRS / XS01 / TSM01 morti (ogni portafoglio Sharpe -2.3..-3.0, DD ~40%); solo SH01 e frammenti HONEST con segnale residuo, da ri-validare in isolamento. - Cleanup "restart pulito": strategie, stack live (src/live, src/portfolio, runner/executor, yml, docker), ~100 script ricerca/gate, waste/games/ portfolios, dati non certificati + cache e 60+ diari -> archiviati in Old/ (preservati, non cancellati). Diario consolidato in un unico documento. - Skeleton ricerca tenuto: Strategy ABC + indicatori + src/fractal + src/backtest/engine + load_data; tool dati certificati (rebuild_history, certify_feed, audit_feed, multi_source_check). - Universo dati ATTIVO: solo BTC/ETH (5m/15m/1h); guardrail fisico (load_data su alt -> FileNotFoundError). Esecuzione DISABILITATA, conto flat. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
68 lines
3.9 KiB
Markdown
68 lines
3.9 KiB
Markdown
# Diario — 2026-06-05 — Fix EXIT-16 live: confirm sul close di barra COMPLETATA + alert STALE_FEED
|
||
|
||
## Innesco
|
||
|
||
Crash ETH 2026-06-05: gli stop MR01/MR02 ETH sono scattati molto sotto il livello
|
||
nominale (MR02: sl 1636.28 → exit 1600.45; MR01: sl 1610.75 → exit 1594.35).
|
||
Analisi delle due concause dichiarate:
|
||
|
||
1. **EXIT-16 close-confirm** (by design): uscita al close oltre `sl ∓ 0.5·ATR14`,
|
||
non al livello — costo accettato e MODELLATO nel backtest validato (7.84/10.06).
|
||
2. **Feed gappato**: ETH testnet flat ~2h (1656.80/1655.55, 13:00–14:50 UTC), poi
|
||
una candela 14:55 da 1634 a 1600 — nessun prezzo esisteva tra SL ed exit. I fill
|
||
REALI confermano (1600.2 / 1589.7, slippage −1.6/−29 bps): non è un bug, è il mercato.
|
||
|
||
## Scoperta: divergenza implementativa REALE nel worker
|
||
|
||
Audit dei 3 stop ETH del 2026-06-04/05 contro le candele:
|
||
|
||
| Stop live | Close barra COMPLETATA al momento | Confirm | Verdetto |
|
||
|---|---|---|---|
|
||
| MR02 06:03 @1672.9 | 1682.25 (05:00) | ~1675.4 | **wick-stop**: il backtest NON avrebbe stoppato lì |
|
||
| MR02 15:00 @1600.45 | 1600.05 (14:00) | ~1621 | legittimo, fill ≈ backtest |
|
||
| MR01 15:01 @1594.35 | 1600.05 (14:00) | ~1594.4 | **wick-stop**: il backtest NON avrebbe stoppato lì |
|
||
|
||
**2 su 3 erano valutazioni sulla barra IN FORMAZIONE**: `tick` confrontava
|
||
`current_price` (close istantaneo della candela in corso al poll) con `sl − buf`.
|
||
Il backtest (`fade_base`) valuta il confirm SOLO sul close di barra completata
|
||
`c[j]`. La differenza reintroduce live esattamente la wick-sensitivity che EXIT-16
|
||
elimina: un dip infrabarra sotto il confirm stoppava anche se la barra chiudeva
|
||
sopra (e nei dip-che-rientrano la fade vince — è il suo edge). Live sarebbe stato
|
||
strutturalmente PIÙ stop-prone del backtest validato.
|
||
|
||
## Fix (`strategy_worker.py`, ramo sl_confirm_atr)
|
||
|
||
- Il confirm è valutato sul **close dell'ultima barra COMPLETATA**: l'ultima riga
|
||
del df è la candela in corso finché non è trascorsa la sua durata
|
||
(`now_ms < ts[-1] + bar_ms`, `bar_ms` = mediana dei delta timestamp → regge 1h/4h/1d).
|
||
- Il `buf` usa l'ATR14 alla stessa barra completata (prima: barra in formazione).
|
||
- Il **fill resta al prezzo corrente** al poll (lag ≈ stress `lag_close_exit`,
|
||
superato in exit-lab). TP intrabar sulla barra in corso INVARIATO (= backtest).
|
||
- Test nuovi in `test_close_confirm_sl.py` (sezione FIX 2026-06-05): il dip della
|
||
candela in corso non stoppa; il breach della completata stoppa anche se rimbalzato;
|
||
TP intrabar invariato. NB fixture: timestamp in ms ESPLICITI
|
||
(`Timestamp.now()` è risoluzione µs → `astype int64 // 10**6` darebbe secondi).
|
||
|
||
## Concausa feed: entry-guard TESTATA e BOCCIATA, solo osservabilità
|
||
|
||
Quantificato (1h, storico completo): segnali fade subito dopo barre flat = BTC
|
||
0.2–0.9%, **ETH 3.4–11.8%**. Backtest con skip di quei segnali (config live,
|
||
sl_confirm 0.5): **PEGGIORA tutti gli sleeve ETH** (MR01 +1344→+1256, MR02
|
||
+2372→+2250, MR07 +740→+621; BTC ~invariato). La candela-gap post-flat è
|
||
l'overshoot che la fade fada con profitto — e i fill reali post-crash lo
|
||
confermano (riaperture a −1.9 bps di slippage). **Niente skip degli ingressi.**
|
||
|
||
Aggiunto invece **alert Telegram `STALE_FEED`** (`runner._check_stale_feed`):
|
||
notifica quando un asset ha ≥2 barre 1h complete flat (worker ciechi) e al
|
||
risveglio col **gap %** del primo prezzo reale. Una notifica per episodio
|
||
(dedup per asset). Solo osservabilità, zero effetto sulle decisioni.
|
||
|
||
## Cosa NON è stato toccato (e perché)
|
||
|
||
- Il **costo del confirm** (uscita al close, non al livello nominale) resta: è il
|
||
trade-off validato di EXIT-16 (FULL 6.47→7.84, OOS 8.82→10.06) — i wick-stop
|
||
evitati pagano molto più dei close-stop più profondi.
|
||
- Il **gap-through** non è mitigabile lato exit: nessun prezzo esisteva tra SL ed
|
||
exit (fill reali ≈ sim). L'unica protezione strutturale resta la diversificazione
|
||
(17 sleeve) + i cap di famiglia.
|