Tradovate API

Erreur 404 de l'API Tradovate sur les données historiques md/getChart

Vous avez configuré un WebSocket, envoyé une requête md/getChart propre, et reçu en retour Not found: md/getChart. Neuf fois sur dix, c'est le mauvais socket ou un symbole que Tradovate ne parvient pas à résoudre.

Vérifié par l'équipe Trading Systems de PickMyTrade Dernière mise à jour
· Lecture de 7 minutes
Client WebSocket Tradovate affichant une réponse 404 Not found: md/getChart

Vous avez configuré un WebSocket, l'avez autorisé, envoyé une requête md/getChart propre pour quelques centaines de barres d'historique, et le serveur vous a répondu par Not found: md/getChart. Rien dans la charge utile ne semble incorrect. Alors pourquoi une erreur 404 sur un endpoint qui existe clairement dans la documentation ?

Neuf fois sur dix, cela se résume à l'une de ces deux choses : vous avez envoyé la requête au mauvais socket, ou vous avez demandé un symbole que Tradovate ne peut pas résoudre. Les deux déclenchent un “not found” qui semble identique de votre côté. Passons en revue chaque cause, dans l'ordre où il vaut la peine de les vérifier, pour faire circuler vos barres historiques.

Ce que le 404 vous indique réellement

Une erreur 404 sur un appel REST signifie que le chemin de l'URL n'existe pas. Sur le WebSocket de Tradovate, c'est la même logique : la trame que vous envoyez nomme un endpoint, et si le socket auquel vous êtes connecté ne dessert pas cet endpoint, vous recevez Not found avec le nom de l'endpoint renvoyé. Cela ne signifie pas que votre symbole est invalide ou que votre jeton a expiré. Cela signifie “je n'ai pas de route pour cela ici”.

Cette distinction est importante. Si le message est littéralement Not found: md/getChart, l'endpoint lui-même n'est pas accessible sur cette connexion, ce qui pointe directement vers le problème de mauvais socket. Si la requête atteint le moteur de données de marché mais que le contrat est introuvable, vous verrez plutôt un échec lié au symbole. Lisez le texte exact avant de commencer à modifier le code.

Cause n° 1 : vous utilisez le mauvais WebSocket

C'est la cause la plus fréquente, et elle piège presque tout le monde la première fois. Tradovate exploite deux services WebSocket distincts, qui ne sont pas interchangeables :

  • Le socket de trading/API gère les ordres, les positions, les comptes et le reste des données d'entités. En live, c'est wss://live.tradovateapi.com/v1/websocket ; en démo, c'est wss://demo.tradovateapi.com/v1/websocket.
  • Le socket de données de marché gère les cotations, le DOM et les graphiques. En live, c'est wss://md.tradovateapi.com/v1/websocket ; en démo, c'est wss://md-demo.tradovateapi.com/v1/websocket.

Tous les endpoints md/, md/getChart, md/subscribeQuote, md/subscribeDOM, n'existent que sur le socket de données de marché. Envoyez-les au socket de trading et il n'y a tout simplement aucune route correspondante, donc vous obtenez Not found: md/getChart. Le socket de trading ne vous indiquera pas que vous êtes au mauvais endroit ; il signale simplement l'endpoint comme introuvable.

Comparaison entre l'hôte du WebSocket de trading de Tradovate et l'hôte distinct du WebSocket de données de marché

La solution : ouvrez une seconde connexion WebSocket vers l'hôte de données de marché et envoyez-y votre requête de graphique. Une erreur courante consiste à autoriser parfaitement le socket de trading, puis à réutiliser cette même connexion pour les données de marché. Vous avez besoin des deux sockets ouverts, et chacun nécessite sa propre trame authorize avec votre jeton d'accès avant de répondre à la moindre requête.

Autre piège sur le même thème : faites correspondre votre environnement. Si votre jeton d'accès provient de l'endpoint d'authentification live, utilisez md.tradovateapi.com. S'il provient de la démo, utilisez md-demo.tradovateapi.com. Croiser un jeton live avec l'hôte de données de marché de démo (ou l'inverse) entraîne un rejet avant même que la requête de graphique n'entre en jeu. Les noms d'hôte sont parfois mis à jour, alors vérifiez les noms actuels dans la documentation officielle des développeurs Tradovate plutôt que de faire confiance à un extrait copié il y a un an.

Cause n° 2 : le symbole n'est pas un contrat réel

Supposons que votre socket soit correct et que vous receviez toujours une réponse not-found liée à la requête. Examinez attentivement le symbole. Les requêtes de graphique nécessitent un contrat à terme entièrement qualifié, et non la racine du produit que vous voyez dans une liste de suivi.

“YM” n'est pas négociable seul, c'est la racine. Ce que Tradovate peut résoudre, c'est le contrat spécifique, comme YMH5, où H est le code du mois de mars et 5 l'année 2025. Si vous transmettez la racine seule, un code de mois erroné ou un contrat déjà expiré et reporté au trimestre suivant, le moteur ne trouvera rien pour construire un graphique. Voici la table standard des codes de mois pour les contrats à terme :

Mois Code Mois Code
janvierFjuilletN
févrierGaoûtQ
marsHseptembreU
avrilJoctobreV
maiKnovembreX
juinMdécembreZ
Recherche de contrat Tradovate affichant un symbole de contrat à terme entièrement qualifié avec code de mois et année

Plutôt que de coder en dur une chaîne de symbole, résolvez le contrat du mois avant de manière programmatique. Les endpoints contract/find et de recherche de produit sur le socket de trading vous donnent le symbole négociable exact, de sorte que vous n'ayez jamais à deviner si ES est passé de décembre à mars. Si vous devez utiliser un alias continu ou de “mois avant”, vérifiez bien qu'il s'agit d'un alias que Tradovate accepte réellement pour les graphiques, de nombreuses notations continues qui fonctionnent dans une interface de graphique ne se résolvent pas dans un appel brut à md/getChart. En cas de doute, demandez le contrat explicite.

C'est également la raison classique pour laquelle une requête qui fonctionnait le trimestre dernier renvoie soudainement une erreur 404 : le contrat que vous aviez fixé a expiré. Les roulements se produisent selon un calendrier fixe, et un symbole expiré disparaît du moteur de données. Automatisez le roulement au lieu de le poursuivre manuellement.

Cause n° 3 : votre droit d'accès aux données de marché n'est pas configuré

Bon socket, contrat valide, et toujours rien d'exploitable ? Vérifiez maintenant à quoi votre compte a réellement droit. Deux niveaux comptent ici.

Premièrement, l'accès à l'API lui-même doit être activé. C'est le module complémentaire API Access dans les paramètres de votre compte Tradovate, qui active l'accès programmatique et vous permet de générer les identifiants dont votre flux d'authentification a besoin. Sans cela, votre jeton ne portera pas les permissions attendues par le moteur de données de marché.

Écran des paramètres Tradovate pour activer l'accès API et les abonnements aux données de marché de la bourse

Deuxièmement, les données de marché en temps réel via l'API nécessitent l'accord et la licence appropriés de la bourse. Pour les produits CME, cela signifie une licence mensuelle de données de marché en plus de votre forfait. Le montant exact est fixé par la bourse et évolue dans le temps, alors confirmez le chiffre actuel auprès de Tradovate plutôt que de vous fier à un montant lu quelque part, il s'agit généralement d'un frais mensuel récurrent, non négligeable. Sans ce droit d'accès, une requête de graphique correctement formée peut toujours revenir inaccessible ou vide, car vous demandez des données que votre compte n'est pas autorisé à recevoir. Si vos symboles apparaissent comme inaccessibles plutôt que introuvables, c'est le type de problème auquel vous êtes confronté.

Si vous avez un compte de prop firm ou d'évaluation, vous ne pouvez souvent pas vous abonner vous-même à ces données, c'est la société qui les contrôle. Dans ce cas, la résolution du droit d'accès passe par le support de votre société, pas par celui de Tradovate.

Cause n° 4 : une trame mal formée ou un socket non autorisé

Le WebSocket de Tradovate ne parle pas du JSON brut. Chaque requête est une trame texte avec une forme spécifique : l'endpoint, puis l'identifiant de la requête, puis une ligne de requête (souvent vide), puis le corps JSON, séparés par des sauts de ligne, par exemple md/getChart\n2\n\n{ ... }. Si cette structure est incorrecte, le serveur peut ne pas analyser correctement le nom de l'endpoint, ce qui peut se manifester par une erreur de type not-found même si votre intention était correcte.

  • Autorisez d'abord. La toute première trame sur le socket de données de marché doit être authorize\n1\n\n<yourAccessToken>. Envoyez md/getChart avant que le socket ne soit autorisé et elle ne sera pas honorée.
  • Maintenez le socket actif. La connexion attend une trame de heartbeat périodique. Manquez-la et le socket se coupe ; les requêtes envoyées à une connexion à moitié morte échouent de façon déroutante.

Construisez la trame exactement comme documentée, autorisez avant de faire votre requête, et envoyez les heartbeats selon le calendrier prévu. La plupart des erreurs 404 “aléatoires” sur un socket qui fonctionnait il y a une heure remontent à l'un de ces trois points.

Une checklist rapide pour résoudre le 404

Vérification Quoi confirmer
Bon socketmd/getChart va vers md.tradovateapi.com (live) ou md-demo.tradovateapi.com (démo), pas vers le socket de trading.
Environnement correspondantJeton live → hôte de données de marché live ; jeton démo → hôte démo.
Symbole de contrat completUtilisez des symboles au format ESH5, pas la racine ES, ni un contrat expiré.
Droits d'accès activésModule API Access activé et licence de données de marché de la bourse active.
Trame + authentificationAutorisez d'abord le socket, puis envoyez une trame de requête correctement délimitée par des sauts de ligne.

Une fois que les données du graphique commencent à circuler

Lorsque la requête aboutit, la réponse vous renvoie des identifiants d'abonnement, un identifiant historique et un identifiant temps réel, et diffuse des barres. L'historique arrive par lots, et chaque lot se termine par un marqueur “end of history” pour que vous sachiez quand un segment est complet. Il n'y a pas de plafond fixe strict sur la quantité que vous pouvez récupérer par requête, mais la limite pratique varie d'un jour à l'autre, donc une grosse demande (par exemple des barres à la minute sur plusieurs années) revient tronquée plutôt que de générer une erreur.

Pour remonter plus loin dans l'historique, prenez l'horodatage le plus ancien que vous avez reçu, envoyez un nouveau md/getChart en l'utilisant comme horodatage le plus proche et votre date cible comme horodatage le plus éloigné, et répétez jusqu'à obtenir la plage dont vous avez besoin. Et lorsque vous en avez terminé avec un graphique en temps réel, annulez-le avec md/cancelChart en utilisant l'identifiant temps réel, afin de ne pas conserver un abonnement que vous ne lisez plus.

Où PickMyTrade s'intègre

La plupart des personnes qui rencontrent ce 404 ne veulent pas vraiment devenir des plombiers WebSocket, elles veulent exécuter une stratégie sur Tradovate sans avoir à surveiller les sockets, les jetons et les formats de trame. PickMyTrade automatise le routage des ordres depuis les alertes TradingView vers Tradovate, afin que vous n'ayez pas à câbler vous-même des trames WebSocket brutes juste pour exécuter une stratégie.

  • Aucun câblage brut de socket vos alertes TradingView sont routées vers Tradovate sans coder à la main la moindre trame WebSocket.
  • Authentification gérée les jetons et les hôtes sont gérés pour vous, de sorte qu'une incohérence d'environnement ne devienne jamais votre problème.
  • Gestion des symboles la résolution des contrats est gérée en coulisses au lieu que vous suiviez manuellement les codes de mois et les roulements.
  • Routage sûr vis-à-vis des limites de débit espace le flux d'ordres pour que rien ne se heurte aux limites de requêtes de Tradovate.

Évitez le câblage brut de socket

Vous voulez que votre stratégie TradingView trade sur Tradovate sans coder à la main la moindre trame WebSocket ? Découvrez comment PickMyTrade automatise l'ensemble du flux d'ordres.

Démarrez votre essai gratuit de 5 jours

Questions fréquentes

Parce que l'endpoint n'existe pas sur le socket auquel vous l'avez envoyé. Les endpoints de données de marché n'existent que sur le WebSocket de données de marché dédié. Envoyez md/getChart via le socket de trading/API et le serveur n'a aucune route pour cela, donc il répond Not found: md/getChart. Déplacez la requête vers l'hôte de données de marché et elle se résout.

Les données de marché live utilisent wss://md.tradovateapi.com/v1/websocket et la démo utilise wss://md-demo.tradovateapi.com/v1/websocket. Ils sont distincts des sockets de trading. Confirmez les noms d'hôte actuels dans la documentation développeur de Tradovate avant de les intégrer à votre code.

Les requêtes de graphique nécessitent un symbole de contrat complet, pas la racine. YM ne peut pas être résolu, mais YMH5 (mars 2025) le peut. Un symbole racine, un code de mois erroné ou un contrat déjà expiré renvoient tous not found. Récupérez d'abord le symbole négociable exact via une recherche de contrat.

Les données de marché en temps réel via l'API nécessitent l'accord et la licence appropriés de la bourse, ce qui, pour les produits CME, représente des frais mensuels récurrents. Le montant varie et est fixé par la bourse, alors confirmez le tarif actuel auprès de Tradovate. Sans cela, les symboles reviennent inaccessibles même lorsque votre requête est parfaitement formée.

PickMyTrade automatise le routage des ordres depuis les alertes TradingView vers Tradovate, afin que vous n'ayez pas à câbler des trames WebSocket brutes juste pour exécuter une stratégie. Ce n'est pas un flux de données historiques en masse, mais pour l'automatisation, il élimine la majeure partie de la plomberie bas niveau à l'origine d'erreurs comme celle-ci.

Ce guide est fourni à des fins éducatives et informatives uniquement 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 à, ni approuvée par, ni parrainée par Tradovate, Inc. 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, alors confirmez toujours la procédure actuelle sur la plateforme et dans la documentation officielles de Tradovate avant d'agir.