Files
PythagorasGoal/STRATEGIA_GRIGLIA.md
T
Adriano Dal Pastro 8d69a0cef5 feat(games): sessioni 2-3 Blind Traders (opzioni/session/grid) + gate PORT06 e tooling reset
- Gioco GRID TRADERS (sessione 3, regola STRATEGIA_GRIGLIA.md): grid_engine
  (backtest causale fee-aware della griglia geometrica), grid_brief (digest
  anonimo per dimensionare la griglia), grid_arena (torneo 100 agenti);
  diario docs/diary/2026-06-10-grid-traders-game3.md
- Gioco OPZIONI: options_engine (BS + skew fittato + DVOL storica),
  options_arena, opt_calibrate (superficie premi REALE da cerbero-bite)
- Gioco SESSION: session_engine/session_arena (pattern orari intraday)
- arena: vincolo GAME_NO_LIVE=1 (vieta pairs e fade zscore/breakout/momentum
  gia' live, coercizione a trend/ma_cross) + normalize del candidato PRIMA
  della valutazione nel hill-climb
- Gate: grid_game_gate (griglia ETH vincitrice vs PORT06, mark-to-market),
  pairs30m_gate (ETH/BTC 30m ridondante col 15m gia' deployato?)
- reset_flatten: flatten one-shot del conto testnet per il reset portafoglio
- .gitignore: data/portfolio_paper_stats/ (stato runtime sleeve paper-only)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 09:49:17 +00:00

8.1 KiB
Raw Blame History

Strategia di Grid Trading — Versione Corretta

Documento di specifica della strategia. Descrive cosa deve fare il bot e perché, non l'implementazione. È il riferimento da cui partire per riscrivere il codice in modo sicuro e testabile.


1. Obiettivo

Estrarre profitto dalla volatilità di un asset all'interno di un intervallo di prezzo (range), comprando automaticamente quando il prezzo scende e vendendo quando risale, secondo livelli predefiniti (la "griglia").

La griglia non prevede la direzione del mercato: monetizza le oscillazioni. Funziona quando il prezzo oscilla; perde quando il prezzo prende un trend deciso. Tutta la progettazione che segue serve a massimizzare il primo caso e a limitare i danni nel secondo.


2. Principi corretti (cosa cambia rispetto al bot originale)

Aspetto Bot originale (sbagliato) Versione corretta
Asset Shitcoin illiquida (LAND) Coppia liquida (es. ETH/USDT, BNB/USDT)
Passo griglia Assoluto in USDT (GRID_STEP=3) Percentuale sul prezzo
Livelli Mobili, inseguono il prezzo Fissi dentro un range definito
Protezione perdite Nessuna Stop-loss sotto il range + take-profit sopra
Slippage amountOutMin = 0 (nessuna) Calcolato da getAmountsOut tolleranza
Break-even fee Ignorato Passo griglia > costo round-trip
Capitale Tutto, senza limiti Allocazione fissa, suddivisa per livello
Chiave privata In chiaro nel .env Keystore cifrato o input a runtime
Validazione Nessuna Backtest + testnet prima del capitale reale

3. Definizione della griglia

3.1 Parametri di ingresso

Parametro Significato Esempio
PAIR Coppia da tradare (base/quote) ETH/USDT
RANGE_LOW Estremo inferiore del range 2800
RANGE_HIGH Estremo superiore del range 3400
GRID_LEVELS Numero di livelli nella griglia 12
CAPITAL_QUOTE Capitale totale in quote (USDT) 1200
STOP_LOSS Prezzo sotto cui il bot chiude tutto e si ferma 2650
TAKE_PROFIT Prezzo sopra cui il bot chiude tutto e si ferma 3550
SLIPPAGE_BPS Tolleranza slippage in basis point (50 = 0,5%) 50
FEE_BPS Fee del DEX in basis point (PancakeSwap = 25) 25

3.2 Costruzione dei livelli (griglia geometrica)

I livelli vanno spaziati in percentuale, non in valore assoluto. Una griglia geometrica mantiene lo stesso rendimento percentuale per ogni gradino, indipendentemente dal prezzo.

ratio = (RANGE_HIGH / RANGE_LOW) ^ (1 / GRID_LEVELS)
livello[i] = RANGE_LOW * ratio ^ i        per i = 0 .. GRID_LEVELS

Esempio (RANGE_LOW=2800, RANGE_HIGH=3400, GRID_LEVELS=12): ratio ≈ 1,0163 → passo di circa 1,63% per gradino.

3.3 Capitale per livello

quote_per_livello = CAPITAL_QUOTE / GRID_LEVELS

Ogni livello di acquisto impegna quote_per_livello. Il capitale è suddiviso in anticipo: il bot non può comprare più di quanto allocato, e non scende mai sotto zero.


4. Vincolo di break-even (regola anti-fee)

Una griglia con passi troppo fitti perde: le fee di ogni round-trip (compra + vendi) si mangiano il profitto. Il passo percentuale della griglia deve superare il costo totale di un round-trip.

costo_round_trip ≈ 2 * (FEE_BPS + SLIPPAGE_BPS) / 10000        (in frazione)
passo_griglia    = ratio - 1

VINCOLO:  passo_griglia  >  costo_round_trip * margine_sicurezza   (margine ≥ 1,5)

Esempio con FEE_BPS=25, SLIPPAGE_BPS=50: costo_round_trip ≈ 2 * (25+50)/10000 = 1,5%. Con margine 1,5 → il passo deve essere ≥ 2,25%. Se la griglia geometrica dà 1,63%, è troppo fitta: vanno ridotti i GRID_LEVELS o allargato il range finché il vincolo è rispettato. Il bot deve rifiutarsi di partire se il vincolo non è soddisfatto.


5. Logica operativa

5.1 Inizializzazione

  1. Validare i parametri: RANGE_LOW < prezzo_attuale < RANGE_HIGH, vincolo di break-even rispettato, capitale disponibile sul wallet.
  2. Verificare la coppia: liquidità sufficiente, contratto non honeypot (controllo obbligatorio, non opzionale), token con decimali noti.
  3. Costruire i livelli (§3.2) e marcare ognuno come attivo/riempito.
  4. Allocare il capitale (§3.3).

5.2 Ciclo principale

A ogni tick (es. ogni nuovo blocco, o ogni N secondi):

prezzo = prezzo_corrente(PAIR)

# --- guardie di uscita: hanno priorità su tutto ---
SE prezzo <= STOP_LOSS:
    vendi_tutta_la_posizione()        # con slippage protetto
    ferma il bot, log "STOP-LOSS"
SE prezzo >= TAKE_PROFIT:
    vendi_tutta_la_posizione()
    ferma il bot, log "TAKE-PROFIT"

# --- logica griglia ---
PER ogni livello L:
    SE prezzo attraversa L verso il basso  E  L non è ancora riempito:
        compra quote_per_livello   # con amountOutMin protetto
        marca L come riempito
    SE prezzo attraversa L verso l'alto  E  il livello sotto è riempito:
        vendi la quantità di quel livello   # con amountOutMin protetto
        marca quel livello come libero

I livelli sono fissi (calcolati una volta), non inseguono il prezzo. Questo rende il comportamento prevedibile e backtestabile.

5.3 Calcolo amountOutMin (protezione slippage — obbligatoria)

Mai passare 0. Prima di ogni swap:

atteso = router.getAmountsOut(amountIn, path)[ultimo]
amountOutMin = atteso * (10000 - SLIPPAGE_BPS) / 10000

Se la transazione non rientra nella tolleranza, deve fallire (revert), non eseguire a qualsiasi prezzo.


6. Gestione del rischio

  1. Stop-loss obbligatorio sotto RANGE_LOW. È la differenza tra "strategia" e "gambling": senza stop-loss un trend ribassista svuota il wallet.
  2. Take-profit sopra RANGE_HIGH per chiudere quando il prezzo esce dal range al rialzo (la griglia avrebbe già venduto tutto; il take-profit evita di restare esposti).
  3. Capitale segregato: usare un wallet dedicato, con solo il capitale destinato alla strategia. Mai il wallet principale.
  4. Limite di gas e prezzo gas ragionevoli, ricalcolati dinamicamente (no valori fissi obsoleti).
  5. Kill-switch manuale: comando per fermare il bot e liquidare in qualsiasi momento.
  6. Idempotenza/recupero: se il bot si riavvia, deve ricostruire lo stato dei livelli (riempiti/liberi) dal saldo on-chain, non ripartire da zero.

7. Validazione prima del capitale reale

Nessun fondo reale prima di aver superato, in ordine:

  1. Backtest su dati storici della coppia (almeno alcuni mesi, includendo sia fasi laterali sia un trend marcato), misurando: PnL netto dopo fee e slippage, max drawdown, numero di trade, comportamento allo stop-loss.
  2. Paper trading / simulazione in tempo reale, senza eseguire ordini veri.
  3. Testnet (BSC testnet) con la stessa logica e router di test, per verificare l'esecuzione on-chain end-to-end.
  4. Mainnet con capitale minimo (es. l'equivalente di pochi euro) per la prima settimana, poi scalare solo se i risultati combaciano col backtest.

8. Quando NON usare questa strategia

  • Asset illiquido o a rischio rug-pull/honeypot.
  • Mercato in trend forte e prolungato (la griglia perde: lo stop-loss limita il danno ma non genera profitto).
  • Passo griglia che non rispetta il vincolo di break-even (§4).
  • Capitale che non puoi permetterti di perdere.

9. Parametri di esempio (configurazione di partenza prudente)

PAIR          = BNB/USDT          # coppia liquida su PancakeSwap
RANGE_LOW     = 580
RANGE_HIGH    = 720
GRID_LEVELS   = 8                 # passo ≈ 2,7% > break-even
CAPITAL_QUOTE = 400               # USDT, su wallet dedicato
STOP_LOSS     = 545               # ~6% sotto RANGE_LOW
TAKE_PROFIT   = 760               # ~5,5% sopra RANGE_HIGH
SLIPPAGE_BPS  = 50                # 0,5%
FEE_BPS       = 25                # PancakeSwap v2

Verifica break-even: passo ≈ 2,7% > 1,5 × (2×0,75%) = 2,25%


Questo documento descrive la strategia. L'implementazione (ethers v6, gestione sicura della chiave, calcolo slippage, stato persistente, backtester) va sviluppata a parte, con test, e validata secondo §7 prima di qualsiasi capitale reale.