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

 
Seric29:

C'è una domanda come questa. Quindi, c'è un ciclo

La primainterruzione non si trova nella prima parentesi del ciclo, ma nelle parentesi annidate al loro interno. La secondainterruzione è ancora più profonda, annidata nelle parentesi interne. Come ho capito in questo casobreak semplicemente non funziona, a dire il vero non ho capito se funzionava o no ma il programma si bloccava e faceva iterazioni inutili. Per uscire da un ciclo con molte condizioni ho aggiunto un flag di uscita al ciclo. Forse mi è sembrato che non funzioni, chi pensa su questo argomento?

Se il codice ha uno stile normale, si vede subito che hai fatto una schifezza:

for(...........)
  {
   if(.........)
     {
      //что-то делаем
     }
   else
      if(.........)
        {
         break
        }
      else
        {
         break;
        }
  } 

Esattamente lo stesso:

for(...........)
  {
   if(.........)
     {
      //что-то делаем
     }
   else
      break;
  } 
 

Impossibile aggiornare le candele e aggiungere tick.

Ecco il codice per gli indicatori:

 long  id_;  
 const  SYMBOL SYMB (  _Symbol  +  "Tick_exp2"  );  
 int  OnInit  ()  
   {  

     if  (SYMB.IsExist ())  
      {  
       SYMB.CloneProperties ();  
                              
       int  rates_total = candles;  

       MqlRates  Rates [], Replace [];  

       int  total_candles =  0  ;  
       for  (  int  i =  CopyRates  (  _Symbol  ,  PERIOD_M1  ,  0  , rates_total, Rates) -  1  ; i> =  0  &&!  IsStopped ();  i--)  
         {  
         MqlTick  Ticks [], ReplaceTicks [];  
         int  vv =  CopyTicksRange  (  _Symbol  , Ticks,  COPY_TICKS_ALL  ,  ulong  (Rates [i] .time) *  1000  ,  ulong  (Rates [i] .time +  61  ) *  1000  );  
          total_candles + = vv;  
         ArrayResize  (Replace, vv-  1  );  ArrayResize  (ReplaceTicks, vv-  1  );  
         for  (  int  ii =  0  ; ii <vv-  1  &&!  IsStopped ();  ii ++)  
            {  
             ReplaceTicks [ii] .bid = Ticks [ii] .bid;  
             ReplaceTicks [ii] .ask = Ticks [ii] .ask;  
             ReplaceTicks [ii] .flags =  TICK_FLAG_BID  ;  
             ReplaceTicks [ii] .last = Ticks [ii +  1  ] .bid;  
             ReplaceTicks [ii] .time = Ticks [ii] .time;  
             ReplaceTicks [ii] .time_msc = Ticks [ii] .time_msc;  

             ReplaceTicks [ii] .volume = Ticks [ii] .volume;  
             ReplaceTicks [ii] .volume_real = Ticks [ii] .volume_real;  

             Replace [ii] .time = Ticks [ii] .time;   
             Replace [ii] .open = Ticks [ii] .bid;  
             Replace [ii] .close = Ticks [ii +  1  ] .bid;  
             if  (Ticks [ii] .bid> Ticks [ii +  1  ] .bid) {Replace [ii] .high = Ticks [ii] .bid;  Replace [ii] .low = Ticks [ii +  1  ] .bid;}  
             else  {Replace [ii] .high = Ticks [ii +  1  ].  bid;  Replace [ii] .low = Ticks [ii] .bid;}  
             Replace [ii] .tick_volume =  long  (Ticks [ii] .volume);  
             Replace [ii] .real_volume =  long  (Ticks [ii] .volume_real);  
             Replace [ii] .spread =  int  (  fabs  (Ticks [ii] .bid-Ticks [ii + 1  ] .bid) *  100000  );  

            }  
        
         CustomTicksAdd  (SYMB.Name, ReplaceTicks);  
         CustomRatesUpdate  (SYMB.Name, Replace);  

         }  
       if  (SYMB.On ()) 
         {  
          id_ =  ChartOpen  (SYMB.Name,  PERIOD_CURRENT  );  
         ChartSetInteger  (id_,  CHART_AUTOSCROLL  ,  1  );  
         ChartSetInteger  (id_,  CHART_MODE  ,  2  );  
         ChartSetInteger  (id_,  CHART_COLOR_CHART_LINE  ,  clrYellow  ); 
         ChartSetInteger  (id_,  CHART_SHIFT  ,  0  ,  ChartGetInteger  (  ChartID  (),  CHART_SHIFT  ));  
         } 
          Print("Всего свечей обновлено :=> ",total_candles); 
      }  
   return  (  INIT_SUCCEEDED  );  
   } 

L'indicatore viene poi applicato per controllare le scommesse:

 int  OnInit  ()  
   {  

   return  (  INIT_SUCCEEDED  );  
   }  

 Int  OnCalculate  (  const  int  rates_total,  
                 const  int  prev_calculated,  
                 const  datetime  & time [],  
                 const  double  & open [],  
                 const  double  & high [],  
                 const  double  & low [],  
                 const  double  & close [],  
                 const  long  & tick_volume [],  
                 const  long  & volume [],  
                 const  int  & spread [])  
   {  

   if (newbar.IsNewBar (  "EURUSD"  ,  PERIOD_M1  ))  
    {  
       Print("Цены доступны от индикатора :=> ", rates_total);
    }  
   return  (rates_total);  
   } 

Uscire:

Se le candele sono completamente aggiornate, perché rate_total mostra solo il 50% delle candele?

Per favore, consigliatemi.


File:
 
Artyom Trishkin:

Con il normale stile del codice, è immediatamente ovvio che è una stronzata:

Quindi nel mio caso potrebbe non funzionare correttamente e potrebbe davvero non uscire dal ciclo, o uscirà comunque dal ciclo più vicino nel corpo del quale si trova la condizione?

 
Seric29:

Quindi nel mio caso potrebbe non funzionare correttamente e potrebbe non uscire effettivamente dal ciclo, o uscirà comunque dal ciclo più vicino con la condizione nel suo corpo?

Non vedo le condizioni del ciclo - hai un trattino lì:

for(...........)
 
Artyom Trishkin:

Non vedo una condizione di loop - hai una linea tratteggiata lì:

Non si tratta della condizione del ciclo, si tratta del fatto che ci possono essere più if all'interno dell'if e uno di questi if dovrà generare un'uscita, quindi la domanda è: la profondità della condizione influisce sul fatto che il ciclo esca o meno?

     for(...........)
     {
     if(........)
       {if(.....)break; else
        if(.....)
           {
           if(....)break;}}else break;
     }  
 
Seric29:

quindi la domanda è: la profondità della condizione influisce sul fatto che il ciclo parta o meno?

non lo fa, break romperà il corpo del ciclo più vicino, cioè quello in cui è attualmente eseguito, e quante volte si usa if() non importa, né il numero di iF() né la loro profondità

bene, parte della frase, se si vuole interrompere un corpo del ciclo da diverse condizioni, a volte è molto più facile usare while() e un flag di interruzione del ciclo, come questo:

int i=Bars-1;
bool calc = true;
while(i>=0 && calc)
{
    if(...) calc = false;
        else
        {
        ....            
                if(...) calc = false;
        }

   i--;
}
 
Igor Makanu:

non influisce, break romperà il corpo del ciclo più vicino, cioè quello in cui è attualmente eseguito, e quante volte si usa if() non ha importanza, né il numero di iF() né la loro profondità

bene, parte della frase, se si vuole interrompere un corpo del ciclo da condizioni diverse, a volte è molto più facile usare while() e un flag di interruzione del ciclo, qualcosa come questo:

Ho capito dove voglio arrivare. Beh, sì, può essere complicato e a volte è davvero meglio usare una bandiera. Sto solo sperimentando, cercando una sospensione, ho pensato che forse gira all'infinito, grazie per le risposte.

 
Seric29:

C'è una domanda come questa. Quindi, c'è un ciclo

La primainterruzione non si trova nella prima parentesi del ciclo, ma nelle parentesi annidate al loro interno. La secondainterruzione è ancora più profonda, annidata nelle parentesi interne. Come ho capito in questo casobreak semplicemente non funziona, a dire il vero non ho capito se funzionava o no ma il programma si bloccava e faceva iterazioni inutili. Per uscire da un ciclo con molte condizioni ho aggiunto un flag di uscita al ciclo. Forse mi sembrava che non funzionasse, chi pensa a questo problema?

     for(...........)              
     {
          if(.........)
          {
               /* что-то делаем */
          }
          else
          {
               // Непонятно зачем? Если при любом варианте выходим из цикла
               if(.........) break;
               else break;
          }
     }
Io farei così
     for(...........)              
     {
          if(/* не соответствует условие */) break;
          /* что-то делаем */
     }
Anche se forse non ho capito bene il senso della tua idea.
 
Konstantin Nikitin:
Io lo farei così
Anche se forse non capisco bene il senso della tua idea.

La cosa principale è non confondersi. Ci sono casi in cui si apre un altro ciclo all'interno di un ciclo e si ha bisogno di uscire da entrambi i cicli in una volta sola, ma mql4 non fornisce questo solo attraverso un flag, C++ ha l'operatore goto mi chiedo come funziona.

 
Seric29:

La cosa principale è non confondersi. Ci sono casi in cui si apre un altro ciclo all'interno di un ciclo e si ha bisogno di uscire da entrambi i cicli in una volta sola, ma mql4 non fornisce questo solo attraverso un flag, C++ ha l'operatore goto mi chiedo come funziona.

Fate tutti i cicli in una funzione, e se avete bisogno di uscire da uno qualsiasi annidato - anche il trecentesimo - ritornate;