# 📊 BILAN COMPLET — Patterns & Paramètres `market_spy.py`

> Généré le **2 mai 2026** — État après simplification complète (Modifications 1 à 6).  
> Fichier source : `/home/ubuntu/crypto_trading_bot/market_spy.py`

---

## 1. PARAMÈTRES GLOBAUX

| Paramètre | Valeur | Description |
|-----------|--------|-------------|
| `SCAN_INTERVAL` | **7 s** | Fréquence de scan du marché (était 10 s) |
| `SPY_POSITION_SIZE` | **bot_settings.json** | Lu depuis `positionSize` (même que le bot principal) |
| `SPY_MAX_POSITIONS` | **bot_settings.json** (`maxPositions`, défaut 3) | Positions simultanées max |
| `SPY_MAX_TRADES_PER_HOUR` | **6** | Toutes paires confondues |
| `MAX_BUY_SLIPPAGE_PCT` | **0.5 %** | Slippage max toléré entre prix détection et ask réel (MARKET) |
| `ENTRY_MIN_BUY_RATIO` | **0.45** | ⭐ MOD6 — Ratio volume acheteur min au moment du spike (calibré sur 167 trades) |
| `WATCHLIST_MIN_VOLUME` | **500 000 USDC** | Volume 24h min pour scanner un coin en watchlist |
| `MIN_VOLUME_USDT` | **800 000 USDC** | Volume 24h min pour intégrer l'univers auto |
| `MAX_PRICE` | 50 000 | Prix max par coin |
| `MIN_PRICE` | 0.0005 | Prix min par coin |

---

## 2. TYPES DE SURGE (DÉTECTION)

> **Seuls TYPE 1 et TYPE 2 sont actifs** depuis le 02/05/2026.  
> Les types 3, 4 et 5 sont désactivés (code conservé en commentaire pour référence).

---

### 2.1 TYPE 1 — FLASH_SURGE (ACTIF)

> Hausse rapide **>= 1.0 %** en **un seul scan (~7 s)**.  
> **649 trades — WR 57.6 % — +7 186 $ total (74 % du PnL global)**

| Paramètre | Valeur | Note |
|-----------|--------|------|
| `SURGE_MIN_PRICE_CHANGE` | **1.0 %** | Sur 1 scan (7 s) |
| `SURGE_MIN_VOLUME_RATIO` | **× 3.0** | Volume actuel vs moyenne 1 min |
| `SURGE_CONFIRM_KLINES` | 5 bougies 1m | Confirmation après détection |
| `SURGE_MAX_ALREADY_PUMPED` | **50 %** | Pump 24h max (hors extreme flash) |
| `SURGE_MAX_ALREADY_PUMPED_EXTREME_FLASH` | **120 %** | Si surge >= 3 %/scan + vol >= 5x |
| `SURGE_MAX_DECLINE_24H` | **-15 %** | Coin en chute -> banni |

**Sous-types FLASH_SURGE :**

| Sous-type | Condition | Comportement |
|-----------|-----------|--------------|
| FLASH standard | surge >= 1.0 % | Filtres habituels |
| FLASH fort (is_strong_flash) | surge >= 1.0 % | Seuils retrace assouplis (0.5 %) |
| FLASH extrême (is_extreme_flash) | surge >= 3.0 % | Seuils rejet klines assouplis |
| FLASH faible + déclin 24h | surge < 1.5 % ET 24h < -3 % | BLOQUE (bruit en tendance négative) |

**Coins en FLASH_SURGE strict (seuil relevé) :**

| Coin | Seuil min | Raison |
|------|-----------|--------|
| NOMUSDC | 2.0 % | Réhabilité testnet 29/04 |
| 0GUSDC | 2.0 % | Réhabilité testnet 29/04 |
| ENJUSDC | 2.0 % | 27T 44%WR — micro-spikes fréquents |
| BROCCOLI714USDC | 2.0 % | 7T 43%WR — seuil ×2 |
| GIGGLEUSDC | 2.5 % | 13T 54%WR — spike très court |
| TSTUSDC | 2.5 % | 10T 40%WR — même pattern |

> La `FLASH_SURGE_BLACKLIST` est actuellement **vide** (tous les coins réhabilités).

---

### 2.2 TYPE 2 — BREAKOUT_SURGE (ACTIF)

> Hausse progressive mais significative sur **2 scans consécutifs (~14 s)**.  
> **40 trades — WR 65.0 % — avg PnL +1.74 % — meilleur ratio risk/reward**

| Paramètre | Valeur | Note |
|-----------|--------|------|
| `SURGE_MIN_PRICE_CHANGE_2` | **1.1 %** | Sur 2 scans (14 s) |
| Delta1 minimum | **0.5 %** | Élan obligatoire au dernier scan |
| Confirmation BREAKOUT | Attente 7 s | Prix doit tenir (retrace < 0.3 % en 7 s) |

> En marché BEAR : `buy_vol_spike >= 2.0x` requis en plus.

---

### 2.3 TYPE 3 — MOMENTUM_SURGE (DÉSACTIVÉ 02/05/2026)

> **37 trades, WR 51 %, 38 % de HARD_SL — entrée systématiquement tardive.**

| Paramètre | Ancienne valeur | Statut |
|-----------|----------------|--------|
| `MOMENTUM_MIN_CHANGE_20` | 4.0 % / 20 scans | commenté |
| `MOMENTUM_MIN_CHANGE_40` | 6.0 % / 40 scans | commenté |
| `MOMENTUM_MIN_CHANGE_1` | 0.3 % dernier scan | commenté |
| `MOMENTUM_COOLDOWN` | 600 s (10 min) | commenté |
| `MOMENTUM_MAX_PER_HOUR` | 3 | commenté |

> Code conservé en commentaire. Réactiver si un filtre d'entrée sur pullback est implémenté.

---

### 2.4 TYPE 4 — LONG_TREND_SURGE (EN VEILLE 02/05/2026)

> **Données insuffisantes pour trancher (< 15 trades).**

| Paramètre | Ancienne valeur | Statut |
|-----------|----------------|--------|
| `LONG_TREND_MIN_RISE` | 10.0 % | commenté |
| `LONG_TREND_SNAPSHOT_INTERVAL` | 360 s (6 min) | commenté |
| `LONG_TREND_MIN_SNAPSHOTS` | 6 snapshots | commenté |
| `LONG_TREND_MAX_SNAPSHOTS` | 12 snapshots (72 min) | commenté |
| `LONG_TREND_COOLDOWN` | 3 600 s (1 h) | commenté |
| `LONG_TREND_MAX_PER_HOUR` | 2 | commenté |

> Détection wrappée dans `if False:` — zéro impact performance, code intact.

---

### 2.5 TYPE 5 — TREND_MOMENTUM_SURGE (DÉSACTIVÉ 02/05/2026)

> **78 trades, WR 50 %, médiane +0.01 % — bruit statistique.**

| Paramètre | Ancienne valeur | Statut |
|-----------|----------------|--------|
| `TREND_MOMENTUM_MIN_CHANGE_85` | 2.5 % / 85 scans | commenté |
| `TREND_MOMENTUM_MIN_CHANGE_130` | 3.5 % / 130 scans | commenté |
| `TREND_MOMENTUM_MIN_CHANGE_1` | 0.15 % | commenté |
| `TREND_MOMENTUM_MIN_CHANGE_5` | 0.20 % | commenté |
| `TREND_MOMENTUM_COOLDOWN` | 900 s (15 min) | commenté |
| `TREND_MOMENTUM_MAX_PER_HOUR` | 2 | commenté |

---

## 3. FILTRES D'ENTRÉE (avant achat)

> Séquence d'évaluation dans `confirm_surge_klines()` puis `open_position()`.

### 3.1 Filtres pré-confirmation (avant appel API klines)

| Filtre | Seuil | Description |
|--------|-------|-------------|
| `already_pumped_24h` | > 50 % (FLASH) / > 40 % (tendance) | Skip sans appel klines |
| `downtrend_24h` | < -15 % (sauf FLASH >= 2 %) | Coin en chute structurelle |
| `surge_faible_déclin` | FLASH < 1.5 % ET 24h < -3 % | Bruit en tendance négative |
| `pump_excessif_24h` | > 20 % sur non-FLASH | Achat en fin de cycle |
| Re-entry post-gain | seuil 24h réduit à 35 % | Évite de racheter épuisé |

### 3.2 Filtres klines (confirm_surge_klines)

| Filtre | Condition | Action |
|--------|-----------|--------|
| Volume ratio | vol actuel >= 3.0x moyenne | Requis (assoupli si strong_buy_pressure) |
| Direction klines | >= 1 bougie verte/3 (FLASH) | >= 2 si non-flash |
| Retrace depuis détection | > 0.5 % FLASH / > 0.3 % autres | SKIP (sauf extreme flash) |
| Rejection wick | mèche haute détectée | SKIP (sauf extreme flash) |
| Momentum 3m (mom_3m) | > 0 % FLASH / > 0.5 % en freefall | Requis |
| EMA bearish + RSI > 70 | EMA9 < EMA21 ET RSI > 70 | SKIP |
| EMA bearish + FLASH < 2.5 % | EMA bearish et surge faible | SKIP |
| Sell pressure | buy_ratio < 0.45 ET vol > 1.5x | Drapeau rouge |
| flash_no_buy_pressure | spike < 1.0x ET buy_ratio < 55 % | SKIP (FLASH fort seulement) |
| Extreme flash wick | buy_ratio < 0.45 + EMA bearish | SKIP |
| RSI oversold + EMA bear | RSI <= 35 ET EMA bearish | SKIP |

### 3.3 Filtres open_position (juste avant l'ordre)

| Filtre | Seuil | Description |
|--------|-------|-------------|
| Retrace live | > seuil proportionnel (0.25–0.55 %) | Prix retombé depuis détection |
| Slippage ask | > 0.5 % (prod uniquement) | Ask trop loin du prix détecté |
| **Filtre buy/sell volume** | `buy_ratio < 0.45` | **MOD6** — Distribution masquée en surge (calibré sur 167 trades) |
| Symbole invalide | auto-blacklist | Erreur -1121 Binance |
| Solde insuffisant | balance < position + 5 USDC | Protection liquidité |

> **MOD6 — Filtre buy/sell volume :** réutilise `confirm_details['buy_ratio']` déjà calculé par `confirm_surge_klines()` — **aucun appel API supplémentaire**. Fail open si données manquantes (default = 1.0).  
> Seuil calibré à **0.45** sur 167 trades (01/04–02/05/2026) : la zone 0.45–0.60 est la plus rentable (WR 75–100 %). Les HARD_SL sont concentrés sur buy_ratio ≥ 0.80 (phénomène FOMO inversé). Le seuil 0.55 initial bloquait 8 gagnants pour 4 perdants (PnL net −19.76 %). Le filtre `sell_pressure` existant (buy_ratio < 0.45 ET vol > 1.5×) couvre déjà les cas critiques.

---

## 4. ÉTATS EMA7 À L'ENTRÉE

> Stockés dans `position` au moment de l'achat pour les règles de sortie.

| Champ | Description |
|-------|-------------|
| `ema7_bullish_at_entry` | EMA7 > EMA25 au moment de l'achat |
| `ema7_slope_at_entry` | Pente EMA7 (% sur 3 bougies) |
| `rsi_at_entry` | RSI(14) au moment de l'achat |
| `delta_5m` | Momentum 5 min (delta prix sur 5 scans) |

> **Usage post-achat :** `ema7_bullish_at_entry` ajuste uniquement le seuil `INSTANT_REVERSAL`
> (-0.6 % standard vs -1.0 % si EMA7 haussier à l'entrée).
> Les modificateurs EMA7 sur le trailing ont été supprimés (MOD2).

---

## 5. TRAILING STOP DYNAMIQUE

> **Simplifié le 02/05/2026 (MOD2)** — 3 paliers, sans modificateurs EMA7/uptrend/RSI.

### 5.1 Paramètres

| Paramètre | Valeur | Description |
|-----------|--------|-------------|
| `TRAILING_ACTIVATION` | **1.0 %** | Activation du trailing (seuil PnL) |
| `HARD_STOP_LOSS_PCT` | **1.2 %** | Stop loss fixe depuis le prix d'entrée |

### 5.2 Paliers (fonction get_dynamic_trailing)

| PnL actuel | Trailing appliqué | Raisonnement |
|------------|-------------------|--------------|
| >= 3.0 % | **-2.0 %** | Mouvement confirmé — laisser courir |
| >= 1.0 % | **-1.2 %** | Pump en cours — marge plus large |
| < 1.0 % | **-0.5 %** | Juste activé — protéger |

> **Ratchet strict :** le trailing stop ne descend **jamais**. Toute mise à jour ne se fait qu'à la hausse.

### 5.3 Éléments supprimés (MOD2)

| Supprimé | Ancienne logique |
|----------|----------------|
| Multiplicateur EMA7 fort | x 1.6 si slope > 0.3 % |
| Multiplicateur EMA7 modéré | x 1.4 si slope > 0.05 % |
| Multiplicateur EMA7 neutre | x 1.0 (référence) |
| Modificateur uptrend | x 1.3 si _detect_uptrend() vrai |
| Plafonnement RSI >= 85 | trailing forcé à 1.0 % si RSI > 85 |
| Bypass ratchet EMA7 bullish | permettait au TS de descendre si EMA haussier |

> **Raison :** ces modificateurs causaient le bug ZBT (trailing stop poussé sous le prix d'entrée). La simplification élimine aussi les neutralisations croisées.

---

## 6. RÈGLES DE SORTIE (_evaluate_exit)

> **Simplifiées le 02/05/2026 (MOD3)** — de 10+ règles à 6 règles.

### 6.1 Règles actives (ordre d'évaluation — elif chaîné)

| # | Règle | Condition | Seuils |
|---|-------|-----------|--------|
| 0 | **INSTANT_REVERSAL** | hold < 45 s ET max_pnl < 0.05 % ET pnl < seuil | -0.6 % standard / -1.0 % si EMA7 haussier ou Delta5 >= 2 % |
| 0d | **EMA7_DOWNTREND** | hold >= 90 s ET EMA7 < EMA25 ET slope < -0.10 % | Quel que soit le PnL |
| 1 | **HARD_SL** | prix <= stop_loss | Entrée × (1 - 1.2 %) |
| 1b | **TRAILING_STOP activé** | trailing_stop stocké ET prix <= TS ET pnl > 0 | TS calculé précédemment |
| 2 | **TRAILING DYNAMIQUE** | pnl >= 1.0 % | 3 paliers (voir §5) — ratchet strict |
| 3 | **MAX_HOLD** | hold >= 12 min | **Fixe, sans bypass** |

### 6.2 Règles supprimées (MOD3)

| Règle supprimée | Ancienne condition | Raison de suppression |
|----------------|-------------------|----------------------|
| EARLY_SL (0b) | pnl < -0.5 % après 90 s | Redondante avec HARD_SL + retrace check entrée |
| EARLY_FLAT (0c) | pnl < 0.15 % max après 90 s | Redondante avec MAX_HOLD 12 min |
| TREND_PULLBACK (0d bis) | TREND_MOMENTUM + EMA7 pullback | Pattern supprimé |
| STAGNATION (3b) | pnl < 0.5 % après 12 min | Remplacée par MAX_HOLD fixe |
| MOMENTUM_EXIT (4) | N baisses consécutives | Trop de cas-limites |
| REVERSAL (5) | momentum inversé | Couvert par trailing + HARD_SL |
| VOLUME_ROUGE (5b) | buy_ratio < 38 % + gros vol | Signal secondaire, interactions complexes |

### 6.3 MAX_HOLD simplifié (MOD4)

| Paramètre | Valeur | Note |
|-----------|--------|------|
| `MAX_HOLD_MINUTES` | **12 min** | Était 15 min — fixe, sans exception |

**Bypasses supprimés :**
- Bypass si PnL >= 3 % (prolongation auto) — SUPPRIMÉ
- Bypass si PnL >= 5 % + EMA7 bullish — SUPPRIMÉ
- Bypass total si TREND_MOMENTUM + EMA7 bullish — SUPPRIMÉ (pattern supprimé)

---

## 7. CIRCUIT BREAKER

| Paramètre | Valeur | Description |
|-----------|--------|-------------|
| `SPY_CB_MAX_CONSEC_LOSSES` | **4** | Pertes consécutives avant blocage |
| `SPY_CB_BLOCK_HOURS` | **12 h** | Durée de blocage après déclenchement |

> Blocage actif : toute nouvelle position est refusée jusqu'à expiration. Pas de bypass.
> Réinitialisation automatique au premier trade gagnant.

---

## 8. RÉGIMES DE MARCHÉ

> BTC analysé toutes les 50 s. Appliqué comme multiplicateur de taille de position.

| Régime | Condition BTC | Multiplicateur | Filtre FLASH supplémentaire |
|--------|--------------|---------------|----------------------------|
| **BULL** | Default | × 1.0 (100 %) | — |
| **NEUTRAL** | Momentum faible | × 0.80 (80 %) | — |
| **CORRECTION** | Correction modérée | × 0.65 (65 %) | — |
| **BEAR** | Chute confirmée | × 0.50 (50 %) | FLASH >= 3.0 % OU buy_spike >= 2.0x |

**En régime BEAR :**
- Types TRENDING/BUILDING/SLOW_PUMP bloqués sauf si buy_ratio >= 85 %
- FLASH bloqué si buy_vol_spike < 2.0x (sauf FLASH >= 3.0 %)
- FLASH extrême (>= 3.0 %) toujours autorisé

**Fenêtres marché (market_ctx) :**

| Fenêtre | Condition | Effet sur seuils |
|---------|-----------|-----------------|
| `is_recovery_window` | BTC rebond après chute | Seuils confirmation assouplis |
| `is_freefall` | BTC -2 %/3h + alts < 30 % bullish | Seuils durcis |

---

## 9. ALGORITHME DE CONFIRMATION (confirm_surge_klines)

> Fetch 7 klines 1m. Retourne (True, details_dict) ou (False, {'reason': ...}).

**Données calculées et transmises dans confirm_details :**

| Clé | Description |
|-----|-------------|
| `vol_ratio` | Volume actuel / moyenne précédente |
| `buy_ratio` | Ratio volume acheteur (taker buy / total) — **réutilisé par MOD6** |
| `buy_vol_spike` | Spike buy volume vs moyenne précédente |
| `strong_buy_pressure` | buy_ratio >= 0.68 |
| `sell_pressure` | buy_ratio < 0.45 ET vol > 1.5x |
| `ema_bearish` | EMA9 < EMA21 à la confirmation |
| `ema7_slope_pct` | Pente EMA7 (%/3 bougies) |
| `rsi` | RSI(14) sur 7 bougies |
| `mom_3m` | Momentum 3 minutes |
| `ema7_bd` | EMA7 < EMA25 ET slope < -0.10 % (bearish declining) |

---

## 10. CHANGELOG (fixes & modifications)

| Date | Modification | Impact |
|------|-------------|--------|
| 29/04/2026 | Fix sell_pressure : seuil buy_ratio 35 % -> 45 % | RAY (37 %) ne bloque plus vrais surges |
| 29/04/2026 | Fix re-entry post-gain : seuil 24h réduit à 35 % | Évite rachat épuisé |
| 01/05/2026 | Fix WATCHLIST_MIN_VOLUME = 500K (cohérence auto-add) | Supprime coins invisibles au scan |
| 01/05/2026 | Fix label SPY-TEST vs SPY-PROD | Debug plus clair dans les logs |
| 02/05/2026 | Fix retrace seuil proportionnel (0.25–0.55 %) | FLASH +1.38 % ne skipait plus à tort |
| **02/05/2026** | **MOD1 — Désactivation MOMENTUM_SURGE + TREND_MOMENTUM_SURGE** | 115 trades bruit éliminés |
| **02/05/2026** | **MOD2 — Trailing simplifié (3 paliers, sans modificateurs EMA)** | Bug ZBT éliminé |
| **02/05/2026** | **MOD3 — 7 règles de sortie supprimées** | Logique épurée, moins d'orphelins |
| **02/05/2026** | **MOD4 — MAX_HOLD fixe 12 min, zéro bypass** | Discipline de durée |
| **02/05/2026** | **MOD5 — Paramètres obsolètes commentés (13 constantes)** | Code plus lisible |
| **02/05/2026** | **MOD6 — Filtre buy/sell volume (ENTRY_MIN_BUY_RATIO = 0.45, calibré 167 trades)** | Distribution masquée éliminée, seuil validé par données |

---

## 11. STATISTIQUES PAR PATTERN

> Source : `espion_history.json` — **1 333 trades** (testnet + prod, depuis mars 2026)
> Calculé le 02/05/2026.

### 11.1 Tableau synthèse

| Pattern | Trades | Win Rate | Avg PnL winners | Total PnL | Durée moy. |
|---------|--------|----------|-----------------|-----------|-----------|
| **FLASH_SURGE** (actif) | 649 | 57.6 % | +2.27 % | **+7 186 $** | 7.2 min |
| **BREAKOUT_SURGE** (actif) | 40 | 65.0 % | +3.43 % | **+679 $** | 5.0 min |
| TREND_MOMENTUM_SURGE (désactivé) | 78 | 50.0 % | médiane +0.01 % | — | — |
| MOMENTUM_SURGE (désactivé) | 37 | 51.4 % | — | — | — |
| LONG_TREND_SURGE (veille) | < 15 | — | — | — | — |

### 11.2 FLASH_SURGE (649 trades)

| Métrique | Valeur |
|----------|--------|
| Win rate | 57.6 % |
| Avg PnL winners | +2.27 % |
| Avg PnL losers | -0.98 % |
| Total PnL | +7 186 $ (74 % du PnL total) |
| Durée moyenne | 7.2 min |

### 11.3 BREAKOUT_SURGE (40 trades)

| Métrique | Valeur |
|----------|--------|
| Win rate | **65.0 %** (meilleur ratio) |
| Avg PnL winners | +3.43 % |
| Avg PnL losers | -1.74 % |
| Médiane PnL winners | +1.16 % |
| Total PnL | +679 $ |
| Durée moyenne | 5.0 min |

### 11.4 Gains laissés sur la table (avant MOD2)

| Métrique | Valeur |
|----------|--------|
| Max PnL moyen (pic) | +3.66 % |
| Exit PnL moyen | +2.27 % |
| **Delta moyen** | **-1.39 %** laissé sur la table |

> **Objectif MOD2 :** récupérer une partie de ces 1.39 % via le palier -1.2 % (1–3 % de PnL).

---

## 12. FLUX COMPLET POST-SIMPLIFICATION

### 12.1 Flux d'entrée

```
Scan (7s) -> Détection surge
  FLASH_SURGE   : changement >= 1.0% / 1 scan
  BREAKOUT_SURGE: changement >= 1.1% / 2 scans, delta1 >= 0.5%

Pre-filtres (sans API) :
  already_pumped_24h > seuil         -> SKIP
  downtrend_24h < -15% (sauf FLASH >= 2%) -> SKIP
  pump_excessif / surge_faible       -> SKIP

confirm_surge_klines (7 klines 1m) :
  Volume, direction, momentum, EMA, RSI
  Calcule buy_ratio -> stocké dans confirm_details

open_position :
  Retrace live check (proportionnel 0.25-0.55%)
  Slippage check (prod uniquement, max 0.5%)
  [MOD6] Buy volume quality (buy_ratio >= 0.55)
  Regime marche -> multiplicateur position
  Ordre MARKET -> position ouverte
```

### 12.2 Flux de sortie

```
Evaluation toutes les 7s (elif chainé — première règle déclenchée gagne) :

  1. INSTANT_REVERSAL   hold < 45s + max_pnl < 0.05% + pnl < -0.6%
                        (-1.0% si EMA7 haussier ou Delta5 >= 2%)

  2. EMA7_DOWNTREND     hold >= 90s + EMA7 < EMA25 + slope < -0.10%
                        (quel que soit le PnL)

  3. HARD_SL            prix <= entree x (1 - 1.2%)

  4. TRAILING 1b        TS stocké + prix <= TS + pnl > 0

  5. TRAILING DYNAMIQUE pnl >= 1.0% -> 3 paliers ratchet :
                          < 1.0% -> -0.5%
                          1.0-3.0% -> -1.2%
                          >= 3.0% -> -2.0%

  6. MAX_HOLD           hold >= 12 min (fixe, sans bypass)
```

### 12.3 Checklist validation testnet (>= 50 trades)

- [ ] Win rate FLASH_SURGE stable autour de 57 %
- [ ] Win rate BREAKOUT_SURGE stable autour de 65 %
- [ ] Avg PnL winners > 2.27 % (récupération partielle des 1.39 %)
- [ ] Aucun trade orphelin (position sans règle de sortie active)
- [ ] MAX_HOLD 12 min : pas de trades longs légitimes coupés prématurément
- [ ] MOD6 : logger avg_buy_ratio sur chaque signal skipé → valider seuil 0.45 (calibré sur 167 trades)
- [ ] Comparer distribution buy_ratio gagnants vs perdants
- [ ] **POINT 1** : Confirmer que le trailing -0.5 % ne s'active pas avant 1.0 % de PnL
      → Logger le PnL exact au moment de chaque première mise à jour du trailing stop
      → Aucune mise à jour trailing ne doit apparaître avec pnl_at_update < 1.0 %
- [ ] **POINT 2** : Confirmer que EMA7/EMA25 est bien le même couple en entrée et en sortie
      → Vérifier sur 10 trades en log que `ema_bearish` (confirm_details) et `_ema_bearish_live` (exit) sont cohérents
      → Aucune confusion de variable entre les deux contextes

---

*Mis à jour le 02/05/2026 — après Modifications 1 à 6*
*Fichier source : `/home/ubuntu/crypto_trading_bot/market_spy.py`*
