Tradovate API

Solución a Tradovate 'Not Found: md/subscribeQuote'

Su flujo de autenticación funciona, su socket de cuenta responde, y md/subscribeQuote sigue devolviendo Not found aunque el endpoint está ahí mismo en la documentación. Envió la solicitud al WebSocket equivocado.

On This Page

Su flujo de autenticación funcionó, su socket de cuenta funciona sin problemas y entonces lanza un md/subscribeQuote para empezar a recibir precios en vivo y el servidor le devuelve Not found: md/subscribeQuote, a menudo deformado en algo como "\"Not found: md/subscribeQuote\"" con caracteres de escape acumulados. El endpoint está ahí mismo en la documentación. Entonces, ¿por qué Tradovate actúa como si no existiera?

Esta es la versión corta: envió la solicitud al WebSocket equivocado. Las suscripciones de cotizaciones no viven en la misma conexión que usa para sincronizar su cuenta o colocar órdenes. Corrija a qué socket va la solicitud y el error desaparece. Veamos exactamente por qué ocurre, cómo enrutarlo correctamente y qué suele fallar a continuación una vez que el frame por fin llega.

Qué significa realmente “Not Found” aquí

Trátelo como un 404 en una llamada REST. Un 404 indica que la ruta de la URL no existe en ese servidor. En el WebSocket de Tradovate la lógica es idéntica: cada frame que envía nombra un endpoint, y si el socket al que está conectado no sirve ese endpoint, el servidor responde Not found devolviéndole el nombre del endpoint.

Lea eso con atención, porque descarta muchas cosas. No le dice que su símbolo sea incorrecto. No le dice que su token haya expirado. No le dice que su JSON esté mal formado. Le dice una sola cosa: “no hay ninguna ruta para md/subscribeQuote en esta conexión”. Y hay exactamente una razón común para eso.

La causa: está en el socket de cuenta, no en el socket de datos de mercado

Tradovate ejecuta dos servicios WebSocket separados que no son intercambiables. Mucha gente configura el primero, lo autoriza, ve que los datos de cuenta y órdenes fluyen perfectamente y luego asume que esa misma conexión se encarga de todo. No es así.

  • El socket de cuenta / API gestiona órdenes, posiciones, ejecuciones, sincronización de cuenta y el resto de datos de entidades. Aquí es donde pertenecen user/syncRequest, order/placeOrder y account/list. En vivo es wss://live.tradovateapi.com/v1/websocket; en demo es wss://demo.tradovateapi.com/v1/websocket.
  • El socket de datos de mercado gestiona precios en vivo, cotizaciones, el DOM, gráficos e histogramas. Aquí es donde vive cada endpoint md/, incluidos md/subscribeQuote, md/subscribeDOM y md/getChart. En vivo es wss://md.tradovateapi.com/v1/websocket; en demo es wss://md-demo.tradovateapi.com/v1/websocket.

Envíe md/subscribeQuote al socket de cuenta y simplemente no hay ruta coincidente, así que regresa Not found: md/subscribeQuote. El socket de cuenta no le insinuará que está llamando a la puerta equivocada, solo informa de que el endpoint falta. Aquí tiene el mapa completo de hosts para que alinee su entorno:

Propósito Demo / Simulación En vivo
Base REST de autenticaciónhttps://demo.tradovateapi.com/v1/https://live.tradovateapi.com/v1/
Socket de cuenta / API (user/syncRequest, order/placeOrder)wss://demo.tradovateapi.com/v1/websocketwss://live.tradovateapi.com/v1/websocket
Socket de datos de mercado (md/subscribeQuote, md/getChart)wss://md-demo.tradovateapi.com/v1/websocketwss://md.tradovateapi.com/v1/websocket

La solución: abrir y autorizar un segundo socket para las cotizaciones

No mueve su socket de cuenta. Añade un socket de datos de mercado a su lado. Mantenga la conexión de cuenta para órdenes y sincronización; abra un WebSocket nuevo al host de datos de mercado para los precios. Esta es la secuencia que elimina el error.

1

Tome ambos tokens de su respuesta de autenticación

Al autenticarse, la respuesta de Tradovate incluye más de un token. Junto al habitual accessToken verá un mdAccessToken y un expirationTime. Ese segundo token no es decorativo, se emite específicamente para el feed de datos de mercado. Consérvelo.

2

Abra el WebSocket de datos de mercado

Conéctese al host de datos de mercado que corresponda a su entorno: wss://md-demo.tradovateapi.com/v1/websocket si su token proviene del endpoint de autenticación demo, o wss://md.tradovateapi.com/v1/websocket si proviene del real. Cruzar un token real con el host demo (o al revés) hace que lo rechacen antes de que la suscripción importe. Espere al frame o de apertura del socket antes de enviar nada.

3

Autorice primero el socket

Este es el paso que la gente omite. Un socket nuevo no responde a nada hasta que lo autoriza. El primer frame que envíe debe ser el frame authorize con su token, use el mdAccessToken para la conexión de datos de mercado. Los frames de Tradovate son texto delimitado por saltos de línea, no JSON en bruto: el endpoint, el id de solicitud, una línea de consulta (a menudo vacía) y luego el cuerpo. Envíe el frame authorize, espere la respuesta que confirma que el socket está autorizado y solo entonces continúe. Si lanza una suscripción antes de que se complete este handshake, no será atendida.

4

Ahora envíe md/subscribeQuote

Con el socket abierto y autorizado, la suscripción por fin tiene una ruta. Envíela como un frame con la misma forma, con un cuerpo JSON que nombre un único contrato. Puede nombrar el contrato por su cadena de símbolo (como ESU6 para el E-mini S&P de septiembre de 2026) o por su id numérico de contrato, ambos funcionan. El servidor confirma la solicitud y luego empieza a enviar eventos de cotización con bid, ask y último precio de ese contrato. El error Not found desaparece porque el endpoint existe en la conexión que ahora usa.

Frame authorize:
authorize
1

<yourMdAccessToken>


Frame subscribe:
md/subscribeQuote
2

{"symbol":"ESU6"}

Suscríbase una vez por símbolo, no en bloque

Una trampa rápida que conviene nombrar: md/subscribeQuote admite un único símbolo por llamada. No existe una forma de array en la que entregue una lista y obtenga todo de una vez. Si quiere seguir ES, NQ y CL a la vez, envíe tres frames de suscripción separados por el mismo socket de datos de mercado, cada uno con su propio id de solicitud. Un socket puede llevar muchas suscripciones de cotizaciones en vivo al mismo tiempo, solo las registra de una en una. Cuando termine con un contrato, cancele la suscripción con md/unsubscribeQuote para no recibir un flujo que ya no lee.

Qué falla a continuación: el socket es correcto, pero no aparecen precios

Una vez que desaparece el error de no encontrado, la siguiente clase de problema es de naturaleza distinta. La solicitud ya llega al motor de datos de mercado, así que cualquier fallo a partir de aquí tiene que ver con qué pidió y si tiene derecho a ello, no con una ruta ausente.

“Symbol is inaccessible”

Si la llamada de suscripción devuelve una respuesta de inaccesible o símbolo desconocido, normalmente intervienen dos factores. Primero, el símbolo debe ser un contrato de vencimiento más cercano real y totalmente cualificado, ESU6, no la raíz ES a secas, ni un contrato que ya venció y pasó al siguiente trimestre. Segundo, su cuenta necesita los permisos para ver esos datos: la Contract Library más una suscripción activa de datos de mercado de la bolsa. Sin ellos, una solicitud perfectamente formada sigue sin devolver nada utilizable. Es un problema distinto con su propia solución.

El socket se sigue cayendo

El WebSocket de Tradovate espera un heartbeat periódico. Si se conecta, autoriza, se suscribe y luego se queda en silencio, el servidor cierra la conexión y sus cotizaciones se detienen en seco. Envíe un frame heartbeat vacío en el intervalo que especifica Tradovate (uno corto, del orden de un par de segundos) para que el socket de datos de mercado siga abierto el tiempo que necesite los precios. Muchos reportes de “funcionó un minuto y luego murió” se remontan directamente a la falta de un heartbeat.

El token expiró a mitad de sesión

Los tokens de acceso no duran para siempre. Si su socket de datos de mercado se autorizó bien al inicio de la sesión y más tarde deja de responder, es posible que su token simplemente haya caducado. Renuévelo antes de que expire en lugar de esperar a que las llamadas fallen, y luego vuelva a autorizar el socket con el token nuevo.

Una lista de comprobación rápida para eliminar el error

Comprobación Qué confirmar
Socket correctomd/subscribeQuote va a md.tradovateapi.com (real) o md-demo.tradovateapi.com (demo), nunca al socket de cuenta.
Entorno coincidenteToken real → host de datos de mercado real; token demo → host demo.
Autorizar primeroEnvíe el frame authorize con su mdAccessToken antes de cualquier solicitud md/.
Símbolo de contrato completoUse un símbolo de vencimiento más cercano totalmente cualificado como ESU6, no la raíz ES ni un contrato vencido.
Un símbolo por llamadaEnvíe un frame de suscripción separado por contrato; no existe forma de array en bloque.
Heartbeats + tokenMantenga el socket vivo con heartbeats y renueve el token antes de que expire.

Olvídese del cableado de sockets en bruto

La mayoría de quienes se topan con Not found: md/subscribeQuote no persiguen un proyecto de proveedor de datos, solo quieren que una estrategia opere en Tradovate sin tener que vigilar dos sockets, dos tokens, heartbeats y formatos de frame. Si es su caso, hay un camino mucho más corto que programar a mano toda la capa de WebSocket.

Para los problemas que suelen aparecer justo después de este, estas guías profundizan más: si sus símbolos devuelven inaccesible en lugar de not-found, es un problema distinto de permisos y formato de símbolo; para que los precios en tiempo real fluyan en primer lugar, suscribirse a los datos de mercado en tiempo real de Tradovate es el punto de partida; y si su socket se autoriza bien y luego deja de responder en silencio, suele ser que el token de acceso de 90 minutos expira a mitad de sesión.

Olvídese del cableado de sockets en bruto

¿Quiere que su estrategia de TradingView opere en Tradovate sin cablear usted mismo un solo frame de WebSocket? Descubra cómo PickMyTrade automatiza todo el flujo de órdenes.

Comience su prueba gratuita de 7 días

Preguntas frecuentes

Porque md/subscribeQuote solo existe en el WebSocket de datos de mercado de Tradovate, no en el socket de cuenta que usa para user/syncRequest y order/placeOrder. Si envía una solicitud md/ al socket de cuenta, el servidor no tiene ninguna ruta para ella en esa conexión y devuelve Not found: md/subscribeQuote. Abra una segunda conexión al host de datos de mercado y envíe allí la suscripción.

Los datos de mercado en vivo usan wss://md.tradovateapi.com/v1/websocket y la demo usa wss://md-demo.tradovateapi.com/v1/websocket. Son hosts distintos de los sockets de cuenta. Confirme los nombres de host actuales en la documentación para desarrolladores de Tradovate antes de fijarlos en su código, ya que pueden cambiar.

La respuesta de autenticación de Tradovate devuelve dos tokens, accessToken y mdAccessToken, además de un tiempo de expiración. El mdAccessToken se emite para el feed de datos de mercado, así que úselo para autorizar el socket de datos de mercado. Cada socket necesita primero su propio frame authorize; un socket no autorizado no responde a nada.

Es un problema distinto. Una vez que la solicitud llega al motor de datos de mercado, necesita un símbolo de vencimiento más cercano válido y totalmente cualificado, además de los permisos: la Contract Library y una suscripción activa de datos de mercado de la bolsa. Sin ellos, el símbolo se devuelve inaccesible incluso con un frame correcto. En una cuenta prop o de evaluación, normalmente la firma controla esos datos.

No. Cada solicitud md/subscribeQuote admite un único símbolo. Para seguir varios contratos, envíe una solicitud de suscripción por símbolo a través del mismo socket de datos de mercado, cada una con su propio id de solicitud. Mantenga la conexión viva con heartbeats y un solo socket puede sostener muchas suscripciones de cotizaciones a la vez.

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. ni Bookmap. 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, por lo que debe confirmar siempre el proceso vigente en la documentación oficial de la plataforma antes de actuar.