# Regole Strategie — RETTANGOLO + VPTR3

> Documento di riferimento unico per le regole di SL/TP delle 2 strategie attive.
> Ultima revisione: 2026-07-16 (Mattia).

---

## 📐 RETTANGOLO (Breakout + Retest)

**Logica ENTRY** (compute_signal in `rettangolo_strategy.py`):
1. Range = high/low candela **daily precedente**
2. MAI LONG sul TOP, MAI SHORT sul BOTTOM, MAI MID range
3. Aspetta **breakout**: candela intraday chiude OLTRE range
4. Aspetta **retest**: candela successiva tocca livello rotto
5. Pattern 2 candele (regola del video "Diari di Trading"):
   - SHORT: prima candela rialzista (verde) + seconda rossa/Doji/Hammer ribassista
   - LONG: prima candela ribassista (rossa) + seconda verde/Doji/Hammer rialzista
6. **ENTRY**: limite al TOP (SHORT) / BOTTOM (LONG)

**Gestione SL/TP** (gestita da `sltp_engine.py`):
- **TP** = **MID range** (fisso, calcolato all'entry)
- **SL iniziale** = estremo Hammer **± 1% buffer**
  - SHORT: `sl = hammer.high * 1.01`
  - LONG: `sl = hammer.low * 0.99`
- **Trailing SL**: ✅ **sempre attivo**, ma si **attiva SOLO DOPO che il prezzo va a +1.5% dal entry (LONG) o -1.5% (SHORT)**
  - Pre-attivazione: SL fermo sull'iniziale → se torna indietro, scatta subito (max loss = 1%)
  - Post-attivazione: SL segue il prezzo (per LONG: sale a ogni nuovo high; per SHORT: scende a ogni nuovo low)
  - Formula semplificata: `sl_trailing = entry + (current - entry) * 0.5` (breakeven + 50% del profitto)

---

## 📐 VPTR3 (Vortex PRO Trend Runner v3)

**Logica ENTRY/CLOSE** (interamente demandata alla **strategia Pine**):
- La strategia Pine emette alert entry/close
- Il sistema esegue fedelmente
- **NON** ricalcola SL/TP dalla strategia Pine (vedi sotto)

**Gestione SL/TP** (gestita da `sltp_engine.py` — la strategia Pine NON le ha):

| Soglia PnL | Azione |
|-----------|--------|
| **PnL ≤ −3%** | **SL hard**: chiude TUTTA la posizione |
| **PnL ≥ +5%** e TP1 non ancora eseguito | **TP parziale 50%**: chiude 50% della size |
| **Dopo TP1, PnL ≥ +3% addizionale al prezzo TP1** | **TP finale**: chiude il restante 50% |
| Altrimenti | **Trailing SL**: −1.5% dal current price (LONG) o +1.5% (SHORT) |

**Esempio pratico**:
- Entry 100, size 10
- Prezzo sale a 105 (+5%) → TP1: chiude 5 a 105 → realized +2.5% sul nozionale, size rimanente = 5
- Prezzo sale a 108.15 (+3% addizionale) → TP2: chiude 5 a 108.15 → realized +4.075% sul nozionale
- **Totale realized: +6.575%** sul nozionale iniziale (2.5% + 4.075%)

**Trailing SL VPTR3**:
- Si attiva **SEMPRE** (anche se PnL < 0)
- Aggiorna SL a `-1.5% dal current price`
- Esempio LONG @ entry 100: se current = 99, SL = 99 * 0.985 = 97.515

---

## 🔄 Mapping Symbol → Strategia

Lettura automatica da `rettangolo_assets.csv` colonna `strategy`:
- `strategy=rettangolo` → logica Rettangolo
- `strategy=vptr3` → logica VPTR3

| Symbol | Strategy | Note |
|--------|----------|------|
| SOLUSDT | rettangolo | – |
| BTCUSDT | rettangolo | – |
| ETHUSDT | rettangolo | – |
| WIFUSDT | rettangolo | – |
| ZECUSDT | rettangolo | – |
| DASHUSDT | vptr3 | – |
| VIRTUALUSDT | vptr3 | (opzionale, da definire) |

---

## ⚙️ Implementazione

**File**: `live_deploy/sltp_engine.py`
- Loop 300s (5 min)
- Legge posizioni aperte da Bybit
- Per ogni posizione: identifica strategia, calcola SL/TP/azioni
- Applica via **webhook** (`/webhook/sltp`) con **fallback diretto Bybit API** se webhook giù
- Per VPTR3: usa `create_market_order` con reduceOnly per chiusura parziale/finale
- Stato TP1 (VPTR3) persistito in `webhook_listener/logs/sltp_state.json` (sopravvive a restart)

**Storage TP parziale** (`sltp_state.json`):
```json
{
  "DASHUSDT": {
    "tp1_done": true,
    "tp1_price": 36.19,
    "tp1_ts": "2026-07-16T13:15:00+00:00",
    "entry_price": 34.47,
    "side": "Buy",
    "original_size": 7.0
  }
}
```

**Env richieste**:
- `WEBHOOK_SECRET` (per chiamare webhook)
- `BYBIT_API_KEY`, `BYBIT_API_SECRET` (per Bybit API e fallback)

---

## 📊 Parametri (costanti in `sltp_engine.py`)

```python
# Rettangolo
RETTANGOLO_SL_BUFFER_PCT = 0.01       # 1% sopra/sotto Hammer
RETTANGOLO_TRAILING_TRIGGER_PCT = 0.015  # 1.5% dal entry per attivare trailing

# VPTR3
VPTR3_SL_HARD_PCT = -0.03            # -3% PnL = SL hard (era -5% prima)
VPTR3_TP_PARTIAL_PCT = 0.05          # +5% PnL = TP parziale 50%
VPTR3_TP_FINAL_ADD_PCT = 0.03        # +3% addizionale al TP1 = TP finale
VPTR3_TRAILING_TRIGGER_PCT = 0.015   # 1.5% dal current per trailing

# Loop
LOOP_INTERVAL_SEC = 300              # 5 min
ALIGN_TOLERANCE_PCT = 0.005          # 0.5% (per non re-applicare se gia' allineato)
```

---

## 🔴 Note operative

- Se il webhook è giù, l'engine chiama **direttamente Bybit** via API (fallback automatico). Quindi funziona anche senza webhook, solo meno elegante.
- Lo stato TP1 VPTR3 è in JSON persistente, quindi se l'engine riparte non perde traccia del TP parziale già eseguito.
- Le posizioni aperte da webhook (alert Pine) sono sempre entry legittime; l'engine si limita a gestire SL/TP/closing in loro assenza.
- Se l'engine deve fare una **chiusura parziale** e poi non trova più la posizione (è stata chiusa da altro), logga warn e continua.
- Il **MANIFESTO CHART** in `rettangolo_config.py` ha ancora `ORDER_VALUE_USD=500` (nozionale). Per allinearsi al MANIFESTO "margine 500 × leva 3 = nozionale 1500" richiesto da Mattia serve cambio semantico: `MARGIN_USD=500` e `max_qty = (MARGIN_USD * LEVERAGE) / price`. Da fare separatamente.
