Tradovate 'Not Found: md/subscribeQuote' beheben
Ihr Auth-Ablauf funktioniert, Ihr Konto-Socket läuft, und md/subscribeQuote liefert trotzdem Not found, obwohl der Endpunkt direkt in der Dokumentation steht. Sie haben die Anfrage an den falschen WebSocket gesendet.
On This Page
- Was „Not Found“ hier tatsächlich bedeutet
- Die Ursache: Sie sind auf dem Konto-Socket, nicht auf dem Marktdaten-Socket
- Die Lösung: Einen zweiten Socket für Kurse öffnen und autorisieren
- Einmal pro Symbol abonnieren, nicht gebündelt
- Was als Nächstes bricht: Der Socket stimmt, aber es erscheinen keine Kurse
- „Symbol is inaccessible“
- Der Socket bricht immer wieder ab
- Das Token ist mitten in der Sitzung abgelaufen
- Eine kurze Checkliste zur Fehlerbehebung
- Verzichten Sie auf die manuelle Socket-Verdrahtung
Ihr Auth-Ablauf hat funktioniert, Ihr Konto-Socket läuft, und dann senden Sie ein md/subscribeQuote, um Live-Kurse zu streamen, und der Server antwortet mit Not found: md/subscribeQuote, oft verstümmelt zu etwas wie "\"Not found: md/subscribeQuote\"" mit gehäuften Escape-Zeichen. Der Endpunkt steht direkt in der Dokumentation. Warum tut Tradovate also so, als gäbe es ihn nicht?
Die Kurzfassung: Sie haben die Anfrage an den falschen WebSocket gesendet. Kursabonnements liegen nicht auf derselben Verbindung, mit der Sie Ihr Konto synchronisieren oder Orders platzieren. Korrigieren Sie den Socket, an den die Anfrage geht, und der Fehler verschwindet. Gehen wir genau durch, warum das passiert, wie Sie korrekt routen und was als Nächstes typischerweise bricht, sobald der Frame endlich ankommt.
Was „Not Found“ hier tatsächlich bedeutet
Behandeln Sie es wie ein 404 bei einem REST-Aufruf. Ein 404 sagt, dass der URL-Pfad auf diesem Server nicht existiert. Beim WebSocket von Tradovate gilt dieselbe Logik: Jeder gesendete Frame nennt einen Endpunkt, und wenn der Socket, mit dem Sie verbunden sind, diesen Endpunkt nicht bedient, antwortet der Server mit Not found und gibt den Endpunktnamen zurück.
Lesen Sie das genau, denn es schließt vieles aus. Es sagt nicht, dass Ihr Symbol falsch ist. Es sagt nicht, dass Ihr Token abgelaufen ist. Es sagt nicht, dass Ihr JSON fehlerhaft ist. Es sagt nur eines: „Für md/subscribeQuote gibt es auf dieser Verbindung keine Route.“ Und dafür gibt es genau einen häufigen Grund.
Die Ursache: Sie sind auf dem Konto-Socket, nicht auf dem Marktdaten-Socket
Tradovate betreibt zwei getrennte WebSocket-Dienste, die nicht austauschbar sind. Viele richten den ersten ein, autorisieren ihn, sehen Konto- und Orderdaten einwandfrei fließen und nehmen dann an, dass dieselbe Verbindung alles erledigt. Das tut sie nicht.
- Der Konto-/API-Socket verarbeitet Orders, Positionen, Ausführungen, Kontosynchronisierung und die übrigen Entitätsdaten. Hier gehören
user/syncRequest,order/placeOrderundaccount/listhin. Live istwss://live.tradovateapi.com/v1/websocket; Demo istwss://demo.tradovateapi.com/v1/websocket. - Der Marktdaten-Socket verarbeitet Live-Kurse, Quotes, das DOM, Charts und Histogramme. Hier liegt jeder
md/-Endpunkt, einschließlichmd/subscribeQuote,md/subscribeDOMundmd/getChart. Live istwss://md.tradovateapi.com/v1/websocket; Demo istwss://md-demo.tradovateapi.com/v1/websocket.
Senden Sie md/subscribeQuote an den Konto-Socket, gibt es schlicht keine passende Route, und es kommt Not found: md/subscribeQuote zurück. Der Konto-Socket gibt keinen Hinweis, dass Sie an der falschen Tür klopfen, er meldet den Endpunkt einfach als fehlend. Hier die vollständige Host-Übersicht, damit Sie Ihre Umgebung abgleichen können:
| Zweck | Demo / Simulation | Live |
|---|---|---|
| REST-Auth-Basis | https://demo.tradovateapi.com/v1/ | https://live.tradovateapi.com/v1/ |
| Konto-/API-Socket (user/syncRequest, order/placeOrder) | wss://demo.tradovateapi.com/v1/websocket | wss://live.tradovateapi.com/v1/websocket |
| Marktdaten-Socket (md/subscribeQuote, md/getChart) | wss://md-demo.tradovateapi.com/v1/websocket | wss://md.tradovateapi.com/v1/websocket |
Die Lösung: Einen zweiten Socket für Kurse öffnen und autorisieren
Sie verschieben Ihren Konto-Socket nicht. Sie fügen daneben einen Marktdaten-Socket hinzu. Behalten Sie die Kontoverbindung für Orders und Synchronisierung bei; öffnen Sie einen neuen WebSocket zum Marktdaten-Host für Kurse. Diese Abfolge behebt den Fehler.
Beide Token aus Ihrer Auth-Antwort entnehmen
Bei der Authentifizierung enthält die Antwort von Tradovate mehr als ein Token. Neben dem üblichen accessToken sehen Sie ein mdAccessToken und eine expirationTime. Dieses zweite Token ist keine Dekoration, es wird speziell für den Marktdaten-Feed ausgestellt. Bewahren Sie es auf.
Den Marktdaten-WebSocket öffnen
Verbinden Sie sich mit dem Marktdaten-Host, der zu Ihrer Umgebung passt: wss://md-demo.tradovateapi.com/v1/websocket, wenn Ihr Token vom Demo-Auth-Endpunkt stammt, oder wss://md.tradovateapi.com/v1/websocket, wenn es vom Live-Endpunkt stammt. Ein Live-Token mit dem Demo-Host zu kreuzen (oder umgekehrt) führt zur Abweisung, noch bevor das Abonnement relevant wird. Warten Sie auf den öffnenden o-Frame des Sockets, bevor Sie etwas senden.
Den Socket zuerst autorisieren
Diesen Schritt überspringen viele. Ein frischer Socket antwortet auf nichts, bis Sie ihn autorisieren. Der allererste gesendete Frame muss der authorize-Frame mit Ihrem Token sein, verwenden Sie für die Marktdatenverbindung das mdAccessToken. Tradovate-Frames sind zeilenweise getrennter Text, kein reines JSON: der Endpunkt, die Request-ID, eine (oft leere) Query-Zeile, dann der Body. Senden Sie den authorize-Frame, warten Sie auf die Antwort, die die Autorisierung des Sockets bestätigt, und fahren Sie erst dann fort. Wird ein Abonnement vor Abschluss dieses Handshakes gesendet, wird es nicht berücksichtigt.
Jetzt md/subscribeQuote senden
Mit geöffnetem und autorisiertem Socket hat das Abonnement endlich eine Route. Senden Sie es als Frame in derselben Form, mit einem JSON-Body, der einen einzelnen Kontrakt benennt. Sie können den Kontrakt über seinen Symbol-String (wie ESU6 für den E-mini S&P vom September 2026) oder über seine numerische Kontrakt-ID benennen, beides funktioniert. Der Server bestätigt die Anfrage und beginnt dann, Quote-Ereignisse mit Bid, Ask und Last-Preis für diesen Kontrakt zu senden. Der Fehler Not found ist verschwunden, weil der Endpunkt auf der Verbindung existiert, die Sie jetzt nutzen.
Authorize-Frame:
authorize
1
<yourMdAccessToken>
Subscribe-Frame:md/subscribeQuote
2
{"symbol":"ESU6"}
Einmal pro Symbol abonnieren, nicht gebündelt
Eine kleine Falle, die man kennen sollte: md/subscribeQuote nimmt pro Aufruf ein einzelnes Symbol entgegen. Es gibt keine Array-Form, bei der Sie eine Liste übergeben und alles auf einmal erhalten. Wenn Sie ES, NQ und CL gemeinsam verfolgen möchten, senden Sie drei separate Subscribe-Frames über denselben Marktdaten-Socket, jeweils mit eigener Request-ID. Ein Socket kann viele Live-Kursabonnements gleichzeitig tragen, Sie registrieren sie nur einzeln nacheinander. Wenn Sie mit einem Kontrakt fertig sind, kündigen Sie mit md/unsubscribeQuote, damit Sie keinen Stream empfangen, den Sie nicht mehr lesen.
Was als Nächstes bricht: Der Socket stimmt, aber es erscheinen keine Kurse
Sobald der Not-found-Fehler verschwunden ist, ist die nächste Problemklasse anderer Natur. Die Anfrage erreicht jetzt die Marktdaten-Engine, jeder weitere Fehler betrifft also was Sie angefordert haben und ob Sie dazu berechtigt sind, nicht eine fehlende Route.
„Symbol is inaccessible“
Wenn der Subscribe-Aufruf mit einer Antwort „inaccessible“ oder „unknown symbol“ zurückkommt, spielen meist zwei Dinge eine Rolle. Erstens muss das Symbol ein echter, vollständig qualifizierter Front-Month-Kontrakt sein, ESU6, nicht der bloße Root ES und nicht ein bereits abgelaufener Kontrakt, der ins nächste Quartal gerollt wurde. Zweitens benötigt Ihr Konto die Berechtigungen, diese Daten überhaupt zu sehen: die Contract Library plus ein aktives Börsen-Marktdatenabonnement. Ohne diese liefert selbst eine perfekt geformte Anfrage nichts Brauchbares. Das ist ein eigenes Problem mit eigener Lösung.
Der Socket bricht immer wieder ab
Der WebSocket von Tradovate erwartet einen periodischen Heartbeat. Wenn Sie sich verbinden, autorisieren, abonnieren und dann schweigen, schließt der Server die Verbindung und Ihre Kurse hören abrupt auf. Senden Sie einen leeren Heartbeat-Frame in dem von Tradovate vorgegebenen Intervall (ein kurzes, in der Größenordnung weniger Sekunden), damit der Marktdaten-Socket so lange offen bleibt, wie Sie Kurse benötigen. Viele Berichte vom Typ „es lief eine Minute, dann ging es kaputt“ lassen sich direkt auf einen fehlenden Heartbeat zurückführen.
Das Token ist mitten in der Sitzung abgelaufen
Access-Token halten nicht ewig. Wenn Ihr Marktdaten-Socket zu Beginn der Sitzung einwandfrei autorisiert war und später nicht mehr antwortet, ist Ihr Token möglicherweise einfach abgelaufen. Erneuern Sie es, bevor es abläuft, statt zu warten, bis Aufrufe fehlschlagen, und autorisieren Sie den Socket dann mit dem neuen Token erneut.
Eine kurze Checkliste zur Fehlerbehebung
| Prüfpunkt | Was zu bestätigen ist |
|---|---|
| Richtiger Socket | md/subscribeQuote geht an md.tradovateapi.com (live) oder md-demo.tradovateapi.com (Demo), nie an den Konto-Socket. |
| Passende Umgebung | Live-Token → Live-Marktdaten-Host; Demo-Token → Demo-Host. |
| Zuerst autorisieren | Senden Sie den authorize-Frame mit Ihrem mdAccessToken vor jeder md/-Anfrage. |
| Vollständiges Kontrakt-Symbol | Verwenden Sie ein vollständig qualifiziertes Front-Month-Symbol wie ESU6, nicht den ES-Root oder einen abgelaufenen Kontrakt. |
| Ein Symbol pro Aufruf | Senden Sie pro Kontrakt einen eigenen Subscribe-Frame; es gibt keine Bulk-Array-Form. |
| Heartbeats + Token | Halten Sie den Socket mit Heartbeats am Leben und erneuern Sie das Token vor Ablauf. |
Verzichten Sie auf die manuelle Socket-Verdrahtung
Die meisten, die auf Not found: md/subscribeQuote stoßen, verfolgen kein Datenanbieter-Projekt, sie möchten einfach, dass eine Strategie auf Tradovate handelt, ohne zwei Sockets, zwei Token, Heartbeats und Frame-Formate zu betreuen. Wenn das auf Sie zutrifft, gibt es einen deutlich kürzeren Weg, als die gesamte WebSocket-Schicht von Hand zu programmieren.
Für die Probleme, die typischerweise direkt danach auftreten, gehen diese Anleitungen tiefer: Wenn Ihre Symbole „inaccessible“ statt not-found zurückgeben, ist das ein separates Problem mit Berechtigungen und Symbolformat; um überhaupt Echtzeitkurse zu erhalten, ist das Abonnieren der Tradovate-Echtzeit-Marktdaten der Ausgangspunkt; und wenn Ihr Socket einwandfrei autorisiert und dann still nicht mehr antwortet, ist das meist das Ablaufen des 90-Minuten-Access-Tokens mitten in der Sitzung.
Verzichten Sie auf die manuelle Socket-Verdrahtung
Möchten Sie, dass Ihre TradingView-Strategie auf Tradovate handelt, ohne dass Sie selbst einen einzigen WebSocket-Frame verdrahten? Sehen Sie, wie PickMyTrade den gesamten Orderfluss automatisiert.
Starten Sie Ihre kostenlose 7-Tage-TestphaseHäufig gestellte Fragen
Weil md/subscribeQuote nur auf dem Marktdaten-WebSocket von Tradovate existiert, nicht auf dem Konto-Socket, den Sie für user/syncRequest und order/placeOrder verwenden. Senden Sie eine md/-Anfrage an den Konto-Socket, hat der Server auf dieser Verbindung keine Route dafür und gibt Not found: md/subscribeQuote zurück. Öffnen Sie eine zweite Verbindung zum Marktdaten-Host und senden Sie das Abonnement dort.
Live-Marktdaten verwenden wss://md.tradovateapi.com/v1/websocket und die Demo verwendet wss://md-demo.tradovateapi.com/v1/websocket. Das sind eigene Hosts, getrennt von den Konto-Sockets. Bestätigen Sie die aktuellen Hostnamen in der Entwicklerdokumentation von Tradovate, bevor Sie sie fest in Ihren Code übernehmen, da sie sich ändern können.
Die Auth-Antwort von Tradovate liefert zwei Token, accessToken und mdAccessToken, sowie eine Ablaufzeit. Das mdAccessToken wird für den Marktdaten-Feed ausgestellt, verwenden Sie es also, um den Marktdaten-Socket zu autorisieren. Jeder Socket benötigt zuerst seinen eigenen authorize-Frame; ein nicht autorisierter Socket antwortet auf nichts.
Das ist ein anderes Problem. Sobald die Anfrage die Marktdaten-Engine erreicht, benötigt sie ein gültiges, vollständig qualifiziertes Front-Month-Symbol sowie Berechtigungen: die Contract Library und ein aktives Börsen-Marktdatenabonnement. Ohne diese wird das Symbol trotz korrektem Frame als nicht zugänglich zurückgegeben. Bei einem Prop- oder Evaluierungskonto kontrolliert in der Regel die Firma diese Daten.
Nein. Jede md/subscribeQuote-Anfrage nimmt ein einzelnes Symbol entgegen. Um mehrere Kontrakte zu verfolgen, senden Sie pro Symbol eine Abonnement-Anfrage über denselben Marktdaten-Socket, jeweils mit eigener Request-ID. Halten Sie die Verbindung mit Heartbeats aufrecht, dann kann ein Socket viele Kursabonnements gleichzeitig halten.
Diese Anleitung dient ausschließlich Bildungs- und Informationszwecken und stellt keine Finanz-, Anlage- oder Handelsberatung dar. Der Handel mit Futures und anderen gehebelten Produkten birgt ein erhebliches Verlustrisiko und ist nicht für jeden Anleger geeignet. PickMyTrade ist eine unabhängige Automatisierungsplattform eines Drittanbieters und steht in keiner Verbindung zu Tradovate, Inc. oder Bookmap, wird von diesen weder unterstützt noch gesponsert. Alle genannten Namen, Logos und Marken sind Eigentum ihrer jeweiligen Inhaber. Funktionen und Schritte der Plattform ändern sich im Laufe der Zeit; bestätigen Sie daher stets den aktuellen Ablauf in der offiziellen Plattformdokumentation, bevor Sie handeln.