Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 893

 
Seric29:

Há uma pergunta como esta. Então, há um loop

A 1ªpausa não está localizada no primeiro parênteses do laço, mas em parênteses aninhados dentro deles. A 2ªpausa está ainda mais profunda aninhada em parênteses internos. Como entendi neste caso,a pausa simplesmente não funciona, para dizer a verdade não entendi se funcionava ou não, mas o programa desligou e fez iterações desnecessárias. A fim de sair de um loop com muitas condições, adicionei uma bandeira de saída ao loop. Talvez me parecesse que não funciona, quem pensa sobre este assunto?

Se o código for estilizado normalmente, você pode ver imediatamente que você fez uma porcaria com ele:

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

Exatamente o mesmo:

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

Incapaz de atualizar os castiçais e adicionar carrapatos.

Aqui está o código para os indicadores:

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

O indicador é então aplicado para verificar as apostas:

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

Saída:

Se os castiçais estão totalmente atualizados, por que a rate_total mostra apenas 50% dos castiçais?

Por favor, me aconselhem.


Arquivos anexados:
 
Artyom Trishkin:

Com um estilo de código normal, é imediatamente óbvio que é uma besteira:

Então, no meu caso pode não funcionar corretamente e pode realmente não sair do laço, ou vai sair do laço mais próximo no corpo do qual a condição está localizada de qualquer maneira?

 
Seric29:

Então, no meu caso, pode não funcionar corretamente e pode não sair realmente do laço, ou vai sair do laço mais próximo com a condição em seu corpo de qualquer maneira?

Eu não vejo as condições do loop - você tem um traço lá:

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

Eu não vejo a condição do laço - você tem uma linha pontilhada lá:

Não se trata da condição do laço, mas do fato de que pode haver mais "se" dentro do "se" e um desses "se" terá que gerar uma saída, então a questão é: a profundidade da condição afeta se o laço sairá ou não?

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

Então a questão é: a profundidade da condição afeta se o laço vai sair ou não?

não, a quebra quebrará o corpo do laço mais próximo, ou seja, aquele em que é executado atualmente, e quantas vezes você usa se() não importa, nem o número de iF() nem sua profundidade

bem, parte da frase, se você quiser quebrar um corpo em loop por condições diferentes, às vezes é muito mais fácil de usar enquanto() e uma bandeira de interrupção de loop, como esta:

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

   i--;
}
 
Igor Makanu:

não afeta, a ruptura quebrará o corpo do laço mais próximo, ou seja, aquele em que é executado atualmente, e quantas vezes você usa se() não importa, nem o número de iF() nem sua profundidade

bem, parte da frase, se você quiser quebrar um corpo em loop por condições diferentes, às vezes é muito mais fácil de usar enquanto() e uma bandeira de interrupção de loop, algo como isto:

Estou vendo onde quero chegar. Bem, sim, pode ser complicado e às vezes é realmente melhor usar uma bandeira. Estou apenas experimentando, vejo que está pendurado, pensei que poderia ser um loop infinito, obrigado pelas respostas.

 
Seric29:

Há uma pergunta como esta. Então, há um loop

A 1ªpausa não está localizada no primeiro parênteses do laço, mas em parênteses aninhados dentro deles. A 2ªpausa está ainda mais profunda aninhada em parênteses internos. Como entendi neste caso,a pausa simplesmente não funciona, para dizer a verdade não entendi se funcionava ou não, mas o programa desligou e fez iterações desnecessárias. A fim de sair de um loop com muitas condições, adicionei uma bandeira de saída ao loop. Talvez me parecesse que não funciona, quem pensa sobre este assunto?

     for(...........)              
     {
          if(.........)
          {
               /* что-то делаем */
          }
          else
          {
               // Непонятно зачем? Если при любом варианте выходим из цикла
               if(.........) break;
               else break;
          }
     }
Eu gostaria de ir assim
     for(...........)              
     {
          if(/* не соответствует условие */) break;
          /* что-то делаем */
     }
Embora talvez eu não tenha entendido bem a sua idéia.
 
Konstantin Nikitin:
Eu o faria desta maneira
Embora, talvez eu não entenda bem o objetivo de sua idéia.

O principal é não ficar confuso. Há casos em que você abre outro loop dentro de um loop e precisa sair dos dois loops de uma só vez, mas o mql4 não fornece isso apenas através de uma bandeira, o C++ tem goto operador eu me pergunto como ele funciona.

 
Seric29:

O principal é não ficar confuso. Há casos em que você abre outro loop dentro de um loop e precisa sair dos dois loops de uma só vez, mas o mql4 não fornece isso apenas através de uma bandeira, o C++ tem goto operador eu me pergunto como ele funciona.

Você faz todos os loops em uma função, e se você precisar sair de qualquer um aninhado - até mesmo o trezentésimo - retornar;

Razão: