WebSocket Tradovate « Connection to Remote Host Lost »
Le socket fonctionne sans problème pendant des heures, puis meurt avec Connection to remote host was lost, souvent autour de la barre des 24 heures. Voici ce qui échoue réellement, ainsi que le schéma de heartbeat, de reconnexion et de jeton qui maintient un flux en vie indéfiniment.
On This Page
- Ce que signifie « Connection to Remote Host Was Lost »
- Principales causes d'un WebSocket Tradovate interrompu
- 1. Heartbeats manqués (délai d'inactivité du serveur)
- 2. Bridage du navigateur / des minuteurs
- 3. Expiration du jeton d'accès
- 4. Connexions de longue durée au-delà de ~24 heures
- 5. Tempêtes de reconnexion et limite de sessions
- Comment réparer une connexion WebSocket Tradovate perdue : pas à pas
- Envoyez un heartbeat toutes les 2,5 secondes, de la bonne façon
- Ajoutez une logique de reconnexion automatique et de réabonnement
- Renouvelez le jeton d'accès et réautorisez le socket
- Confirmez que l'accès API est activé et que vous êtes dans la limite de sessions
- Faites tourner proactivement la connexion avant 24 heures
- Tableau de dépannage
- Évitez cela avec PickMyTrade
Quand votre bot diffuse des cotations ES ou NQ en continu, rien ne tue une stratégie plus vite qu'un WebSocket Tradovate qui meurt discrètement avec “Connection to remote host was lost.” C'est l'un des casse-têtes les plus courants de l'API Tradovate : le socket fonctionne sans problème pendant des heures, puis tombe, très souvent autour de la barre des 24 heures, et emporte avec lui vos données de marché en direct et l'acheminement des ordres. Parfois cela apparaît comme une fermeture WebSocket brute (code 1006, “abnormal closure”). Parfois cela ressemble à une déconnexion massive. Parfois, c'est simplement un flux mort qui ne lève jamais d'exception.
Il n'existe pas de réglage magique unique qui règle cela. Ce qui maintient réellement un socket en vie, c'est un ensemble d'habitudes qui fonctionnent ensemble : des heartbeats de 2,5 secondes, la reconnexion automatique, le renouvellement du jeton et la rotation de la connexion avant qu'elle ne devienne périmée. PickMyTrade intègre cette logique de reconnexion et de réautorisation, de sorte que vos alertes TradingView continuent d'atteindre Tradovate même quand un socket artisanal serait discrètement tombé.
Liste de contrôle rapide pour un WebSocket Tradovate perdu
- Heartbeat toutes les 2,5 secondes, envoyez une trame
[]vide afin que le serveur ne marque jamais votre client comme inactif et ne le ferme pas. - Ne vous fiez pas à setInterval dans un onglet de navigateur, le bridage en arrière-plan fait descendre votre minuteur sous 2,5 s et tue le socket. Utilisez plutôt une vérification par horodatage des messages.
- Reconnexion automatique à chaque fermeture, quand le socket se ferme, rouvrez-le, réautorisez et réabonnez-vous à vos symboles de données de marché.
- Renouvelez le jeton avant son expiration, appelez renewAccessToken environ 15 minutes avant l'expiration du jeton d'accès de ~90 minutes, et gardez les sessions dans la limite de sessions simultanées de Tradovate.
- Faites tourner la connexion avant ~24 heures, démontez et rouvrez le socket sur minuteur au lieu d'attendre que le serveur le coupe.
- Appliquez un backoff à la reconnexion, espacez les nouvelles tentatives afin qu'une tempête de reconnexions ne déclenche pas les limites de débit de Tradovate et ne vous bloque pas.
Ce que signifie « Connection to Remote Host Was Lost »
“Connection to remote host was lost” est la façon dont Tradovate vous indique que le WebSocket vers ses serveurs est fermé et n'est plus utilisable. C'est un événement de niveau transport, pas un ordre rejeté ni une mauvaise requête. Le tuyau lui-même a disparu. En coulisses, cela se manifeste généralement par une fermeture WebSocket anormale (code de fermeture 1006), c'est-à-dire une connexion tombée sans handshake de fermeture propre, si bien que votre client ne peut pas toujours vous dire exactement pourquoi.
Voici ce qui piège les gens : une connexion perdue est normale et attendue sur un flux de longue durée. Les réseaux vacillent, les répartiteurs de charge se recyclent, les sockets inactifs sont élagués, les jetons expirent et les très longues sessions sont renouvelées côté serveur. Même un client parfaitement bien élevé qui diffuse des données en direct peut perdre le socket après assez d'heures de fonctionnement. Le but n'est donc pas un socket qui ne tombe jamais, c'est impossible. Le but est un client qui remarque la coupure instantanément et se rétablit tout seul, sans que vous ayez à le surveiller.
Cette distinction compte pour le risque. Si votre flux meurt en silence et que votre code continue de se croire connecté, vous pouvez manquer des exécutions, manquer des déclenchements de stop ou envoyer des ordres sur une vue périmée du marché. Traitez chaque WebSocket comme jetable et chaque déconnexion comme un événement de routine à gérer, pas comme une urgence.
Principales causes d'un WebSocket Tradovate interrompu
1. Heartbeats manqués (délai d'inactivité du serveur)
C'est de loin la cause la plus courante. Le protocole WebSocket de Tradovate exige que le client envoie un heartbeat toutes les 2,5 secondes, une trame dont le texte est un tableau vide, [], pour prouver qu'il est toujours en vie. Si le serveur reste 2,5 secondes sans vous entendre et ne vous diffuse pas activement de données, il traite le client comme inactif et ferme la connexion. Et voici le piège : tant que le serveur pousse activement des messages (par exemple un abonnement aux données de marché très actif), il n'enverra pas ses propres heartbeats ; maintenir le flux des trames [] incombe donc entièrement à votre client.
2. Bridage du navigateur / des minuteurs
Si vous développez dans le navigateur et planifiez les heartbeats avec setInterval ou setTimeout, vous tombez dans un piège subtil : les navigateurs brident les minuteurs dans les onglets en arrière-plan ou inactifs, étirant votre intervalle de 2,5 secondes à plusieurs secondes. Dès qu'il dépasse la fenêtre, le serveur ferme le socket. Ne vous appuyez pas sur setInterval, calez plutôt vos heartbeats sur le dernier message réellement reçu.
3. Expiration du jeton d'accès
Votre WebSocket est autorisé une fois avec un jeton d'accès, et ce jeton a une durée de vie limitée, d'environ 90 minutes depuis sa création selon la documentation API de Tradovate. Quand le jeton derrière une connexion active expire, la connexion n'est plus authentifiée et peut être coupée. Un client de longue durée qui ne renouvelle jamais son jeton verra le socket mourir à intervalle prévisible.
4. Connexions de longue durée au-delà de ~24 heures
Maintenir une connexion plus de 24 heures est en soi une cause reconnue de coupures. Même avec des heartbeats parfaits et un jeton frais, un socket ouvert depuis environ un jour est un candidat de choix au recyclage côté serveur. C'est pourquoi une connexion brute qui “a fonctionné tout l'après-midi” meurt mystérieusement pendant la nuit.
5. Tempêtes de reconnexion et limite de sessions
Quand un socket tombe, le code naïf martèle souvent le serveur de tentatives de reconnexion immédiates et successives. Cela peut déclencher les limites de débit de requêtes de Tradovate et aggraver les choses, et se réauthentifier à répétition (au lieu de renouveler) peut vous faire buter sur le plafond de sessions simultanées. Le résultat est un client coincé dans une boucle de reconnexion qui ne se stabilise jamais.
Comment réparer une connexion WebSocket Tradovate perdue : pas à pas
Envoyez un heartbeat toutes les 2,5 secondes, de la bonne façon
Horodatez chaque message entrant
À chaque message reçu sur le socket, enregistrez un horodatage (un simple new Date() suffit).
Comparez au dernier heartbeat
À courte cadence, comparez “maintenant” à l'horodatage du dernier message reçu.
Envoyez le heartbeat si nécessaire
Si plus de 2500 ms se sont écoulées depuis le dernier message, envoyez une seule trame de heartbeat contenant exactement [] avec la méthode send du socket.
Évitez un setInterval fixe
Pilotez cela par une vérification basée sur les messages plutôt que par un setInterval fixe, afin que le bridage du navigateur ne puisse pas étirer silencieusement l'écart et vous déconnecter.
Cette seule habitude résout la majorité des signalements “connection to remote host was lost”, car elle satisfait directement la règle de délai d'inactivité du serveur.
Ajoutez une logique de reconnexion automatique et de réabonnement
Détectez la coupure immédiatement
Attachez un gestionnaire à l'événement close (et error) du socket afin qu'une coupure soit détectée immédiatement.
Ouvrez un nouveau socket
À la fermeture, supposez que la connexion a été perdue par erreur et ouvrez un nouveau WebSocket vers le même point d'accès.
Renvoyez la requête d'autorisation
Renvoyez la requête d'autorisation avec un jeton d'accès actuellement valide, un nouveau socket n'est pas autorisé du simple fait que le précédent l'était.
Réabonnez-vous à tout
Réabonnez-vous à chaque symbole de données de marché et à chaque sync utilisateur/ordres que vous écoutiez auparavant, puisque les abonnements ne survivent pas à une reconnexion.
Appliquez un backoff exponentiel
Enveloppez les tentatives de reconnexion dans un backoff exponentiel (par exemple, attendez 1 s, puis 2 s, puis 4 s, plafonné) afin qu'une panne prolongée ne se transforme pas en blocage par limite de débit.
Renouvelez le jeton d'accès et réautorisez le socket
Planifiez un renouvellement avant l'expiration
Lors de la première authentification, lisez l'heure d'expiration du jeton dans la réponse d'authentification et planifiez un renouvellement avant celle-ci.
Appelez renewAccessToken tôt
Appelez renewAccessToken environ 15 minutes avant l'expiration du jeton. Renouveler (plutôt que de réautoriser à partir de zéro) prolonge votre session actuelle au lieu d'en ouvrir une nouvelle, ce qui vous maintient sous la limite de sessions simultanées de Tradovate.
Réautorisez le socket actif
Après le renouvellement, assurez-vous que le socket actif est autorisé avec le nouveau jeton. L'approche la plus sûre consiste à vous reconnecter et à envoyer une nouvelle trame authorize avec le jeton renouvelé, car le seul renouvellement du jeton ne garde pas toujours authentifié un socket déjà ouvert.
Confirmez que l'accès API est activé et que vous êtes dans la limite de sessions
Confirmez que l'accès API est activé
Dans le Web Trader de Tradovate, ouvrez Application Settings et confirmez que API Access (le module complémentaire API) est activé pour votre compte, un socket ne peut pas rester autorisé sur un compte qui n'a pas droit à l'usage de l'API.
Vérifiez votre nombre de sessions simultanées
Vérifiez que vous n'exécutez pas plus de sessions simultanées que Tradovate n'en autorise entre votre bot, l'application de bureau, TradingView et toute autre connexion ; des sessions supplémentaires peuvent mettre hors ligne votre connexion API.
Confirmez votre autorisation de données de marché
Si vous avez spécifiquement besoin de données de marché API en temps réel, confirmez que vos autorisations de données de marché sont en place, car un abonnement aux données non autorisé peut provoquer la fermeture du flux.
Faites tourner proactivement la connexion avant 24 heures
Plutôt que d'attendre que le serveur coupe un socket vieux d'un jour, prenez les devants. Sur minuteur, confortablement sous le plafond de ~24 heures, fermez proprement votre WebSocket existant et ouvrez-en un nouveau avec un jeton fraîchement renouvelé, puis réautorisez et réabonnez-vous. Comme votre chemin de reconnexion existe déjà (vous l'avez construit à l'étape précédente), un cycle planifié n'est qu'une version contrôlée de la même routine. Il transforme une déconnexion surprise à 3 h du matin en un rafraîchissement planifié et invisible.
Tableau de dépannage
| Erreur / état | Ce que cela signifie | Solution |
|---|---|---|
| Connection to remote host was lost | Le WebSocket vers Tradovate a été fermé et est inutilisable | Reconnexion automatique, réautoriser et réabonner ; s'assurer que les heartbeats circulent |
| WebSocket closed with code 1006 | Fermeture anormale, coupure sans handshake propre | La traiter comme une déconnexion normale ; rouvrir le socket avec backoff |
| Le socket meurt toutes les ~90 minutes | Le jeton d'accès derrière la connexion a expiré | Appeler renewAccessToken ~15 min avant l'expiration et réautoriser le socket |
| Le flux tombe après de nombreuses heures / pendant la nuit | Connexion de longue durée recyclée (souvent autour de 24 heures) | Faire tourner proactivement la connexion sur minuteur sous ~24 heures |
| Déconnexions uniquement quand l'onglet est en arrière-plan | Le navigateur a bridé votre heartbeat setInterval sous 2,5 s | Caler les heartbeats sur le dernier message reçu, pas sur un intervalle fixe |
| Boucle de reconnexion / nouvelles coupures après reconnexion | Une tempête de reconnexions déclenche les limites de débit ou le plafond de sessions | Ajouter un backoff exponentiel ; renouveler les jetons au lieu de réauthentifier de nouvelles sessions |
| Flux de données silencieux mais aucune erreur levée | Socket à moitié ouvert ; le serveur a cessé d'envoyer, le client ne l'a pas remarqué | Appliquer le heartbeat de 2,5 s et traiter les heartbeats manqués comme une déconnexion |
Évitez cela avec PickMyTrade
Si votre but est simplement de faire parvenir de façon fiable les alertes TradingView à Tradovate, vous n'avez pas à construire et surveiller vous-même toute cette tuyauterie de sockets. PickMyTrade se place entre TradingView et Tradovate et maintient la connexion en bonne santé pour vous.
- Logique de reconnexion gérée, reconnexion, réautorisation et réabonnement automatiques à chaque coupure, de sorte qu'un socket perdu se rétablit sans que vous ayez à écrire ou maintenir le code.
- Renouvellement du jeton intégré, les sessions sont rafraîchies avant leur expiration, ce qui garde la connexion authentifiée au lieu de mourir à l'horloge du jeton de ~90 minutes.
- Rotation des connexions, les connexions de longue durée sont recyclées de façon proactive, afin que la coupure à ~24 heures ne surprenne jamais votre automatisation hors ligne.
- Acheminement respectueux des limites de débit, les reconnexions et le flux d'ordres sont espacés pour respecter les limites de Tradovate, évitant les blocages par tempête de reconnexion qui affligent les sockets bruts.
Arrêtez de surveiller votre socket
Prêt à arrêter de surveiller votre socket ? Commencez votre essai gratuit de 7 jours, reliez vos alertes dès aujourd'hui et tradez sans rejet.
Commencez votre essai gratuit de 7 joursQuestions fréquentes
Presque toujours parce que le client a cessé d'envoyer son heartbeat de 2,5 secondes, que le jeton d'accès a expiré ou que la connexion a simplement vieilli (les sessions longues au-delà de ~24 heures sont recyclées). Ajoutez des heartbeats, le renouvellement du jeton et la reconnexion automatique, et les coupures deviennent un non-événement.
Toutes les 2,5 secondes. Envoyez une trame dont le texte est un tableau vide, []. Si le serveur reste 2,5 secondes sans vous entendre alors qu'il ne vous diffuse pas de données, il ferme le socket pour inactivité.
Les navigateurs brident setInterval/setTimeout dans les onglets inactifs, de sorte que votre intervalle dépasse 2,5 secondes. Au lieu d'un intervalle fixe, horodatez chaque message reçu et n'envoyez un heartbeat que lorsque plus de 2500 ms se sont écoulées depuis le dernier.
Un jeton d'accès dure environ 90 minutes selon la documentation API de Tradovate. Appelez renewAccessToken environ 15 minutes avant son expiration pour prolonger la session, puis assurez-vous que le socket est autorisé avec le jeton renouvelé ; se reconnecter et renvoyer une trame authorize est le moyen le plus sûr de le garder authentifié.
Oui. Un nouveau socket démarre sans abonnements ; après la réouverture et la réautorisation, vous devez donc vous réabonner à chaque symbole et sync que vous écoutiez avant la coupure.
Non. C'est une caractéristique attendue des connexions de très longue durée. La réponse fiable consiste à faire tourner la connexion de façon proactive avant qu'elle n'atteigne cet âge plutôt que d'attendre que le serveur la coupe.
Des tentatives de reconnexion immédiates et successives martèlent le serveur et peuvent déclencher les limites de requêtes de Tradovate, et se réauthentifier à répétition peut vous faire buter sur le plafond de sessions simultanées. Ajoutez un backoff exponentiel entre les tentatives et renouvelez les jetons au lieu de créer de nouvelles sessions.
Si vous avez seulement besoin que les alertes TradingView atteignent Tradovate, oui. PickMyTrade gère pour vous le heartbeat, le renouvellement du jeton, la reconnexion et la rotation de la connexion, de sorte que vous n'avez pas à maintenir vous-même un client WebSocket résilient.
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 important et ne convient pas à tous les investisseurs. PickMyTrade est une plateforme d'automatisation tierce indépendante et n'est ni affiliée à Tradovate, Inc., ni approuvée ou parrainée par cette dernière. « Tradovate » ainsi que tous les noms, logos et marques associés sont la propriété de leurs détenteurs respectifs. Les fonctionnalités de la plateforme et les étapes évoluent avec le temps ; confirmez donc toujours la procédure en vigueur dans la plateforme et la documentation officielles de Tradovate avant d'agir.