> ## 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.

# Positions automatisées

> Vue d'ensemble du workflow complet des positions swing avec webhook TradingView

# Positions automatisées - Vue d'ensemble

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

## 📊 Statut des Tests

### Tests Frontend (Checkly)

[![checkly-frontend no-tests](https://img.shields.io/badge/checkly--frontend-no--tests-lightgrey)](https://app.checklyhq.com/checks)

### Tests Backend (Vitest)

[![vitest-backend failing](https://img.shields.io/badge/vitest--backend-failing-red)](https://docs.poihunter.com/docs/reports/vitest/specs/swing-positions-index.json)

***

## 🎯 Vue d'ensemble

Ce document décrit le workflow complet des positions swing, de la réception des signaux TradingView jusqu'à la fermeture de la position. Le système gère automatiquement les ordres BUY1, BUY2, TP1, TP2 et le Stop Loss selon un diagramme d'état précis.

## 📊 Diagramme de Workflow Complet

```mermaid theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
stateDiagram-v2
    [*] --> CheckPosition: swingPositions() appelé
    
    CheckPosition --> CreateNewPosition: Aucune position existante
    CheckPosition --> ProcessExistingPosition: Position existante trouvée
    
    CreateNewPosition --> NEW: longCondition<br/>wma50 >= wma50_htf<br/>rangeFilterLow <= wma50_htf
    CreateNewPosition --> NEW: shortCondition<br/>wma50 <= wma50_htf<br/>rangeFilterHigh >= wma50_htf
    CreateNewPosition --> [*]: Aucune condition remplie
    
    NEW --> NEW: BUY1 order.status != 'closed'<br/>OU pas de average/price
    NEW --> RUNNING: BUY1 order.status === 'closed'<br/>average OU price existe<br/>netAmount > 0
    
    ProcessExistingPosition --> CheckBuy1Completed: status === NEW
    CheckBuy1Completed --> NEW: BUY1 pas encore fermé
    CheckBuy1Completed --> RUNNING: BUY1 fermé et validé
    
    ProcessExistingPosition --> CheckTrend: status != NEW
    
    CheckTrend --> ProcessClose: LONG && wma50 < wma50_htf
    CheckTrend --> ProcessClose: SHORT && wma50 > wma50_htf
    CheckTrend --> ProcessTrades: Tendance OK
    
    ProcessTrades --> ProcessTrades: buy1Order closed<br/>!buy1TradesCompleted
    ProcessTrades --> ProcessTrades: buy2Order closed<br/>!buy2TradesCompleted
    ProcessTrades --> ProcessTrades: slOrder closed<br/>!slTradesCompleted
    ProcessTrades --> ProcessTrades: tp1Order closed<br/>!tp1TradesCompleted
    ProcessTrades --> ProcessTrades: tp2Order closed<br/>!tp2TradesCompleted
    ProcessTrades --> ProcessRunning: Tous trades complétés
    
    ProcessRunning --> UpdateBuy2Price: status === RUNNING<br/>buy2Order.status === 'open'
    UpdateBuy2Price --> ProcessBuy2: Prix BUY2 mis à jour
    ProcessBuy2 --> ProcessBuy2: buy2Order.status === 'closed'<br/>Skip déjà fermé
    ProcessBuy2 --> ProcessBuy2: buy2Order.status === 'closed'<br/>Mise à jour buy2Amount/Price<br/>Recalcul relativeEntryPrice
    ProcessBuy2 --> ProcessBuy2: buy2Order.status != 'closed'<br/>Créer/remplacer BUY2
    ProcessBuy2 --> ProcessTp1: BUY2 traité
    
    ProcessTp1 --> ProcessTp1: tp1Order.status === 'closed'<br/>Skip
    ProcessTp1 --> ProcessTp1: tp1Order.status === 'closed'<br/>calculateRelativeAmount()<br/>Archive TP1 si nécessaire<br/>Ajuster buy2Amount si BUY2 ouvert
    ProcessTp1 --> ProcessTp1: tp1Order.status != 'closed'<br/>Créer/remplacer TP1
    ProcessTp1 --> ProcessTp2: TP1 traité
    
    ProcessTp2 --> ProcessTp2: tp2Order.status === 'closed'<br/>Skip
    ProcessTp2 --> ProcessTp2: tp2Order.status === 'closed'<br/>calculateRelativeAmount()<br/>Archive TP2 si nécessaire<br/>Ajuster buy2Amount si BUY2 ouvert
    ProcessTp2 --> ProcessTp2: tp2Order.status != 'closed'<br/>Créer/remplacer TP2
    ProcessTp2 --> VerifyIntegrity: TP2 traité
    
    VerifyIntegrity --> CheckSlOrder: Vérification cohérence
    CheckSlOrder --> CheckSlOrder: slOrder.status === 'closed'<br/>processStopLossOrder()<br/>CLOSED
    CheckSlOrder --> UpdatePosition: SL OK ou absent
    
    UpdatePosition --> [*]: Position mise à jour<br/>PnL, lastPrice, etc.
    
    ProcessClose --> ProcessClose: closeOrder.status === 'closed'<br/>Skip
    ProcessClose --> ProcessClose: Annuler TP1/TP2 ouverts
    ProcessClose --> ProcessClose: Créer closeOrder (market)
    ProcessClose --> CLOSED: closeOrder.status === 'closed'<br/>closedReason TREND_CHANGED
    
    CLOSED --> [*]: Position finalisée
    
    note right of NEW
        Conditions de création:
        - Budget disponible
        - minNotional respecté
        - reserveAmount calculé
        - BUY1 order créé (market)
    end note
    
    note right of RUNNING
        Actions en RUNNING:
        - Mise à jour prix BUY2
        - Gestion BUY2, TP1, TP2
        - Calcul PnL
        Note: SL géré par sharkModeCron.ts
    end note
    
    note right of ProcessClose
        Conditions de fermeture:
        - Changement de tendance (Range Filter: trend bull/bear)
        - SL touché (géré par sharkModeCron.ts)
        Après exécution closeOrder: status = CLOSED
    end note
```

## 📝 TERMINOLOGIE

### **"Montant" = Quantité (Amount)**

Quand on parle de "montant" dans ce document, cela fait référence à la **quantité de tokens**, pas au prix :

* `buy1Amount` = quantité de tokens achetés avec BUY1
* `buy2Amount` = quantité de tokens achetés avec BUY2
* `tp1Amount` = quantité de tokens à vendre avec TP1
* `tp2Amount` = quantité de tokens à vendre avec TP2
* `relativeAmount` = quantité totale de tokens (buy1 + buy2)

### **Prix vs Quantité**

* **Prix** : `buy1Price`, `buy2Price`, `tp1Price`, `tp2Price` (en USDT par token)
* **Quantité** : `buy1Amount`, `buy2Amount`, `tp1Amount`, `tp2Amount` (en tokens)

### **Logique TP1/TP2**

* TP1 a un prix **plus bas** que TP2 (pour LONG)
* TP1 est donc **toujours fermé avant TP2**
* TP2 ne peut jamais être fermé avant TP1

## 🔄 États de la Position

Le système gère trois états principaux :

1. **[NEW](etat-new)** : Position créée, en attente de l'exécution de BUY1
2. **[Transition NEW → RUNNING](transition-new-to-running)** : Passage effectif une fois BUY1 exécuté
3. **[RUNNING](etat-running)** : Position active, gestion des ordres BUY2, TP1, TP2
4. **[Transition RUNNING → CLOSED](transition-running-to-closed)** : Fermeture (tendance, SL, etc.)
5. **[CLOSED](etat-closed)** : Position fermée et finalisée

## 🔗 Navigation

Pour plus de détails sur chaque état et les variantes de workflow, consultez :

* **[État NEW](etat-new)** : Création de position
* **[Transition NEW → RUNNING](transition-new-to-running)** : Conditions de passage en RUNNING
* **[État RUNNING](etat-running)** : Gestion des ordres et variantes de workflow
* **[Transition RUNNING → CLOSED](transition-running-to-closed)** : Déclencheurs de fermeture
* **[État CLOSED](etat-closed)** : Conditions et processus de fermeture

## 📚 Références

* [Service SwingPositionService](../../../packages/functions/src/positions/swingPositionService.ts) : Implémentation complète
* [Schema Prisma](../../../prisma/schema.prisma) : Modèle de données
