Tradovate API

Tradovate-WebSocket bricht ab: Heartbeats & 24-h-Limit

Ein Tradovate-Socket, der ständig die Verbindung verliert, geht fast immer auf drei behebbare Fehler zurück: fehlende Heartbeats, doppelte Request-IDs und eine Verbindung, die länger als 24 Stunden offen gehalten wird. Hier ist jede Ursache mit der genauen Lösung.

On This Page

Streamen Sie Live-Kurse von ES oder NQ in eine automatisierte Strategie, und ein Tradovate-WebSocket, der sich stillschweigend trennt, kann eine Position minutenlang unbeaufsichtigt lassen, bevor Sie es überhaupt bemerken. Tradovates Echtzeit-Socket ist unerbittlich. Der Server schließt eine inaktive Verbindung innerhalb von etwa 10 Sekunden, wenn er nichts mehr von Ihrem Client hört, und eine einzelne Verbindung hat eine harte Lebensdauer, die in Stunden und nicht in Tagen gemessen wird. Wenn ein Tradovate-WebSocket ständig abbricht, liegt es fast immer an drei behebbaren Fehlern, nämlich fehlenden Heartbeats, doppelten Request-IDs und einer Verbindung, die über das 24-Stunden-Limit hinaus offen gehalten wird, plus einem vierten, der Überflutung des Sockets mit Anfragen. Unten finden Sie jede Ursache, die genaue Lösung und wie Sie mit der Weiterleitung Ihrer Alerts über PickMyTrade die rohe Socket-Verwaltung ganz umgehen.

Kurz-Checkliste bei Tradovate-WebSocket-Abbrüchen

  • Senden Sie alle 2,5 Sekunden einen Heartbeat, einen Frame mit einem leeren Array [], vom Client gesendet, hält den Socket offen.
  • Verlassen Sie sich in einem Browser-Tab nicht auf setInterval, Hintergrund-Tabs drosseln Timer und lassen Ihren Heartbeat verhungern. Verwenden Sie eine Zeitstempelprüfung oder einen Web Worker.
  • Geben Sie jeder Anfrage eine eindeutige, aufsteigende i (Request-ID), verwenden Sie auf demselben Socket niemals eine Ganzzahl-ID erneut.
  • Takten Sie Ihre Anfragen, zu viele Frames in zu kurzer Zeit lösen eine serverseitige Trennung aus.
  • Verbinden Sie sich vor Ablauf von ca. 24 Stunden neu, ein einzelner Tradovate-WebSocket ist nicht für unbegrenzte Lebensdauer gedacht, planen Sie daher eine saubere Wiederverbindung ein.
  • Erneuern Sie das Access-Token vor dem Ablauf, ein abgelaufenes Token bedeutet, dass Ihre erneute Autorisierung bei der Wiederverbindung fehlschlägt.

Was „Tradovate-WebSocket trennt ständig die Verbindung“ bedeutet

Das WebSocket-Protokoll von Tradovate ist von Haus aus gesprächig. Nachdem Sie den Socket geöffnet haben, sendet der Server einen Open-Frame (o), Sie senden einen Authorize-Frame mit Ihrem Access-Token, und von da an wird erwartet, dass beide Seiten weiter kommunizieren. Wenn der Server etwa 10 Sekunden lang nichts von Ihrem Client hört, geht er davon aus, dass die Verbindung tot ist, und schließt sie. Deshalb bricht ein Socket, der “eben noch funktionierte”, in dem Moment ab, in dem Ihr Code keine Frames mehr sendet.

Hier ist der Haken, der die meisten Entwickler überrascht: Sobald Sie einen Live-Datenfeed abonnieren, sendet der Server keine eigenen Heartbeat-Frames mehr, weil die Streaming-Nachrichten selbst beweisen, dass die Verbindung aktiv ist. Ihr Client muss jedoch weiterhin beweisen, dass er aktiv ist. Wird Ihr Datenfeed ruhig, etwa in einer langsamen Nachtsitzung oder bei einem wenig gehandelten Symbol, und Ihr Client sendet keine eigenen Heartbeats, schließt der Server den Socket, obwohl nichts “falsch” ist.

Zusätzlich zum Inaktivitäts-Timeout führt eine einzelne Verbindung, die länger als 24 Stunden offen gehalten wird, zu Trennungen. Selbst ein perfekt funktionierender Client, der Heartbeats sendet, wird also irgendwann getrennt, wenn er sich nie neu verbindet. Diese beiden Uhren zu verstehen, den Inaktivitäts-Timer von ca. 10 Sekunden und die Verbindungsobergrenze von ca. 24 Stunden, ist der Schlüssel zu einem stabilen Feed.

Die häufigsten Ursachen für Tradovate-WebSocket-Abbrüche 2026

1. Kein Heartbeat (oder ein verspäteter)

Das ist die Ursache Nummer eins. Ihr Client ist dafür verantwortlich, alle 2,5 Sekunden einen Heartbeat zu senden, einen Frame, dessen Text genau [] lautet, um nicht wegen Inaktivität geschlossen zu werden. Verpassen Sie das Zeitfenster, schließt sich der Socket.

2. Browser-Tabs drosseln Ihren Timer

Läuft Ihre App in einem Browser und steuern Sie Heartbeats mit setInterval oder setTimeout, werden die Timer eines inaktiven oder im Hintergrund laufenden Tabs vom Browser gedrosselt. Ihre Heartbeats kommen verspätet oder bleiben ganz aus, und der Socket stirbt “ohne Grund”, sobald Sie den Tab wechseln.

3. Doppelte Request-IDs

Jede Anfrage, die Sie senden, trägt im Feld i eine Ganzzahl-ID. Senden Sie zwei Anfragen mit demselben i auf demselben Socket, bringen Sie die Zuordnung von Anfrage und Antwort durcheinander, was die Verbindung unterbrechen oder Sie ewig auf eine Antwort warten lassen kann, die nie sauber aufgelöst wird.

4. Zu schnelles Senden von Anfragen

Wenn Sie einen Schwall von Frames auf den Socket abfeuern, etwa Dutzende Symbole in einer engen Schleife abonnieren oder Ordermodifikationen im Dauerfeuer senden, können Sie den Flood-Schutz von Tradovate auslösen und eine Trennung verursachen.

5. Das 24-Stunden-Limit erreicht oder ein abgelaufenes Token

Eine Verbindung, die länger als etwa 24 Stunden offen gehalten wird, wird getrennt. Ähnlich verhält es sich mit dem Access-Token Ihrer Sitzung, das abläuft (Tradovate-Access-Tokens sind kurzlebig, in der Größenordnung von 90 Minuten). Versuchen Sie, einen neu verbundenen Socket mit einem veralteten Token erneut zu autorisieren, schlägt die Authentifizierung fehl und Sie bleiben getrennt.

So beheben Sie Tradovate-WebSocket-Abbrüche: Schritt für Schritt

Fehlende Heartbeats beheben

1

Heartbeat-Routine nach der Autorisierung starten

Starten Sie eine Heartbeat-Routine, sobald Ihr Socket autorisiert ist.

2

Das leere Array im 2,5-Sekunden-Takt senden

Senden Sie alle 2,5 Sekunden (2500 ms) mit der Standardmethode send des WebSockets einen Frame mit einem leeren Array [].

3

Auch beim Streaming weitersenden

Senden Sie Heartbeats weiter, auch während des Streamings von Marktdaten, und gehen Sie nicht davon aus, dass die Stille des Servers eine intakte Verbindung bedeutet. Fließen Live-Daten, sendet der Server keine eigenen Heartbeats mehr, sodass Ihre das Einzige sind, was den Socket in ruhigen Phasen offen hält.

4

Als Fire-and-Forget behandeln

Behandeln Sie den Heartbeat als Fire-and-Forget. Er trägt keine Request-ID und erwartet keine Antwort.

Browser-Tab-Drosselung beheben

1

Nicht allein auf setInterval verlassen

Verlassen Sie sich in einem Browser für Heartbeats nicht allein auf setInterval / setTimeout.

2

Einen zeitstempelbasierten Ansatz verwenden

Verwenden Sie stattdessen einen zeitstempelbasierten Ansatz: Erfassen Sie bei jeder eingehenden Nachricht die aktuelle Zeit und vergleichen Sie sie mit dem Zeitpunkt des letzten Heartbeats. Sind mehr als 2500 ms vergangen, senden Sie sofort einen Heartbeat-Frame.

3

Den Timer vom Hauptthread auslagern

Verlagern Sie den Timer bei Apps, die lange Phasen ohne eingehende Daten in einem Hintergrund-Tab überstehen müssen, in einen Web Worker (der nicht auf dieselbe Weise gedrosselt wird), oder betreiben Sie den Socket in einem serverseitigen Node.js-Prozess, in dem es das Konzept eines inaktiven Tabs gar nicht gibt.

Doppelte Request-IDs beheben

1

Einen aufsteigenden Zähler führen

Führen Sie für das Feld i auf jedem Socket einen einzigen, streng monoton steigenden Zähler.

2

Niedrige IDs für die Einrichtung reservieren

Reservieren Sie die niedrigen IDs, die das Protokoll für die Einrichtung verwendet (Autorisierung und die erste Sync-Anfrage), und starten Sie Ihren allgemeinen Zähler oberhalb davon.

3

Atomar erhöhen

Erhöhen Sie den Zähler atomar, damit zwei asynchrone Aufgaben nie denselben Wert erhalten. Sichern Sie den Zähler in Multithread- oder stark nebenläufigem Code mit einem Lock, einer Closure oder einer threadsicheren Struktur.

4

Bei Wiederholung nie eine ID erneut verwenden

Vergeben Sie nie von Hand dieselbe ID zweimal. Wenn Sie eine Anfrage wiederholen, geben Sie der Wiederholung eine neue ID.

Anfrageflut und 24-Stunden-Limit beheben

1

Ausgehende Frames drosseln

Reihen Sie Ihre Anfragen in eine Warteschlange ein und geben Sie sie in gleichmäßigem Tempo frei, statt sie als Schwall zu senden. Abgestufte Abonnements und Order-Aktionen halten Sie unter der Toleranz des Sockets.

2

Eine proaktive Wiederverbindung planen

Warten Sie nicht auf die Trennung nach ca. 24 Stunden. Verbinden Sie sich nach Ihrem eigenen Zeitplan neu (deutlich innerhalb von 24 Stunden), senden Sie den Authorize-Frame erneut und abonnieren Sie Ihre Feeds erneut, damit der Wechsel reibungslos verläuft.

3

Zuerst das Token erneuern

Verfolgen Sie den Ablauf Ihres Access-Tokens und erneuern Sie es, bevor es abläuft, damit die erneute Autorisierung bei der Wiederverbindung immer ein gültiges Token verwendet. Die genauen Token-Laufzeiten legt Tradovate fest und sie können sich ändern. Prüfen Sie die aktuelle API-Dokumentation, anstatt eine Zahl fest zu codieren.

4

Bei jedem unerwarteten Schließen automatisch wiederherstellen

Behandeln Sie jedes unerwartete Schließen als Fehler und stellen Sie die Verbindung automatisch wieder her. Sofern Sie nicht absichtlich herunterfahren, öffnen Sie den Socket erneut, autorisieren Sie sich neu und abonnieren Sie automatisch erneut. Fügen Sie ein Timeout für ausstehende Antworten hinzu, damit eine festhängende Anfrage nie Ihren gesamten Client blockiert.

Tabelle zur Fehlerbehebung

Symptom / Fehler Was es bedeutet Lösung
Socket schließt sich nach ca. 10 Sekunden StilleKein Client-Heartbeat, der Server hat die inaktive Verbindung geschlossenAlle 2,5 s einen Heartbeat mit leerem Array [] senden
Feed bricht ab, sobald der Tab in den Hintergrund gehtBrowser hat setInterval / setTimeout gedrosseltZeitstempelbasierte Heartbeats oder einen Web Worker verwenden
Live-Daten stoppen, aber der Socket „sieht“ verbunden ausServer hat beim Streaming seine eigenen Heartbeats eingestellt, der Client sendete keineClient-Heartbeats auch während des Streamings weitersenden
Antworten passen nicht oder Anfragen hängenDoppelte Ganzzahlwerte für i (Request-ID)Einen atomaren, aufsteigenden Request-ID-Zähler verwenden
Verbindung bricht nach einem Schwall von Frames abZu viele Anfragen zu schnell gesendetAusgehende Anfragen in eine Warteschlange stellen und takten
Verbindung bricht um die 24-Stunden-Marke abEinzelne Verbindung über ihre Lebensdauer hinaus gehaltenDeutlich innerhalb von 24 h neu verbinden, neu autorisieren und neu abonnieren
Erneute Autorisierung schlägt nach einer Wiederverbindung fehlAccess-Token abgelaufenToken vor dem Ablauf erneuern, dann Authorize erneut senden

Vermeiden Sie das mit PickMyTrade

Wenn Sie Automatisierung nur einrichten, um Orders in Tradovate zu bekommen, müssen Sie möglicherweise gar keinen rohen WebSocket verwalten. PickMyTrade nimmt Ihre TradingView-Alerts entgegen und liefert sie für Sie an Tradovate aus, sodass Heartbeat-Timing, Request-ID-Hygiene und Wiederverbindungslogik auf unserer Seite liegen:

  • Verwaltete Verbindungsstabilität, die Verbindung zu Tradovate wird für Sie aufrechterhalten und neu aufgebaut, sodass Heartbeat-Lücken und die 24-Stunden-Obergrenze Ihre Strategie nie erreichen.
  • Ratenlimit-sicheres Routing, Alerts werden getaktet und in eine Warteschlange gestellt, damit ein Schwall von Signalen den Socket nie bis zur Trennung überflutet.
  • Token- & Sitzungsverwaltung, Authentifizierung und Erneuerung werden im Hintergrund verwaltet, sodass ein abgelaufenes Token Ihre Automatisierung nie unbemerkt lahmlegt.
  • Multi-Account-Synchronisierung, ein Alert wird sauber auf mehrere Tradovate-Konten gespiegelt, ohne dass Sie einen Socket pro Konto jonglieren müssen.

Handeln ohne Ablehnungen

Starten Sie Ihre kostenlose 7-Tage-Testphase, verknüpfen Sie noch heute Ihre Alerts und handeln Sie ohne Ablehnungen.

Starten Sie Ihre kostenlose 7-Tage-Testphase

Häufig gestellte Fragen

Alle 2,5 Sekunden. Der Client sendet einen Frame mit einem leeren Array []. Wenn der Server etwa 10 Sekunden lang nichts von Ihrem Client hört, schließt er den Socket wegen Inaktivität.

Er besteht einfach aus dem Text [], einem leeren JSON-Array, das mit der Standardmethode send des WebSockets gesendet wird. Er hat keine Request-ID und erwartet keine Antwort.

Browser drosseln setInterval und setTimeout in Hintergrund-Tabs, sodass timergesteuerte Heartbeats verspätet eintreffen und der Socket in ein Timeout läuft. Verwenden Sie eine Zeitstempelprüfung bei eingehenden Nachrichten oder verlagern Sie den Timer in einen Web Worker, damit Heartbeats auch bei inaktivem Tab weiter gesendet werden.

Ja. Sobald Sie einen Datenfeed abonnieren, sendet der Server keine eigenen Heartbeats mehr, weil die Streaming-Nachrichten beweisen, dass die Verbindung aktiv ist, aber Ihr Client muss trotzdem nachweisen, dass er aktiv ist. In ruhigen Phasen ohne eingehende Daten sind Ihre Heartbeats das Einzige, was den Socket offen hält.

Jede Anfrage trägt eine Ganzzahl i, und Antworten werden anhand dieser ID zugeordnet. Wird eine ID auf demselben Socket erneut verwendet, gerät diese Zuordnung durcheinander, was Anfragen hängen lassen oder die Verbindung trennen kann. Verwenden Sie einen einzigen atomaren Zähler, der für jede Anfrage hochzählt.

Ja. Wird eine Verbindung länger als etwa 24 Stunden offen gehalten, führt das zu einer Trennung. Das zuverlässige Muster besteht darin, nach einem eigenen Zeitplan deutlich innerhalb von 24 Stunden neu zu verbinden, sich erneut zu autorisieren und erneut zu abonnieren, anstatt zu erwarten, dass ein einzelner Socket ewig lebt.

Ihr Access-Token ist wahrscheinlich abgelaufen. Tradovate-Access-Tokens sind kurzlebig. Erneuern Sie das Token also, bevor es abläuft, und senden Sie bei jeder Wiederverbindung den Authorize-Frame mit einem gültigen Token erneut. Die genauen Token-Laufzeiten legt Tradovate fest und sie können sich ändern. Prüfen Sie sie daher in der aktuellen API-Dokumentation.

Wenn Ihr Ziel einfach darin besteht, Tradovate-Orders aus TradingView zu automatisieren, nutzen Sie eine Brücke wie PickMyTrade, damit Verbindungsstabilität, Taktung und Token-Verwaltung für Sie übernommen werden, statt selbst einen rohen Socket zu betreiben.

Dieser Leitfaden dient ausschließlich Bildungs- und Informationszwecken und stellt weder Finanz-, Anlage- noch 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., wird weder von Tradovate, Inc. unterstützt noch gesponsert. „Tradovate“ sowie alle zugehörigen Namen, Logos und Marken sind Eigentum ihrer jeweiligen Inhaber. Funktionen und Schritte der Plattform ändern sich im Laufe der Zeit. Prüfen Sie daher stets den aktuellen Ablauf in der offiziellen Tradovate-Plattform und -Dokumentation, bevor Sie handeln.