> ## Documentation Index
> Fetch the complete documentation index at: https://docs.poihunter.com/llms.txt
> Use this file to discover all available pages before exploring further.

# État NEW

> Création de position et transition vers RUNNING

# État NEW

{/* Ne pas modifier manuellement, ils sont mis à jour automatiquement après chaque commit */}

## 📊 Statut des Tests

| Couche             | Badge                                                                                                                                                                             | Rapport                                                                                            |
| ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
| Frontend (Checkly) | [![checkly-frontend no-tests](https://img.shields.io/badge/checkly--frontend-no--tests-lightgrey)](https://app.checklyhq.com/checks)                                              | —                                                                                                  |
| Backend (Vitest)   | [![vitest-backend passing](https://img.shields.io/badge/vitest--backend-passing-brightgreen)](https://docs.poihunter.com/docs/reports/vitest/specs/swing-positions-etat-new.json) | [Rapport spec](https://docs.poihunter.com/docs/reports/vitest/specs/swing-positions-etat-new.json) |

***

## 🎯 Vue d'ensemble

L'état **NEW** correspond à la **création d'une nouvelle position**. La position est créée lorsqu'un signal TradingView valide est reçu et que les conditions de trading sont remplies.

## 🔄 Algorithme TradingView Webhook

### Réception et Validation des Données

* Le webhook reçoit un signal POST au format JSON depuis TradingView
* Le système valide que tous les champs obligatoires sont présents : ticker, interval, open, high, low, close, volume, rangeFilter, rangeFilterLow, rangeFilterHigh, time, trend, wma50, wma50\_htf
* Les données invalides sont rejetées avec un message d'erreur 400
* Le ticker TradingView est converti en format compatible avec le système (gestion du séparateur '/')

### Stockage des Données de Marché

* La nouvelle bougie est enregistrée en base avec toutes les métadonnées
* La tendance est mise à jour (BULL/BEAR) selon les données reçues
* Les métadonnées (WMA50, rangeFilter) sont sauvegardées avec la bougie
* Le timestamp est converti en Date valide pour le stockage

### Recherche des Configurations Actives

* Le système recherche les EPTs (Exchange Pair Timeframes) actifs pour le symbolPair et timeframe
* Seules les paires avec budget > 0 sont considérées pour le trading
* Les timeframes doivent correspondre au signal reçu
* Si aucun EPT actif n'est trouvé, le traitement s'arrête silencieusement

### Analyse des Conditions de Trading

* Le système analyse les conditions LONG/SHORT selon les données reçues
* **Conditions LONG** : longCondition = "yes" ET `wma50 >= wma50_htf` ET (`previousCandle.rangeFilterLow <= wma50_htf` OU `previousCandle.rangeFilterLow <= candle.wma50`)
* **Conditions SHORT** : shortCondition = "yes" ET exchange.type = 'swap' ET `wma50 <= wma50_htf` ET (`previousCandle.rangeFilterHigh >= wma50_htf` OU `previousCandle.rangeFilterHigh >= candle.wma50`)
* Si aucune condition n'est remplie, aucune position n'est créée

### Création d'une Position

* Les conditions LONG/SHORT sont vérifiées pour chaque EPT actif
* **VÉRIFICATION DU SOLDE** : Le système vérifie que l'exchange a suffisamment de solde **libre** (`balanceFree`) pour le `exchangePair.budget` de **cette** paire (pas de soustraction de la somme des budgets des autres positions RUNNING : sur swap la marge déjà engagée est reflétée dans `balanceFree`).
* Si le solde est insuffisant, on log l'erreur "INSUFFICIENT\_BALANCE\_ERROR" et on passe à l'EPT suivant
* Si les conditions sont remplies, l'ordre BUY1 (market) est placé avec 30% du budget effectif
* La position est créée en base avec statut **NEW**
* L'activité "POSITION\_CREATED" est enregistrée dans le champ activity
* L'activité "BUY1\_ORDER\_PLACED" est enregistrée dans le champ activity

### Placement de l'Ordre BUY2

* L'ordre BUY2 (limit) est placé au niveau RANGE\_FILTER\_LOW si LONG ou RANGE\_FILTER\_HIGH si SHORT selon la direction
* Le montant représente 70% du budget effectif (après déduction réserve)
* L'ordre est en attente d'exécution
* L'activité "BUY2\_ORDER\_PLACED" est enregistrée

### Calcul du Budget et des Montants

* **Réserve** = Montant minimum d'un ordre + marge de sécurité (20%)
* **Budget Effectif** = Budget Total - (Réserve x Prix Actuel)
* **BUY1** = 30% du budget effectif (après déduction de la réserve)
* **BUY2** = 70% du budget effectif (après déduction de la réserve)
* Les limites de l'exchange sont vérifiées avant placement
* La réserve garantit qu'il y a toujours un montant vendable au marché lors de la fermeture

## 🔄 Transition NEW → RUNNING

Dès que BUY1 est exécuté et validé, la position passe en **RUNNING** (calculs TP1/TP2, etc.).\
Le détail des conditions et actions est sur la page **[Transition NEW → RUNNING](/docs/specifications/swing-positions/transition-new-to-running)**.

## 🧭 Diagramme XState (NEW)

Source machine (réutilisable pour Stately/inspections futures) :\
`docs/specifications/swing-positions/xstate/etat-new.machine.json`

### Vue workflow (lecture rapide)

```mermaid theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
stateDiagram-v2
  [*] --> VALIDATE_PAYLOAD
  VALIDATE_PAYLOAD --> STORE_MARKET_DATA: PAYLOAD_VALID
  VALIDATE_PAYLOAD --> INVALID_PAYLOAD_ERROR: PAYLOAD_INVALID
  STORE_MARKET_DATA --> FIND_ACTIVE_EPTS: MARKET_DATA_STORED
  FIND_ACTIVE_EPTS --> ANALYZE_TRADING_CONDITIONS: ACTIVE_EPTS_FOUND
  FIND_ACTIVE_EPTS --> NO_ACTIVE_EPT_STOP: NO_ACTIVE_EPT
  ANALYZE_TRADING_CONDITIONS --> CHECK_BALANCE: CONDITIONS_MATCHED
  ANALYZE_TRADING_CONDITIONS --> NO_SIGNAL_STOP: NO_CONDITIONS_MATCHED
  CHECK_BALANCE --> PLACE_BUY1_MARKET: BALANCE_OK
  CHECK_BALANCE --> INSUFFICIENT_BALANCE_ERROR: INSUFFICIENT_BALANCE
  PLACE_BUY1_MARKET --> CREATE_POSITION_NEW: BUY1_ORDER_PLACED
  CREATE_POSITION_NEW --> PLACE_BUY2_LIMIT: POSITION_CREATED
  PLACE_BUY2_LIMIT --> WAIT_BUY1_EXECUTION: BUY2_ORDER_PLACED
  WAIT_BUY1_EXECUTION --> WAIT_BUY1_EXECUTION: NEXT_CANDLE
  WAIT_BUY1_EXECUTION --> RUNNING: BUY1_EXECUTED
  RUNNING --> [*]
  NO_ACTIVE_EPT_STOP --> [*]
  NO_SIGNAL_STOP --> [*]
  INVALID_PAYLOAD_ERROR --> [*]
  INSUFFICIENT_BALANCE_ERROR --> [*]

  classDef error fill:#ffe5e5,stroke:#ff4d4f,stroke-width:2px,color:#8b0000;
  class INVALID_PAYLOAD_ERROR,INSUFFICIENT_BALANCE_ERROR error;
```

### Embed/Lien Mintlify (Stately)

Si vous voulez un rendu interactif dans Mintlify, deux options :

1. **Lien externe** (simple et robuste) : publier la machine dans Stately puis ajouter le lien.
2. **Embed iframe** (si autorisé par la CSP) :

```html theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
<iframe
  src="https://stately.ai/viz?machine=swingPositionNewState"
  title="XState diagram - Etat NEW"
  width="100%"
  height="520"
  style={{ border: '1px solid #2d3748', borderRadius: '8px' }}
/>
```

> États marqués en rouge = bloc/step en erreur (logs observables BetterStack), notamment `INVALID_PAYLOAD_ERROR` et `INSUFFICIENT_BALANCE_ERROR`.

## 📋 Variantes de Workflow

### Variante 1 : BUY1 exécuté normalement

**Séquence** :

```
Signal TradingView → Conditions remplies → BUY1 (market) → BUY1 fermé → Transition vers RUNNING
```

**Comportement attendu** :

* Position créée avec statut NEW
* BUY1 ordre placé et exécuté
* BUY2 ordre placé en attente
* Transition automatique vers RUNNING après exécution de BUY1

### Variante 2 : BUY1 en attente

**Séquence** :

```
Signal TradingView → Conditions remplies → BUY1 (market) → BUY1 non encore fermé → Position reste en NEW
```

**Comportement attendu** :

* Position créée avec statut NEW
* BUY1 ordre placé mais non encore exécuté
* Position reste en NEW jusqu'à l'exécution de BUY1
* À chaque nouvelle bougie, vérification si BUY1 est fermé

### Variante 3 : Solde insuffisant

**Séquence** :

```
Signal TradingView → Conditions remplies → Vérification solde → Solde insuffisant → Erreur loggée
```

**Comportement attendu** :

* Erreur "INSUFFICIENT\_BALANCE\_ERROR" loggée
* Aucune position créée
* Passage à l'EPT suivant si plusieurs EPTs actifs

## 🧪 Tests (synthèse)

Smoke post-deploy : **POST /webhooks/tradingview** par exchange/paire ; réponses agrégées dans [rapport webhook smoke](https://docs.poihunter.com/docs/reports/webhook-smoke/report.json). Rapport Vitest spec : [swing-positions-etat-new.json](https://docs.poihunter.com/docs/reports/vitest/specs/swing-positions-etat-new.json).

| Exchange      | Paire (ticker webhook)       |
| ------------- | ---------------------------- |
| Binance       | SYRUPUSDC → SYRUP/USDC       |
| Kucoinfutures | GRIFFAINUSDT → GRIFFAIN/USDT |
| MEXC          | DAMUSDT → DAM/USDT           |

## 🔗 Navigation

* **[Vue d'ensemble swing positions](/docs/specifications/swing-positions/index)**
* **[Transition NEW → RUNNING](/docs/specifications/swing-positions/transition-new-to-running)**
* **[État RUNNING](/docs/specifications/swing-positions/etat-running)**
* **[Transition RUNNING → CLOSED](/docs/specifications/swing-positions/transition-running-to-closed)**
* **[État CLOSED](/docs/specifications/swing-positions/etat-closed)**
*
