Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 893

 
Seric29:

Hay una pregunta así. Por lo tanto, hay un bucle

La primeraruptura no se encuentra en los primeros paréntesis del bucle, sino en los paréntesis anidados dentro de ellos. La segundaruptura está aún más profunda anidada en los paréntesis interiores. Según entendí en este casoromper simplemente no funciona, a decir verdad no entendí si funcionaba o no pero el programa se colgaba y hacía iteraciones innecesarias. Para salir de un bucle con muchas condiciones he añadido una bandera de salida al bucle. Tal vez me pareció que no funciona, ¿quién piensa en este tema?

Si el código tiene un estilo normal, se ve enseguida que se ha hecho una porquería:

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

Exactamente lo mismo:

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

No se puede actualizar los candelabros y añadir ticks.

Aquí está el código de los 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  );  
   } 

A continuación, se aplica el indicador para comprobar las apuestas:

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

Salir:

Si las velas se actualizan completamente, ¿por qué rate_total sólo muestra el 50% de las velas?

Por favor, aconséjeme.


Archivos adjuntos:
 
Artyom Trishkin:

Con un estilo de código normal, es inmediatamente obvio que es una mierda:

Así que en mi caso puede que no funcione correctamente y que realmente no salga del bucle o que salga del bucle más cercano en el cuerpo del que se encuentra la condición de todos modos?

 
Seric29:

Así que en mi caso puede que no funcione correctamente y no salga realmente del bucle, o saldrá de todas formas del bucle más cercano cuyo cuerpo contenga la condición?

No veo las condiciones del bucle: tienes un guión ahí:

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

No veo la condición de bucle: tienes una línea de puntos ahí:

No se trata de la condición del bucle, se trata de que puede haber más ifs dentro del if y uno de esos ifs tendrá que generar una salida, así que la pregunta es, ¿la profundidad de la condición afecta a que el bucle salga o no?

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

Así que la pregunta es: ¿la profundidad de la condición afecta a la salida del bucle o no?

no lo hace, break romperá el cuerpo del bucle más cercano, es decir, aquel en el que se está ejecutando actualmente, y no importa cuántas veces se utilice if(), ni el número de iF() ni su profundidad

bueno, parte de la frase, si quieres romper el cuerpo de un bucle por diferentes condiciones, a veces es mucho más fácil usar while() y una bandera de interrupción del bucle, así:

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

   i--;
}
 
Igor Makanu:

no afecta, break romperá el cuerpo del bucle más cercano, es decir, aquel en el que se esté ejecutando en ese momento, y el número de veces que se utilice if() no importa, ni el número de iF() ni su profundidad

Bueno, parte de la frase, si quieres romper el cuerpo de un bucle por diferentes condiciones, a veces es mucho más fácil usar while() y una bandera de interrupción del bucle, algo así:

Ya veo a dónde quiero llegar. Pues sí, puede ser complicado y a veces es mejor usar una bandera. Solo estoy experimentando, buscando un cuelgue, pensé que tal vez gira infinitamente, gracias por las respuestas.

 
Seric29:

Hay una pregunta así. Por lo tanto, hay un bucle

La primeraruptura no se encuentra en los primeros paréntesis del bucle, sino en los paréntesis anidados dentro de ellos. La segundaruptura está aún más profunda anidada en los paréntesis interiores. Según entendí en este casoromper simplemente no funciona, a decir verdad no entendí si funcionaba o no pero el programa se colgaba y hacía iteraciones innecesarias. Para salir de un bucle con muchas condiciones he añadido una bandera de salida al bucle. Tal vez me pareció que no funciona, ¿quién piensa en esta cuestión?

     for(...........)              
     {
          if(.........)
          {
               /* что-то делаем */
          }
          else
          {
               // Непонятно зачем? Если при любом варианте выходим из цикла
               if(.........) break;
               else break;
          }
     }
Yo haría lo siguiente
     for(...........)              
     {
          if(/* не соответствует условие */) break;
          /* что-то делаем */
     }
Aunque tal vez no entendí bien el sentido de tu idea.
 
Konstantin Nikitin:
Yo lo haría así
Aunque, tal vez, no entiendo bien el sentido de tu idea.

Lo principal es no confundirse. Hay casos en los que abres otro bucle dentro de un bucle y necesitas salir de los dos bucles a la vez, pero mql4 no proporciona esto sólo a través de una bandera, C++ tiene el operador goto me pregunto cómo funciona.

 
Seric29:

Lo principal es no confundirse. Hay casos en los que abres otro bucle dentro de un bucle y necesitas salir de los dos bucles a la vez, pero mql4 no proporciona esto sólo a través de una bandera, C++ tiene el operador goto me pregunto cómo funciona.

Se hacen todos los bucles en una función, y si hay que salir de alguno anidado -incluso del número trescientos- se devuelve;