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

 
trader781:

Una volta che avete pulito il vostro codice, sarà più leggibile per voi, per non parlare degli altri che hanno bisogno di capire la vostra logica. È lì che si vedranno tutti i bug.

Ok, così va meglio?
Ora cancellate le parentesi graffe accoppiate non necessarie e disponete il resto normalmente in blocchi, e vedrete dove avete dei difetti di logica.
 
Artyom Trishkin:
Ora rimuovi le parentesi graffe accoppiate extra e disponi il resto normalmente in blocchi, e vedrai dove la tua logica è sbagliata.
Quali sono quelli in più?
 
trader781:
Quali sono ridondanti?
Hai un sacco di parentesi inutili nel tuo codice - usa uno strumento di styling e vedrai immediatamente le inutili parentesi graffe vuote accoppiate.
 
Artyom Trishkin:
Hai un sacco di parentesi graffe inutili nel tuo codice - elabora il codice con uno styler, e vedrai immediatamente le parentesi graffe vuote accoppiate extra.
Fatto
File:
 
trader781:
Fatto
Lo guarderò più tardi - ci vorranno almeno quattro ore...
 
trader781:
Fatto da
1.count++; // conta i tick dall'inizio del programma

Un modo migliore: if(count<=20) count++; - perché contare ulteriormente se avete bisogno solo di 21?

2.
   if(count>20) //  если количество тиков больше начинаем работу ... и дальше код эксперта
     {
      if(Bars<801 || (IsTradeAllowed()==false)) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли
         Print("Нет достаточного количества баров или торговля на текущем инструменте запрещена");
      return;
     }

Ed ecco il wigwam. Questo controllerà solo il numero di barre e stamperà quando ilconteggio>20, il resto del codice funzionerà quando ilconteggio<=20.

3.

if(OrderSymbol()==Symbol() && OrderType()<2)
            continue;

Se avete solo bisogno di considerare quelli del mercato (e questo è quello che vi aspettate da un ulteriore codice), non avete bisogno dicontinuare affatto.

4.

         if(y==true && (OrderType()==0)) //+-----покупка
           {
            dummy=(OrderClose(OrderTicket(),OrderLots(),Bid,0,White));

              {
               if((dummy==true) && ((OrderSelect(i,SELECT_BY_POS,MODE_TRADES))==false))

                  PlaySound("music");
               Sleep(20000);
               PlaySound("music");
               Sleep(20000);
               PlaySound("music");
               Sleep(20000);
               dummy=false;
               ExpertRemove();
              }
           }

Chiude un ordine e si elimina? E se ce ne fossero altri? E abbiamo un intero minuto per dormire.

Non ho guardato il codice sopra, non c'è ancora un posto dove testarlo.

 

1 ok, lo sistemerò

2 non va bene, i seguenti blocchi non dovrebbero funzionare acount<20

3 OK, lo correggerò

4 Sì, è un minuto ma dovrebbe essere avviato solo se non ci sono più ordini a mercato per il simbolo corrente. Ho cercato di implementarlo attraverso un risultato negativo della selezione dell'ordine, ecco perché dovremmo impostare il ritorno da qualche parte, ma il ritorno in void OnTick() non sembra così buono. E ancora, OrdersTotal() darà il risultato sbagliato se abbiamo molti ordini per tutti i simboli.

 
trader781:

2 non va bene, i seguenti blocchi non dovrebbero funzionare quandocount<20

Poi abbiamo bisogno di aggiungere else return dopo il blocco;

4 Sì, è un minuto ma dovrebbe essere avviato solo se non ci sono più ordini a mercato per il simbolo corrente. Ho cercato di implementarlo attraverso un risultato negativo della selezione degli ordini, ecco perché dovremmo impostare il ritorno da qualche parte, mentre il ritorno in void OnTick() non sembra molto buono. E ancora, OrdersTotal() darà il risultato sbagliato se abbiamo molti ordini su tutti i simboli.

Perché abbiamo bisogno di tre suoni?

Bene, possiamo fare tutto in due fasi: nel primo ciclo, si chiudono gli ordini e in quello successivo si ricalcolano tutti gli ordini di mercato per controllare se ce ne sono ancora, e se non ce ne sono, suonano le fanfare.

Ma non ho ancora capito qual è il trucco della musica dopo la chiusura degli ordini. Beh, si può fare una stampa al diario o inviare un messaggio alla posta o una notifica al proprio smartphone, ma perché si dovrebbe trasformare un EA in un carillon?
 
Vitalie Postolache:

Allora dovreste aggiungere un ritorno dopo il blocco else return;

Perché abbiamo bisogno di tre volte il suono?

Ma si può fare tutto in due passi: nel primo ciclo si chiudono gli ordini, e in quello successivo si ricalcolano tutti gli ordini di mercato per controllare se ce ne sono non chiusi, e se non ce ne sono, suona la fanfara.

Non ho ancora capito qual è il trucco della musica quando gli ordini sono stati chiusi. Bene, possiamo stamparlo sul giornale, inviare un messaggio alla posta o notificarlo allo smartphone, ma perché dovremmo trasformare la nostra EA in un carillon?

Come si separano i cicli?

Come faccio a legare il suono all'ultimo ordine chiuso? Perché se non ci sono ordini, l'Expert Advisor non farebbe scattare un suono.

E un'ultima cosa: sono contento della musica per ora

 
trader781:

Come separare i cicli?

Come legare il suono all'ultimo chiuso? perché se non ci sono ordini, l'Expert Advisor non funziona

E infine, la variante musicale mi va bene per il momento.

Cosa intende per "separato"? Non dobbiamo separare nulla, abbiamo solo bisogno di due cicli (sono quasi uguali) ma uno ha OrderClose() e l'altro ha un contatore di ordini. Il criterio di selezione dell'ordine è lo stesso. Se il contatore è=0, tutti gli ordini sono stati chiusi e possiamo suonare la musica.

Ho anche notato che la condizione

         if(Uslovie1==true) //Bid+ma6
           {
            if((Bid>=ma1-X*Point && Bid<ma1) || (Bid<=ma1+X*Point && Bid>ma1))
              {
                 {y=true;}
              }
           }

Non sembra essere legato a un certo ordine, quindi a cosa serve nel ciclo?

Lo controllerei prima del ciclo di chiusura.

Motivazione: