Correzione dell'errore Tradovate 'Not Found: md/subscribeQuote'
Il Suo flusso di autenticazione funziona, il socket dell'account è attivo, e md/subscribeQuote restituisce comunque Not found anche se l'endpoint è proprio lì nella documentazione. Ha inviato la richiesta al WebSocket sbagliato.
On This Page
- Che cosa significa davvero “Not Found” qui
- La causa: è sul socket dell'account, non sul socket dei dati di mercato
- La soluzione: aprire e autorizzare un secondo socket per le quotazioni
- Sottoscriva una volta per simbolo, non in blocco
- Che cosa si rompe dopo: il socket è giusto, ma non compaiono prezzi
- “Symbol is inaccessible”
- Il socket continua a cadere
- Il token è scaduto a metà sessione
- Una rapida checklist per eliminare l'errore
- Salti il cablaggio dei socket grezzi
Il Suo flusso di autenticazione ha funzionato, il socket dell'account è attivo e poi invia un md/subscribeQuote per iniziare a ricevere i prezzi live e il server Le restituisce Not found: md/subscribeQuote, spesso storpiato in qualcosa come "\"Not found: md/subscribeQuote\"" con caratteri di escape accumulati. L'endpoint è proprio lì nella documentazione. Allora perché Tradovate si comporta come se non esistesse?
Ecco la versione breve: ha inviato la richiesta al WebSocket sbagliato. Le sottoscrizioni alle quotazioni non risiedono sulla stessa connessione che usa per sincronizzare l'account o inviare ordini. Corregga il socket a cui va la richiesta e l'errore scompare. Vediamo esattamente perché succede, come instradare correttamente e che cosa tende a rompersi dopo, una volta che il frame arriva finalmente a destinazione.
Che cosa significa davvero “Not Found” qui
Lo tratti come un 404 su una chiamata REST. Un 404 dice che il percorso URL non esiste su quel server. Sul WebSocket di Tradovate la logica è identica: ogni frame inviato nomina un endpoint, e se il socket a cui è connesso non serve quell'endpoint, il server risponde Not found restituendo il nome dell'endpoint.
Legga con attenzione, perché questo esclude molte cose. Non Le sta dicendo che il simbolo è sbagliato. Non Le sta dicendo che il token è scaduto. Non Le sta dicendo che il JSON è malformato. Le dice una sola cosa: “su questa connessione non esiste una route per md/subscribeQuote”. E c'è esattamente un motivo comune per questo.
La causa: è sul socket dell'account, non sul socket dei dati di mercato
Tradovate gestisce due servizi WebSocket separati, e non sono intercambiabili. Molti configurano il primo, lo autorizzano, vedono i dati di account e ordini scorrere perfettamente e poi presumono che la stessa connessione gestisca tutto. Non è così.
- Il socket account / API gestisce ordini, posizioni, esecuzioni, sincronizzazione dell'account e il resto dei dati delle entità. È qui che si trovano
user/syncRequest,order/placeOrdereaccount/list. Live èwss://live.tradovateapi.com/v1/websocket; demo èwss://demo.tradovateapi.com/v1/websocket. - Il socket dei dati di mercato gestisce prezzi live, quotazioni, il DOM, grafici e istogrammi. È qui che vive ogni endpoint
md/, inclusimd/subscribeQuote,md/subscribeDOMemd/getChart. Live èwss://md.tradovateapi.com/v1/websocket; demo èwss://md-demo.tradovateapi.com/v1/websocket.
Invii md/subscribeQuote al socket dell'account e semplicemente non c'è alcuna route corrispondente, quindi torna Not found: md/subscribeQuote. Il socket dell'account non Le suggerirà che sta bussando alla porta sbagliata, segnala soltanto che l'endpoint manca. Ecco la mappa completa degli host per allineare il Suo ambiente:
| Scopo | Demo / Simulazione | Live |
|---|---|---|
| Base REST di autenticazione | https://demo.tradovateapi.com/v1/ | https://live.tradovateapi.com/v1/ |
| Socket account / API (user/syncRequest, order/placeOrder) | wss://demo.tradovateapi.com/v1/websocket | wss://live.tradovateapi.com/v1/websocket |
| Socket dei dati di mercato (md/subscribeQuote, md/getChart) | wss://md-demo.tradovateapi.com/v1/websocket | wss://md.tradovateapi.com/v1/websocket |
La soluzione: aprire e autorizzare un secondo socket per le quotazioni
Non sposta il socket dell'account. Aggiunge un socket dei dati di mercato accanto ad esso. Mantenga la connessione dell'account per ordini e sincronizzazione; apra un nuovo WebSocket verso l'host dei dati di mercato per i prezzi. Ecco la sequenza che elimina l'errore.
Prenda entrambi i token dalla risposta di autenticazione
Quando si autentica, la risposta di Tradovate contiene più di un token. Accanto al consueto accessToken troverà un mdAccessToken e un expirationTime. Quel secondo token non è decorativo, viene emesso specificamente per il feed dei dati di mercato. Lo conservi.
Apra il WebSocket dei dati di mercato
Si connetta all'host dei dati di mercato corrispondente al Suo ambiente: wss://md-demo.tradovateapi.com/v1/websocket se il token proviene dall'endpoint di autenticazione demo, oppure wss://md.tradovateapi.com/v1/websocket se proviene da quello live. Incrociare un token live con l'host demo (o viceversa) La fa respingere prima ancora che la sottoscrizione conti. Attenda il frame o di apertura del socket prima di inviare qualsiasi cosa.
Autorizzi prima il socket
Questo è il passaggio che molti saltano. Un socket nuovo non risponde a nulla finché non lo autorizza. Il primissimo frame che invia deve essere il frame authorize con il Suo token, usi il mdAccessToken per la connessione dei dati di mercato. I frame di Tradovate sono testo delimitato da a capo, non JSON grezzo: l'endpoint, l'id della richiesta, una riga di query (spesso vuota), poi il corpo. Invii il frame authorize, attenda la risposta che conferma l'autorizzazione del socket e solo allora proceda. Se invia una sottoscrizione prima che questo handshake sia completato, non verrà accolta.
Ora invii md/subscribeQuote
Con il socket aperto e autorizzato, la sottoscrizione ha finalmente una route. La invii come frame della stessa forma, con un corpo JSON che nomina un solo contratto. Può indicare il contratto tramite la stringa del simbolo (come ESU6 per l'E-mini S&P di settembre 2026) oppure tramite il suo id numerico di contratto, entrambi funzionano. Il server conferma la richiesta e poi inizia a inviare eventi di quotazione con bid, ask e ultimo prezzo di quel contratto. L'errore Not found scompare perché l'endpoint esiste sulla connessione che sta usando ora.
Frame authorize:
authorize
1
<yourMdAccessToken>
Frame subscribe:md/subscribeQuote
2
{"symbol":"ESU6"}
Sottoscriva una volta per simbolo, non in blocco
Una trappola rapida che vale la pena nominare: md/subscribeQuote accetta un solo simbolo per chiamata. Non esiste una forma ad array in cui passa una lista e ottiene tutto in una volta. Se vuole seguire ES, NQ e CL insieme, invii tre frame di sottoscrizione separati sullo stesso socket dei dati di mercato, ciascuno con il proprio id di richiesta. Un socket può portare molte sottoscrizioni di quotazioni live contemporaneamente, le registra semplicemente una alla volta. Quando ha finito con un contratto, annulli la sottoscrizione con md/unsubscribeQuote così non riceve un flusso che non legge più.
Che cosa si rompe dopo: il socket è giusto, ma non compaiono prezzi
Una volta scomparso l'errore not-found, la classe di problemi successiva è di natura diversa. La richiesta ora raggiunge il motore dei dati di mercato, quindi qualsiasi errore da qui in poi riguarda che cosa ha richiesto e se ne ha diritto, non una route mancante.
“Symbol is inaccessible”
Se la chiamata di sottoscrizione restituisce una risposta di inaccessibile o simbolo sconosciuto, di solito entrano in gioco due fattori. Primo, il simbolo deve essere un vero contratto front-month completamente qualificato, ESU6, non la sola radice ES, e non un contratto già scaduto e passato al trimestre successivo. Secondo, il Suo account ha bisogno dei permessi per vedere quei dati: la Contract Library più un abbonamento attivo ai dati di mercato dell'exchange. Senza questi, una richiesta perfettamente formata non restituisce nulla di utilizzabile. È un problema distinto con una propria soluzione.
Il socket continua a cadere
Il WebSocket di Tradovate si aspetta un heartbeat periodico. Se si connette, autorizza, sottoscrive e poi resta in silenzio, il server chiude la connessione e le Sue quotazioni si fermano di colpo. Invii un frame heartbeat vuoto all'intervallo indicato da Tradovate (breve, nell'ordine di un paio di secondi) in modo che il socket dei dati di mercato resti aperto per tutto il tempo in cui servono i prezzi. Molte segnalazioni del tipo “ha funzionato per un minuto e poi si è interrotto” risalgono direttamente a un heartbeat mancante.
Il token è scaduto a metà sessione
I token di accesso non durano per sempre. Se il socket dei dati di mercato si è autorizzato correttamente all'inizio della sessione e poi smette di rispondere, il Suo token potrebbe semplicemente essere scaduto. Lo rinnovi prima che scada invece di aspettare che le chiamate falliscano, poi riautorizzi il socket con il nuovo token.
Una rapida checklist per eliminare l'errore
| Verifica | Che cosa confermare |
|---|---|
| Socket giusto | md/subscribeQuote va a md.tradovateapi.com (live) o md-demo.tradovateapi.com (demo), mai al socket dell'account. |
| Ambiente coerente | Token live → host dati di mercato live; token demo → host demo. |
| Autorizzare prima | Invii il frame authorize con il Suo mdAccessToken prima di qualsiasi richiesta md/. |
| Simbolo di contratto completo | Usi un simbolo front-month completamente qualificato come ESU6, non la radice ES né un contratto scaduto. |
| Un simbolo per chiamata | Invii un frame di sottoscrizione separato per contratto; non esiste una forma ad array in blocco. |
| Heartbeat + token | Mantenga attivo il socket con gli heartbeat e rinnovi il token prima che scada. |
Salti il cablaggio dei socket grezzi
La maggior parte di chi incontra Not found: md/subscribeQuote non sta inseguendo un progetto da fornitore di dati, vuole semplicemente che una strategia operi su Tradovate senza dover accudire due socket, due token, heartbeat e formati di frame. Se è il Suo caso, esiste un percorso molto più breve che programmare a mano l'intero livello WebSocket.
Per i problemi che tendono a comparire subito dopo questo, queste guide approfondiscono: se i Suoi simboli risultano inaccessibili anziché not-found, è un problema distinto di permessi e formato del simbolo; per far arrivare prezzi in tempo reale in primo luogo, sottoscrivere i dati di mercato in tempo reale di Tradovate è il punto di partenza; e se il Suo socket si autorizza correttamente e poi smette silenziosamente di rispondere, di solito è il token di accesso da 90 minuti che scade a metà sessione.
Salti il cablaggio dei socket grezzi
Vuole che la Sua strategia TradingView operi su Tradovate senza cablare personalmente un solo frame WebSocket? Scopra come PickMyTrade automatizza l'intero flusso di ordini.
Inizi la prova gratuita di 7 giorniDomande frequenti
Perché md/subscribeQuote esiste solo sul WebSocket dei dati di mercato di Tradovate, non sul socket dell'account che usa per user/syncRequest e order/placeOrder. Se invia una richiesta md/ al socket dell'account, il server non ha alcuna route per essa su quella connessione e restituisce Not found: md/subscribeQuote. Apra una seconda connessione verso l'host dei dati di mercato e invii lì la sottoscrizione.
I dati di mercato live usano wss://md.tradovateapi.com/v1/websocket e la demo usa wss://md-demo.tradovateapi.com/v1/websocket. Sono host distinti dai socket dell'account. Verifichi i nomi host attuali nella documentazione per sviluppatori di Tradovate prima di inserirli nel codice, poiché possono cambiare.
La risposta di autenticazione di Tradovate restituisce due token, accessToken e mdAccessToken, più un tempo di scadenza. Il mdAccessToken viene emesso per il feed dei dati di mercato, quindi lo usi per autorizzare il socket dei dati di mercato. Ogni socket ha bisogno prima del proprio frame authorize; un socket non autorizzato non risponde a nulla.
È un problema diverso. Una volta che la richiesta raggiunge il motore dei dati di mercato, richiede un simbolo di front-month valido e completamente qualificato più i relativi permessi: la Contract Library e un abbonamento attivo ai dati di mercato dell'exchange. Senza questi, il simbolo risulta inaccessibile anche con un frame corretto. Su un account prop o di valutazione, di solito è la società a controllare quei dati.
No. Ogni richiesta md/subscribeQuote accetta un solo simbolo. Per seguire più contratti, invii una richiesta di sottoscrizione per simbolo sullo stesso socket dei dati di mercato, ciascuna con il proprio id di richiesta. Mantenga la connessione attiva con gli heartbeat e un solo socket può reggere molte sottoscrizioni di quotazioni contemporaneamente.
Questa guida ha esclusivamente scopo educativo e informativo e non costituisce consulenza finanziaria, di investimento o di trading. Operare in futures e in 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, approvata né sponsorizzata da Tradovate, Inc. o Bookmap. 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 la procedura attuale nella documentazione ufficiale della piattaforma prima di agire.