É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_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
Conditions requises
buy1Order.status === 'closed'buy1Order.averageOUbuy1Order.priceexistenetAmount > 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
avgMaxPnlForPairavec 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 :- 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
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 :
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 :
🔗 Navigation
- Vue d’ensemble : Retour à la vue d’ensemble
- État RUNNING : Gestion des ordres en RUNNING
- État CLOSED : Conditions de fermeture