Skip to main content

État NEW

📊 Statut des Tests

CoucheBadgeRapport
Frontend (Checkly)checkly-frontend no-tests
Backend (Vitest)vitest-backend passingRapport 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_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 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 :
  1. Lien externe (simple et robuste) : publier la machine dans Stately puis ajouter le lien.
  2. Embed iframe (si autorisé par la CSP) :
<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. Rapport Vitest spec : swing-positions-etat-new.json.
ExchangePaire (ticker webhook)
BinanceSYRUPUSDC → SYRUP/USDC
KucoinfuturesGRIFFAINUSDT → GRIFFAIN/USDT
MEXCDAMUSDT → DAM/USDT

🔗 Navigation