Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 493

 
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))
            return false;
   }

   return true;
}

  1. La prima iterazione nel vostro caso fallirà - l'ordine con l'indice OrdersTotal() non esiste.
  2. Non c'è nessun controllo per il risultato della funzione OrderSelect.
  3. 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.
  4. 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.
 
Ihor Herasko:

L'architettura stessa è corretta. Gli errori sono nella mancanza di controlli e nell'uso di alcune funzioni:

  1. La prima iterazione nel vostro caso fallirà - l'ordine con l'indice OrdersTotal() non esiste.
  2. Non c'è nessun controllo per il risultato della funzione OrderSelect.
  3. 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.
  4. 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".

 
Vladimir:

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 :)

 
Artyom Trishkin:

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à.

Организация цикла перебора ордеров
Организация цикла перебора ордеров
  • 2017.09.16
  • www.mql5.com
MQL4 и MetaTrader 4: Организация цикла перебора ордеров
 
Vladimir:

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:

Особенности языка mql4, тонкости и приёмы работы
Особенности языка mql4, тонкости и приёмы работы
  • 2017.02.24
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql4, примеры решения тех, или иных задач...
 
Vladimir:

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?

bool stop;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//Closed at Profit
   ObjectCreate(0,"Stop",OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,"Stop",OBJPROP_XDISTANCE,10);
   ObjectSetInteger(0,"Stop",OBJPROP_YDISTANCE,105);
   ObjectSetInteger(0,"Stop",OBJPROP_XSIZE,100);
   ObjectSetInteger(0,"Stop",OBJPROP_YSIZE,25);

   ObjectSetString(0,"Stop",OBJPROP_TEXT,"Stop");

   ObjectSetInteger(0,"Stop",OBJPROP_COLOR,White);
   ObjectSetInteger(0,"Stop",OBJPROP_BGCOLOR,Green);
   ObjectSetInteger(0,"Stop",OBJPROP_BORDER_COLOR,Green);
   ObjectSetInteger(0,"Stop",OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,"Stop",OBJPROP_HIDDEN,true);
   ObjectSetInteger(0,"Stop",OBJPROP_STATE,false);
   ObjectSetInteger(0,"Stop",OBJPROP_FONTSIZE,12);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
if(sparam=="Stop")
     {
      ObjectSetInteger(0,"Stop",OBJPROP_STATE,false);
      CloseAtProfit();
      stop=true;
     }
     }
 
lil_lil: C'è un pulsante "Stop", come posso cambiare il suo testo in "Start" una volta premuto?

Vedi il mio esempio di esperto

File:
ToFile.mq4  11 kb
 
STARIJ:

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)

/*62*/  Строка=DoubleToStr(AccountEquity()/AccountMargin()*100,2)+"%"; // Уровень=Средства/Залог
Il testo non cambia nel tester, non c'è questa opzione?