Files
PythagorasGoal/Old/docs/diary/2026-06-05-confirm-sl-forming-bar.md
T
Adriano Dal Pastro 14522262e6 chore(reset): v2.0.0 — storico certificato Deribit mainnet, ripartenza pulita
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>
2026-06-19 15:20:59 +00:00

3.9 KiB
Raw Blame History

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:0014: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.20.9%, ETH 3.411.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.