Errore 404 dell'API Tradovate sui dati storici di md/getChart
Ha configurato un WebSocket, inviato una richiesta md/getChart pulita e ricevuto come risposta Not found: md/getChart. Nove volte su dieci il problema è il socket sbagliato o un simbolo che Tradovate non riesce a risolvere.
Ha configurato un WebSocket, lo ha autorizzato, inviato una richiesta md/getChart pulita per qualche centinaio di barre di storico, e il server ha risposto con Not found: md/getChart. Nel payload non sembra esserci nulla di sbagliato. Allora perché un 404 su un endpoint che esiste chiaramente nella documentazione?
Nove volte su dieci si tratta di una di due cose: ha inviato la richiesta al socket sbagliato, oppure ha chiesto un simbolo che Tradovate non riesce a risolvere. Entrambe le situazioni generano un “not found” identico dal suo punto di vista. Analizziamo ogni causa, nell'ordine in cui conviene controllarle, per far fluire le sue barre storiche.
Cosa le sta dicendo davvero il 404
Un 404 su una chiamata REST significa che il percorso URL non esiste. Sul WebSocket di Tradovate vale lo stesso principio: il frame che invia indica un endpoint e, se il socket a cui è connesso non serve quell'endpoint, riceve Not found con il nome dell'endpoint riportato. Non significa che il suo simbolo non sia valido o che il token sia scaduto. Significa “non ho una route per questo qui”.
Questa distinzione è importante. Se il messaggio è letteralmente Not found: md/getChart, l'endpoint stesso non è raggiungibile su quella connessione, il che indica direttamente il problema del socket sbagliato. Se la richiesta raggiunge il motore dei dati di mercato ma il contratto non viene trovato, vedrà invece un errore legato al simbolo. Legga il testo esatto prima di iniziare a modificare il codice.
Causa 1: sta usando il WebSocket sbagliato
Questa è la causa principale e coglie quasi tutti alla prima esperienza. Tradovate gestisce due servizi WebSocket distinti, che non sono intercambiabili:
- Il socket di trading/API gestisce ordini, posizioni, conti e il resto dei dati delle entità. In live è
wss://live.tradovateapi.com/v1/websocket; in demo èwss://demo.tradovateapi.com/v1/websocket. - Il socket dei dati di mercato gestisce quotazioni, DOM e grafici. In live è
wss://md.tradovateapi.com/v1/websocket; in demo èwss://md-demo.tradovateapi.com/v1/websocket.
Tutti gli endpoint md/, md/getChart, md/subscribeQuote, md/subscribeDOM, esistono solo sul socket dei dati di mercato. Se li invia al socket di trading semplicemente non c'è alcuna route corrispondente, quindi riceve Not found: md/getChart. Il socket di trading non le darà alcun indizio che si trova nel posto sbagliato; segnala semplicemente l'endpoint come mancante.

La soluzione: aprire una seconda connessione WebSocket verso l'host dei dati di mercato e inviare lì la richiesta del grafico. Un errore comune è autorizzare perfettamente il socket di trading e poi riutilizzare quella stessa connessione per i dati di mercato. Servono entrambi i socket aperti, e ciascuno richiede il proprio frame authorize con il token di accesso prima di rispondere a qualsiasi richiesta.
Un'altra trappola sullo stesso tema: far corrispondere l'ambiente. Se il token di accesso proviene dall'endpoint di autenticazione live, usi md.tradovateapi.com. Se proviene dalla demo, usi md-demo.tradovateapi.com. Incrociare un token live con l'host dei dati di mercato demo (o viceversa) porta al rifiuto ancora prima che la richiesta del grafico entri in gioco. I nomi host vengono aggiornati occasionalmente, quindi verifichi quelli attuali nella documentazione ufficiale per sviluppatori di Tradovate invece di fidarsi di uno snippet copiato un anno fa.
Causa 2: il simbolo non è un contratto reale
Supponiamo che il socket sia corretto e che continui comunque a ricevere una risposta not-found legata alla richiesta. Osservi attentamente il simbolo. Le richieste di grafico richiedono un contratto future completamente qualificato, non la radice del prodotto che si vede in una watchlist.
“YM” non è negoziabile da solo, è la radice. Ciò che Tradovate può risolvere è il contratto specifico, come YMH5, dove H è il codice del mese di marzo e 5 è l'anno 2025. Se passa la radice nuda, un codice mese errato o un contratto già scaduto e passato al trimestre successivo, il motore non trova nulla su cui costruire un grafico. Ecco la mappa standard dei codici mese per i future:
| Mese | Codice | Mese | Codice |
|---|---|---|---|
| gennaio | F | luglio | N |
| febbraio | G | agosto | Q |
| marzo | H | settembre | U |
| aprile | J | ottobre | V |
| maggio | K | novembre | X |
| giugno | M | dicembre | Z |

Invece di codificare in modo fisso una stringa di simbolo, risolva il contratto del mese corrente in modo programmatico. Gli endpoint contract/find e di ricerca prodotto sul socket di trading forniscono il simbolo negoziabile esatto, così non deve mai indovinare se ES è passato da dicembre a marzo. Se deve usare un alias continuo o “front month”, verifichi bene che sia uno accettato realmente da Tradovate per i grafici, molte notazioni continue che funzionano in un'interfaccia grafica non si risolvono in una chiamata diretta a md/getChart. In caso di dubbio, richieda il contratto esplicito.
Questa è anche la ragione classica per cui una richiesta che funzionava il trimestre scorso restituisce improvvisamente un 404: il contratto che aveva fissato è scaduto. I rollover avvengono secondo un calendario fisso, e un simbolo scaduto scompare dal motore dati. Automatizzi il rollover invece di inseguirlo manualmente.
Causa 3: il diritto ai dati di mercato non è configurato
Socket corretto, contratto valido e ancora nulla di utile? Verifichi ora a cosa ha effettivamente diritto il suo account. Qui contano due livelli.
Innanzitutto, l'accesso API stesso deve essere attivato. Si tratta del componente aggiuntivo API Access nelle impostazioni del suo account Tradovate, che abilita l'accesso programmatico e le consente di generare le credenziali necessarie al suo flusso di autenticazione. Senza di esso, il token non porterà i permessi attesi dal motore dei dati di mercato.

In secondo luogo, i dati di mercato in tempo reale tramite API richiedono il relativo accordo e licenza della borsa. Per i prodotti CME questo significa una licenza mensile per i dati di mercato in aggiunta al suo piano. L'importo esatto è fissato dalla borsa e cambia nel tempo, quindi confermi la cifra attuale con Tradovate invece di fidarsi di un numero letto da qualche parte, si tratta in genere di un addebito mensile ricorrente, non trascurabile. Senza tale diritto, una richiesta di grafico ben formata può comunque tornare inaccessibile o vuota, perché sta chiedendo dati che il suo account non è autorizzato a ricevere. Se i suoi simboli risultano inaccessibili anziché not-found, è questo il tipo di problema di cui si tratta.
Se ha un account prop-firm o di valutazione, spesso non può sottoscrivere autonomamente quei dati, è la società a controllarli. In quel caso la risoluzione del diritto passa attraverso il supporto della sua società, non quello di Tradovate.
Causa 4: un frame malformato o un socket non autorizzato
Il WebSocket di Tradovate non parla JSON semplice. Ogni richiesta è un frame di testo con una forma specifica: l'endpoint, poi l'id della richiesta, poi una riga di query (spesso vuota), poi il corpo JSON, separati da a-capo, ad esempio md/getChart\n2\n\n{ ... }. Se questa struttura è sbagliata, il server potrebbe non analizzare correttamente il nome dell'endpoint, il che può manifestarsi come un errore in stile not-found anche se l'intento era corretto.
- Autorizzare prima. Il primissimo frame sul socket dei dati di mercato deve essere
authorize\n1\n\n<yourAccessToken>. Se inviamd/getChartprima che il socket sia autorizzato, non verrà elaborato. - Mantenere attivo il socket. La connessione si aspetta un frame di heartbeat periodico. Se lo si manca, il socket si interrompe; le richieste inviate a una connessione semi-morta falliscono in modi confusi.
Costruisca il frame esattamente come documentato, autorizzi prima di effettuare la richiesta e invii gli heartbeat secondo la pianificazione. La maggior parte dei 404 “casuali” su un socket che funzionava un'ora fa risale a uno di questi tre punti.
Una checklist rapida per risolvere il 404
| Verifica | Cosa confermare |
|---|---|
| Socket corretto | md/getChart va verso md.tradovateapi.com (live) o md-demo.tradovateapi.com (demo), non verso il socket di trading. |
| Ambiente corrispondente | Token live → host dati di mercato live; token demo → host demo. |
| Simbolo del contratto completo | Usi simboli in stile ESH5, non la radice ES, e non un contratto scaduto. |
| Diritti attivi | Componente aggiuntivo API Access abilitato e licenza dei dati di mercato della borsa attiva. |
| Frame + autenticazione | Autorizzi prima il socket, quindi invii un frame di richiesta correttamente delimitato da a-capo. |
Una volta che i dati del grafico iniziano a fluire
Quando la richiesta va a buon fine, la risposta restituisce id di sottoscrizione, un id storico e un id in tempo reale, e trasmette le barre. Lo storico arriva a lotti, e ogni lotto termina con un marcatore “end of history” così sa quando un blocco è completo. Non esiste un limite massimo fisso su quanto si può estrarre per richiesta, ma il limite pratico varia di giorno in giorno, quindi una richiesta ampia (ad esempio barre al minuto su più anni) torna troncata invece di generare un errore.
Per risalire ulteriormente indietro, prenda il timestamp più vecchio ricevuto, invii una nuova md/getChart usandolo come timestamp più vicino e la data target come timestamp più lontano, e ripeta finché non ha ottenuto l'intervallo di cui ha bisogno. E quando ha finito con un grafico in tempo reale, lo annulli con md/cancelChart usando l'id in tempo reale, così da non mantenere una sottoscrizione che non legge più.
Dove si inserisce PickMyTrade
La maggior parte delle persone che incontra questo 404 non vuole in realtà diventare un idraulico di WebSocket, vuole eseguire una strategia su Tradovate senza dover sorvegliare socket, token e formati dei frame. PickMyTrade automatizza l'instradamento degli ordini dagli alert di TradingView a Tradovate, così non deve cablare da sé i frame WebSocket grezzi solo per eseguire una strategia.
- Nessun cablaggio grezzo dei socket i suoi alert di TradingView vengono instradati verso Tradovate senza codificare a mano un solo frame WebSocket.
- Autenticazione gestita token e host vengono gestiti per lei, così un disallineamento di ambiente non diventa mai un suo problema.
- Gestione dei simboli la risoluzione dei contratti viene gestita internamente invece che dover tracciare manualmente codici mese e rollover.
- Instradamento sicuro rispetto ai limiti di frequenza distanzia il flusso degli ordini in modo che nulla urti contro i limiti di richiesta di Tradovate.
Salti il cablaggio grezzo dei socket
Vuole che la sua strategia TradingView faccia trading su Tradovate senza codificare a mano un solo frame WebSocket? Scopra come PickMyTrade automatizza l'intero flusso degli ordini.
Avvii la sua prova gratuita di 5 giorniDomande frequenti
Perché l'endpoint non esiste sul socket a cui è stato inviato. Gli endpoint dei dati di mercato esistono solo sul WebSocket dei dati di mercato dedicato. Se invia md/getChart tramite il socket di trading/API, il server non ha alcuna route per esso, quindi risponde Not found: md/getChart. Sposti la richiesta sull'host dei dati di mercato e si risolverà.
I dati di mercato live usano wss://md.tradovateapi.com/v1/websocket e la demo usa wss://md-demo.tradovateapi.com/v1/websocket. Sono distinti dai socket di trading. Confermi i nomi host attuali nella documentazione per sviluppatori di Tradovate prima di inserirli nel codice.
Le richieste di grafico richiedono un simbolo di contratto completo, non la radice. YM non può essere risolto, ma YMH5 (marzo 2025) sì. Un simbolo radice, un codice mese errato o un contratto già scaduto restituiscono tutti not found. Recuperi prima il simbolo negoziabile esatto tramite una ricerca contratti.
I dati di mercato in tempo reale tramite API richiedono il relativo accordo e licenza della borsa, che per i prodotti CME è una tariffa mensile ricorrente. L'importo varia ed è fissato dalla borsa, quindi confermi la tariffa attuale con Tradovate. Senza di essa, i simboli risultano inaccessibili anche quando la richiesta è formata perfettamente.
PickMyTrade automatizza l'instradamento degli ordini dagli alert di TradingView a Tradovate, così non deve cablare frame WebSocket grezzi solo per eseguire una strategia. Non è un feed di dati storici massivo, ma per l'automazione elimina la maggior parte dell'idraulica a basso livello che causa errori come questo.
Questa guida ha scopo puramente educativo e informativo e non costituisce consulenza finanziaria, di investimento o di trading. Il trading di future e altri prodotti a leva comporta un notevole rischio di perdita e non è adatto a tutti gli investitori. PickMyTrade è una piattaforma di automazione di terze parti indipendente e non è affiliata, approvata o sponsorizzata da Tradovate, Inc. Tutti i nomi, i loghi e i marchi correlati sono di proprietà dei rispettivi titolari. Le funzionalità e i passaggi della piattaforma cambiano nel tempo, quindi confermi sempre il processo attuale sulla piattaforma e nella documentazione ufficiale di Tradovate prima di agire.