Tradovate API

L'API Tradovate /product/find restituisce 404

Ha inviato una richiesta a product/find e ha ricevuto un secco 404. L'endpoint non manca, la richiesta è strutturata male; ecco la correzione esatta con GET e stringa di query.

Verificato dal Trading Systems Team di PickMyTrade Ultimo aggiornamento
· Lettura di 7 minuti
Client API Tradovate che mostra una risposta 404 Not Found dopo l'invio di un corpo JSON all'endpoint product/find

Ha inviato una richiesta a product/find, e invece di un payload JSON ordinato, il server ha restituito un secco 404. Qui non c'è nulla, dice. Ma l'endpoint non manca. In pratica, quel 404 significa quasi sempre che la richiesta è strutturata male, non che la route non esista. Nove volte su dieci si tratta di uno di due errori: ha inviato i parametri in un corpo JSON invece che nell'URL, oppure sta puntando all'host o al percorso sbagliato. Corregga la forma della chiamata e product/find (insieme al suo stretto parente contract/find) tornerà a fornirle dati.

Ecco la versione breve, poi il perché e il come.

Soluzione rapida: chiami product/find come GET con il simbolo nella stringa di query, GET https://demo.tradovateapi.com/v1/product/find?name=ES, non come POST con un corpo JSON. Per ottenere il contratto effettivamente negoziabile, usi contract/find?name=ESU6. Entrambi accettano gli stessi parametri.

Perché si verifica il 404

Un 404 su questa chiamata è fuorviante perché siamo abituati a leggerlo come “questo URL non esiste”. Sull'API REST di Tradovate, però, lo stesso stato compare anche quando il router non riesce ad abbinare la richiesta effettivamente inviata a un'operazione reale. Sono alcuni errori specifici a causarlo.

Ha inviato un corpo JSON invece di una stringa di query. Questo è l'errore principale. product/find è un'operazione di lettura, e Tradovate si aspetta che le operazioni di lettura siano richieste GET con parametri aggiunti all'URL. Se invia con POST qualcosa come {"name":"es","isAutomated":true} come corpo JSON, la richiesta non si risolve mai nell'operazione find e riceve un 404. Ci sono due errori contemporaneamente: la forma corpo contro stringa di query, e il campo aggiuntivo isAutomated che find non accetta comunque. Elimini entrambi.

Ha omesso il prefisso di versione o ha sbagliato l'host. Ogni chiamata REST si trova sotto /v1/. La base è https://demo.tradovateapi.com/v1 per la simulazione e https://live.tradovateapi.com/v1 per il live. Se omette /v1, punta a api.tradovate.com (quello è il sito di documentazione, non l'API), o sbaglia a digitare il sottodominio, non c'è alcuna route corrispondente, 404.

Ha cambiato maiuscole/minuscole o l'ortografia del percorso. Il percorso è composto da due parti: un'entità e un'operazione, unite da una barra, come product/find o contract/find. Scriva Product/Find, products/find o product/search e nessuna si risolverà.

Sta chiamando un'operazione non implementata su quel trasporto. Alcune operazioni esistono via WebSocket ma non sulla route REST semplice, e viceversa. Se copia una chiamata pensata per l'una e la invia all'altra, vedrà un 404 con un corpo che nomina letteralmente l'operazione mancante, come "Not found: md/getChart". Questo è l'indizio che la route è corretta, ma il trasporto è sbagliato.

Una cosa che un 404 non è: un problema di autenticazione. Se il suo token di accesso manca o è scaduto, riceve un 401, non un 404. Quindi, se si trova davanti a un 404, non perda tempo a rigenerare token, controlli prima la forma della richiesta e l'URL.

La soluzione: GET con una stringa di query

Ricostruisca la chiamata come GET e sposti il simbolo nella stringa di query. Questo singolo cambiamento risolve la stragrande maggioranza di questi 404.

GET https://demo.tradovateapi.com/v1/product/find?name=ES
Authorization: Bearer <your-access-token>
Accept: application/json

Sostituisca ES con la radice di prodotto desiderata, MES, NQ, MNQ, CL, e così via. La risposta è il record del prodotto per quello strumento: il suo id, nome, tipo di prodotto, borsa, tick size e valore per punto. Noti che non c'è alcun corpo di richiesta. Nulla da serializzare, nulla che possa andare storto.

Se stava usando una libreria client o un bridge che costruisce la richiesta per lei e continua a vedere 404, controlli cosa sta effettivamente inviando sulla rete. Un numero sorprendente di momenti “l'API è rotta” si rivela essere un helper che silenziosamente avvolge i suoi parametri in un corpo POST. Lo punti su GET, e la stessa ricerca di simbolo che falliva un attimo fa torna a funzionare pulita.

Risposta 200 riuscita da una richiesta GET a product/find con name=ES nella stringa di query

Ottenere il contratto negoziabile con contract/find

product/find le dà informazioni sulla famiglia di strumenti. Non le dice a quale contratto instradare effettivamente un ordine, perché un prodotto non scade, un contratto sì. Per questo, ricorra a contract/find, che accetta esattamente gli stessi parametri di query:

GET https://demo.tradovateapi.com/v1/contract/find?name=ESU6

Il name qui è il simbolo completo del contratto, non solo la radice. Tradovate lo costruisce da tre parti senza spazi: la radice del prodotto, un singolo codice mese e l'ultima cifra dell'anno. Quindi ESU6 è l'E-mini S&P 500 per U (settembre) 6 (2026). Cambi la lettera del mese e la cifra dell'anno man mano che i contratti ruotano; i mesi trimestrali degli indici azionari sono H, M, U e Z (marzo, giugno, settembre, dicembre). Il mese frontale ruota nel corso dell'anno, quindi confermi il contratto attivo attuale invece di codificarne uno che sta per scadere.

Se fornisce a contract/find un simbolo che non esiste o è già scaduto, potrebbe ottenere un risultato vuoto invece di un contratto pulito, un altro motivo per risolvere prima il mese frontale in tempo reale invece di indovinare. Una volta ottenuto l'id del contratto, quello è il valore che passa al piazzamento degli ordini, alle consultazioni delle posizioni e agli abbonamenti ai dati di mercato.

Risposta di contract/find di Tradovate che restituisce il record del contratto ESU6 con il suo id numerico e la scadenza

Quando non conosce il simbolo esatto

E se non ha il codice di contratto preciso e vuole solo cercare? Prima di tutto, ridimensioni le sue aspettative: non esiste un endpoint pubblico “mi dia ogni simbolo”. L'API è costruita attorno a ricerche mirate e si aspetta che lei metta in cache ciò che recupera invece di prelevare un elenco enorme a ogni esecuzione.

Due percorsi pratici:

  • Suggerimento a completamento automatico. Tradovate ha un endpoint di suggerimento contratti che si comporta come il campo di ricerca della piattaforma, lei passa una stringa di testo parziale e un limite di risultati, e restituisce i contratti corrispondenti. È il modo più pulito per trasformare “l'utente ha digitato MNQ” in un contratto reale e attuale. Confermi i nomi esatti dei parametri nel riferimento API attuale prima di integrarlo, poiché gli endpoint di suggerimento usano chiavi brevi a una sola lettera.
  • Prima il prodotto, poi il contratto. Cerchi il prodotto con product/find?name=NQ, poi risolva il contratto attivo corrispondente. Questo processo in due passaggi la mantiene su operazioni documentate e stabili.

Potrebbe imbattersi in una route contract/list in giro. Esiste, ma non è documentata e non è consigliata, non è una chiamata supportata di “elenca tutto”, e costruirci sopra invita a problemi. Si attenga a contract/find e all'endpoint di suggerimento, metta in cache i risultati e aggiorni la cache a ogni rollover di contratto.

Una checklist di 90 secondi

Prima di presentare una segnalazione di bug, scorra questo elenco. Risolve quasi ogni 404 di product/find.

Controllo Come appare &ldquo;corretto&rdquo;
Metodo HTTPGET, non POST
ParametriNella stringa di query (?name=ES), non in un corpo JSON
Campi extraNessun isAutomated o altri campi solo per ordini in una chiamata find
URL di basedemo.tradovateapi.com/v1 o live.tradovateapi.com/v1, con il /v1
Ortografia del percorsoEsattamente product/find / contract/find, minuscolo
HostNon api.tradovate.com (quello è il sito di documentazione)
TrasportoRoute REST su HTTPS, non un'operazione solo WebSocket

Se tutto quanto sopra è verificato e riceve comunque un 404 specificamente su product/find mentre altre chiamate GET funzionano, catturi la richiesta e la risposta grezze e si rivolga al supporto API di Tradovate, ma questo è raro. Quasi sempre, il problema è una delle righe sopra.

Vale la pena sapere quali errori non sono questo: un 401 significa che il suo token è scaduto o mancante (lo rinnovi prima che scada), e un “symbol is inaccessible” o 403 su una richiesta di quotazione significa un problema di diritti sui dati di mercato, non un problema di ricerca. Le ricerche di contratti e prodotti in sé richiedono solo un token valido, nessun abbonamento ai dati necessario.

Impostazioni web di Tradovate che mostrano dove viene abilitato l'accesso API e generata una chiave API

Vuole che la ricerca dei simboli venga gestita per lei?

Configurare il rinnovo del token, la risoluzione del mese frontale e le ricerche di contratto per simbolo è il tipo di lavoro idraulico che divora un weekend e poi si rompe al rollover di contratto successivo. Se il suo vero obiettivo è far scattare un avviso TradingView e vederlo tradursi in un ordine live su Tradovate, senza dover sorvegliare il livello REST, può saltare completamente l'API grezza e lasciare che un bridge mappi i simboli e instradi gli ordini per lei.

Automatizzi i suoi ordini Tradovate da TradingView senza toccare l'API grezza e lasci che PickMyTrade gestisca per lei la ricerca dei simboli e l'instradamento degli ordini.

Salti l'API grezza

Automatizzi i suoi ordini Tradovate da TradingView senza toccare l'API grezza. PickMyTrade gestisce per lei la ricerca dei simboli e l'instradamento degli ordini.

Inizi la sua prova gratuita di 5 giorni

Domande frequenti

Quasi sempre perché la richiesta è strutturata male, non perché la route manchi. Il fattore scatenante più comune è inviare il simbolo in un corpo JSON invece che nella stringa di query dell'URL, oppure aggiungere campi che l'endpoint non accetta. È una chiamata GET, quindi passi il simbolo come stringa di query: GET /v1/product/find?name=ES. Anche un prefisso /v1/ mancante, l'host sbagliato o un errore di battitura nel percorso produrranno un 404.

product/find restituisce il prodotto, la famiglia di strumenti, come ES per l'E-mini S&P 500. contract/find restituisce uno specifico contratto negoziabile con una scadenza, come ESU6 per settembre 2026. Accettano gli stessi parametri di query. Usi product/find per cercare lo strumento, poi contract/find per ottenere il contratto esatto che negozierà o a cui si abbonerà.

No. Non esiste un endpoint pubblico che elenchi tutti i simboli. L'API si aspetta che lei cerchi ciò di cui ha bisogno con contract/find o l'endpoint di suggerimento a completamento automatico e metta in cache i risultati. Esiste una route contract/list, ma non è documentata né consigliata, quindi costruisca il suo flusso di lavoro attorno a ricerche mirate.

No. contract/find e product/find restituiscono dati di riferimento e funzionano con un semplice token di accesso valido. Un abbonamento ai dati di mercato conta solo quando si abbona a quotazioni in tempo reale. Se una ricerca va a buon fine ma una richiesta di quotazione fallisce, si tratta di un problema di diritti sui dati, non di ricerca contratti.

Questa guida ha scopi puramente educativi e informativi 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 di terze parti indipendente e non è affiliata, sponsorizzata o approvata 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 il processo attuale nella documentazione ufficiale della piattaforma prima di agire.