Tradovate API

API Tradovate: 'Access is denied' nell'invio dell'ordine

Le Sue credenziali funzionano, il Suo token è valido, eppure /order/placeOrder rifiuta ogni ordine con Access is denied. Quasi mai si tratta di una chiave non valida: è uno dei quattro errori banali e facilmente risolvibili.

Verificato dal Trading Systems Team di PickMyTrade Ultimo aggiornamento
· Lettura di 8 minuti
Risposta di errore Access is denied di placeOrder Tradovate mostrata in un client REST

Collega un bot all'API REST di Tradovate, parte il primo ordine live, e arriva Access is denied. Sembra un muro. Le sue credenziali hanno funzionato. L'autenticazione le ha fornito un token. Può persino vedere le sue posizioni. Eppure /order/placeOrder rifiuta ogni esecuzione con la stessa stringa laconica, a volte come 401, a volte come HTTP 200 con {"failureReason":"UnknownReason","failureText":"Access is denied"}. La buona notizia: quasi mai si tratta di un problema di “chiave non valida”. È uno dei quattro errori banali e facilmente risolvibili: l'id account sbagliato, un permesso Orders troppo limitato, l'host demo/live sbagliato, o un flag isAutomated gestito male. Di seguito trova la checklist completa, cosa significa realmente l'errore, ogni causa con una soluzione passo dopo passo, e come PickMyTrade evita del tutto questa categoria di problemi in modo che i suoi alert di TradingView arrivino a Tradovate senza dover eseguire il debug del JSON in apertura.

Checklist rapida per "Access is denied"

  • Id account sbagliato, legga l'id numerico da /account/list, mai il nome visualizzato (come “DEMO1235”).
  • Permesso Orders troppo basso, il permesso Orders della API key deve essere impostato su Full Access, non in sola lettura.
  • Host non corrispondente, generi il token e invii l'ordine sullo stesso host: demo.tradovateapi.com per il sim, live.tradovateapi.com per il live.
  • isAutomated errato, includa il flag e lo imposti su true per qualsiasi ordine di bot o algoritmico, e presti attenzione al tipo di dato quando usa il form-encoding.
  • Simbolo obsoleto o errato, usi il contratto del mese frontale attivo (o il suo id contratto), non un simbolo scaduto o continuo.
  • Dispositivo non approvato in live, il live impone rigorosamente un deviceId noto e stabile; il demo è più permissivo.

Cosa significa "Access is denied"

Access is denied è la risposta generica di Tradovate che significa “questa richiesta non è autorizzata a farlo”. La trappola è che non è un errore di autenticazione nel senso comune: può avere un access token perfettamente valido e non scaduto e riceverla comunque. Si verifica nel momento in cui Tradovate verifica se questo token è autorizzato a piazzare questo ordine su questo account. Qualsiasi interruzione in quella catena, un id account che il token non possiede, una API key a cui non sono mai stati concessi i diritti di invio ordini, o un token generato sull'host demo e poi riutilizzato sul live, si manifesta con le stesse tre parole.

Qui contano due tipi di risposta. Un 401 Access Denied puro punta di solito al token o all'host: il token è scaduto, è stato richiesto dalla base URL sbagliata, oppure (in live) il dispositivo non è approvato. Un 200 OK il cui corpo contiene {"failureReason":"UnknownReason","failureText":"Access is denied"} significa che la richiesta si è autenticata correttamente, ma l'ordine stesso è stato rifiutato a livello di permessi, tipicamente per un accountId errato o un permesso Orders mancante.

Poiché entrambe le varianti mostrano la stessa stringa, è facile perdere un'ora a ricontrollare le password quando il vero problema è un singolo campo nel corpo della richiesta. Controlli prima lo stato HTTP, poi analizzi le cause seguenti in ordine.

Principali cause di "Access is denied" sull'invio ordine

1. Sta inviando il nome visualizzato invece dell'id account numerico

Questa è di gran lunga la causa più comune. Il suo account mostra un nome come DEMO1235 o TRAD123456, ed è tentante passare il numero finale come accountId. Ma accountId è l'id entità interno di Tradovate, un valore numerico separato che non ha nulla a che fare con le cifre del nome visualizzato. Se passa quello sbagliato, il token non “possiede” quell'account, quindi l'ordine viene rifiutato.

La soluzione è leggere entrambi gli identificatori da /account/list. Ogni oggetto account restituisce un id (l'id entità numerico da inserire in accountId) e un name (l'etichetta leggibile da inserire in accountSpec). In breve: l'id account non è il numero da cui il suo account risulta chiamato. Non lo codifichi mai in modo fisso, lo recuperi sempre dinamicamente.

Risposta dell'API account/list di Tradovate che evidenzia l'id account numerico rispetto al nome visualizzato

2. Il permesso Orders della API key non è Full Access

Tradovate consente di limitare una API key per singola funzionalità. Una key può leggere le posizioni, leggere le informazioni account e leggere la libreria contratti pur avendo Orders impostato al di sotto di Full Access, il che basta esattamente per autenticarsi, elencare gli account e sembrare funzionante, ma viene bloccata nell'istante in cui tenta di piazzare un ordine. La soluzione è diretta: conceda alla key Orders → Full Access nelle impostazioni applicazione/API di Tradovate, quindi riemetta il token in modo che il nuovo permesso venga applicato.

Schermata delle impostazioni della API key di Tradovate con il permesso Orders impostato su Full Access

3. Ha generato il token su un host e sta inviando l'ordine su un altro

Tradovate gestisce due ambienti completamente separati con due base URL:

  • Demo / simulazione: https://demo.tradovateapi.com/v1
  • Live: https://live.tradovateapi.com/v1

Un token richiesto dall'host demo è valido solo verso l'host demo. Se punta quel token verso il /order/placeOrder di live (o viceversa) ottiene Access is denied. L'errore classico è chiamare auth/accessTokenRequest con una base URL malformata o non corrispondente, per poi chiedersi perché ogni ordine successivo fallisca. Verifichi che la chiamata di autenticazione e la chiamata di ordine usino la stessa stringa host, carattere per carattere, e che l'host corrisponda all'account con cui intende realmente operare.

4. isAutomated manca o ha il tipo sbagliato

Se un bot, un algoritmo o qualsiasi processo impersonale attiva l'ordine, le regole CME richiedono isAutomated: true; un essere umano che clicca su un pulsante dell'interfaccia è false. Oltre al semplice includere il flag, presti attenzione al tipo di dato. Quando invia JSON via POST, isAutomated è un booleano (true). Ma se codifica il corpo come form (data= invece di json= in requests di Python), tutto viene serializzato come stringhe, quindi deve essere inviato come stringa "true". Un booleano che ricade silenziosamente su False, o un tipo che il server non riesce a interpretare, la riporta dritta a Access is denied.

5. Formato del simbolo e (in live) un dispositivo non approvato

Due cause meno frequenti completano l'elenco. Primo, il formato del simbolo: passare un contratto scaduto o mal formato, un vecchio codice di scadenza, o un simbolo continuo/di rollover che l'API non riesce a instradare, può leggersi come un rifiuto invece di un chiaro errore di “simbolo non valido”. Passare al contratto del mese frontale attivo (o al suo id contratto) risolve il problema. Secondo, l'id dispositivo in live: il live impone rigorosamente che gli ordini provengano da un deviceId noto e approvato, fornito in auth/accessTokenRequest, mentre il demo lo ignora in gran parte. Se il suo codice piazza ordini in demo ma viene rifiutato solo in live, questo è l'indizio.

Come risolvere "Access is denied": passo dopo passo

1

Correggere l'id account

Si autentichi e recuperi l'access token dall'host corretto. Chiami GET /account/list sullo stesso host. Nella risposta, individui il suo oggetto account. Copi il valore di id, quell'id entità numerico è il suo accountId. Copi il valore di name (in genere il suo nome utente Tradovate o l'etichetta dell'account), quello è il suo accountSpec. Inserisca entrambi nel corpo dell'ordine. Non riutilizzi le cifre del nome visualizzato.

2

Concedere Orders Full Access e riemettere il token

Apra le impostazioni applicazione/API key di Tradovate dove sono elencati i permessi per singola funzionalità. Imposti il permesso Orders su Full Access (lasci gli scope di lettura secondo necessità). Salvi, quindi richieda un access token nuovo, le modifiche ai permessi si applicano solo ai token emessi successivamente. Verifichi con una chiamata di lettura come GET /position/list prima di riprovare l'ordine.

3

Far corrispondere l'host demo/live

Determini in quale ambiente si trova l'account (sim o live). Usi demo.tradovateapi.com/v1 per il sim e live.tradovateapi.com/v1 per il live, sia per la chiamata di autenticazione che per quella di ordine. Se cambia ambiente, si riautentichi; non porti mai un token demo sul live. Ricordi che i token hanno una durata breve (circa 90 minuti). Se uno script che prima funzionava inizia a fallire a metà sessione, rinnovi il token invece di ridiagnosticare i permessi.

4

Inviare isAutomated correttamente

Includa sempre isAutomated nel corpo dell'ordine. Lo imposti su true per ordini di bot/algoritmici, su false solo per azioni dell'interfaccia genuinamente attivate da un essere umano. Se invia JSON, lo mantenga booleano. Se usa il form-encoding, invii la stringa "true". Rinvii l'ordine e confermi che la risposta contenga un id ordine reale, non un failureText.

Corpo della richiesta placeOrder di Tradovate con i campi corretti accountId numerico, accountSpec e isAutomated

Tabella di risoluzione dei problemi

Errore Significato Soluzione
401 Access DeniedToken non valido, scaduto, o generato sull'host sbagliatoRiautenticarsi sull'host demo/live corrispondente; rinnovare prima della scadenza di circa 90 minuti
200 + {"failureText":"Access is denied"}Autenticato, ma l'ordine è stato rifiutato a livello di permessiUsare l'accountId numerico da /account/list e concedere Orders Full Access
Access is denied dopo aver concesso il permesso OrdersaccountId è il numero del nome visualizzato, non l'id entitàLeggere il campo id da /account/list
Funziona in demo, rifiutato in liveId dispositivo non approvato in liveInviare un deviceId stabile in fase di autenticazione e approvare il dispositivo
Access is denied con un account correttoisAutomated mancante o con tipo di dato erratoIncludere isAutomated; true per i bot; tipo corretto per JSON o form-encoded
Rifiutato su un simbolo apparentemente validoContratto scaduto, continuo o mal formatoUsare il contratto del mese frontale attivo o il suo id contratto

Dove si inserisce PickMyTrade

La maggior parte dei ticket “Access is denied” deriva dalla costruzione manuale della logica di autenticazione e invio ordini. PickMyTrade elimina del tutto questa superficie di rischio intermediando la connessione a Tradovate per lei:

  • Autenticazione gestita e instradamento host, l'host demo/live corretto e un token recente e valido vengono gestiti automaticamente, così una sessione scaduta non si presenta mai come un errore di permessi.
  • Risoluzione account e permessi, l'id account numerico corretto e il permesso Orders vengono determinati dal suo account collegato, non indovinati da un nome visualizzato.
  • Gestione conforme di isAutomated, gli ordini automatizzati vengono contrassegnati correttamente secondo le regole dell'exchange ogni volta, senza insidie booleano-vs-stringa.
  • Validazione simbolo e contratto, gli alert vengono mappati su un contratto valido e attivo prima che un ordine venga mai inviato, eliminando la categoria di errore “rifiutato per simbolo non valido”.

Operi senza rifiuti

Avvii la sua prova gratuita di 5 giorni, colleghi i suoi alert oggi stesso e operi senza rifiuti.

Avvii la prova gratuita di 5 giorni

Domande frequenti

Il permesso è solo metà del controllo. La causa residua più comune è un accountId errato, sta inviando il numero del nome visualizzato invece dell'id entità numerico da /account/list. Un host non corrispondente, ad esempio l'uso di un token demo contro il live, produce lo stesso messaggio.

Chiami GET /account/list sullo stesso host su cui si è autenticato. Usi il campo id dell'oggetto (l'id entità numerico) per accountId, e il suo campo name per accountSpec. Non derivi mai l'id dal nome visualizzato dell'account.

accountSpec è la stringa leggibile (di solito il suo nome utente o l'etichetta dell'account). accountId è l'id numerico interno. Entrambi sono richiesti nel corpo dell'ordine ed entrambi provengono da /account/list.

No. È un rifiuto generico. Controlli prima Orders → Full Access, ma se è già impostato, passi all'id account, all'host e al tipo di isAutomated prima di presumere che la chiave stessa sia difettosa.

Il live impone rigorosamente un deviceId approvato e il proprio host, mentre il demo è più permissivo. Fornisca un id dispositivo stabile in fase di autenticazione e approvi il dispositivo per risolvere il problema.

true per qualsiasi ordine piazzato da un bot, script o algoritmo (un requisito dell'exchange); false solo quando è una persona ad attivarlo fisicamente tramite un'interfaccia.

Sì. Tradovate a volte restituisce 200 OK con {"failureReason":"UnknownReason","failureText":"Access is denied"} nel corpo. Controlli sempre il corpo, non solo il codice di stato.

Può darsi. Alcune prop firm limitano o vietano l'automazione diretta tramite API sugli account di valutazione, e lo stato di dati/permessi varia in base alla firm e alla dimensione dell'account, verifichi le regole attuali della sua firm prima di automatizzare.

Questa guida ha scopo esclusivamente educativo e informativo 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 ogni investitore. PickMyTrade è una piattaforma di automazione indipendente di terze parti e non è affiliata, sostenuta 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 la procedura corrente sulla piattaforma e nella documentazione ufficiale di Tradovate prima di agire.