Tradovate API

Error 404 de la API de Tradovate en los datos históricos de md/getChart

Configuró un WebSocket, envió una solicitud md/getChart limpia y recibió Not found: md/getChart. Nueve de cada diez veces se debe al socket incorrecto o a un símbolo que Tradovate no puede resolver.

Revisado por el equipo de Sistemas de Trading de PickMyTrade Última actualización
· Lectura de 7 minutos
Cliente WebSocket de Tradovate mostrando una respuesta 404 Not found: md/getChart

Configuró un WebSocket, lo autorizó, envió una solicitud md/getChart limpia para unas cientos de barras de historial, y el servidor le respondió con Not found: md/getChart. Nada en el payload parece incorrecto. Entonces, ¿por qué un 404 en un endpoint que claramente existe en la documentación?

Nueve de cada diez veces se reduce a una de dos cosas: envió la solicitud al socket equivocado o pidió un símbolo que Tradovate no puede resolver. Ambos casos generan un “not found” que se ve idéntico desde su lado. Repasemos cada causa, en el orden en que vale la pena revisarlas, para que sus barras históricas empiecen a fluir.

Qué le está diciendo realmente el 404

Un 404 en una llamada REST significa que la ruta de la URL no existe. En el WebSocket de Tradovate se aplica la misma idea: el frame que envía nombra un endpoint, y si el socket al que está conectado no atiende ese endpoint, recibe Not found con el nombre del endpoint reflejado de vuelta. No significa que su símbolo sea incorrecto ni que su token haya expirado. Significa “no tengo una ruta para eso aquí”.

Esa distinción importa. Si el mensaje es literalmente Not found: md/getChart, el propio endpoint no es accesible en esa conexión, lo que apunta directamente al problema del socket equivocado. Si la solicitud llega al motor de datos de mercado pero no se encuentra el contrato, verá en su lugar un fallo relacionado con el símbolo. Lea el texto exacto antes de empezar a modificar el código.

Causa 1: está usando el WebSocket equivocado

Esta es la causa principal, y atrapa a casi todo el mundo la primera vez. Tradovate opera dos servicios WebSocket distintos, y no son intercambiables:

  • El socket de trading/API gestiona órdenes, posiciones, cuentas y el resto de los datos de entidades. En real es wss://live.tradovateapi.com/v1/websocket; en demo es wss://demo.tradovateapi.com/v1/websocket.
  • El socket de datos de mercado gestiona cotizaciones, DOM y gráficos. En real es wss://md.tradovateapi.com/v1/websocket; en demo es wss://md-demo.tradovateapi.com/v1/websocket.

Todos los endpoints md/, md/getChart, md/subscribeQuote, md/subscribeDOM, existen únicamente en el socket de datos de mercado. Si los envía al socket de trading, simplemente no hay ninguna ruta que coincida, por lo que recibe Not found: md/getChart. El socket de trading no le indicará que está en el lugar equivocado; solo reporta el endpoint como inexistente.

Comparación entre el host del WebSocket de trading de Tradovate y el host separado del WebSocket de datos de mercado

La solución: abra una segunda conexión WebSocket al host de datos de mercado y envíe allí su solicitud de gráfico. Un error común es autorizar perfectamente el socket de trading y luego reutilizar esa misma conexión para los datos de mercado. Necesita ambos sockets abiertos, y cada uno necesita su propio frame authorize con su token de acceso antes de responder a cualquier solicitud.

Otra trampa relacionada con el mismo tema: haga coincidir su entorno. Si su token de acceso proviene del endpoint de autenticación en real, use md.tradovateapi.com. Si proviene de demo, use md-demo.tradovateapi.com. Combinar un token en real con el host de datos de mercado de demo (o viceversa) hace que lo rechacen antes incluso de que la solicitud de gráfico importe. Los nombres de host se actualizan ocasionalmente, así que confirme los actuales en la documentación oficial para desarrolladores de Tradovate en lugar de confiar en un fragmento que copió hace un año.

Causa 2: el símbolo no es un contrato real

Supongamos que su socket es correcto y aun así sigue recibiendo una respuesta not-found asociada a la solicitud. Examine cuidadosamente el símbolo. Las solicitudes de gráfico necesitan un contrato de futuros completamente calificado, no la raíz del producto que ve en una lista de seguimiento.

“YM” no es negociable por sí solo, es la raíz. Lo que Tradovate puede resolver es el contrato específico, como YMH5, donde H es el código del mes de marzo y 5 es el año 2025. Si pasa la raíz sola, un código de mes incorrecto o un contrato que ya venció y pasó al siguiente trimestre, el motor no podrá encontrar nada con qué construir un gráfico. Aquí está el mapa estándar de códigos de mes para futuros:

Mes Código Mes Código
eneroFjulioN
febreroGagostoQ
marzoHseptiembreU
abrilJoctubreV
mayoKnoviembreX
junioMdiciembreZ
Búsqueda de contratos de Tradovate que muestra un símbolo de futuros completamente calificado con código de mes y año

En lugar de codificar de forma fija una cadena de símbolo, resuelva el contrato del mes frontal actual de forma programática. Los endpoints contract/find y de búsqueda de productos en el socket de trading le dan el símbolo negociable exacto, de modo que nunca tenga que adivinar si ES pasó de diciembre a marzo. Si debe usar un alias continuo o de “mes frontal”, verifique bien que sea uno que Tradovate realmente acepte para gráficos, muchas notaciones continuas que funcionan en una interfaz de gráficos no se resuelven en una llamada directa a md/getChart. En caso de duda, solicite el contrato explícito.

Esta es también la razón clásica por la que una solicitud que funcionaba el trimestre pasado de repente da un 404: el contrato que fijó ha vencido. Los rollovers ocurren según un calendario fijo, y un símbolo vencido desaparece del motor de datos. Automatice el rollover en lugar de perseguirlo manualmente.

Causa 3: su permiso de datos de mercado no está configurado

¿Socket correcto, contrato válido y aun así nada útil? Ahora revise a qué está realmente autorizada su cuenta. Aquí importan dos niveles.

Primero, el acceso a la API en sí debe estar activado. Ese es el complemento API Access dentro de la configuración de su cuenta de Tradovate, que habilita el acceso programático y le permite generar las credenciales que necesita su flujo de autenticación. Sin él, su token no llevará los permisos que espera el motor de datos de mercado.

Pantalla de configuración de Tradovate para habilitar el acceso a la API y las suscripciones de datos de mercado de la bolsa

En segundo lugar, los datos de mercado en tiempo real a través de la API requieren el acuerdo y la licencia correspondientes de la bolsa. Para los productos de CME, eso significa una licencia mensual de datos de mercado adicional a su plan. El importe exacto lo fija la bolsa y cambia con el tiempo, así que confirme la cifra actual con Tradovate en lugar de confiar en un número que leyó en algún lugar, normalmente es un cargo mensual recurrente, no trivial. Sin esa autorización, una solicitud de gráfico bien formada puede seguir devolviendo datos inaccesibles o vacíos, porque está pidiendo datos que su cuenta no tiene licencia para recibir. Si sus símbolos aparecen como inaccesibles en lugar de not-found, ese es el tipo de problema que está viendo.

Si tiene una cuenta de prop-firm o de evaluación, a menudo no puede suscribirse usted mismo a esos datos, la firma los controla. En ese caso, la solución del permiso pasa por el soporte de su firma, no por el de Tradovate.

Causa 4: un frame mal formado o un socket sin autorizar

El WebSocket de Tradovate no habla JSON plano. Cada solicitud es un frame de texto con una forma específica: el endpoint, luego el id de la solicitud, luego una línea de consulta (a menudo vacía), luego el cuerpo JSON, separados por saltos de línea, por ejemplo md/getChart\n2\n\n{ ... }. Si esa estructura está mal, el servidor puede no analizar correctamente el nombre del endpoint, lo que puede manifestarse como un error tipo not-found aunque su intención fuera correcta.

  • Autorice primero. El primer frame en el socket de datos de mercado debe ser authorize\n1\n\n<yourAccessToken>. Si envía md/getChart antes de que el socket esté autorizado, no se atenderá.
  • Mantenga vivo el socket. La conexión espera un frame de heartbeat periódico. Si lo omite, el socket se cae; las solicitudes enviadas a una conexión semimuerta fallan de formas confusas.

Construya el frame exactamente como está documentado, autorice antes de solicitar, y envíe heartbeats según el calendario. La mayoría de los 404 “aleatorios” en un socket que funcionaba hace una hora se remontan a uno de estos tres puntos.

Una lista de verificación rápida para resolver el 404

Verificación Qué confirmar
Socket correctomd/getChart va a md.tradovateapi.com (real) o md-demo.tradovateapi.com (demo), no al socket de trading.
Entorno coincidenteToken en real → host de datos de mercado en real; token de demo → host de demo.
Símbolo de contrato completoUse símbolos con formato ESH5, no la raíz ES, y no un contrato vencido.
Permisos activadosComplemento API Access habilitado y licencia de datos de mercado de la bolsa activa.
Frame + autenticaciónAutorice el socket primero y luego envíe un frame de solicitud correctamente delimitado por saltos de línea.

Una vez que los datos del gráfico empiezan a fluir

Cuando la solicitud tiene éxito, la respuesta le devuelve ids de suscripción, un id histórico y un id en tiempo real, y transmite barras. El historial llega en lotes, y cada lote termina con un marcador de “end of history” para que sepa cuándo un fragmento está completo. No hay un límite máximo fijo de cuánto puede extraer por solicitud, pero el límite práctico varía día a día, así que una solicitud grande (por ejemplo, barras de un minuto durante varios años) vuelve truncada en lugar de dar error.

Para retroceder más en la paginación, tome la marca de tiempo más antigua que recibió, envíe una nueva md/getChart usándola como su marca de tiempo más cercana y su fecha objetivo como la marca de tiempo lejana, y repita hasta obtener el rango que necesita. Y cuando termine con un gráfico en tiempo real, cancélelo con md/cancelChart usando el id en tiempo real, para no mantener una suscripción que ya no lee.

Dónde encaja PickMyTrade

La mayoría de las personas que se topan con este 404 en realidad no quieren convertirse en fontaneros de WebSocket, quieren ejecutar una estrategia en Tradovate sin tener que vigilar sockets, tokens y formatos de frame. PickMyTrade automatiza el enrutamiento de órdenes desde las alertas de TradingView hacia Tradovate, de modo que no tenga que cablear frames WebSocket en bruto usted mismo solo para ejecutar una estrategia.

  • Sin cableado de sockets en bruto sus alertas de TradingView se enrutan a Tradovate sin codificar a mano ni un solo frame WebSocket.
  • Autenticación gestionada los tokens y hosts se gestionan por usted, de modo que un desajuste de entorno nunca se convierte en su problema.
  • Gestión de símbolos la resolución de contratos se maneja internamente en lugar de que usted rastree manualmente los códigos de mes y los rollovers.
  • Enrutamiento seguro frente a límites de tasa espacia el flujo de órdenes para que nada choque contra los límites de solicitudes de Tradovate.

Evite el cableado de sockets en bruto

¿Quiere que su estrategia de TradingView opere en Tradovate sin codificar a mano ni un solo frame WebSocket? Vea cómo PickMyTrade automatiza todo el flujo de órdenes.

Inicie su prueba gratuita de 5 días

Preguntas frecuentes

Porque el endpoint no existe en el socket al que lo envió. Los endpoints de datos de mercado solo existen en el WebSocket de datos de mercado dedicado. Si envía md/getChart por el socket de trading/API, el servidor no tiene ruta para él, por lo que responde Not found: md/getChart. Mueva la solicitud al host de datos de mercado y se resolverá.

Los datos de mercado en real usan wss://md.tradovateapi.com/v1/websocket y la demo usa wss://md-demo.tradovateapi.com/v1/websocket. Son distintos de los sockets de trading. Confirme los nombres de host actuales en la documentación para desarrolladores de Tradovate antes de incorporarlos a su código.

Las solicitudes de gráfico necesitan un símbolo de contrato completo, no la raíz. YM no se puede resolver, pero YMH5 (marzo de 2025) sí. Un símbolo raíz, un código de mes incorrecto o un contrato ya vencido siempre devuelven not found. Obtenga primero el símbolo negociable exacto mediante una búsqueda de contrato.

Los datos de mercado en tiempo real por la API requieren el acuerdo y la licencia correspondientes de la bolsa, que para los productos de CME es una tarifa mensual recurrente. El importe varía y lo fija la bolsa, así que confirme la tarifa actual con Tradovate. Sin ella, los símbolos vuelven como inaccesibles incluso cuando su solicitud está perfectamente formada.

PickMyTrade automatiza el enrutamiento de órdenes desde las alertas de TradingView hacia Tradovate, de modo que no tenga que cablear frames WebSocket en bruto solo para ejecutar una estrategia. No es un feed masivo de datos históricos, pero para la automatización elimina la mayor parte del cableado de bajo nivel que causa errores como este.

Esta guía tiene fines educativos e informativos únicamente y no constituye asesoramiento financiero, de inversión o 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 de terceros independiente y no está afiliada, respaldada ni patrocinada por Tradovate, Inc. Todos los nombres, logotipos y marcas relacionados son propiedad de sus respectivos dueños. Las funciones y los pasos de la plataforma cambian con el tiempo, así que confirme siempre el proceso actual en la plataforma y la documentación oficiales de Tradovate antes de actuar.