Tradovate

Le stop NinjaTrader-Tradovate ne se met pas à jour au breakeven

NinjaTrader affiche votre stop déplacé au breakeven, le prix retraverse ce niveau et vous encaissez quand même la perte complète. Le rapport Orders de Tradovate raconte une autre histoire que votre écran. Voici pourquoi, et comment combler l'écart.

On This Page

Vous avez vu NinjaTrader remonter votre stop au breakeven, le prix retraverser ce niveau et, au lieu d'un résultat nul, vous avez encaissé la perte complète de 20 points. Puis vous avez ouvert le rapport Orders de Tradovate et voilà : le stop était toujours garé à votre prix de stop d'entrée d'origine. Cet écart est tout le problème. Votre stratégie affiche le nouveau prix sur votre écran, mais la modification n'a jamais atteint l'ordre actif du courtier. Il prend plusieurs déguisements : un stop qui ne bouge jamais de son prix de départ, un trailing stop qui affiche plusieurs ticks d'écart par rapport à ce que votre code a ordonné, ou un changement qui « reste orange » et ne se confirme jamais. Acheminer votre risque via une passerelle comme PickMyTrade supprime le maillon fragile où ces échecs silencieux se produisent, mais vous devez d'abord comprendre où la mise à jour disparaît réellement.

Liste de vérification rapide pour un stop qui ne passe pas au breakeven

  • Vérifiez d'abord le rapport Orders de Tradovate. Le prix de l'ordre actif du courtier est votre seule source de vérité ; l'affichage de NinjaTrader peut accuser du retard ou diverger.
  • Confirmez que la modification n'a pas été rejetée. Un stop déplacé du mauvais côté d'un marché rapide est rejeté, et l'ancien ordre reste actif.
  • Validez le nouveau prix du stop : il doit être sous le bid (long) ou au-dessus de l'ask (short) avant chaque appel à ChangeOrder().
  • Actualisez votre référence d'ordre avec GetRealtimeOrder() lorsque la stratégie passe de l'historique au temps réel.
  • Limitez les modifications rapides. Une boucle de trailing à fort volume peut dépasser l'acceptation du courtier et laisser tomber des mises à jour.
  • Ajoutez une gestion d'erreurs autour de votre méthode de mise à jour du stop afin qu'un changement échoué apparaisse dans le log au lieu de disparaître.

Ce que signifie réellement « le stop ne se met pas à jour au breakeven »

NinjaTrader et Tradovate conservent deux images distinctes de votre ordre. NinjaTrader détient un objet d'ordre local que votre stratégie lit et écrit. Tradovate détient l'ordre actif réel que la bourse exécutera. Un ChangeOrder(), ou un glissement sur le graphique ou le DOM, est une requête envoyée via la connexion demandant à Tradovate de modifier cet ordre actif. Tant que Tradovate ne l'a pas acceptée et renvoyé une confirmation, l'ordre du courtier reste exactement où il était.

Voici le piège : NinjaTrader peut afficher tranquillement le nouveau prix de breakeven alors que Tradovate n'a rien accepté. Imaginez une stratégie non gérée qui place un stop de 20 points, le déplace au breakeven à un déclencheur de profit, puis le suit. Pendant une ouverture matinale à fort volume, le stop apparaît déplacé dans NinjaTrader, mais le rapport Orders de Tradovate montre qu'il n'a jamais quitté le prix d'origine. Le prix retraverse le « breakeven » et la position se ferme au stop d'origine, parce que c'est là que se trouvait l'ordre de Tradovate depuis le début.

C'est pourquoi le rapport Orders compte davantage que le graphique. Lorsque le prix actif du courtier et le prix visé par votre stratégie divergent, croyez le courtier. Tout ce qui suit vise à combler cet écart.

Principales causes d'un stop NinjaTrader qui ne se met pas à jour sur Tradovate

1. La modification a touché le mauvais côté du marché et a été rejetée

C'est la cause numéro un lors des mouvements rapides. Un stop de vente protecteur pour une position longue doit se trouver sous le marché ; un stop d'achat couvrant une position courte doit se trouver au-dessus. Essayez de déplacer un stop au breakeven alors que le prix a déjà traversé ce niveau, et la modification est un ordre invalide ; le courtier la rejette avec quelque chose comme « Sell stop or sell stop limit orders can't be placed above the market. » NinjaTrader a peut-être déjà mis à jour son objet local, mais comme le changement a été rejeté, Tradovate conserve le stop précédent actif à son prix d'origine.

Dans des conditions rapides, ce n'est pas un bug : c'est la bourse qui refuse un ordre qu'elle ne peut pas honorer. La solution est une tarification défensive, décrite ci-dessous.

2. Votre code a modifié une référence d'ordre périmée

NinjaTrader exécute d'abord votre stratégie sur des barres historiques, puis passe en temps réel. Si vous avez enregistré un objet d'ordre dans une variable pendant l'état historique et continuez d'appeler ChangeOrder() sur cette référence après le passage de la stratégie en direct, vous modifiez un objet mort, et l'ordre actif de Tradovate ne voit jamais le changement. La documentation de NinjaTrader est explicite à ce sujet : lorsque les références d'ordres historiques passent en temps réel, vous devez mettre à jour la référence avec l'assistant GetRealtimeOrder(), sinon le changement échoue.

Il existe un proche cousin de ce problème : une modification déclenchée juste après le placement avec un prix arrondi ou périmé. Une stratégie peut ordonner un stop à 19802 alors que l'ordre Tradovate affiche 19805.75, et la cause est la propre logique de la stratégie qui modifie le stop juste après la soumission, et non une défaillance du courtier. La leçon est simple : si le nombre sur Tradovate est proche mais faux, soupçonnez le chemin de votre code, pas la connexion.

3. Limitation des modifications d'ordres à fort volume

Tradovate limite la vitesse à laquelle il accepte les actions sur ordres, et ces limites varient selon le compte et évoluent avec le temps ; consultez les limites de débit actuelles de l'API de Tradovate plutôt que de supposer un nombre fixe. Une routine de trailing qui déclenche un ChangeOrder() à chaque tick ou à chaque barre peut générer des modifications plus vite que le courtier ne les prend. Dans ce cas, certaines modifications sont abandonnées ou rejetées pendant que l'état local de NinjaTrader continue d'avancer, et les deux images divergent. C'est le schéma classique « a fonctionné en simulation, a échoué à l'ouverture » en cas de fort volume.

4. NinjaTrader affiche le changement localement, mais le courtier ne l'a jamais confirmé

Même avec un code propre, la connexion peut laisser une modification en suspens. Vous déplacez un stop ou un take-profit et l'ordre « reste orange », ne se confirme jamais, et se déconnecter, se reconnecter et redémarrer NinjaTrader ne règle rien. Dans cet état, considérez que le courtier détient toujours l'ancien ordre. La bonne démarche pour un ordre actif suspendu est de contacter votre courtier ou fournisseur d'évaluation pour confirmer et gérer directement l'ordre actif, puis de soumettre vos fichiers de log et de trace pour investigation.

5. Ordre géré non live-until-cancelled, ou arrondi au tick

Dans l'approche gérée, un ordre doit être marqué live-until-cancelled pour rester modifiable d'une barre à l'autre. Si vous l'omettez, le framework peut le traiter comme n'étant plus modifiable, si bien que votre modification ne fait silencieusement rien. L'arrondi des prix aggrave le problème : si votre breakeven calculé n'est pas aligné sur la taille de tick de l'instrument, le courtier peut le rejeter ou le décaler, laissant l'ordre actif différent de ce que vous attendiez.

Comment corriger un stop NinjaTrader-Tradovate qui ne se met pas à jour

Corriger les rejets du mauvais côté du marché

  1. Avant chaque modification de stop, lisez le marché actuel. Pour le stop de vente protecteur d'une position longue, si votre nouveau prix est égal ou supérieur au bid, limitez-le à un tick sous le bid (newPrice = GetCurrentBid() - TickSize) ; faites de même en miroir pour les positions courtes par rapport à l'ask.
  2. N'avancez le stop vers le breakeven qu'une fois que le prix l'a dépassé d'une marge. N'ordonnez pas le breakeven à l'instant où le profit égale la distance du stop.
  3. Arrondissez le prix final à la taille de tick de l'instrument afin que le courtier n'ait jamais à le décaler.

Corriger les références d'ordres périmées

  1. Dans OnStateChange(), lorsque la stratégie passe en temps réel, récupérez de nouveau chaque objet d'ordre que vous comptez modifier avec GetRealtimeOrder().
  2. Confirmez que la référence renvoyée n'est pas null avant d'appeler ChangeOrder(). Un null signifie que l'ordre est déjà exécuté, annulé ou rejeté, et qu'il n'y a plus rien d'actif à modifier.
  3. Dans l'approche gérée, gardez les ordres protecteurs live-until-cancelled afin qu'ils restent modifiables d'une barre à l'autre.

Limiter la cadence et ajouter la gestion d'erreurs

  1. N'envoyez une modification que lorsque le prix cible a réellement changé d'au moins un tick. Ignorez les appels redondants à ChangeOrder().
  2. Enveloppez votre méthode de mise à jour du stop dans une gestion d'erreurs qui journalise l'ID de l'ordre, l'horodatage et le motif du rejet, afin qu'un échec silencieux devienne une ligne de log visible. Ajouter une meilleure gestion d'erreurs à une méthode comme UpdateStopLoss est souvent le seul changement qui capture enfin le prochain échec.
  3. Pendant les annonces et l'ouverture du marché au comptant, élargissez l'intervalle entre les mises à jour de trailing pour rester sous la cadence d'acceptation du courtier.

Réconcilier NinjaTrader avec Tradovate

  1. Gardez le rapport Orders (ou l'Order History) de Tradovate ouvert à côté de NinjaTrader pendant qu'un stop en direct est suivi.
  2. Après chaque modification, confirmez que le prix actif sur Tradovate correspond à votre prix visé. Sinon, le changement n'a pas abouti.
  3. Si un ordre est bloqué sans confirmation, clôturez-le ou gérez-le directement depuis Tradovate plutôt que de faire confiance à l'affichage local de NinjaTrader.

Tableau de dépannage

Symptôme / Erreur Ce que cela signifie Solution
Le stop affiche le breakeven dans NinjaTrader, le prix d'origine dans TradovateLa modification n'a jamais atteint le courtier ou a été rejetée par celui-ciSe fier au rapport Orders de Tradovate ; valider le côté du prix et revérifier la référence
Message « Sell stop ... can't be placed above the market » (ou l'équivalent buy stop)Le nouveau stop était du mauvais côté d'un marché rapideLimiter le nouveau prix d'un tick au-delà du bid/ask avant l'envoi
Le prix du stop Tradovate diffère de quelques ticks de la stratégieLe code modifie le stop avec un prix périmé/arrondi après le placementArrondir à la taille de tick ; cesser de re-modifier immédiatement après l'entrée
La modification « reste orange » / ne se confirme jamaisOrdre actif suspendu dans la connexionGérer l'ordre directement sur Tradovate ; soumettre les logs/trace NinjaTrader
Le trailing stop perd des mises à jour en cas de fort volumeLes modifications ont dépassé la cadence d'acceptation du courtierLimiter les mises à jour ; n'envoyer que sur un vrai changement d'un tick
ChangeOrder() ne fait silencieusement rien après le passage en temps réelModification d'un objet d'ordre historique périméRécupérer de nouveau avec GetRealtimeOrder() ; garder les ordres live-until-cancelled

Évitez cela avec PickMyTrade

  • État d'ordre confirmé par le courtier, l'acheminement va directement vers Tradovate et suit l'ordre actif réel du courtier, de sorte que votre stop reflète ce que la bourse détient, et non une copie locale périmée.
  • Validation de la quantité et du symbole, bloque les modifications malformées ou du mauvais côté avant leur envoi, réduisant les rejets silencieux.
  • Acheminement respectueux des limites de débit, espace le flux d'ordres afin que les mises à jour de trailing rapides ne dépassent pas l'acceptation du courtier et ne disparaissent pas.
  • Synchronisation multi-comptes, reproduit le stop corrigé sur tous les comptes connectés au lieu de laisser derrière l'ordre d'un compte.

Fini les stops breakeven qui s'évaporent

L'acheminement va directement vers Tradovate et suit l'ordre actif réel du courtier, de sorte que votre stop reflète ce que la bourse détient, et non une copie locale périmée.

Commencez votre essai gratuit de 7 jours

Questions fréquentes

NinjaTrader conserve une copie locale de l'ordre tandis que Tradovate détient l'ordre actif réel. Si la modification a été rejetée ou n'a jamais été confirmée, la copie de NinjaTrader peut avancer alors que le stop du courtier reste en place. Vérifiez toujours avec le rapport Orders de Tradovate.

Le plus souvent, c'est la stratégie ou le marché rapide, pas Tradovate. Les coupables habituels sont la modification d'une référence d'ordre périmée, l'envoi d'un stop du mauvais côté du marché ou le déclenchement de modifications plus vite que le courtier ne les accepte. Ajoutez de la journalisation à votre méthode de mise à jour du stop pour voir lequel vous touche.

Cela signifie que le changement est suspendu dans la connexion et que le courtier détient toujours l'ordre précédent. Gérez l'ordre directement sur Tradovate, puis soumettez vos fichiers de log et de trace NinjaTrader pour investigation.

Validez le nouveau prix du stop avant de l'envoyer : pour le stop de vente d'une position longue, gardez-le au moins un tick sous le bid actuel, et n'avancez vers le breakeven qu'une fois que le prix a dépassé ce niveau avec une marge.

Si vous stockez un objet d'ordre pendant la phase de préchauffage historique de la stratégie, puis le modifiez en direct, oui. Récupérez de nouveau la référence en direct avec GetRealtimeOrder() une fois la stratégie passée en temps réel, sinon vos appels à ChangeOrder() cibleront un objet mort.

Un mouvement de prix rapide rend les rejets du mauvais côté plus probables, et une boucle de trailing très active peut dépasser la cadence d'actions sur ordres du courtier. Les deux laissent l'affichage de NinjaTrader en avance sur l'ordre réel de Tradovate. Limitez les mises à jour et appuyez-vous sur une tarification défensive pendant ces fenêtres.

Une passerelle ne peut pas passer outre les règles de la bourse, mais un acheminement attentif aux confirmations, qui suit l'état réel de l'ordre du courtier et espace les modifications, supprime le point fragile où la copie locale de NinjaTrader dérive silencieusement du stop actif de Tradovate.

Ce guide est fourni à des fins exclusivement éducatives et informatives et ne constitue pas un conseil financier, d'investissement ou de trading. Le trading de contrats à terme et d'autres produits à effet de levier comporte un risque de perte substantiel et ne convient pas à tous les investisseurs. PickMyTrade est une plateforme d'automatisation tierce indépendante et n'est ni affiliée à Tradovate, Inc. ou à Bookmap, ni approuvée ou parrainée par ces sociétés. Tous les noms, logos et marques associés sont la propriété de leurs détenteurs respectifs. Les fonctionnalités et les étapes de la plateforme évoluent avec le temps ; vérifiez donc toujours la procédure en vigueur dans la documentation officielle de la plateforme avant d'agir.