Tradovate-WebSocket-Abbruch durch Schließungscode 1006
Ihr Tradovate-WebSocket bricht mit Schließungscode 1006 ab, ganz ohne Grundtext. Hier erfahren Sie, was 1006 tatsächlich bedeutet, warum es auftritt und wie Sie Neuverbindungen zum Nicht-Ereignis machen.
Ihr Tradovate-WebSocket versorgt einen Bot problemlos mit Daten, und dann bricht er plötzlich mit Schließungscode 1006 ab. Kein Grund im Klartext, keine Schließungsnachricht, nichts in den Logs außer einer Variante von “Verbindung abnormal geschlossen.” Das ist einer der frustrierendsten Fehler in der Tradovate-Automatisierung, gerade weil 1006 Ihnen fast nichts verrät. Die gute Nachricht: Sie müssen das Rätsel so gut wie nie lösen. Ein 1006 bedeutet, dass die Verbindung ohne sauberen Handshake abgebrochen ist, und die zuverlässige Lösung besteht darin, dass sich Ihr Client sofort automatisch neu verbindet und erneut autorisiert, sobald das passiert: Heartbeats am Laufen halten, den Abbruch erkennen, einen neuen Socket aufbauen, sich erneut anmelden und neu abonnieren. Eine Bridge wie PickMyTrade erledigt genau das im Hintergrund, sodass Ihre TradingView-Alerts Tradovate weiterhin erreichen, selbst wenn ein selbstgeschriebenes Skript stumm geblieben wäre.
Schnelle Checkliste für Schließungscode 1006
- Behandeln Sie 1006 als Symptom. Es bedeutet, dass der Socket ohne Schließungs-Frame abgebrochen ist, nicht dass eine bestimmte Sache kaputt ist.
- Senden Sie Heartbeats. Schicken Sie etwa alle 2,5 Sekunden einen leeren
[]-Frame. Verpassen Sie das, trennt Sie der Server. - Verbinden Sie sich bei jeder Schließung automatisch neu. Unterscheiden Sie nicht nach dem Code. Verbinden Sie sich sowohl bei einem sauberen
1000als auch bei einem1006neu. - Autorisieren und abonnieren Sie erneut. Ein neuer Socket ist nicht authentifiziert, und Kurs- sowie User-Sync-Abonnements überstehen eine Neuverbindung nicht.
- Erneuern Sie, loggen Sie sich nicht neu ein. Das Erneuern des Tokens hält den Socket am Leben; eine komplett neue Anmeldung kann Ihre Sitzung beenden und den Abbruch verursachen.
- Nutzen Sie Backoff mit Jitter. Verteilen Sie die Versuche zeitlich und begrenzen Sie sie, damit Sie Tradovates Anfragelimits nicht auslösen.
Was „Schließungscode 1006“ bedeutet
WebSocket-Schließungscodes sind durch das Protokoll selbst definiert. Ein sauberes Beenden sendet den Code 1000 (normale Schließung) zusammen mit einem Schließungs-Frame, der den Grund erklärt. Der Code 1006 ist anders: Es handelt sich um einen reservierten Code, den Ihre WebSocket-Bibliothek vergibt, wenn die Verbindung verschwunden ist, ohne dass jemals ein Schließungs-Frame ankam. Mit anderen Worten: Die TCP-Leitung unter dem Socket ist gerissen, und keine Seite hatte die Chance, sich ordentlich zu verabschieden. Deshalb enthält 1006 nie einen menschenlesbaren Grund. Es gibt nichts zu lesen, weil die Nachricht, die ihn enthalten hätte, nie ankam.
Es hilft zu wissen, wie der Tradovate-Socket normalerweise kommuniziert. Jeder Frame, den der Server sendet, ist mit einem einzelnen führenden Zeichen gekennzeichnet: Ein o-Frame ist die open-Nachricht, die Sie in dem Moment erhalten, in dem sich der Socket verbindet, und Ihr Stichwort zum Authentifizieren; ein a-Frame trägt ein Array mit JSON-Daten (Kurse, Order-Updates, Sync-Antworten); ein h-Frame ist ein Heartbeat; und ein c-Frame ist eine geordnete close-Meldung. Wenn Tradovate absichtlich schließt, sendet es c[1000,“...”] mit einer Nachricht, die den Grund nennt. Ein 1006 ist das Gegenteil dieses ordentlichen c: gar kein Schließungs-Frame, nur ein toter Socket und der Code der Bibliothek für abnormale Schließung.
Hören Sie also auf, nach einer Nachricht zu suchen, die nie kommen wird, und fragen Sie stattdessen, was die TCP-Verbindung unter einem langlebigen Socket gekappt haben könnte. In dieser kurzen Liste steckt jede echte Lösung.
Die häufigsten Ursachen für Schließungscode 1006 im Jahr 2026
1. Verpasste Heartbeats (die 2,5-Sekunden-Regel)
Das ist die Ursache, die am häufigsten übersehen wird. Nachdem Ihr authorize-Frame akzeptiert wurde, erwartet der Tradovate-Socket einen stetigen Heartbeat von Ihrem Client: ein leeres JSON-Array, buchstäblich als [] geschrieben, gesendet etwa alle 2,5 Sekunden. Diese winzigen Frames beweisen, dass die Verbindung lebt. Bleiben sie aus, kann der Server stillschweigend aufhören, Daten zu senden, oder die Verbindung kappen, was auf Ihrer Seite als 1006 ankommt. Wenn sich Ihre Verbindungsabbrüche nach einer Pause in Ihrem Code oder einer überlasteten Event-Loop häufen, verdächtigen Sie zuerst den Heartbeat.
2. Drosselung von Browser-Tabs
Wenn Ihr Socket in einem Browser läuft, gibt es eine fiese Falle. Wenn der Tab mit Ihrer App nicht der aktive Tab ist, senken Chrome und andere Browser die Priorität von setInterval und setTimeout. Ihr 2,5-Sekunden-Heartbeat rutscht auf mehrere Sekunden Abstand, der Server sieht eine stockende Verbindung, und der Socket schließt mit 1006 in dem Moment, in dem Sie den Tab wechseln. Die Lösung besteht darin, die Heartbeat-Schleife in einem Web Worker laufen zu lassen (Worker werden nicht auf dieselbe Weise gedrosselt) oder das Ganze als Node-Prozess komplett außerhalb des Browsers auszuführen.

3. Timeouts durch inaktive Proxys, NAT oder Firewalls
Alles, was zwischen Ihrer Maschine und Tradovate sitzt, kann eine Verbindung kappen, die es für ruhig hält. Unternehmens-Proxys, Load Balancer, NAT-Tabellen und Heimrouter trennen inaktive TCP-Verbindungen häufig nach 30 bis 120 Sekunden, und dabei senden sie selten einen Schließungs-Frame. Das ist der Lehrbuch-1006, und ein passend getakteter Heartbeat sorgt dafür, dass die Verbindung aktiv genug wirkt, um das zu überstehen.
4. Ablaufender Token oder eine zweite Anmeldung, die Ihre Sitzung stiehlt
Ein Tradovate-Zugriffstoken lebt etwa 90 Minuten, und lässt man ihn ablaufen, während der Socket verbunden ist, kann das die Verbindung kappen. Schlimmer noch: Tradovate erlaubt pro Konto nur zwei gleichzeitige Sitzungen, und das Erstellen einer dritten schließt die älteste. Wenn ein anderes Skript, ein manueller Test oder ein neuer Login-Vorgang für dasselbe Konto einen neuen Token anfordert, kann das die Sitzung beenden, auf der Ihr Socket reitet, was wieder als 1006 auftaucht. Das sichere Muster besteht darin, den Token per Timer zu erneuern, statt sich erneut anzumelden, wodurch die bestehende Sitzung und damit der Socket am Leben bleiben.
5. Netzwerkinstabilität und Reconnect-Stürme
Auch einfache Netzwerkabbrüche verursachen 1006: eine wacklige WLAN-Verbindung, ein VPS mit einem lauten Nachbarn, ein kurzer ISP-Ausfall. Das lässt sich nicht vermeiden. Die Falle liegt darin, wie Sie reagieren. Wenn Ihre Reconnect-Logik in einer engen Schleife feuert, sobald sie eine Schließung sieht, können Sie Tradovates Endpunkt mit Verbindungsversuchen überfluten, dessen Anfrage-Strafe auslösen und aus einem zweisekündigen Aussetzer eine mehrminütige Sperre machen. Backoff ist hier nicht optional.
So beheben Sie Schließungscode 1006: Schritt für Schritt
Kapseln Sie den Socket und verbinden Sie sich bei jeder Schließung neu
Übernehmen Sie den gesamten Lebenszyklus
Platzieren Sie Ihren WebSocket in einer Klasse oder Funktion, die den gesamten Lebenszyklus übernimmt: Verbinden, Autorisieren, Abonnieren, Heartbeat und Abbau.
Hängen Sie einen einzigen Close-Handler an
Hängen Sie einen einzigen Close-Handler an, der bei jeder Schließung auslöst, sauber oder abnormal. Unterscheiden Sie nicht nach dem Code. Ein 1000 und ein 1006 bedeuten beide: “Der Socket ist weg, bauen Sie ihn neu auf.”
Räumen Sie den toten Socket auf und planen Sie eine Neuverbindung
Verwerfen Sie bei der Schließung alle Referenzen auf den toten Socket, löschen Sie dessen Heartbeat-Timer und planen Sie eine Neuverbindung. Verwenden Sie niemals ein geschlossenes Socket-Objekt wieder.
Sichern Sie Ihren Zustand, bevor der Abbau erfolgt
Bevor Sie ihn abbauen, sichern Sie den Zustand, den Sie zum Wiederherstellen brauchen: welche Kontrakte Sie abonniert hatten, ob eine User-Sync-Anfrage offen war, und Ihren aktuellen Token.
Halten Sie den Heartbeat am Leben
Starten Sie den Heartbeat nach der Autorisierung
Sobald Ihr authorize-Frame akzeptiert wurde, beginnen Sie, alle 2,5 Sekunden einen leeren []-Frame zu senden.
Verlagern Sie Browser-Timer in einen Web Worker
Wenn Sie sich in einem Browser befinden, verlagern Sie diesen Timer in einen Web Worker, damit ein Hintergrund-Tab ihn nicht drosseln kann. Unter Node reicht ein einfaches Intervall.
Beobachten Sie auch die Gegenseite
Beobachten Sie auch die Gegenseite. Wenn mehr als ein paar Sekunden lang gar kein Frame vom Server kommt, behandeln Sie die Verbindung als tot und erzwingen Sie eine Neuverbindung, statt zu warten.

Autorisieren und abonnieren Sie den neuen Socket erneut
Warten Sie auf den Open-Frame
Warten Sie auf den o-Open-Frame beim neuen Socket. Erst dann ist er bereit für die Authentifizierung.
Senden Sie den Authorize-Frame erneut
Senden Sie den authorize-Frame erneut mit einem gültigen Zugriffstoken, formatiert genau wie in der aktuellen API-Dokumentation angegeben (das Schlüsselwort request, eine id, dann der Token, mit den korrekten Leerzeilen-Trennzeichen).
Spielen Sie jedes Abonnement erneut ab
Sobald die Autorisierung erfolgreich ist, spielen Sie jedes Abonnement aus Ihrem gespeicherten Zustand erneut ab: Kurs-Abonnements, User-Sync-Anfragen und alles andere, was der alte Socket trug.
Gleichen Sie nach der Lücke ab
Gleichen Sie nach der Lücke ab. Rufen Sie aktuelle Positionen und offene Orders ab, damit Ihre Ansicht der Realität entspricht, da während der Trennung Ereignisse ausgelöst worden sein könnten.
Erneuern Sie den Token per Timer, statt eine neue Sitzung zu starten
Speichern Sie die Ablaufzeit und setzen Sie einen Erneuerungs-Timer
Speichern Sie beim ersten Login die Ablaufzeit des Tokens und setzen Sie einen Timer, um ihn etwa 15 Minuten vor Ablauf zu erneuern.
Erneuern Sie über den Renew-Endpunkt
Erneuern Sie über den Renew-Endpunkt, der Ihre Sitzung verlängert, ohne dass eine neue Anmeldung nötig ist. Der verbundene Socket arbeitet ohne weiteres Zutun weiter.
Starten Sie niemals eine zweite Anmeldung
Starten Sie niemals eine komplett neue Anmeldung für ein Konto, das bereits einen aktiven Socket hat. Das kann Sie über das Zwei-Sitzungen-Limit hinaustreiben und genau den Socket kappen, den Sie schützen wollen.

Backoff mit Jitter anwenden
Beginnen Sie mit ein bis zwei Sekunden
Warten Sie bei der ersten Neuverbindung ein bis zwei Sekunden. Verdoppeln Sie die Verzögerung bei jedem weiteren Fehlschlag ungefähr.
Fügen Sie einen kleinen Zufallsversatz hinzu
Fügen Sie jeder Verzögerung einen kleinen Zufallsversatz hinzu, damit nicht viele Clients gleichzeitig auf demselben Takt erneut versuchen und den Endpunkt gemeinsam bombardieren.
Begrenzen Sie das Maximum
Begrenzen Sie das Maximum auf 30 bis 60 Sekunden. Ein gedeckelter, mit Jitter versehener Backoff erholt sich schnell von einem Aussetzer, ohne zu einer selbst verursachten Rate-Limit-Sperre zu werden.
Fehlerbehebungstabelle
| Symptom | Wahrscheinliche Ursache | Lösung |
|---|---|---|
| 1006 innerhalb von Sekunden nach einem Browser-Tab-Wechsel | Gedrosselter Heartbeat-Timer in einem Hintergrund-Tab | Führen Sie den []-Heartbeat in einem Web Worker oder auf Node aus |
| 1006 nach einer Code-Pause oder überlasteten Schleife | Heartbeat länger als ~2,5 Sekunden ausgeblieben | Senden Sie [] auf einem zuverlässigen 2,5-Sekunden-Intervall, zusätzlich bei eingehenden Frames |
| 1006 nach 30 bis 120 Sekunden Ruhe | Proxy, NAT oder Firewall hat eine inaktive TCP-Verbindung getrennt | Halten Sie Heartbeats am Laufen, damit die Verbindung nie inaktiv wirkt |
| 1006 genau um die 90-Minuten-Marke | Zugriffstoken abgelaufen | Erneuern Sie den Token ~15 Minuten vor Ablauf |
| 1006 in dem Moment, in dem Sie sich anderswo anmelden | Neue Sitzung hat Sie über das 2-Sitzungen-Limit gebracht | Erneuern statt neu anmelden; eine Sitzung pro Konto |
| 1006-Stürme, gefolgt von einer langen Sperre | Enge Reconnect-Schleife hat die Anfrage-Strafe ausgelöst | Exponentieller Backoff mit Jitter, gedeckelt bei 30 bis 60s |
Verhindern Sie das mit PickMyTrade
Eine Reconnect-Schicht, ein drosselresistenter Heartbeat, eine Token-Erneuerung und eine Abonnement-Wiedergabe sind eine Menge Installationsarbeit, die man von Hand richtig hinbekommen muss, und ein einziger übersehener Grenzfall lässt Ihre Orders im schlimmsten Moment fallen. PickMyTrade sitzt zwischen TradingView und Tradovate und übernimmt das alles für Sie:
- Verwaltete WebSocket-Verbindungen mit automatischer Neuverbindung und Reautorisierung, sodass ein 1006 zu einem kurzen Aussetzer statt einem Ausfall wird.
- Dauerhaft aktive Heartbeats, die serverseitig laufen, weit entfernt von der Drosselung durch Browser-Tabs.
- Automatische Token-Erneuerung und eine saubere Sitzung pro Konto, damit ein 90-Minuten-Ablauf oder eine versehentliche zweite Anmeldung Sie nie offline schickt.
- Rate-Limit-sichere Neuverbindungen mit sinnvollem Backoff, sodass die Wiederherstellung nie zu einer Anfrage-Strafsperre wird.
Der Lohn: Ihre TradingView-Alerts erreichen Tradovate zuverlässig, ohne dass Sie auch nur eine einzige Zeile WebSocket-Lebenszyklus-Code schreiben oder überwachen müssen.
Lassen Sie sich von einem 1006 nie offline schicken
PickMyTrade übernimmt die Reconnect-, Reautorisierungs- und Heartbeat-Logik für Sie, sodass ein abgebrochener Tradovate-WebSocket Sie eine Sekunde kostet, nicht eine Sitzung.
Starten Sie Ihre kostenlose 5-Tage-TestphaseHäufig gestellte Fragen
Code 1006 ist eine abnormale Schließung. Die zugrunde liegende TCP-Verbindung ist abgebrochen, ohne dass eine der beiden Seiten einen ordentlichen WebSocket-Schließungs-Frame gesendet hat, sodass Ihre Bibliothek 1006 ohne Grundtext meldet. Es ist ein Symptom, keine Grundursache: Etwas unterhalb der WebSocket-Schicht (ein Timeout, ein Reset, ein verpasster Heartbeat oder ein Netzwerkausfall) hat die Leitung gekappt, bevor eine saubere 1000-Schließung stattfinden konnte.
Die üblichen Auslöser sind verpasste Heartbeats (Tradovate erwartet etwa alle 2,5 Sekunden einen leeren Array-Frame), ein inaktiver Proxy oder eine Firewall, die die TCP-Verbindung timeoutet, ein ablaufender oder durch eine zweite Anmeldung ungültig gewordener Zugriffstoken, oder schlicht Netzwerkinstabilität auf einem VPS oder einer Heimverbindung. Da 1006 den genauen Grund verbirgt, besteht die praktische Lösung darin, automatisch neu zu verbinden und zu reautorisieren, statt einer einzelnen Ursache nachzujagen.
Etwa alle 2,5 Sekunden. Sobald Ihr Authorize-Frame akzeptiert wurde, sollte der Client in diesem Intervall einen leeren JSON-Array-Frame senden, geschrieben als []. Bleiben diese Heartbeats aus, kann der Server aufhören, Daten zu senden, oder die Verbindung direkt schließen, was auf Ihrer Seite oft als 1006 erscheint.
Ja. Ein komplett neuer Socket startet unauthentifiziert. Nachdem er sich geöffnet hat, müssen Sie den Authorize-Frame mit einem gültigen Zugriffstoken erneut senden und dann jedes Abonnement erneut übertragen (Kurse, User-Sync und so weiter). Abonnements und Autorisierung werden vom gerade abgestorbenen Socket nicht übernommen.
Das Erneuern nicht. Der Aufruf des Renew-Endpunkts hält Ihre bestehende Sitzung gültig, und der bereits verbundene Socket bleibt ohne weiteres Zutun aktiv. Was ihn trennt, ist die Anforderung eines komplett neuen Tokens über eine neue Anmeldung: Tradovate erlaubt nur zwei gleichzeitige Sitzungen, sodass eine neue Sitzung die ältere beenden kann, auf der Ihr Socket reitet, und Sie einen 1006 sehen.
Chrome und andere Browser drosseln setInterval und setTimeout in inaktiven Tabs, um Energie zu sparen. Diese Drosselung verzögert Ihren 2,5-Sekunden-Heartbeat, der Server sieht eine stockende Verbindung, und der Socket schließt mit 1006. Wenn Sie den Heartbeat in einem Web Worker oder auf einem Node-Prozess statt in einem Hintergrund-Tab laufen lassen, umgehen Sie die Drosselung.
Verwenden Sie exponentiellen Backoff mit etwas zufälligem Jitter. Beginnen Sie bei etwa ein bis zwei Sekunden, verdoppeln Sie die Verzögerung bei jedem gescheiterten Versuch ungefähr, fügen Sie einen kleinen Zufallsversatz hinzu, damit nicht viele Clients im Gleichschritt erneut versuchen, und begrenzen Sie das Maximum auf 30 bis 60 Sekunden. Eine Neuverbindung in einer engen Schleife kann Tradovates Anfrage-Strafe auslösen und den Ausfall länger dauern lassen.
Keine Verbindung ist immun gegen 1006, weil Netzwerke, Proxys und Server gelegentlich langlebige Sockets trennen. Das Ziel ist nicht, es zu eliminieren, sondern es zum Nicht-Ereignis zu machen: Heartbeats am Laufen halten, die Schließung sofort erkennen, mit Backoff neu verbinden und reautorisieren, und neu abonnieren. Richtig gemacht kostet Sie ein 1006 ein bis zwei Sekunden, statt Ihren Bot offline zu nehmen.
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 Drittanbieter-Automatisierungsplattform und steht in keiner Verbindung zu Tradovate, Inc. oder Bookmap und wird von diesen weder unterstützt noch gesponsert. Alle zugehörigen Namen, Logos und Marken sind Eigentum ihrer jeweiligen Inhaber. Funktionen und Abläufe der Plattform ändern sich mit der Zeit, bestätigen Sie den aktuellen Prozess daher immer in der offiziellen Plattformdokumentation, bevor Sie handeln.