OnTradeTransaction - pagina 2

 
Игорь Герасько:

Da un lato, sì. D'altra parte: che dire dei casi in cui una richiesta è stata inviata al server, ma l'operazione non è ancora stata eseguita? Come possiamo dire in che stato siamo se abbiamo solo una lista di ordini e posizioni (e la storia del conto)?

Non c'è un tale problema in MT4, perché tutte le operazioni di trading sono sincrone. Ma come risultato abbiamo prestazioni più lente.

Il fatto che le operazioni asincrone siano più veloci di quelle sincrone è un mito che deriva dall'ignoranza di ciò che succede. Le operazioni asincrone hanno un ciclo completo di esecuzione di un'azione commerciale diviso in più parti, mentre quelle sincrone hanno un solo ciclo. L'operazione asincrona richiede anche la risposta del server, l'esecuzione sullo scambio è la stessa, cioè il tempo totale richiesto per l'operazione asincrona e sincrona è quasi lo stesso. Il vantaggio degli ordini asincroni è la possibilità di inviarli simultaneamente, cioè è possibile inviare due o più ordini quasi contemporaneamente. Questo è ciò che rende possibile un'alta velocità di funzionamento (in totale). Non tutti gli Expert Advisor richiedono la modalità di invio asincrono. Prima di tutto, è necessario per vari commercianti di arbitraggio in cui è necessario acquistare due o più simboli allo stesso tempo, o algoritmi HFT. Per esempio, il bot HFT può inviare un ordine per entrare nel mercato, e in 3-4 msec può inviare l'ordine opposto, nel qual caso è troppo lungo aspettare la risposta del server sul primo ordine, quindi richiede una modalità di invio asincrona - senza aspettare il risultato. Nella stragrande maggioranza degli EA tali velocità non sono necessarie.

 
Vasiliy Sokolov:
Neanche tu sai come fare. Hai già scritto decine di pagine su OnTradeTransaction, ma non hai capito una cosa: OnTradeTransaction è una funzione di servizio per risolvere compiti specifici, non puoi usarla nel trading come fai tu. E poi i ragazzi intelligenti leggono i vostri articoli e creano thread simili: "Perché OnTradeTransaction non è garantita?" - perché un Expert Advisor non dovrebbe creare il suo ambiente di trading attraverso OnTradeTransaction, come fate voi, ma basarsi solo su ciò che è disponibile nel sistema, in particolare nella storia degli ordini e delle operazioni.

Ed è qui che Ostap si sbaglia....

Se hai un rancore personale verso di me, non c'è bisogno di portarlo in una discussione

di problemi tecnici in cui lei è "molto esperto"...

Siete voi che ingannate la gente con la vostra teatralità invadente!

 
Михаил:

Ed è qui che Ostap lo prende....

Se hai un rancore personale verso di me, non c'è bisogno di portarlo in una discussione

di problemi tecnici in cui sei "altamente esperto"...

Stai solo ingannando la gente con le tue teorie assertive!

Misha, ehi! Com'è stato il tuo viaggio in Formula 1? Com'era il tempo a Sochi?
 
Vasiliy Sokolov:
Misha, ciao! Com'è stato il tuo viaggio in Formula 1? Com'era il tempo a Sochi?

Ciao!

Grande! Ho fatto una nuotata in mare (l'acqua era di 24 gradi).

 
Михаил:

Ciao!

Grande! Ho fatto una nuotata in mare (l'acqua era di 24 gradi).

Fico, è un'acqua molto calda!

In tutta serietà - non ho nessuna lamentela contro di te. Se volete discutere nel merito - benvenuti. Inoltre, non ho alcun desiderio di insegnare a qualcuno. Ognuno ha la sua bicicletta con ruote quadrate.

 
Vasiliy Sokolov:

Se il tempo tra l'invio dell'ordine e il prossimo segnale di entrata nel mercato supera il tempo di esecuzione dell'ordine, non c'è niente da fare. La logica qui è semplice: inviamo un ordine asincrono, usciamo dal thread e ce ne dimentichiamo. Aspettiamo il momento successivo per controllare il segnale. Se in quel momento l'ambiente di trading non è cambiato - l'Expert Advisor cerca un segnale per entrare di nuovo nel mercato e ripete l'ordine di entrare nel mercato. Se, al contrario, tutto è andato bene e l'ordine è stato eseguito, l'Expert Advisor si renderà conto di avere una posizione dopo aver analizzato l'ambiente e non aprirà più una nuova posizione. Cioè, in questo approccio, la condizione dell'Expert Advisor è garantita per essere coerente con l'ambiente di mercato.

La situazione è più complicata nel trading ad alta frequenza, dove un nuovo segnale può verificarsi dopo un tempo paragonabile all'esecuzione di un ordine (6-100 msec). In questo caso, non si può fare a meno di chiudere. L'Expert Advisor dovrebbe ricordare l'ora dell'ultimo invio dell'ordine. Se si verifica un errore in OnTransaction, il blocco viene resettato e l'Expert Advisor può eseguire nuovamente le operazioni.

Va notato che OnTradeTransacton che tanta gente ama pregare non aiuta a HFT. Un nuovo segnale di entrata può arrivare più velocemente della risposta sull'esecuzione riuscita di una transazione in OnTradeTransaction. Il blocco è necessario sia che usiate OnTradeTransacton o meno.

Come, vi chiederete, possiamo controllare gli errori che sorgono in OnTradeTransaction? Potete rispondere con una contro-domanda: come cambierete al volo la logica di trading dell'Expert Advisor quando si verifica un errore? - Non si può. Gli errori si verificano se non si fanno controlli appropriati prima (presenza di denaro, volume, ecc., ecc.). Ma una volta che si è verificato, non sarà possibile correggerlo. Perciò la cosa migliore che potete fare in OnTradeTransaction è stampare questo errore nel log (per correggere la logica di Expert Advisor più tardi), e rimuovere il blocco, se è usato. Per questo e per nient'altro, si deve usare OnTradeTransaction.

Ora vari adepti di Mikalas arriveranno di corsa e cominceranno a lanciarmi pomodori - lasciali fare. Ma ho sempre ripetuto che una logica di trading affidabile può essere organizzata solo se si basa sull'ambiente di trading del terminale. Tutto il resto - non funziona.

Non capisco bene cosa c'entra il tempo tra i segnali? Ogni segnale di trading ha il suo tempo di registrazione. Una volta che il segnale è registrato (apparso), è necessario eseguire un'operazione di trading. Come risultato, l'Expert Advisor invia un ordine di trading al server e lavora ulteriormente. L'ordine non è stato ancora eseguito dal server. Arriva una nuova zecca. L'Expert Advisor rianalizza il suo stato e scopre che c'è un segnale di apertura, ma non c'è una posizione (o un ordine) corrispondente tra gli ordini di lavoro.

Lamia domanda è: come può l'Expert Advisor determinare senza usare i dati di OnTrade o OnTradeTransaction perché non c'è posizione? Ci possono essere diverse ragioni:

1. La richiesta di apertura è stata inviata al server, ma il server non ha ancora dato una risposta sul risultato dell'esecuzione dell'ordine. Dobbiamo aspettare la risposta.

2. La richiesta non è stata ancora inviata al server. Gli ordini devono essere inviati.

3. La richiesta è stata inviata, il server risponde che l'ordine non può essere eseguito. Il messaggio di errore deve essere elaborato e deve essere presa una decisione su cosa fare dopo.

4. La richiesta è stata inviata, ma il server non risponde per molto tempo (ognuno imposta questo tempo da solo, il mio è 1 minuto) (timeout).

Non vedo nessuna soluzione senza usare OnTrade o OnTradeTransaction. Ma voi sostenete che ce n'è uno. Per favore, spiegate quale. Perché è strano parlare di thread locking in MQL4/5 - non ci sono due o più thread qui, c'è solo un thread. Inoltre, operate con espressioni come "se tutto va bene e l'ordine viene eseguito", ma non spiegate come viene determinato. E questa è l'essenza della mia domanda.

 
Vasiliy Sokolov:

Ciò che si intende non è bloccare il flusso, ma bloccare l'invio dell'ordine di compravendita.

Ecco la domanda: se il server restituisce un errore di esecuzione dell'ordine, come possiamo scoprirlo per sbloccare la possibilità di inviare un secondo ordine? Di nuovo, se OnTrade e OnTradeTransaction non sono utilizzati.

Un'altra domanda: supponiamo che l'Expert Advisor abbia determinato il motivo per cui un ordine non può essere eseguito (il mercato è chiuso, non ci sono soldi, ecc.), e poi? In che modo l'Expert Advisor migliorerà la situazione? Aggiungerà denaro al conto o aprirà il mercato? In che modo conoscere la causa dell'errore dell'ultimo ordine aiuterà l'Expert Advisor a fare ulteriore trading?

Aiuterà molto. Lasceremo la mancanza di denaro, perché l'Expert Advisor dovrebbe determinare questo punto prima di inviare un ordine di compravendita e informare il trader con un messaggio (o con qualche altro mezzo). Di conseguenza, l'ordine di compravendita non viene inviato affatto.

Il messaggio di errore può informarci se dobbiamo continuare a provare a inviare ordini. Per esempio, se il mercato è chiuso, non c'è bisogno di reinviare immediatamente la richiesta. Dovresti fermare il trading per un certo tempo (è determinato dallo sviluppatore dell'Expert Advisor), e solo allora inviare una nuova richiesta (se il segnale di trading è ancora attivo). Se si verifica un requote, puoi inviare subito una nuova richiesta. Se c'è stato un errore nell'impostazione degli stop (Stop Level o Freeze Level è cambiato durante l'invio dell'ordine), gli stop vengono corretti in base ai nuovi dati e viene inviata immediatamente una nuova richiesta.

Quindi la conoscenza di un errore di trading (in generale - qualsiasi errore) e la sua corretta elaborazione è un prerequisito per il funzionamento di qualsiasi programma "normale".

 
Игорь Герасько:

Ecco la domanda: se il server restituisce un errore di esecuzione dell'ordine, come faccio a saperlo per sbloccare la possibilità di reinviare l'ordine? Di nuovo, se OnTrade e OnTradeTransaction non sono utilizzati.

Molto utile. Lasceremo la mancanza di denaro, perché l'Expert Advisor dovrebbe rilevare questo punto prima di inviare un ordine di compravendita e informare il trader con un messaggio (o con qualche altro mezzo). Di conseguenza, l'ordine di compravendita non viene inviato affatto.

Il messaggio di errore può informarci se dobbiamo continuare a provare a inviare ordini. Per esempio, se il mercato è chiuso, non c'è bisogno di reinviare immediatamente la richiesta. Dovresti fermare il trading per un certo tempo (è determinato dallo sviluppatore dell'Expert Advisor), e solo allora inviare una nuova richiesta (se il segnale di trading è ancora attivo). Se si verifica un requote, puoi inviare subito una nuova richiesta. Se c'è stato un errore nell'impostazione degli stop (Stop Level o Freeze Level è cambiato durante l'invio dell'ordine), gli stop vengono corretti in base ai nuovi dati e viene inviata immediatamente una nuova richiesta.

Quindi la conoscenza di un errore di trading (in generale - qualsiasi errore) e la sua corretta elaborazione è una condizione necessaria per il funzionamento di qualsiasi programma "normale".

Se il mercato è chiuso, dobbiamo controllarlo prima di inviare l'ordine.

In altri casi, l'ordine di compravendita dovrebbe essere reinviato. Così, tutti gli errori possono essere divisi in due categorie:

  1. Errori il cui verificarsi può essere previsto prima dell'invio dell'ordine;
  2. Errori che non possono essere previsti al momento dell'invio dell'ordine, per esempio le requote.

Se un Expert Advisor ha ricevuto un errore del secondo tipo, le sue azioni dovrebbero essere sempre le stesse e non dipendono dal tipo di errore: cioè, dovrebbe ripetere il suo ordine di compravendita sperando che questa volta venga eseguito. Prima di inviare un ordine di compravendita, l'Expert Advisor dovrebbe controllare il primo tipo di errori. Pertanto, l'Expert Advisor non ha bisogno di correggere il suo comportamento a seconda del tipo di errore restituito in OnTradeTransaction. Tuttavia, è possibile notificare all'utente gli errori che si verificano in OnTradeTransaction e resettare il blocco durante l'esecuzione di una nuova operazione di compravendita se la compravendita precedente è finita con un errore del secondo tipo. In questo caso, se OnTradeTransaction non si verifica per qualche motivo, il blocco dovrebbe comunque essere resettato da un timeout. Quindi, non importa se OnTradeTransaction arriva o no, solo che con OnTradeTransaction gli ordini ripetuti saranno eseguiti alla massima velocità possibile.

s.w. FreezeLevel deve anche essere analizzato prima dell'invio dell'ordine.

 
Come faccio a sapere inOnTradeTransaction () che SL/TP è stato attivato?
 
Andrey Dik:
Come faccio a sapere in OnTradeTransaction () che SL/TP è stato attivato?

Usare TRADE_TRANSACTION_DEAL_ADD