Roman Sharanov: Potresti per favore consigliarmi se la funzione di chiusura di tutti gli ordini aperti dall'EA in base al simbolo è implementata correttamente?
L'architettura stessa è corretta. Gli errori sono nella mancanza di controlli e nell'uso di alcune funzioni:
bool OrderCloseAll()
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
continue;
if(OrderSymbol() !=Symbol() || OrderMagicNumber() != Magic)
continue;
if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage, clrWhite))
returnfalse;
}
returntrue;
}
La prima iterazione nel vostro caso fallirà - l'ordine con l'indice OrdersTotal() non esiste.
Non c'è controllo per il risultato della funzione OrderClose. Se la chiusura dell'ordine fallisce, non possiamo rimanere nella stessa funzione, poiché dobbiamo scoprire perché la chiusura non ha avuto successo. Per fare questo, dobbiamo lasciare la funzione con il risultato falso, e poi decidere cosa fare dopo.
Non possiamo usare uno stesso prezzo di chiusura per tutti gli ordini. In primo luogo, gli ordini possono essere di diversi tipi e, in secondo luogo, è probabile che il prezzo sia cambiato durante l'esecuzione degli ordini precedenti (alla chiusura). Possiamo usare una caratteristica di MT4 per evitare di indovinare quale prezzo usare: il valore OrderClosePrice() di un ordine a mercato prima della sua chiusura è il prezzo Bid o Ask a seconda del tipo di ordine.
Non c'è controllo per il risultato della funzione OrderClose. Se la chiusura dell'ordine fallisce, non possiamo rimanere nella stessa funzione, poiché dobbiamo scoprire perché la chiusura non ha avuto successo. Per fare questo, dobbiamo lasciare la funzione con il risultato falso, e poi decidere cosa fare dopo.
Non possiamo usare uno stesso prezzo di chiusura per tutti gli ordini. In primo luogo, gli ordini possono essere di diversi tipi e, in secondo luogo, è probabile che il prezzo sia cambiato durante l'esecuzione degli ordini precedenti (alla chiusura). Per evitare di indovinare quale prezzo utilizzare, possiamo utilizzare una caratteristica di MT4: il valore OrderClosePrice() di un ordine a mercato prima della sua chiusura è il prezzo Bid o Ask a seconda del tipo di ordine.
Grazie, il problema principale era probabilmente solo usare lo stesso prezzo
Dall'aiuto di OrderSelect " Quando gli ordini sono selezionati in modo sequenziale usando il parametro SELECT_BY_POS, le informazioni sono date nell'ordine in cui sono arrivate dal server commerciale. Non è garantito l'ordinamento della lista d'ordine ottenuta".
Se pensiamo che questa frase è stata inserita nell'aiuto per niente, siamo a posto. Se pensiamo che era lì per una ragione, non dovremmo cambiare questa lista durante l'esecuzione del ciclo attraverso l'elenco degli ordini. Come saranno ordinati gli ordini dopo la cancellazione di uno di essi sul server e l'arrivo di una nuova lista attuale con un OrdersTotal più piccolo, è sconosciuto. E' più affidabile, senza cancellare, eseguire la stessa copia invariata della lista e raccogliere (in un array) tutti i numeri dei biglietti delle compravendite da cancellare. Poi dimentica quella lista e cancella le compravendite, selezionandole per biglietto.
Si vorrebbe credere, naturalmente, che l'ordine nella lista modificabile sia conservato, anche solo per questo caso di rimozione di diversi ordini dalla fine di una lista non ordinata, ma gli sviluppatori sono contrari... Ora funziona, e se esce una nuova build - "abbiamo avvertito".
Dall'aiuto di OrderSelect " Quando gli ordini sono selezionati in modo sequenziale usando il parametro SELECT_BY_POS, le informazioni sono date nell'ordine in cui sono arrivate dal server commerciale. Non è garantito l'ordinamento della lista d'ordine ottenuta".
Se pensiamo che questa frase è stata inserita nell'aiuto per niente, siamo a posto. Se pensiamo che era lì per una ragione, non dovremmo cambiare questa lista durante l'esecuzione del ciclo attraverso l'elenco degli ordini. Come saranno ordinati gli ordini dopo la cancellazione di uno di essi sul server e l'arrivo di una nuova lista attuale con un OrdersTotal più piccolo, è sconosciuto. È più affidabile, senza cancellare, eseguire la stessa copia invariata della lista e raccogliere (in un array) tutti i numeri dei biglietti delle compravendite da cancellare. Poi dimentica quella lista e cancella le compravendite, selezionandole per biglietto.
Si vorrebbe credere, naturalmente, che l'ordine nella lista modificabile sia conservato, anche solo per questo caso di rimozione di diversi ordini dalla fine di una lista non ordinata, ma gli sviluppatori sono contrari... Ora funziona, e se esce una nuova build - "abbiamo avvertito".
Tale "America" è stata aperta per circa trecento anni :)
Questo tipo di "America" è stato aperto per circa trecento anni :)
Non credo che le persone che fanno domande qui per conto dei nuovi arrivati lo abbiano già scoperto loro stessi. Ecco perché lo sto scrivendo. Non per i moderatori, ma per chi fa domande. Guarda il nome del thread.
P.S. Ho cercato la provenienza di questo interesse. Si scopre che è dal ramo https://www.mql5.com/ru/forum/215783/page8"Organizzare il ciclo dell'ordine". A quanto pare, nell'ottobre 2017, quei trecento anni non sono ancora finiti, ci sono ancora novità.
Non credo che le persone che fanno domande qui per conto dei nuovi arrivati lo abbiano già scoperto loro stessi. Ecco perché lo sto scrivendo. Non per i moderatori, ma per chi fa domande. Guarda il nome del thread.
P.S. Ho guardato da dove viene questo interesse. Si scopre che è dal ramo https://www.mql5.com/ru/forum/215783/page8"Organizzare il ciclo dell'ordine". Come si scopre, nell'ottobre 2017 quei trecento anni non sono ancora finiti, c'è ancora novità.
Sbagliato di nuovo :) Trecento anni è iniziato su mql4.com - c'è stato un tempo in cui se ne discuteva attivamente. E ci sono stati anche quei momenti che avete descritto in "Adesso funziona, e uscirà una nuova build - "abbiamo avvertito". Solo senza avvertimenti, e così più volte - dipende, non dipende dall'ordinamento...
E, sì, c'è un thread speciale per queste risposte:
Dall'aiuto di OrderSelect " Quando gli ordini sono selezionati in modo sequenziale usando il parametro SELECT_BY_POS, le informazioni sono date nell'ordine in cui sono arrivate dal server commerciale. Non è garantito l'ordinamento della lista d'ordine ottenuta".
Se pensiamo che questa frase è stata inserita nell'aiuto per niente, siamo a posto. Se pensiamo che era lì per una ragione, non dovremmo cambiare questa lista durante l'esecuzione del ciclo attraverso l'elenco degli ordini. Come saranno ordinati gli ordini dopo la cancellazione di uno di essi sul server e l'arrivo di una nuova lista attuale con un OrdersTotal più piccolo, è sconosciuto. E' più affidabile, senza cancellare, eseguire la stessa copia invariata della lista e raccogliere (in un array) tutti i numeri dei biglietti delle compravendite da cancellare. Poi dimentica quella lista e cancella le compravendite, selezionandole per biglietto.
Mi piacerebbe, naturalmente, credere che l'ordinamento nella lista modificata sia conservato almeno per questo caso di cancellazione di diversi ordini dalla fine di una lista non ordinata, ma gli sviluppatori sono contrari... Ora funziona, e se esce una nuova build, "vi abbiamo avvertito".
Come buona idea (considerando che ci possono essere diversi Expert Advisors + trader che lavorano sul conto in parallelo), non puoi assolutamente eseguire operazioni in un ciclo. L'ordine necessario viene ricevuto, l'operazione viene eseguita, l'intero OnTick() viene eseguito nuovamente (non necessariamente con l'arrivo di un nuovo tick). E così via, fino a quando tutte le operazioni necessarie vengono eseguite.
Quindi, formare un array per cancellare gli ordini è equivalente a cancellare gli ordini nel ciclo.
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
Potresti per favore consigliarmi se la funzione di chiusura di tutti gli ordini aperti dall'EA in base al simbolo è implementata correttamente?
L'architettura stessa è corretta. Gli errori sono nella mancanza di controlli e nell'uso di alcune funzioni:
L'architettura stessa è corretta. Gli errori sono nella mancanza di controlli e nell'uso di alcune funzioni:
Grazie, il problema principale era probabilmente solo usare lo stesso prezzo
Dall'aiuto di OrderSelect " Quando gli ordini sono selezionati in modo sequenziale usando il parametro SELECT_BY_POS, le informazioni sono date nell'ordine in cui sono arrivate dal server commerciale. Non è garantito l'ordinamento della lista d'ordine ottenuta".
Se pensiamo che questa frase è stata inserita nell'aiuto per niente, siamo a posto. Se pensiamo che era lì per una ragione, non dovremmo cambiare questa lista durante l'esecuzione del ciclo attraverso l'elenco degli ordini. Come saranno ordinati gli ordini dopo la cancellazione di uno di essi sul server e l'arrivo di una nuova lista attuale con un OrdersTotal più piccolo, è sconosciuto. E' più affidabile, senza cancellare, eseguire la stessa copia invariata della lista e raccogliere (in un array) tutti i numeri dei biglietti delle compravendite da cancellare. Poi dimentica quella lista e cancella le compravendite, selezionandole per biglietto.
Si vorrebbe credere, naturalmente, che l'ordine nella lista modificabile sia conservato, anche solo per questo caso di rimozione di diversi ordini dalla fine di una lista non ordinata, ma gli sviluppatori sono contrari... Ora funziona, e se esce una nuova build - "abbiamo avvertito".
Dall'aiuto di OrderSelect " Quando gli ordini sono selezionati in modo sequenziale usando il parametro SELECT_BY_POS, le informazioni sono date nell'ordine in cui sono arrivate dal server commerciale. Non è garantito l'ordinamento della lista d'ordine ottenuta".
Se pensiamo che questa frase è stata inserita nell'aiuto per niente, siamo a posto. Se pensiamo che era lì per una ragione, non dovremmo cambiare questa lista durante l'esecuzione del ciclo attraverso l'elenco degli ordini. Come saranno ordinati gli ordini dopo la cancellazione di uno di essi sul server e l'arrivo di una nuova lista attuale con un OrdersTotal più piccolo, è sconosciuto. È più affidabile, senza cancellare, eseguire la stessa copia invariata della lista e raccogliere (in un array) tutti i numeri dei biglietti delle compravendite da cancellare. Poi dimentica quella lista e cancella le compravendite, selezionandole per biglietto.
Si vorrebbe credere, naturalmente, che l'ordine nella lista modificabile sia conservato, anche solo per questo caso di rimozione di diversi ordini dalla fine di una lista non ordinata, ma gli sviluppatori sono contrari... Ora funziona, e se esce una nuova build - "abbiamo avvertito".
Tale "America" è stata aperta per circa trecento anni :)
Questo tipo di "America" è stato aperto per circa trecento anni :)
Non credo che le persone che fanno domande qui per conto dei nuovi arrivati lo abbiano già scoperto loro stessi. Ecco perché lo sto scrivendo. Non per i moderatori, ma per chi fa domande. Guarda il nome del thread.
P.S. Ho cercato la provenienza di questo interesse. Si scopre che è dal ramo https://www.mql5.com/ru/forum/215783/page8"Organizzare il ciclo dell'ordine". A quanto pare, nell'ottobre 2017, quei trecento anni non sono ancora finiti, ci sono ancora novità.
Non credo che le persone che fanno domande qui per conto dei nuovi arrivati lo abbiano già scoperto loro stessi. Ecco perché lo sto scrivendo. Non per i moderatori, ma per chi fa domande. Guarda il nome del thread.
P.S. Ho guardato da dove viene questo interesse. Si scopre che è dal ramo https://www.mql5.com/ru/forum/215783/page8"Organizzare il ciclo dell'ordine". Come si scopre, nell'ottobre 2017 quei trecento anni non sono ancora finiti, c'è ancora novità.
Sbagliato di nuovo :) Trecento anni è iniziato su mql4.com - c'è stato un tempo in cui se ne discuteva attivamente. E ci sono stati anche quei momenti che avete descritto in "Adesso funziona, e uscirà una nuova build - "abbiamo avvertito". Solo senza avvertimenti, e così più volte - dipende, non dipende dall'ordinamento...
E, sì, c'è un thread speciale per queste risposte:
Dall'aiuto di OrderSelect " Quando gli ordini sono selezionati in modo sequenziale usando il parametro SELECT_BY_POS, le informazioni sono date nell'ordine in cui sono arrivate dal server commerciale. Non è garantito l'ordinamento della lista d'ordine ottenuta".
Se pensiamo che questa frase è stata inserita nell'aiuto per niente, siamo a posto. Se pensiamo che era lì per una ragione, non dovremmo cambiare questa lista durante l'esecuzione del ciclo attraverso l'elenco degli ordini. Come saranno ordinati gli ordini dopo la cancellazione di uno di essi sul server e l'arrivo di una nuova lista attuale con un OrdersTotal più piccolo, è sconosciuto. E' più affidabile, senza cancellare, eseguire la stessa copia invariata della lista e raccogliere (in un array) tutti i numeri dei biglietti delle compravendite da cancellare. Poi dimentica quella lista e cancella le compravendite, selezionandole per biglietto.
Mi piacerebbe, naturalmente, credere che l'ordinamento nella lista modificata sia conservato almeno per questo caso di cancellazione di diversi ordini dalla fine di una lista non ordinata, ma gli sviluppatori sono contrari... Ora funziona, e se esce una nuova build, "vi abbiamo avvertito".
Come buona idea (considerando che ci possono essere diversi Expert Advisors + trader che lavorano sul conto in parallelo), non puoi assolutamente eseguire operazioni in un ciclo. L'ordine necessario viene ricevuto, l'operazione viene eseguita, l'intero OnTick() viene eseguito nuovamente (non necessariamente con l'arrivo di un nuovo tick). E così via, fino a quando tutte le operazioni necessarie vengono eseguite.
Quindi, formare un array per cancellare gli ordini è equivalente a cancellare gli ordini nel ciclo.
C'è un pulsante "Stop", come posso cambiare il suo testo in "Start" una volta premuto?
Vedi il mio esempio di esperto
Guarda il mio esempio di Expert Advisor
Grazie, proprio quello di cui avevo bisogno.
Potrebbe essere utile sapere che c'è un errore nelle posizioni mancanti--- ToFile EURUSD,H1: zero divide in 'ToFile.mq4' (62,39)
Il testo non cambia nel tester, non c'è questa opzione?