État NEW
📊 Statut des Tests
| Couche | Badge | Rapport |
|---|---|---|
| Frontend (Checkly) | — | |
| Backend (Vitest) | Rapport spec |
🎯 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_htfET (previousCandle.rangeFilterLow <= wma50_htfOUpreviousCandle.rangeFilterLow <= candle.wma50) - Conditions SHORT : shortCondition = “yes” ET exchange.type = ‘swap’ ET
wma50 <= wma50_htfET (previousCandle.rangeFilterHigh >= wma50_htfOUpreviousCandle.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 pour le exchangePair.budget
- 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.
🧭 Diagramme XState (NEW)
Source machine (réutilisable pour Stately/inspections futures) :docs/specifications/swing-positions/xstate/etat-new.machine.json
Vue workflow (lecture rapide)
Embed/Lien Mintlify (Stately)
Si vous voulez un rendu interactif dans Mintlify, deux options :- Lien externe (simple et robuste) : publier la machine dans Stately puis ajouter le lien.
- Embed iframe (si autorisé par la CSP) :
États marqués en rouge = bloc/step en erreur (logs observables BetterStack), notammentINVALID_PAYLOAD_ERRORetINSUFFICIENT_BALANCE_ERROR.
📋 Variantes de Workflow
Variante 1 : BUY1 exécuté normalement
Séquence :- 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 :- 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 :- 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. Rapport Vitest spec : swing-positions-etat-new.json.| Exchange | Paire (ticker webhook) |
|---|---|
| Binance | SYRUPUSDC → SYRUP/USDC |
| Kucoinfutures | GRIFFAINUSDT → GRIFFAIN/USDT |
| MEXC | DAMUSDT → DAM/USDT |