Skip to main content

État NEW - Création de Position

📊 Statut des Tests

Tests Frontend (Checkly)

Tests Backend (Vitest)


🎯 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

Conditions requises

  1. buy1Order.status === 'closed'
  2. buy1Order.average OU buy1Order.price existe
  3. netAmount > 0 (buy1Amount - reserveAmount)

Actions lors de la transition

  • Calcul de buy1Amount, buy1Price, avgEntryPrice
  • Calcul de relativeAmount = buy1Amount - reserveAmount
  • Calcul des prix TP1/TP2 basés sur avgMaxPnlForPair avec valeur par défaut de 2.0% si non disponible
  • Calcul des montants TP1/TP2 (70% / 30% de relativeAmount)
  • Création des ordres TP1 et TP2
  • Mise à jour status = RUNNING

📋 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

Tests Frontend

Les tests frontend vérifient la création de position depuis l’interface utilisateur. Fichiers de tests : features/positions/new-position.spec.ts Configuration Checkly :
// @checkly frequency: 10min
// @checkly locations: paris, new-york
// @checkly alertChannels: linear
// @checkly tags: production, positions

Tests Backend

Les tests backend valident la logique de création de position et la transition vers RUNNING. Fichiers de tests : packages/functions/src/tests/positions/new-state.test.ts Exécution :
npm run test -- new-state

🔗 Navigation