Tradovate

Lo stop NinjaTrader-Tradovate non si aggiorna al breakeven

NinjaTrader mostra il Suo stop spostato al breakeven, il prezzo riattraversa quel livello e Lei incassa comunque l'intera perdita. Il report Orders di Tradovate racconta una storia diversa dal Suo schermo. Ecco perché, e come colmare il divario.

On This Page

Ha visto NinjaTrader far salire il Suo stop al breakeven, il prezzo ha riattraversato quel livello e, invece di chiudere in pareggio, ha incassato l'intera perdita di 20 punti. Poi ha aperto il report Orders di Tradovate ed eccolo: lo stop era ancora fermo al prezzo originale del Suo stop d'ingresso. Quel divario è tutto il problema. La Sua strategia mostra il nuovo prezzo sullo schermo, ma la modifica non ha mai raggiunto l'ordine attivo del broker. Si presenta sotto vari travestimenti: uno stop che non si sposta mai dal prezzo iniziale, un trailing stop che segna alcuni tick di scarto rispetto a quanto ordinato dal Suo codice, oppure una modifica che «resta arancione» e non si conferma mai. Instradare il Suo rischio tramite un bridge come PickMyTrade elimina il passaggio fragile in cui avvengono questi errori silenziosi, ma prima deve capire dove l'aggiornamento scompare davvero.

Checklist rapida per uno stop che non si sposta al breakeven

  • Controlli prima il report Orders di Tradovate. Il prezzo dell'ordine attivo del broker è la Sua unica fonte di verità; il display di NinjaTrader può essere in ritardo o divergere.
  • Confermi che la modifica non sia stata rifiutata. Uno stop spostato sul lato sbagliato di un mercato veloce viene rifiutato e il vecchio ordine resta attivo.
  • Convalidi il nuovo prezzo dello stop: deve essere sotto il bid (long) o sopra l'ask (short) prima di ogni chiamata a ChangeOrder().
  • Aggiorni il riferimento dell'ordine con GetRealtimeOrder() quando la strategia passa da storico a tempo reale.
  • Limiti le modifiche rapide. Un ciclo di trailing ad alto volume può superare l'accettazione del broker e far cadere gli aggiornamenti.
  • Aggiunga la gestione degli errori attorno al metodo di aggiornamento dello stop, così una modifica fallita compare nel log invece di svanire.

Cosa significa davvero «lo stop non si aggiorna al breakeven»

NinjaTrader e Tradovate mantengono due immagini separate del Suo ordine. NinjaTrader detiene un oggetto ordine locale che la Sua strategia legge e scrive. Tradovate detiene l'ordine attivo reale che il mercato eseguirà. Un ChangeOrder(), o un trascinamento sul grafico o sul DOM, è una richiesta inviata attraverso la connessione che chiede a Tradovate di modificare quell'ordine attivo. Finché Tradovate non la accetta e restituisce una conferma, l'ordine del broker resta esattamente dov'era.

Ecco la trappola: NinjaTrader può mostrare tranquillamente il nuovo prezzo di breakeven mentre Tradovate non ha accettato nulla. Immagini una strategia non gestita che imposta uno stop di 20 punti, lo sposta al breakeven a un trigger di profitto e poi lo trascina. Durante un'apertura mattutina ad alto volume, lo stop risulta spostato all'interno di NinjaTrader, ma il report Orders di Tradovate mostra che non ha mai lasciato il prezzo originale. Il prezzo ritraversa il «breakeven» e la posizione si chiude allo stop originale, perché è lì che si trovava l'ordine di Tradovate per tutto il tempo.

Ecco perché il report Orders conta più del grafico. Quando il prezzo attivo del broker e il prezzo voluto dalla Sua strategia non coincidono, creda al broker. Tutto ciò che segue serve a colmare quel divario.

Cause principali di uno stop NinjaTrader che non si aggiorna su Tradovate

1. La modifica ha colpito il lato sbagliato del mercato ed è stata rifiutata

È la causa numero uno durante i movimenti rapidi. Uno stop di vendita protettivo per una posizione long deve stare sotto il mercato; uno stop di acquisto a copertura di una posizione short deve stare sopra. Se prova a spostare uno stop al breakeven dopo che il prezzo ha già attraversato quel livello, la modifica è un ordine non valido e il broker la rifiuta con qualcosa come «Sell stop or sell stop limit orders can't be placed above the market.» NinjaTrader potrebbe aver già aggiornato il proprio oggetto locale, ma poiché la modifica è stata rifiutata, Tradovate mantiene attivo lo stop precedente al prezzo originale.

In condizioni rapide non è un bug, è il mercato che rifiuta un ordine che non può onorare. La correzione è una determinazione dei prezzi difensiva, trattata sotto.

2. Il Suo codice ha modificato un riferimento d'ordine obsoleto

NinjaTrader esegue la Sua strategia prima sulle barre storiche, poi passa al tempo reale. Se ha salvato un oggetto ordine in una variabile durante lo stato storico e continua a chiamare ChangeOrder() su quel riferimento dopo che la strategia è andata live, sta modificando un oggetto morto e l'ordine attivo di Tradovate non vede mai la modifica. La documentazione di NinjaTrader è esplicita: quando i riferimenti agli ordini storici passano al tempo reale, deve aggiornare il riferimento con l'helper GetRealtimeOrder(), altrimenti la modifica fallisce.

C'è un parente stretto di questo problema: una modifica che scatta subito dopo il piazzamento con un prezzo arrotondato o obsoleto. Una strategia può ordinare uno stop a 19802 mentre l'ordine Tradovate mostra 19805.75, e la causa è la logica stessa della strategia che modifica lo stop subito dopo l'invio, non un guasto del broker. La lezione è semplice: se il numero su Tradovate è vicino ma sbagliato, sospetti il percorso del Suo codice, non la connessione.

3. Limitazione delle modifiche degli ordini ad alto volume

Tradovate limita la velocità con cui accetta le azioni sugli ordini, e tali limiti variano in base al conto e cambiano nel tempo; controlli i limiti di frequenza dell'API di Tradovate attuali anziché assumere un numero fisso. Una routine di trailing che lancia un ChangeOrder() a ogni tick o a ogni barra può generare modifiche più velocemente di quanto il broker le accetti. Quando accade, alcune modifiche vengono scartate o rifiutate mentre lo stato locale di NinjaTrader continua ad avanzare, e le due immagini si separano. È il classico schema «ha funzionato in simulazione, è fallito all'apertura» con volumi elevati.

4. NinjaTrader mostra la modifica localmente, ma il broker non l'ha mai confermata

Anche con codice pulito, la connessione può lasciare una modifica sospesa. Sposta uno stop o un take-profit e l'ordine «resta arancione», non si conferma mai, e disconnettersi, riconnettersi e riavviare NinjaTrader non lo risolve. In quello stato, presuma che il broker detenga ancora l'ordine vecchio. La mossa corretta per un ordine attivo sospeso è contattare il Suo broker o fornitore di valutazione per confermare e gestire direttamente l'ordine attivo, quindi inviare i file di log e di trace per l'analisi.

5. Ordine gestito non live-until-cancelled, o arrotondamento al tick

Nell'approccio gestito, un ordine deve essere contrassegnato come live-until-cancelled per restare modificabile tra le barre. Se lo omette, il framework può considerarlo non più modificabile, quindi la Sua modifica non fa silenziosamente nulla. L'arrotondamento dei prezzi aggrava il problema: se il breakeven calcolato non è allineato alla dimensione del tick dello strumento, il broker può rifiutarlo o spostarlo, lasciando l'ordine attivo diverso da quanto si aspettava.

Come correggere uno stop NinjaTrader-Tradovate che non si aggiorna

Correggere i rifiuti dal lato sbagliato del mercato

  1. Prima di ogni modifica dello stop, legga il mercato corrente. Per lo stop di vendita protettivo di una posizione long, se il nuovo prezzo è pari o superiore al bid, lo limiti a un tick sotto il bid (newPrice = GetCurrentBid() - TickSize); faccia lo speculare per gli short rispetto all'ask.
  2. Avanzi lo stop verso il breakeven solo quando il prezzo lo ha superato con un margine. Non ordini il breakeven nell'istante in cui il profitto uguaglia la distanza dello stop.
  3. Arrotondi il prezzo finale alla dimensione del tick dello strumento, così il broker non deve mai spostarlo.

Correggere i riferimenti d'ordine obsoleti

  1. In OnStateChange(), quando la strategia passa al tempo reale, riottenga ogni oggetto ordine che intende modificare usando GetRealtimeOrder().
  2. Confermi che il riferimento restituito non sia null prima di chiamare ChangeOrder(). Un null significa che l'ordine è già stato eseguito, cancellato o rifiutato, e non c'è nulla di attivo da modificare.
  3. Nell'approccio gestito, mantenga gli ordini protettivi live-until-cancelled in modo che restino modificabili tra le barre.

Limitare la frequenza e aggiungere la gestione degli errori

  1. Invii una modifica solo quando il prezzo obiettivo è effettivamente cambiato di almeno un tick. Salti le chiamate ridondanti a ChangeOrder().
  2. Racchiuda il metodo di aggiornamento dello stop in una gestione degli errori che registri l'ID dell'ordine, il timestamp e il motivo del rifiuto, così un errore silenzioso diventa una riga di log visibile. Aggiungere una migliore gestione degli errori a un metodo come UpdateStopLoss è spesso l'unica modifica che finalmente cattura il prossimo errore.
  3. Durante le notizie e l'apertura del mercato cash, allarghi l'intervallo tra gli aggiornamenti di trailing per restare sotto la frequenza di accettazione del broker.

Riconciliare NinjaTrader con Tradovate

  1. Tenga aperto il report Orders (o l'Order History) di Tradovate accanto a NinjaTrader mentre uno stop live viene trascinato.
  2. Dopo ogni modifica, confermi che il prezzo attivo su Tradovate corrisponda al prezzo voluto. In caso contrario, la modifica non è andata a buon fine.
  3. Se un ordine resta bloccato senza conferma, lo chiuda o lo gestisca direttamente da Tradovate invece di fidarsi del display locale di NinjaTrader.

Tabella di risoluzione dei problemi

Sintomo / Errore Cosa significa Soluzione
Lo stop mostra il breakeven in NinjaTrader, il prezzo originale in TradovateLa modifica non ha mai raggiunto il broker o è stata da esso rifiutataFidarsi del report Orders di Tradovate; convalidare il lato del prezzo e ricontrollare il riferimento
Messaggio «Sell stop ... can't be placed above the market» (o l'equivalente buy stop)Il nuovo stop era sul lato sbagliato di un mercato veloceLimitare il nuovo prezzo di un tick oltre bid/ask prima dell'invio
Il prezzo dello stop Tradovate differisce di alcuni tick dalla strategiaIl codice modifica lo stop con un prezzo obsoleto/arrotondato dopo il piazzamentoArrotondare alla dimensione del tick; smettere di ri-modificare subito dopo l'ingresso
La modifica «resta arancione» / non si conferma maiOrdine attivo sospeso nella connessioneGestire l'ordine direttamente su Tradovate; inviare log/trace di NinjaTrader
Il trailing stop perde aggiornamenti con volumi elevatiLe modifiche hanno superato la frequenza di accettazione del brokerLimitare gli aggiornamenti; inviare solo su un reale cambiamento di un tick
ChangeOrder() non fa silenziosamente nulla dopo l'avvio in tempo realeModifica di un oggetto ordine storico obsoletoRiottenere con GetRealtimeOrder(); mantenere gli ordini live-until-cancelled

Lo eviti con PickMyTrade

  • Stato dell'ordine confermato dal broker, l'instradamento va direttamente a Tradovate e segue l'effettivo ordine attivo del broker, così il Suo stop riflette ciò che detiene il mercato, non una copia locale obsoleta.
  • Validazione di quantità e simbolo, blocca le modifiche malformate o dal lato sbagliato prima dell'invio, riducendo i rifiuti silenziosi.
  • Instradamento sicuro rispetto ai limiti di frequenza, distanzia il flusso degli ordini in modo che gli aggiornamenti rapidi del trailing non superino l'accettazione del broker e non svaniscano.
  • Sincronizzazione multi-conto, replica lo stop corretto su ogni conto collegato invece di lasciare indietro l'ordine di un conto.

Smetta di veder evaporare gli stop al breakeven

L'instradamento va direttamente a Tradovate e segue l'effettivo ordine attivo del broker, così il Suo stop riflette ciò che detiene il mercato, non una copia locale obsoleta.

Inizi la prova gratuita di 7 giorni

Domande frequenti

NinjaTrader mantiene una copia locale dell'ordine mentre Tradovate detiene l'ordine attivo reale. Se la modifica è stata rifiutata o non è mai stata confermata, la copia di NinjaTrader può avanzare mentre lo stop del broker resta fermo. Verifichi sempre con il report Orders di Tradovate.

Il più delle volte è la strategia o il mercato veloce, non Tradovate. I colpevoli abituali sono la modifica di un riferimento d'ordine obsoleto, l'invio di uno stop dal lato sbagliato del mercato o l'invio di modifiche più velocemente di quanto il broker le accetti. Aggiunga logging al Suo metodo di aggiornamento dello stop per vedere quale caso sta incontrando.

Significa che la modifica è sospesa nella connessione e il broker detiene ancora l'ordine precedente. Gestisca l'ordine direttamente su Tradovate, poi invii i file di log e di trace di NinjaTrader per l'analisi.

Convalidi il nuovo prezzo dello stop prima dell'invio: per lo stop di vendita di una posizione long, lo mantenga almeno un tick sotto il bid corrente e avanzi al breakeven solo dopo che il prezzo ha superato quel livello con un margine.

Se memorizza un oggetto ordine durante il riscaldamento storico della strategia e poi lo modifica in tempo reale, sì. Riottenga il riferimento live con GetRealtimeOrder() non appena la strategia passa al tempo reale, altrimenti le Sue chiamate a ChangeOrder() punteranno a un oggetto morto.

Un movimento rapido dei prezzi rende più probabili i rifiuti dal lato sbagliato, e un ciclo di trailing molto attivo può superare la frequenza di azioni sugli ordini del broker. Entrambe le cose lasciano il display di NinjaTrader in anticipo rispetto all'ordine reale di Tradovate. Limiti gli aggiornamenti e si affidi a una determinazione dei prezzi difensiva in quelle finestre.

Un bridge non può scavalcare le regole del mercato, ma un instradamento attento alle conferme, che segue lo stato reale dell'ordine del broker e distanzia le modifiche, elimina il punto fragile in cui la copia locale di NinjaTrader si discosta silenziosamente dallo stop attivo di Tradovate.

Questa guida ha esclusivamente scopo educativo e informativo 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. o a Bookmap, né da esse approvata o sponsorizzata. 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, pertanto confermi sempre la procedura attuale nella documentazione ufficiale della piattaforma prima di agire.