Files
PythagorasGoal/docs/diary/2026-06-15-frozen-feed-gate.md
T
Adriano Dal Pastro 4c184d5cbc feat(runner): gate feed CONGELATO — sospende gli sleeve ETH-leg finche' il feed non si sblocca
Audit "stato ordini": il feed ETH-PERPETUAL congelato a 1661.95 (36h+) generava
perdite REALI (SH01_ETH -2.83 reali vs -0.09 sim su un close + riapertura; 4 pairs
con gamba ETH entrati su z-score spuri -3/-5/+5.6 = artefatto del log-ratio con ETH
pinnato mentre gli alt si muovono).

_frozen_assets + _feed_gated_sids: quando il feed di decisione 1h di un asset e'
congelato, gli sleeve concentrati (single/ml/pairs) che ne dipendono saltano il tick
(entry+exit) finche' non si sblocca (come outage; disaster-SL on-book = coda).
Auto-guarente: rilascio alla prima barra COMPLETA non-flat (NON l'entry-guard
post-flat bocciata). Detector guasto-vs-illiquido: conta la run di close INVARIATE
(ETH/BNB/DOGE run 40-64, 1-4 val/48h = morti; SOL/LTC/ADA run <=12, 5-31 val = vivi).
Soglia feed_freeze_gate_bars=24 -> gatea le 9 gambe ETH esatte, PR_BTCLTC e i
multi-asset restano attivi. Alert Telegram FEED_FROZEN_GATE GATED/RIPRESO.

Test test_freeze_gate.py (6, detector+scope+rilascio). Suite portfolio 140/140.
Cerotto testnet: il fix vero e' mainnet. Diario 2026-06-15-frozen-feed-gate.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 08:44:39 +00:00

4.5 KiB
Raw Blame History

2026-06-15 — Gate del feed CONGELATO (freeze gate)

Problema (da "stato ordini")

Audit degli ordini live: 5 sleeve in posizione reale, 4-5 contaminati dal feed ETH congelato. ETH-PERPETUAL (inverse, il feed di DECISIONE del runner) è fermo a 1661.95 da 36h+ (100% barre flat, 57/57 nel windows 2g, 1 solo valore distinto), mentre il book reale dove si ESEGUE (ETH_USDC-PERPETUAL, lineare) si muove ~1717-1722.

Effetto misurato sui soldi reali (log container):

  • SH01_ETH ha aperto short a sim 1661.95 / real 1717.10 (slippage 332 bps), chiuso a time_limit con sim_exit 1661.95 ma real_fill 1719.212.83 USD reali vs 0.09 sim → e ha riaperto subito lo stesso short sulla trappola.
  • I 4 pairs con gamba ETH (ETH/BTC 1h+15m, ETH/SOL, LTC/ETH, ADA/ETH) sono entrati con z-score estremi (3.10, 2.96, +5.58, 2.56): artefatto MECCANICO del log-ratio con ETH pinnato a 1661.95 mentre gli alt si muovono → falsa divergenza → carico di spread long-ETH.

È un GUASTO testnet, non di strategia: in mainnet l'arbitraggio tiene inverse ≈ lineare ≈ realtà.

Decisione utente

"congela gli sleeve ETH-leg finché il feed non si sblocca"

Soluzione: gate del feed congelato nel runner (auto-guarente)

src/portfolio/runner.py: quando il feed di decisione 1h di un asset è congelato, gli sleeve CONCENTRATI (single/ml/pairs) che ne dipendono saltano il tick (entry E exit) finché il feed non si sblocca. Come un outage (i worker non valutano gli exit, protezione = disaster-SL on-book). Si rilascia DA SOLO alla prima barra completa non-flat.

Distinguere il GUASTO dall'ILLIQUIDITÀ (il punto critico)

Un detector flat-bar ingenuo sarebbe SBAGLIATO: sul feed reale (2026-06-15) gli alt sono flat ma VIVI. Firma misurata (run finale di close invariate / valori distinti in 48h):

Asset run distinti/48h natura
ETH 64 1 MORTO (guasto)
BNB 64 2 MORTO (testnet, solo paper)
DOGE 42 4 MORTO (testnet, solo paper)
XRP 12 3 illiquido
ADA 11 5 illiquido ma VIVO
LTC 10 5 illiquido ma VIVO
SOL 1 31 VIVO

→ il detector conta la run di close INVARIATE (prezzo che non cambia MAI), non le barre flat. Soglia 24 (feed_freeze_gate_bars, configurabile, 0=off): un giorno intero di prezzo immobile separa nettamente le due popolazioni. ETH/BNB/DOGE (run 40-64) gateati, ADA/LTC/XRP/SOL (run ≤12) no. PR_BTCLTC resta attivo (BTC vivo + LTC solo illiquido NON deve sospendere il pair: si perderebbero segnali reali sulla gamba BTC).

NON è l'entry-guard post-flat (BOCCIATA)

Si gatea DURANTE il freeze (ultima barra completa ferma). La barra di RIPRESA è non-flat → la run si azzera → il tick riprende SU di essa. NON si salta la candela-gap di ripresa (quella è l'overshoot che la fade fada con profitto — l'entry-guard post-flat è bocciata, CLAUDE.md / 2026-06-05). Rilascio solo su barra completata non-flat (la forming non basta, coerente con EXIT-16).

Scope

Solo sleeve single/ml/pairs. I multi-asset (basket/rotation/tsmom/xsec, tutti PAPER) NON sono gateati: diversificati su 8 asset, un feed fermo non li compromette (e ROT02 ha ETH nell'universo ma resta attivo). Osservabilità: log FEED_FROZEN_GATE + alert Telegram GATED/RIPRESO, dedup per episodio.

Esito (smoke feed reale, soglia 24)

  • CONGELATI: ETH, BNB, DOGE.
  • GATEATI: le 9 gambe ETH esatte — MR01/MR02/MR07_ETH, SH_ETH, PR_ETHBTC, PR_ETHBTC_15M, PR_LTCETH, PR_ADAETH, PR_ETHSOL. BTC-only, PR_BTCLTC e i multi-asset restano attivi.

Le 5 posizioni ETH già aperte NON vengono flattate (freeze = pausa, non liquidazione): un close forzato passerebbe per lo stesso feed congelato (= il close 2.83 di SH01). Restano gestite alla ripresa del feed; protezione di coda = disaster-SL on-book a 30%.

Test: tests/portfolio/test_freeze_gate.py (detector guasto-vs-illiquido, rilascio su barra completata, scope sui veri sleeve PORT06). Suite portfolio: 140/140 verdi.

Lezione

Tre livelli di osservabilità del feed ora distinti: STALE_FEED (≥2 barre flat, alert umano), FEED_BOOK_GAP (feed≠book d'esecuzione, alert), FEED_FROZEN_GATE (≥24 barre invariate, AGISCE). La firma che separa guasto da illiquidità è la run di prezzo invariato, non la barra flat: gli alt illiquidi stampano barre flat ma il prezzo si muove ogni ~10 barre.