Tradovate API

WebSocket de Tradovate «Connection to Remote Host Lost»

El socket funciona sin problemas durante horas y luego muere con Connection to remote host was lost, a menudo justo en torno a las 24 horas. Esto es lo que realmente falla y el patrón de heartbeat, reconexión y token que mantiene un feed vivo indefinidamente.

On This Page

Cuando su bot transmite cotizaciones de ES o NQ las 24 horas, nada mata una estrategia más rápido que un WebSocket de Tradovate que muere en silencio con “Connection to remote host was lost.” Es uno de los dolores de cabeza más comunes de la API de Tradovate: el socket funciona sin problemas durante horas y luego se cae, muy a menudo justo en torno a las 24 horas, y arrastra consigo sus datos de mercado en vivo y el enrutamiento de órdenes. A veces lo verá como un cierre WebSocket en bruto (código 1006, “abnormal closure”). A veces parece una desconexión masiva. A veces es solo un feed muerto que nunca lanza una excepción.

No existe una única configuración mágica que lo arregle. Lo que de verdad mantiene vivo un socket es un conjunto de hábitos que funcionan juntos: heartbeats de 2,5 segundos, reconexión automática, renovación de token y ciclado de la conexión antes de que se quede obsoleta. PickMyTrade incorpora esta lógica de reconexión y reautorización, de modo que sus alertas de TradingView siguen llegando a Tradovate incluso cuando un socket hecho a mano se habría caído en silencio.

Lista rápida para un WebSocket de Tradovate perdido

  • Heartbeat cada 2,5 segundos, envíe un frame [] vacío para que el servidor nunca marque su cliente como inactivo y lo cierre.
  • No confíe en setInterval en una pestaña del navegador, la limitación en segundo plano hace caer su temporizador por debajo de 2,5 s y mata el socket. Use en su lugar una comprobación por marca de tiempo del mensaje.
  • Reconexión automática en cada cierre, cuando el socket se cierre, reábralo, reautorice y vuelva a suscribirse a sus símbolos de datos de mercado.
  • Renueve el token antes de que caduque, llame a renewAccessToken unos 15 minutos antes de la caducidad del token de acceso de ~90 minutos y mantenga las sesiones dentro del límite de sesiones simultáneas de Tradovate.
  • Cicle la conexión antes de ~24 horas, desmonte y reabra el socket con un temporizador en lugar de esperar a que el servidor lo corte.
  • Aplique backoff al reconectar, espacie los reintentos para que una tormenta de reconexiones no active los límites de tasa de Tradovate y le bloquee.

Qué significa «Connection to Remote Host Was Lost»

“Connection to remote host was lost” es la forma que tiene Tradovate de decirle que el WebSocket hacia sus servidores está cerrado y ya no se puede usar. Es un evento a nivel de transporte, no una orden rechazada ni una solicitud incorrecta. La tubería misma desapareció. Por debajo, esto suele aparecer como un cierre WebSocket anormal (código de cierre 1006), es decir, una conexión que se cayó sin un handshake de cierre limpio, de modo que su cliente no siempre puede decirle exactamente por qué.

Aquí está lo que confunde a la gente: perder la conexión es normal y esperable en un feed de larga duración. Las redes parpadean, los balanceadores de carga se reciclan, los sockets inactivos se podan, los tokens caducan y las sesiones muy largas se ciclan en el servidor. Incluso un cliente perfectamente bien portado que transmite datos en vivo puede perder el socket tras suficientes horas de actividad. Así que el objetivo no es un socket que nunca se caiga, eso es imposible. El objetivo es un cliente que note la caída al instante y se recupere solo, sin que tenga que vigilarlo.

Esa distinción importa para el riesgo. Si su feed muere en silencio y su código sigue asumiendo que está conectado, puede perder ejecuciones, perder disparos de stop o lanzar órdenes sobre una vista obsoleta del mercado. Trate cada WebSocket como desechable y cada desconexión como un evento rutinario que gestionar, no como una emergencia.

Principales causas de un WebSocket de Tradovate caído

1. Heartbeats perdidos (tiempo de espera de inactividad del servidor)

Esta es la causa más común con diferencia. El protocolo WebSocket de Tradovate exige que el cliente envíe un heartbeat cada 2,5 segundos, un frame cuyo texto es un array vacío, [], para demostrar que sigue vivo. Si el servidor pasa 2,5 segundos sin saber de usted y no le está transmitiendo datos activamente, trata al cliente como inactivo y cierra la conexión. Y aquí está el problema: mientras el servidor envía mensajes activamente (por ejemplo, una suscripción de datos de mercado muy activa), no enviará sus propios heartbeats, así que mantener fluyendo los frames [] depende por completo de su cliente.

2. Limitación del navegador / de los temporizadores

Si desarrolla en el navegador y programa los heartbeats con setInterval o setTimeout, cae en una trampa sutil: los navegadores limitan los temporizadores en pestañas en segundo plano o inactivas, estirando su intervalo de 2,5 segundos a varios segundos. En cuanto supera la ventana, el servidor cierra el socket. No se apoye en setInterval, calcule el momento de sus heartbeats a partir del último mensaje que realmente recibió.

3. Caducidad del token de acceso

Su WebSocket se autoriza una vez con un token de acceso, y ese token tiene una vida limitada, de alrededor de 90 minutos desde su creación según la documentación de la API de Tradovate. Cuando caduca el token tras una conexión activa, la conexión deja de estar autenticada y puede cortarse. Un cliente de larga ejecución que nunca renueva su token verá morir el socket con una cadencia predecible.

4. Conexiones de larga duración de más de ~24 horas

Mantener una conexión durante más de 24 horas es por sí mismo una causa reconocida de caídas. Incluso con heartbeats perfectos y un token nuevo, un socket que lleva abierto aproximadamente un día es un candidato principal para ser reciclado en el servidor. Por eso una conexión en bruto que “funcionó toda la tarde” muere misteriosamente durante la noche.

5. Tormentas de reconexión y el límite de sesiones

Cuando un socket se cae, el código ingenuo suele saturar al servidor con intentos de reconexión inmediatos y consecutivos. Eso puede activar los límites de tasa de solicitudes de Tradovate y empeorar las cosas, y reautenticarse repetidamente (en lugar de renovar) puede hacerle chocar con el tope de sesiones simultáneas. El resultado es un cliente atascado en un bucle de reconexión que nunca se estabiliza.

Cómo arreglar una conexión WebSocket de Tradovate perdida: paso a paso

Envíe un heartbeat cada 2,5 segundos, de la forma correcta

1

Ponga una marca de tiempo a cada mensaje entrante

En cada mensaje que reciba por el socket, registre una marca de tiempo (un simple new Date() basta).

2

Compare con el último heartbeat

Con una cadencia corta, compare “ahora” con la marca de tiempo del último mensaje recibido.

3

Envíe el heartbeat cuando haga falta

Si han transcurrido más de 2500 ms desde el último mensaje, envíe un único frame de heartbeat que contenga exactamente [] usando el método send del socket.

4

Evite un setInterval fijo

Dirija esto con una comprobación basada en mensajes en lugar de un setInterval fijo, para que la limitación del navegador no pueda estirar en silencio el intervalo y desconectarle.

Este único hábito resuelve la mayoría de los informes de “connection to remote host was lost”, porque cumple directamente la regla de tiempo de espera de inactividad del servidor.

Añada lógica de reconexión automática y resuscripción

1

Detecte la caída de inmediato

Adjunte un manejador al evento close (y error) del socket para que una caída se detecte de inmediato.

2

Abra un socket nuevo

Al cerrarse, asuma que la conexión se perdió por error y abra un WebSocket nuevo hacia el mismo endpoint.

3

Reenvíe la solicitud de autorización

Reenvíe la solicitud de autorización con un token de acceso válido en ese momento, un socket nuevo no está autorizado solo porque lo estuviera el anterior.

4

Vuelva a suscribirse a todo

Vuelva a suscribirse a cada símbolo de datos de mercado y a cada sync de usuario/órdenes que escuchaba antes, ya que las suscripciones no sobreviven a una reconexión.

5

Aplique un backoff exponencial

Envuelva los intentos de reconexión en un backoff exponencial (por ejemplo, espere 1 s, luego 2 s, luego 4 s, con un tope) para que una interrupción prolongada no se convierta en un bloqueo por límite de tasa.

Renueve el token de acceso y reautorice el socket

1

Programe una renovación antes de la caducidad

Cuando se autentique por primera vez, lea la hora de caducidad del token en la respuesta de autenticación y programe una renovación antes de ella.

2

Llame a renewAccessToken con antelación

Llame a renewAccessToken unos 15 minutos antes de que caduque el token. Renovar (en lugar de reautorizar desde cero) extiende su sesión actual en vez de abrir una nueva, lo que le mantiene por debajo del límite de sesiones simultáneas de Tradovate.

3

Reautorice el socket activo

Tras renovar, asegúrese de que el socket activo esté autorizado con el token nuevo. Lo más seguro es reconectar y enviar un nuevo frame authorize con el token renovado, porque renovar el token por sí solo no siempre mantiene autenticado un socket ya abierto.

Confirme que el acceso a la API está habilitado y que está dentro del límite de sesiones

1

Confirme que el acceso a la API está habilitado

En el Web Trader de Tradovate, abra Application Settings y confirme que API Access (el complemento de API) está habilitado para su cuenta, un socket no puede permanecer autorizado frente a una cuenta que no tiene derecho al uso de la API.

2

Compruebe su número de sesiones simultáneas

Compruebe que no ejecuta más sesiones simultáneas de las que Tradovate permite entre su bot, la aplicación de escritorio, TradingView y cualquier otra conexión; las sesiones adicionales pueden dejar sin conexión su conexión API.

3

Confirme su autorización de datos de mercado

Si necesita específicamente datos de mercado de API en tiempo real, confirme que sus autorizaciones de datos de mercado están en vigor, ya que una suscripción de datos no autorizada puede hacer que el feed se cierre.

Cicle la conexión de forma proactiva antes de las 24 horas

En lugar de esperar a que el servidor corte un socket de un día de antigüedad, adelántese. Con un temporizador, cómodamente por debajo del techo de ~24 horas, cierre limpiamente su WebSocket existente y abra uno nuevo con un token recién renovado, luego reautorice y vuelva a suscribirse. Como su ruta de reconexión ya existe (la construyó en el paso anterior), un ciclo programado es solo una versión controlada de la misma rutina. Convierte una desconexión sorpresa a las 3 de la madrugada en un refresco planificado e invisible.

Tabla de solución de problemas

Error / estado Qué significa Solución
Connection to remote host was lostEl WebSocket hacia Tradovate se cerró y es inutilizableReconexión automática, reautorizar y volver a suscribirse; asegúrese de que los heartbeats fluyen
WebSocket closed with code 1006Cierre anormal, caída sin handshake limpioTrátelo como una desconexión normal; reabra el socket con backoff
El socket muere cada ~90 minutosEl token de acceso de la conexión caducóLlame a renewAccessToken ~15 min antes de la caducidad y reautorice el socket
El feed se cae tras muchas horas / durante la nocheConexión de larga duración reciclada (a menudo en torno a las 24 horas)Cicle la conexión de forma proactiva con un temporizador por debajo de ~24 horas
Se desconecta solo cuando la pestaña está en segundo planoEl navegador limitó su heartbeat de setInterval por debajo de 2,5 sCalcule el momento de los heartbeats desde el último mensaje recibido, no con un intervalo fijo
Bucle de reconexión / nuevas caídas tras reconectarUna tormenta de reconexiones activa los límites de tasa o el tope de sesionesAñada backoff exponencial; renueve tokens en lugar de reautenticar nuevas sesiones
Feed de datos en silencio pero sin errorSocket medio abierto; el servidor dejó de enviar y el cliente no lo notóAplique el heartbeat de 2,5 s y trate los heartbeats perdidos como una desconexión

Evite esto con PickMyTrade

Si su objetivo es simplemente que las alertas de TradingView lleguen a Tradovate de forma fiable, no tiene que construir ni vigilar usted mismo toda esta infraestructura de sockets. PickMyTrade se sitúa entre TradingView y Tradovate y mantiene sana la conexión por usted.

  • Lógica de reconexión gestionada, reconexión, reautorización y resuscripción automáticas en cada caída, de modo que un socket perdido se recupera sin que tenga que escribir ni mantener el código.
  • Renovación de token integrada, las sesiones se refrescan antes de caducar, manteniendo la conexión autenticada en lugar de morir con el reloj del token de ~90 minutos.
  • Ciclado de conexión, las conexiones de larga duración se reciclan de forma proactiva, así que la caída de ~24 horas nunca sorprende a su automatización sin conexión.
  • Enrutamiento seguro frente a límites de tasa, las reconexiones y el flujo de órdenes se espacian para respetar los límites de Tradovate, evitando los bloqueos por tormenta de reconexión que afectan a los sockets en bruto.

Deje de vigilar su socket

¿Listo para dejar de vigilar su socket? Comience su prueba gratuita de 7 días, vincule sus alertas hoy y opere sin rechazos.

Comience su prueba gratuita de 7 días

Preguntas frecuentes

Casi siempre porque el cliente dejó de enviar su heartbeat de 2,5 segundos, el token de acceso caducó o la conexión simplemente envejeció (las sesiones largas de más de ~24 horas se reciclan). Añada heartbeats, renovación de token y reconexión automática y las caídas se vuelven irrelevantes.

Cada 2,5 segundos. Envíe un frame cuyo texto sea un array vacío, []. Si el servidor pasa 2,5 segundos sin saber de usted mientras no le está transmitiendo datos, cierra el socket por inactividad.

Los navegadores limitan setInterval/setTimeout en las pestañas inactivas, de modo que su intervalo se estira más allá de 2,5 segundos. En lugar de un intervalo fijo, ponga una marca de tiempo a cada mensaje recibido y envíe un heartbeat solo cuando hayan pasado más de 2500 ms desde el último.

Un token de acceso dura alrededor de 90 minutos según la documentación de la API de Tradovate. Llame a renewAccessToken unos 15 minutos antes de que caduque para extender la sesión y luego asegúrese de que el socket esté autorizado con el token renovado; reconectar y reenviar un frame authorize es la forma más segura de mantenerlo autenticado.

Sí. Un socket nuevo empieza sin suscripciones, así que después de reabrir y reautorizar debe volver a suscribirse a cada símbolo y sync que escuchaba antes de la caída.

No. Es una característica esperada de las conexiones de muy larga duración. La respuesta fiable es ciclar la conexión de forma proactiva antes de que alcance esa antigüedad en lugar de esperar a que el servidor la corte.

Los intentos de reconexión inmediatos y consecutivos saturan al servidor y pueden activar los límites de solicitudes de Tradovate, y reautenticarse repetidamente puede chocar con el tope de sesiones simultáneas. Añada un backoff exponencial entre intentos y renueve los tokens en lugar de crear nuevas sesiones.

Si solo necesita que las alertas de TradingView lleguen a Tradovate, sí. PickMyTrade gestiona por usted el heartbeat, la renovación de token, la reconexión y el ciclado de la conexión, así que no tiene que mantener usted mismo un cliente WebSocket resistente.

Esta guía tiene fines exclusivamente educativos e informativos y no constituye asesoramiento financiero, de inversión ni de trading. Operar con futuros y otros productos apalancados conlleva un riesgo sustancial de pérdida y no es adecuado para todos los inversores. PickMyTrade es una plataforma de automatización independiente de terceros y no está afiliada, respaldada ni patrocinada por Tradovate, Inc. «Tradovate» y todos los nombres, logotipos y marcas relacionados son propiedad de sus respectivos titulares. Las funciones de la plataforma y los pasos cambian con el tiempo, por lo que debe confirmar siempre el proceso vigente en la plataforma y la documentación oficiales de Tradovate antes de actuar.