Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 893

 
Seric29:

Il y a une question comme celle-ci. Donc, il y a une boucle

La 1èrerupture est située non pas dans les premières parenthèses de la boucle mais dans des parenthèses imbriquées à l'intérieur de celles-ci. La 2èmerupture est encore plus profondément imbriquée dans des parenthèses intérieures. Comme je l'ai compris dans ce cas,break ne fonctionne tout simplement pas, pour dire la vérité, je n'ai pas compris si cela a fonctionné ou non, mais le programme s'est arrêté et a fait des itérations inutiles. Afin de sortir d'une boucle avec beaucoup de conditions, j'ai ajouté un drapeau de sortie à la boucle. Il m'a peut-être semblé que ça ne marche pas, qui pense sur cette question ?

Si le code est stylé normalement, on voit tout de suite que vous en avez fait un déchet :

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

Exactement la même chose :

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

Impossible de mettre à jour les chandeliers et d'ajouter des ticks.

Voici le code pour les indicateurs :

 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'indicateur est ensuite appliqué aux paris de contrôle :

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

Sortie :

Si les chandeliers sont entièrement mis à jour, pourquoi rate_total ne montre-t-il que 50 % des chandeliers ?

Veuillez me conseiller.


Dossiers :
 
Artyom Trishkin:

Avec un style de code normal, il est immédiatement évident que c'est une connerie :

Donc, dans mon cas, il se peut que cela ne fonctionne pas correctement et qu'il ne sorte pas vraiment de la boucle ou qu'il sorte de toute façon de la boucle la plus proche dans le corps de laquelle se trouve la condition ?

 
Seric29:

Donc, dans mon cas, il se peut que cela ne fonctionne pas correctement et qu'il ne sorte pas réellement de la boucle, ou bien il sortira de toute façon de la boucle la plus proche dont le corps contient la condition ?

Je ne vois pas les conditions de la boucle - vous avez un tiret là :

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

Je ne vois pas de condition de boucle - vous avez une ligne pointillée ici :

Il ne s'agit pas de la condition de la boucle, mais du fait qu'il peut y avoir d'autres ifs à l'intérieur du if et que l'un de ces ifs devra générer une sortie. La question est donc de savoir si la profondeur de la condition affecte la sortie de la boucle ou non.

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

La question est donc la suivante : la profondeur de la condition affecte-t-elle la sortie de la boucle ou non ?

si ce n'est pas le cas, break cassera le corps de boucle le plus proche, c'est-à-dire celui dans lequel il est actuellement exécuté, et le nombre de fois où vous utilisez if() n'a pas d'importance, ni le nombre d'iF() ni leur profondeur

enfin, une partie de la phrase, si vous voulez interrompre le corps de la boucle par différentes conditions, il est parfois beaucoup plus facile d'utiliser while() et le drapeau d'interruption de boucle, comme ceci :

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

   i--;
}
 
Igor Makanu:

n'a pas d'incidence, break cassera le corps de boucle le plus proche, c'est-à-dire celui dans lequel il est actuellement exécuté, et le nombre de fois où vous utilisez if() n'a pas d'incidence, ni le nombre d'iF() ni leur profondeur

enfin, une partie de la phrase, si vous voulez interrompre le corps d'une boucle par différentes conditions, il est parfois beaucoup plus facile d'utiliser while() et un drapeau d'interruption de boucle, quelque chose comme ceci :

Je vois où je veux en venir. Eh bien oui, cela peut être compliqué et parfois il est vraiment préférable d'utiliser un drapeau. Je suis juste en train d'expérimenter, à la recherche d'une accroche, je pensais que peut-être il tourne à l'infini, merci pour les réponses.

 
Seric29:

Il y a une question comme celle-ci. Donc, il y a une boucle

La 1èrerupture est située non pas dans les premières parenthèses de la boucle mais dans des parenthèses imbriquées à l'intérieur de celles-ci. La 2èmerupture est encore plus profondément imbriquée dans des parenthèses intérieures. Comme je l'ai compris dans ce cas,break ne fonctionne tout simplement pas, pour dire la vérité, je n'ai pas compris si cela a fonctionné ou non, mais le programme s'est arrêté et a fait des itérations inutiles. Afin de sortir d'une boucle avec beaucoup de conditions, j'ai ajouté un drapeau de sortie à la boucle. Il m'a peut-être semblé que cela ne fonctionne pas, qui pense sur cette question ?

     for(...........)              
     {
          if(.........)
          {
               /* что-то делаем */
          }
          else
          {
               // Непонятно зачем? Если при любом варианте выходим из цикла
               if(.........) break;
               else break;
          }
     }
Je ferais comme ceci
     for(...........)              
     {
          if(/* не соответствует условие */) break;
          /* что-то делаем */
     }
Bien que je n'aie peut-être pas bien saisi le sens de votre idée.
 
Konstantin Nikitin:
Je le ferais comme ceci
Bien que, peut-être, je ne saisis pas bien le sens de votre idée.

L'essentiel est de ne pas s'embrouiller. Il y a des cas où vous ouvrez une autre boucle à l'intérieur d'une boucle et où vous avez besoin de sortir des deux boucles en même temps, mais mql4 ne fournit pas cela seulement à travers un drapeau, C++ a l'opérateur goto, je me demande comment cela fonctionne.

 
Seric29:

L'essentiel est de ne pas s'embrouiller. Il y a des cas où vous ouvrez une autre boucle à l'intérieur d'une boucle et où vous avez besoin de sortir des deux boucles en même temps, mais mql4 ne fournit pas cela seulement à travers un drapeau, C++ a l'opérateur goto, je me demande comment cela fonctionne.

Vous effectuez toutes les boucles dans une fonction, et si vous devez sortir d'une boucle imbriquée - même la trois centième - vous retournez ;