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
- Was „Tradovate-WebSocket trennt ständig die Verbindung“ bedeutet
- Die häufigsten Ursachen für Tradovate-WebSocket-Abbrüche 2026
- 1. Kein Heartbeat (oder ein verspäteter)
- 2. Browser-Tabs drosseln Ihren Timer
- 3. Doppelte Request-IDs
- 4. Zu schnelles Senden von Anfragen
- 5. Das 24-Stunden-Limit erreicht oder ein abgelaufenes Token
- So beheben Sie Tradovate-WebSocket-Abbrüche: Schritt für Schritt
- Fehlende Heartbeats beheben
- Browser-Tab-Drosselung beheben
- Doppelte Request-IDs beheben
- Anfrageflut und 24-Stunden-Limit beheben
- Tabelle zur Fehlerbehebung
- Vermeiden Sie das mit PickMyTrade
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
Heartbeat-Routine nach der Autorisierung starten
Starten Sie eine Heartbeat-Routine, sobald Ihr Socket autorisiert ist.
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 [].
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.
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
Nicht allein auf setInterval verlassen
Verlassen Sie sich in einem Browser für Heartbeats nicht allein auf setInterval / setTimeout.
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.
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
Einen aufsteigenden Zähler führen
Führen Sie für das Feld i auf jedem Socket einen einzigen, streng monoton steigenden Zähler.
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.
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.
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
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.
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.
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.
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 Stille | Kein Client-Heartbeat, der Server hat die inaktive Verbindung geschlossen | Alle 2,5 s einen Heartbeat mit leerem Array [] senden |
| Feed bricht ab, sobald der Tab in den Hintergrund geht | Browser hat setInterval / setTimeout gedrosselt | Zeitstempelbasierte Heartbeats oder einen Web Worker verwenden |
| Live-Daten stoppen, aber der Socket „sieht“ verbunden aus | Server hat beim Streaming seine eigenen Heartbeats eingestellt, der Client sendete keine | Client-Heartbeats auch während des Streamings weitersenden |
| Antworten passen nicht oder Anfragen hängen | Doppelte Ganzzahlwerte für i (Request-ID) | Einen atomaren, aufsteigenden Request-ID-Zähler verwenden |
| Verbindung bricht nach einem Schwall von Frames ab | Zu viele Anfragen zu schnell gesendet | Ausgehende Anfragen in eine Warteschlange stellen und takten |
| Verbindung bricht um die 24-Stunden-Marke ab | Einzelne Verbindung über ihre Lebensdauer hinaus gehalten | Deutlich innerhalb von 24 h neu verbinden, neu autorisieren und neu abonnieren |
| Erneute Autorisierung schlägt nach einer Wiederverbindung fehl | Access-Token abgelaufen | Token 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-TestphaseHä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.