Files
PythagorasGoal/Old/docs/diary/2026-06-15-frozen-feed-gate.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

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.