Tradovate API

Disconnessione WebSocket di Tradovate: codice di chiusura 1006

Il suo WebSocket Tradovate muore con il codice di chiusura 1006, senza alcun testo esplicativo. Ecco cosa significa realmente il codice 1006, perché si attiva e come fare in modo che le riconnessioni passino inosservate.

Verificato dal Trading Systems Team di PickMyTrade Ultimo aggiornamento
· Lettura di 7 minuti
Pannello Rete degli Strumenti per sviluppatori del browser che mostra un WebSocket di Tradovate che si chiude con il codice 1006 e senza frame di chiusura

Il suo WebSocket Tradovate sta alimentando felicemente un bot e, all'improvviso, si interrompe con il codice di chiusura 1006. Nessun testo del motivo, nessun messaggio di chiusura, nulla nei log a parte qualche variante di “connessione chiusa in modo anomalo.” È uno dei fallimenti più frustranti nell'automazione di Tradovate proprio perché il 1006 non le dice quasi nulla. La buona notizia: raramente è necessario risolvere il mistero. Un 1006 significa che la connessione è morta senza un handshake pulito, e la soluzione affidabile è far sì che il suo client si riconnetta e si riautorizzi automaticamente nell'istante in cui accade: mantenere attivi gli heartbeat, individuare la caduta, avviare un nuovo socket, effettuare nuovamente l'accesso e riabbonarsi. Un bridge come PickMyTrade fa esattamente questo dietro le quinte, in modo che i suoi avvisi di TradingView continuino a raggiungere Tradovate anche quando uno script grezzo sarebbe rimasto muto.

Lista di controllo rapida per il codice di chiusura 1006

  • Consideri il 1006 come un sintomo. Significa che il socket è caduto senza un frame di chiusura, non che un elemento specifico sia rotto.
  • Invii heartbeat. Invii un frame vuoto [] circa ogni 2,5 secondi. Se li salta, il server la disconnette.
  • Si riconnetta automaticamente a ogni chiusura. Non faccia distinzioni in base al codice. Si riconnetta sia in caso di un 1000 pulito sia di un 1006.
  • Riautorizzi e si riabboni. Un socket nuovo non è autenticato, e le sottoscrizioni di quotazioni e di sincronizzazione utente non sopravvivono a una riconnessione.
  • Rinnovi, non effettui un nuovo accesso. Rinnovare il token mantiene il socket attivo; un accesso completamente nuovo può espellere la sua sessione e causare la caduta.
  • Applichi un backoff con jitter. Distanzi i tentativi e limiti il loro numero per non superare i limiti di richieste di Tradovate.

Cosa significa il “codice di chiusura 1006”

I codici di chiusura WebSocket sono definiti dal protocollo stesso. Una chiusura pulita invia il codice 1000 (chiusura normale) insieme a un frame di chiusura che ne spiega il motivo. Il codice 1006 è diverso: è un codice riservato che la sua libreria WebSocket assegna quando la connessione svanisce senza che arrivi mai un frame di chiusura. In altre parole, la pipe TCP sottostante al socket si è interrotta, e nessuna delle due parti ha avuto la possibilità di salutarsi correttamente. Ecco perché il 1006 non porta mai un motivo leggibile da un essere umano. Non c'è nulla da leggere, perché il messaggio che lo avrebbe contenuto non è mai arrivato a destinazione.

È utile sapere come comunica normalmente il socket di Tradovate. Ogni frame inviato dal server è contrassegnato da un unico carattere iniziale: un frame o è il messaggio di apertura che riceve nel momento in cui il socket si connette ed è il suo segnale per autenticarsi; un frame a trasporta un array di dati JSON (quotazioni, aggiornamenti degli ordini, risposte di sincronizzazione); un frame h è un heartbeat; e un frame c è una chiusura ordinata. Quando Tradovate chiude intenzionalmente, invia c[1000,“...”] con un messaggio che spiega il motivo. Un 1006 è l'opposto di quel c ordinato: nessun frame di chiusura, solo un socket morto e il codice di chiusura anomala della libreria.

Quindi smetta di cercare un messaggio che non arriverà mai, e si chieda invece cosa potrebbe aver interrotto la connessione TCP sotto un socket di lunga durata. Quella breve lista è dove si trova ogni soluzione reale.

Le principali cause del codice di chiusura 1006 nel 2026

1. Heartbeat mancati (la regola dei 2,5 secondi)

Questa è la causa più spesso trascurata. Una volta accettato il suo frame authorize, il socket di Tradovate si aspetta un heartbeat costante dal client: un array JSON vuoto, scritto letteralmente come [], inviato circa ogni 2,5 secondi. Questi piccoli frame dimostrano che la connessione è viva. Se si interrompono, il server potrebbe smettere silenziosamente di inviare dati o chiudere la connessione, cosa che sul suo lato si manifesta come un 1006. Se le disconnessioni si concentrano dopo una pausa nel codice o un event loop occupato, sospetti prima dell'heartbeat.

2. Limitazione delle schede del browser

Se il socket viene eseguito in un browser, c'è una trappola insidiosa. Quando la scheda che contiene la sua app non è quella attiva, Chrome e gli altri browser riducono la priorità di setInterval e setTimeout. Il suo heartbeat di 2,5 secondi slitta a ogni diversi secondi, il server rileva una connessione stagnante, e il socket si chiude con 1006 nel momento in cui cambia scheda. La soluzione è eseguire il ciclo di heartbeat in un web worker (i worker non subiscono la stessa limitazione) oppure eseguire l'intero processo come un processo Node completamente al di fuori del browser.

Registro dei frame WebSocket di Tradovate che mostra il frame di apertura o, i frame di dati in formato array a e i frame di heartbeat vuoti inviati ogni 2,5 secondi

3. Timeout di proxy, NAT o firewall inattivi

Qualsiasi elemento posto tra la sua macchina e Tradovate può interrompere una connessione che ritiene inattiva. I proxy aziendali, i bilanciatori di carico, le tabelle NAT e i router domestici tagliano comunemente le connessioni TCP inattive dopo 30-120 secondi, e raramente inviano un frame di chiusura quando lo fanno. Questo è un classico caso di 1006, ed è un heartbeat correttamente cadenzato a mantenere il collegamento sufficientemente attivo da sopravvivere.

4. Scadenza del token o un secondo accesso che ruba la sessione

Un token di accesso di Tradovate ha una durata di circa 90 minuti, e lasciarlo scadere mentre il socket è connesso può interrompere la connessione. Peggio ancora, Tradovate consente solo due sessioni simultanee per account, e crearne una terza chiude la più vecchia. Se un altro script, un test manuale o un nuovo flusso di accesso richiede un nuovo token per lo stesso account, può espellere la sessione su cui si appoggia il suo socket, manifestandosi di nuovo come un 1006. Lo schema sicuro è rinnovare il token con un timer anziché effettuare nuovamente l'accesso, il che mantiene attiva la sessione esistente, e quindi il socket.

5. Instabilità di rete e tempeste di riconnessione

Anche le semplici cadute di rete causano 1006: un collegamento Wi-Fi instabile, un VPS con un vicino rumoroso, un breve intoppo del provider internet. Questo è in una certa misura inevitabile. La trappola sta in come risponde. Se la sua logica di riconnessione si attiva in un ciclo serrato non appena rileva una chiusura, può sommergere l'endpoint di Tradovate di tentativi di connessione, attivare la sua penalità sulle richieste, e trasformare un intoppo di due secondi in un blocco di più minuti. Il backoff qui non è opzionale.

Come risolvere il codice di chiusura 1006: passo dopo passo

Racchiuda il socket e si riconnetta a ogni chiusura

1

Gestisca l'intero ciclo di vita

Inserisca il suo WebSocket all'interno di una classe o funzione che gestisce l'intero ciclo di vita: connessione, autorizzazione, sottoscrizione, heartbeat e smontaggio.

2

Colleghi un unico gestore di chiusura

Colleghi un unico gestore di chiusura che si attivi per qualsiasi chiusura, pulita o anomala. Non faccia distinzioni in base al codice. Sia un 1000 sia un 1006 significano “il socket non c'è più, ricostruiscilo.”

3

Elimini il socket morto e pianifichi una riconnessione

Alla chiusura, elimini tutti i riferimenti al socket morto, cancelli il suo timer di heartbeat e pianifichi una riconnessione. Non riutilizzi mai un oggetto socket chiuso.

4

Salvi lo stato prima dello smontaggio

Prima di smontarlo, salvi lo stato che le servirà per ripristinare: a quali contratti era sottoscritto, se era aperta una richiesta di sincronizzazione utente, e il suo token attuale.

Mantenga attivo l'heartbeat

1

Avvii l'heartbeat una volta autorizzato

Non appena il suo frame authorize viene accettato, inizi a inviare un frame vuoto [] ogni 2,5 secondi.

2

Sposti i timer del browser in un web worker

Se si trova in un browser, sposti quel timer in un web worker in modo che una scheda in background non possa limitarlo. Su Node, un semplice intervallo va bene.

3

Monitori anche il lato opposto

Monitori anche il lato opposto. Se passano più di pochi secondi senza alcun frame dal server, consideri la connessione morta e forzi una riconnessione anziché aspettare.

Logica di riconnessione e riautorizzazione che racchiude un WebSocket di Tradovate in un editor di codice

Riautorizzi e riabboni il nuovo socket

1

Attenda il frame di apertura

Attenda il frame di apertura o sul nuovo socket. Solo a quel punto è pronto per autenticarsi.

2

Invii nuovamente il frame authorize

Invii nuovamente il frame authorize con un token di accesso valido, formattato esattamente come specificato dalla documentazione API attuale (la parola chiave request, un id, poi il token, con i separatori a riga vuota corretti).

3

Ripeta ogni sottoscrizione

Una volta riuscita l'autorizzazione, ripeta ogni sottoscrizione a partire dallo stato salvato: sottoscrizioni di quotazioni, richieste di sincronizzazione utente e qualsiasi altra cosa gestita dal vecchio socket.

4

Riconcili dopo l'interruzione

Riconcili dopo l'interruzione. Recuperi le posizioni attuali e gli ordini in corso in modo che la sua vista corrisponda alla realtà, poiché potrebbero essersi verificati eventi mentre era disconnesso.

Rinnovi il token con un timer, non crei una nuova sessione

1

Memorizzi la scadenza e imposti un timer di rinnovo

Al primo accesso, memorizzi la scadenza del token e imposti un timer per rinnovarlo circa 15 minuti prima che scada.

2

Rinnovi tramite l'endpoint di rinnovo

Rinnovi tramite l'endpoint di rinnovo, che estende la sua sessione senza un nuovo accesso. Il socket connesso continua a funzionare senza bisogno di altro.

3

Non avvii mai un secondo accesso

Non avvii mai un accesso completamente nuovo per un account che ha già un socket attivo. Ciò può farle superare il limite di due sessioni e far cadere il socket che sta cercando di proteggere.

Schermata di accesso API di Tradovate dove si conferma la chiave API attiva e la sessione prima di riconnettersi

Applichi un backoff con jitter

1

Inizi con uno o due secondi

Alla prima riconnessione, attenda uno o due secondi. A ogni ulteriore fallimento, raddoppi circa il ritardo.

2

Aggiunga un piccolo scarto casuale

Aggiunga un piccolo scarto casuale a ogni ritardo in modo che molti client non riprovino tutti nello stesso istante e non sovraccarichino l'endpoint insieme.

3

Limiti il massimo

Limiti il massimo a 30-60 secondi. Un backoff limitato e con jitter si riprende rapidamente da un intoppo senza trasformarsi in un blocco per limite di richieste autoinflitto.

Tabella di risoluzione dei problemi

Sintomo Causa probabile Soluzione
1006 pochi secondi dopo il cambio di scheda del browserTimer di heartbeat limitato in una scheda in backgroundEsegua l'heartbeat [] in un web worker o su Node
1006 dopo una pausa nel codice o un ciclo occupatoHeartbeat bloccato oltre ~2,5 secondiInvii [] con un intervallo affidabile di 2,5s, oltre che sui frame in arrivo
1006 dopo 30-120 secondi di inattivitàProxy, NAT o firewall ha interrotto un collegamento TCP inattivoMantenga gli heartbeat attivi in modo che il collegamento non appaia mai inattivo
1006 proprio intorno alla soglia dei 90 minutiToken di accesso scadutoRinnovi il token ~15 minuti prima della scadenza
1006 nel momento in cui accede altroveUna nuova sessione le ha fatto superare il limite di 2 sessioniRinnovi invece di accedere di nuovo; una sessione per account
Tempeste di 1006, seguite da un lungo bloccoUn ciclo di riconnessione serrato ha attivato la penalità sulle richiesteBackoff esponenziale con jitter, limitato a 30-60s

Prevenga questo con PickMyTrade

Un livello di riconnessione, un heartbeat resistente al throttling, un sistema di rinnovo del token e una ripetizione delle sottoscrizioni sono molti dettagli tecnici da gestire correttamente a mano, e un solo caso limite trascurato fa cadere i suoi ordini nel momento peggiore. PickMyTrade si colloca tra TradingView e Tradovate e gestisce tutto questo per lei:

  • Connessioni WebSocket gestite con riconnessione e riautorizzazione automatiche, in modo che un 1006 diventi un semplice intoppo anziché un'interruzione.
  • Heartbeat sempre attivi eseguiti lato server, ben al riparo dalla limitazione delle schede del browser.
  • Rinnovo automatico del token e un'unica sessione pulita per account, in modo che una scadenza a 90 minuti o un secondo accesso accidentale non la mettano mai fuori linea.
  • Riconnessioni sicure rispetto ai limiti di richieste con un backoff ragionevole, in modo che il ripristino non si trasformi mai in un blocco per penalità sulle richieste.

Il risultato: i suoi avvisi di TradingView raggiungono Tradovate in modo affidabile senza che lei debba scrivere o supervisionare una sola riga di codice del ciclo di vita del WebSocket.

Non lasci mai che un 1006 la metta fuori linea

PickMyTrade gestisce per lei la logica di riconnessione, riautorizzazione e heartbeat, in modo che un WebSocket di Tradovate caduto le costi un secondo, non una sessione.

Inizi la sua prova gratuita di 5 giorni

Domande frequenti

Il codice 1006 è una chiusura anomala. La connessione TCP sottostante è caduta senza che nessuna delle due parti inviasse un corretto frame di chiusura WebSocket, quindi la sua libreria segnala 1006 senza testo del motivo. È un sintomo, non una causa radice: qualcosa al di sotto del livello WebSocket (un timeout, un reset, un heartbeat mancato o una rete caduta) ha interrotto la pipe prima che potesse avvenire una chiusura 1000 pulita.

I fattori scatenanti abituali sono heartbeat mancati (Tradovate si aspetta un frame array vuoto circa ogni 2,5 secondi), un proxy o firewall inattivo che fa scadere il timeout della connessione TCP, il token di accesso che scade o viene invalidato da un secondo accesso, oppure semplice instabilità di rete su un VPS o una connessione domestica. Poiché il 1006 nasconde il motivo esatto, la soluzione pratica è riconnettersi e riautorizzarsi automaticamente invece di inseguire una singola causa.

Circa ogni 2,5 secondi. Una volta accettato il frame authorize, il client dovrebbe inviare un frame array JSON vuoto scritto come [] a quell'intervallo. Se questi heartbeat si bloccano, il server può smettere di inviare dati o chiudere direttamente la connessione, il che spesso si manifesta come un 1006 sul suo lato.

Sì. Un socket completamente nuovo parte non autenticato. Dopo l'apertura, deve inviare di nuovo il frame authorize con un token di accesso valido, e poi reinviare ogni sottoscrizione (quotazioni, sincronizzazione utente e così via). Le sottoscrizioni e l'autorizzazione non vengono mantenute dal socket appena caduto.

Il rinnovo no. Chiamare l'endpoint di rinnovo mantiene valida la sua sessione esistente, e il socket già connesso resta attivo senza bisogno di altro. Ciò che invece lo fa cadere è richiedere un token completamente nuovo con un nuovo accesso: Tradovate consente solo due sessioni simultanee, quindi una nuova sessione può espellere quella più vecchia su cui si appoggia il suo socket, e lei vede un 1006.

Chrome e altri browser limitano setInterval e setTimeout nelle schede inattive per risparmiare energia. Questa limitazione ritarda il suo heartbeat di 2,5 secondi, il server rileva una connessione bloccata, e il socket si chiude con 1006. Eseguire l'heartbeat in un web worker o su un processo Node, anziché in una scheda in background, evita la limitazione.

Utilizzi un backoff esponenziale con un po' di jitter casuale. Inizi intorno a uno o due secondi, raddoppi circa il ritardo a ogni tentativo fallito, aggiunga un piccolo scarto casuale in modo che molti client non riprovino in sincronia, e limiti il massimo a 30-60 secondi. Riconnettersi in un ciclo serrato può attivare la penalità sulle richieste di Tradovate e prolungare l'interruzione.

Nessuna connessione è immune al 1006, perché reti, proxy e server a volte interrompono i socket di lunga durata. L'obiettivo non è eliminarlo, ma renderlo un evento trascurabile: mantenere attivi gli heartbeat, rilevare la chiusura istantaneamente, riconnettersi e riautorizzarsi con un backoff, e riabbonarsi. Fatto correttamente, un 1006 le costa uno o due secondi invece di mettere il suo bot fuori linea.

Questa guida ha finalità esclusivamente educative e informative e non costituisce consulenza finanziaria, di investimento o di trading. Il trading di futures e altri prodotti a leva comporta un rischio sostanziale di perdita e non è adatto a tutti gli investitori. PickMyTrade è una piattaforma di automazione indipendente di terze parti e non è affiliata, sostenuta o sponsorizzata da Tradovate, Inc. o Bookmap. Tutti i nomi, i loghi e i marchi correlati sono di proprietà dei rispettivi titolari. Le funzionalità e le procedure della piattaforma cambiano nel tempo, quindi verifichi sempre la procedura attuale nella documentazione ufficiale della piattaforma prima di agire.