Files
PythagorasGoal/docs/diary/2026-06-05-confirm-sl-forming-bar.md
T
Adriano Dal Pastro 2da3457ca7 fix(live): EXIT-16 confirm-SL valutato sul close di barra COMPLETATA + alert STALE_FEED
Il worker valutava il confirm sul prezzo della candela IN FORMAZIONE ad ogni poll,
reintroducendo la wick-sensitivity che EXIT-16 elimina (audit crash ETH 2026-06-05:
2 stop su 3 erano wick-stop che il backtest validato non avrebbe preso in quel
momento). Ora il confirm usa SOLO il close dell'ultima barra completata (riga -1 =
candela in corso finche' now < ts[-1]+bar_ms), buf dall'ATR della stessa barra,
fill al prezzo corrente (~ stress lag_close_exit OK in exit-lab), TP intrabar
invariato. Concausa feed-gap: non mitigabile lato exit (fill reali ~ sim);
entry-guard post-flat TESTATA e BOCCIATA (skippare i segnali dopo barre flat
peggiora tutti gli sleeve ETH: la candela-gap e' l'overshoot che la fade fada).
Aggiunto alert Telegram STALE_FEED (>=2 barre 1h flat -> notifica + gap % al
risveglio, dedup per episodio, solo osservabilita').

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 18:32:14 +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.