Tradovate API

WebSocket di Tradovate «Connection to Remote Host Lost»

Il socket funziona senza problemi per ore, poi muore con Connection to remote host was lost, spesso intorno alle 24 ore. Ecco cosa fallisce davvero e lo schema di heartbeat, riconnessione e token che mantiene vivo un feed all'infinito.

On This Page

Quando il suo bot trasmette quotazioni ES o NQ ventiquattr'ore su ventiquattro, nulla uccide una strategia più in fretta di un WebSocket di Tradovate che muore silenziosamente con “Connection to remote host was lost.” È uno dei mal di testa più comuni dell'API di Tradovate: il socket funziona senza problemi per ore, poi cade, molto spesso intorno alle 24 ore, e si porta via i suoi dati di mercato in tempo reale e l'instradamento degli ordini. A volte lo vede come una chiusura WebSocket grezza (codice 1006, “abnormal closure”). A volte sembra una disconnessione di massa. A volte è semplicemente un feed morto che non solleva mai un'eccezione.

Non esiste una singola impostazione magica che risolva il problema. Ciò che tiene davvero in vita un socket è un insieme di abitudini che lavorano insieme: heartbeat da 2,5 secondi, riconnessione automatica, rinnovo del token e rotazione della connessione prima che diventi obsoleta. PickMyTrade integra questa logica di riconnessione e riautorizzazione, così i suoi alert di TradingView continuano a raggiungere Tradovate anche quando un socket artigianale sarebbe silenziosamente caduto.

Checklist rapida per un WebSocket di Tradovate perso

  • Heartbeat ogni 2,5 secondi, invii un frame [] vuoto in modo che il server non segni mai il suo client come inattivo e non lo chiuda.
  • Non si fidi di setInterval in una scheda del browser, la limitazione in background fa scendere il suo timer sotto i 2,5 s e uccide il socket. Usi invece un controllo basato sul timestamp dei messaggi.
  • Riconnessione automatica a ogni chiusura, quando il socket si chiude, lo riapra, riautorizzi e si iscriva di nuovo ai suoi simboli di dati di mercato.
  • Rinnovi il token prima che scada, chiami renewAccessToken circa 15 minuti prima della scadenza del token di accesso di ~90 minuti e mantenga le sessioni entro il limite di sessioni simultanee di Tradovate.
  • Cicli la connessione prima di ~24 ore, smonti e riapra il socket con un timer invece di aspettare che sia il server a troncarlo.
  • Applichi un backoff alla riconnessione, distanzi i tentativi in modo che una tempesta di riconnessioni non faccia scattare i limiti di frequenza di Tradovate e non la blocchi.

Cosa significa «Connection to Remote Host Was Lost»

“Connection to remote host was lost” è il modo in cui Tradovate le comunica che il WebSocket verso i suoi server è chiuso e non più utilizzabile. È un evento a livello di trasporto, non un ordine rifiutato né una richiesta errata. È la condotta stessa a essere sparita. Sotto il cofano, di solito si presenta come una chiusura WebSocket anomala (codice di chiusura 1006), cioè una connessione caduta senza un handshake di chiusura pulito, quindi il suo client non sempre può dirle esattamente perché.

Ecco la parte che mette in difficoltà: una connessione persa è normale e attesa su un feed di lunga durata. Le reti ballano, i load balancer si riciclano, i socket inattivi vengono potati, i token scadono e le sessioni molto lunghe vengono ciclate lato server. Anche un client perfettamente ben educato che trasmette dati in tempo reale può perdere il socket dopo abbastanza ore di attività. Quindi l'obiettivo non è un socket che non cade mai, è impossibile. L'obiettivo è un client che si accorga subito della caduta e si riprenda da solo, senza doverlo sorvegliare.

Questa distinzione conta per il rischio. Se il suo feed muore in silenzio e il suo codice continua a credersi connesso, può perdere fill, mancare l'attivazione degli stop o inviare ordini su una vista obsoleta del mercato. Tratti ogni WebSocket come usa e getta e ogni disconnessione come un evento di routine da gestire, non come un'emergenza.

Principali cause di un WebSocket di Tradovate interrotto

1. Heartbeat mancati (timeout di inattività del server)

È di gran lunga la causa più comune. Il protocollo WebSocket di Tradovate richiede che il client invii un heartbeat ogni 2,5 secondi, un frame il cui testo è un array vuoto, [], per dimostrare di essere ancora vivo. Se il server resta 2,5 secondi senza sentirla e non le sta trasmettendo attivamente dati, tratta il client come inattivo e chiude la connessione. E qui sta il problema: finché il server sta spingendo attivamente messaggi (ad esempio un'iscrizione ai dati di mercato molto attiva), non invierà i propri heartbeat, quindi mantenere in flusso i frame [] spetta interamente al suo client.

2. Limitazione del browser / dei timer

Se sviluppa nel browser e pianifica gli heartbeat con setInterval o setTimeout, cade in una trappola sottile: i browser limitano i timer nelle schede in background o inattive, dilatando il suo intervallo di 2,5 secondi a diversi secondi. Nel momento in cui supera la finestra, il server chiude il socket. Non si appoggi a setInterval, cadenzi invece i suoi heartbeat a partire dall'ultimo messaggio effettivamente ricevuto.

3. Scadenza del token di accesso

Il suo WebSocket viene autorizzato una volta con un token di accesso, e quel token ha una durata limitata, di circa 90 minuti dalla creazione secondo la documentazione API di Tradovate. Quando il token dietro una connessione attiva scade, la connessione non è più autenticata e può essere interrotta. Un client in esecuzione prolungata che non rinnova mai il token vedrà il socket morire con una cadenza prevedibile.

4. Connessioni di lunga durata oltre ~24 ore

Mantenere una connessione per più di 24 ore è di per sé una causa riconosciuta di cadute. Anche con heartbeat perfetti e un token fresco, un socket aperto da circa un giorno è un candidato ideale al riciclo lato server. Ecco perché una connessione grezza che “ha funzionato tutto il pomeriggio” muore misteriosamente durante la notte.

5. Tempeste di riconnessione e limite di sessioni

Quando un socket cade, il codice ingenuo spesso martella il server con tentativi di riconnessione immediati e consecutivi. Ciò può far scattare i limiti di frequenza delle richieste di Tradovate e peggiorare le cose, e riautenticarsi ripetutamente (invece di rinnovare) può farla scontrare con il tetto di sessioni simultanee. Il risultato è un client bloccato in un ciclo di riconnessione che non si stabilizza mai.

Come riparare una connessione WebSocket di Tradovate persa: passo dopo passo

Invii un heartbeat ogni 2,5 secondi, nel modo giusto

1

Apponga un timestamp a ogni messaggio in arrivo

A ogni messaggio ricevuto sul socket, registri un timestamp (basta un semplice new Date()).

2

Confronti con l'ultimo heartbeat

Con una cadenza breve, confronti “adesso” con il timestamp dell'ultimo messaggio ricevuto.

3

Invii l'heartbeat quando serve

Se sono trascorsi più di 2500 ms dall'ultimo messaggio, invii un singolo frame heartbeat contenente esattamente [] usando il metodo send del socket.

4

Eviti un setInterval fisso

Gestisca tutto con un controllo basato sui messaggi anziché con un setInterval fisso, in modo che la limitazione del browser non possa dilatare silenziosamente l'intervallo e disconnetterla.

Questa sola abitudine risolve la maggior parte delle segnalazioni “connection to remote host was lost”, perché soddisfa direttamente la regola del timeout di inattività del server.

Aggiunga logica di riconnessione automatica e nuova iscrizione

1

Rilevi subito la caduta

Colleghi un gestore all'evento close (ed error) del socket in modo che una caduta venga rilevata immediatamente.

2

Apra un socket nuovo

Alla chiusura, presuma che la connessione sia stata persa per errore e apra un nuovo WebSocket verso lo stesso endpoint.

3

Reinvii la richiesta di autorizzazione

Reinvii la richiesta di autorizzazione con un token di accesso attualmente valido, un nuovo socket non è autorizzato solo perché lo era il precedente.

4

Si iscriva di nuovo a tutto

Si iscriva di nuovo a ogni simbolo di dati di mercato e a ogni sync utente/ordini che stava ascoltando prima, poiché le iscrizioni non sopravvivono a una riconnessione.

5

Applichi un backoff esponenziale

Racchiuda i tentativi di riconnessione in un backoff esponenziale (ad esempio, attenda 1 s, poi 2 s, poi 4 s, con un tetto) in modo che un'interruzione prolungata non si trasformi in un blocco per limite di frequenza.

Rinnovi il token di accesso e riautorizzi il socket

1

Pianifichi un rinnovo prima della scadenza

Quando si autentica per la prima volta, legga l'ora di scadenza del token dalla risposta di autenticazione e pianifichi un rinnovo prima di essa.

2

Chiami renewAccessToken in anticipo

Chiami renewAccessToken circa 15 minuti prima della scadenza del token. Rinnovare (invece di riautorizzare da zero) prolunga la sua sessione corrente anziché aprirne una nuova, il che la mantiene sotto il limite di sessioni simultanee di Tradovate.

3

Riautorizzi il socket attivo

Dopo il rinnovo, si assicuri che il socket attivo sia autorizzato con il token fresco. L'approccio più sicuro è riconnettersi e inviare un nuovo frame authorize con il token rinnovato, perché il solo rinnovo del token non sempre mantiene autenticato un socket già aperto.

Confermi che l'accesso API sia abilitato e di essere entro il limite di sessioni

1

Confermi che l'accesso API sia abilitato

Nel Web Trader di Tradovate, apra Application Settings e confermi che API Access (il componente aggiuntivo API) sia abilitato per il suo conto, un socket non può restare autorizzato su un conto non abilitato all'uso dell'API.

2

Controlli il numero di sessioni simultanee

Controlli di non eseguire più sessioni simultanee di quante Tradovate ne consenta tra il suo bot, l'app desktop, TradingView e qualsiasi altra connessione; sessioni extra possono mettere offline la sua connessione API.

3

Confermi la sua autorizzazione ai dati di mercato

Se le servono specificamente dati di mercato API in tempo reale, confermi che le sue autorizzazioni ai dati di mercato siano in regola, poiché un'iscrizione ai dati non autorizzata può far chiudere il feed.

Cicli in modo proattivo la connessione prima delle 24 ore

Invece di aspettare che il server tronchi un socket vecchio di un giorno, lo anticipi. Con un timer, comodamente sotto il tetto di ~24 ore, chiuda in modo pulito il suo WebSocket esistente e ne apra uno nuovo con un token appena rinnovato, quindi riautorizzi e si iscriva di nuovo. Poiché il suo percorso di riconnessione esiste già (lo ha costruito nel passaggio precedente), un ciclo programmato è solo una versione controllata della stessa routine. Trasforma una disconnessione a sorpresa alle 3 di notte in un aggiornamento pianificato e invisibile.

Tabella di risoluzione dei problemi

Errore / stato Cosa significa Soluzione
Connection to remote host was lostIl WebSocket verso Tradovate è stato chiuso ed è inutilizzabileRiconnessione automatica, riautorizzare e iscriversi di nuovo; assicurarsi che gli heartbeat fluiscano
WebSocket closed with code 1006Chiusura anomala, caduta senza handshake pulitoGestirla come una disconnessione normale; riaprire il socket con backoff
Il socket muore ogni ~90 minutiIl token di accesso dietro la connessione è scadutoChiamare renewAccessToken ~15 min prima della scadenza e riautorizzare il socket
Il feed cade dopo molte ore / durante la notteConnessione di lunga durata riciclata (spesso intorno alle 24 ore)Ciclare in modo proattivo la connessione con un timer sotto le ~24 ore
Si disconnette solo quando la scheda è in backgroundIl browser ha limitato il suo heartbeat setInterval sotto i 2,5 sCadenzare gli heartbeat dall'ultimo messaggio ricevuto, non con un intervallo fisso
Ciclo di riconnessione / nuove cadute dopo la riconnessioneUna tempesta di riconnessioni fa scattare i limiti di frequenza o il tetto di sessioniAggiungere backoff esponenziale; rinnovare i token invece di riautenticare nuove sessioni
Feed dati silenzioso ma nessun errore sollevatoSocket semiaperto; il server ha smesso di inviare, il client non se n'è accortoApplicare l'heartbeat da 2,5 s e trattare gli heartbeat mancati come una disconnessione

Lo prevenga con PickMyTrade

Se il suo obiettivo è semplicemente far arrivare in modo affidabile gli alert di TradingView a Tradovate, non deve costruire e sorvegliare da sé tutta questa infrastruttura di socket. PickMyTrade si colloca tra TradingView e Tradovate e mantiene sana la connessione per Lei.

  • Logica di riconnessione gestita, riconnessione, riautorizzazione e nuova iscrizione automatiche a ogni caduta, così un socket perso si riprende senza che debba scrivere o mantenere il codice.
  • Rinnovo del token integrato, le sessioni vengono aggiornate prima della scadenza, mantenendo la connessione autenticata invece di morire con l'orologio del token da ~90 minuti.
  • Rotazione delle connessioni, le connessioni di lunga durata vengono riciclate in modo proattivo, così la caduta a ~24 ore non coglie mai la sua automazione offline.
  • Instradamento sicuro rispetto ai limiti di frequenza, riconnessioni e flusso degli ordini sono distanziati per rispettare i limiti di Tradovate, evitando i blocchi da tempesta di riconnessione che affliggono i socket grezzi.

Smetta di sorvegliare il suo socket

Pronto a smettere di sorvegliare il suo socket? Inizi la prova gratuita di 7 giorni, colleghi oggi i suoi alert e faccia trading senza rifiuti.

Inizi la prova gratuita di 7 giorni

Domande frequenti

Quasi sempre perché il client ha smesso di inviare il suo heartbeat da 2,5 secondi, il token di accesso è scaduto o la connessione è semplicemente invecchiata (le sessioni lunghe oltre ~24 ore vengono riciclate). Aggiunga heartbeat, rinnovo del token e riconnessione automatica e le cadute diventano un non-evento.

Ogni 2,5 secondi. Invii un frame il cui testo è un array vuoto, []. Se il server resta 2,5 secondi senza sentirla mentre non le sta trasmettendo dati, chiude il socket per inattività.

I browser limitano setInterval/setTimeout nelle schede inattive, quindi il suo intervallo si dilata oltre i 2,5 secondi. Invece di un intervallo fisso, apponga un timestamp a ogni messaggio ricevuto e invii un heartbeat solo quando sono trascorsi più di 2500 ms dall'ultimo.

Un token di accesso dura circa 90 minuti secondo la documentazione API di Tradovate. Chiami renewAccessToken circa 15 minuti prima della scadenza per prolungare la sessione, quindi si assicuri che il socket sia autorizzato con il token rinnovato; riconnettersi e reinviare un frame authorize è il modo più sicuro per mantenerlo autenticato.

Sì. Un nuovo socket parte senza iscrizioni, quindi dopo la riapertura e la riautorizzazione deve iscriversi di nuovo a ogni simbolo e sync che stava ascoltando prima della caduta.

No. È una caratteristica attesa delle connessioni di durata molto lunga. La risposta affidabile è ciclare in modo proattivo la connessione prima che raggiunga quell'età, invece di aspettare che sia il server a troncarla.

Tentativi di riconnessione immediati e consecutivi martellano il server e possono far scattare i limiti di richieste di Tradovate, e riautenticarsi ripetutamente può farle sbattere contro il tetto di sessioni simultanee. Aggiunga un backoff esponenziale tra i tentativi e rinnovi i token invece di creare nuove sessioni.

Se le serve solo far arrivare gli alert di TradingView a Tradovate, sì. PickMyTrade gestisce per Lei heartbeat, rinnovo del token, riconnessione e rotazione della connessione, quindi non deve mantenere da sé un client WebSocket resiliente.

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