Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 893

 
Seric29:

Es gibt eine Frage wie diese. Es gibt also eine Schleife

Die ersteUnterbrechung befindet sich nicht in der ersten Klammer der Schleife, sondern in darin verschachtelten Klammern. Die zweiteUnterbrechung ist noch tiefer in inneren Klammern verschachtelt.Um die Wahrheit zu sagen, habe ich nicht verstanden, ob es funktioniert hat oder nicht, aber das Programm hat sich aufgehängt und unnötige Iterationen gemacht. Um eine Schleife mit vielen Bedingungen zu beenden, habe ich ein Exit-Flag in die Schleife eingefügt. Vielleicht habe ich den Eindruck, dass es nicht funktioniert, aber wer denkt schon über dieses Thema nach?

Wenn der Code normal gestylt ist, sieht man sofort, dass Sie ihn in die Tonne getreten haben:

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

Das ist genau dasselbe:

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

Es ist nicht möglich, die Candlesticks zu aktualisieren und Ticks hinzuzufügen.

Hier ist der Code für die Indikatoren:

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

Der Indikator wird dann zur Überprüfung von Wetten verwendet:

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

Ausstieg:

Wenn die Candlesticks vollständig aktualisiert werden, warum zeigt rate_total nur 50 % der Candlesticks an?

Bitte beraten Sie mich.


Dateien:
 
Artyom Trishkin:

Bei normalem Code-Styling ist sofort ersichtlich, dass es sich um Blödsinn handelt:

Also in meinem Fall kann es nicht richtig funktionieren und es kann wirklich nicht die Schleife beenden oder wird es die nächste Schleife im Körper, die die Bedingung sowieso befindet beenden?

 
Seric29:

Also in meinem Fall könnte es nicht richtig funktionieren und es könnte nicht tatsächlich die Schleife beenden, oder wird es die nächste Schleife beenden, deren Körper die Bedingung sowieso enthält?

Ich sehe die Schleifenbedingungen nicht - Sie haben dort einen Bindestrich:

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

Ich sehe die Schleifenbedingung nicht - Sie haben dort eine gestrichelte Linie:

Es geht nicht um die Schleifenbedingung, sondern um die Tatsache, dass es innerhalb der if-Schleife mehrere ifs geben kann und eines dieser ifs einen Exit erzeugen muss. Die Frage ist also, ob die Tiefe der Bedingung Einfluss darauf hat, ob die Schleife verlassen wird oder nicht.

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

Die Frage ist also: Hat die Tiefe der Bedingung einen Einfluss darauf, ob die Schleife verlassen wird oder nicht?

ist das nicht der Fall, bricht break den nächstgelegenen Schleifenkörper ab, d.h. den, in dem es gerade ausgeführt wird, und es spielt keine Rolle, wie oft Sie if() verwenden, weder die Anzahl der iF() noch deren Tiefe

Nun, ein Teil des Satzes, wenn Sie den Körper der Schleife durch verschiedene Bedingungen unterbrechen wollen, ist es manchmal viel einfacher, while() und das Schleifenunterbrechungsflag zu verwenden, wie hier:

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

   i--;
}
 
Igor Makanu:

hat keinen Einfluss, break bricht den nächstgelegenen Schleifenkörper ab, d.h. den, in dem es gerade ausgeführt wird, und wie oft Sie if() verwenden, spielt keine Rolle, weder die Anzahl der iF() noch deren Tiefe

Nun, ein Teil des Satzes, wenn Sie einen Schleifenkörper durch verschiedene Bedingungen unterbrechen wollen, ist es manchmal viel einfacher, while() und ein Schleifenunterbrechungsflag zu verwenden, etwa so:

Ich verstehe, worauf ich hinaus will. Nun ja, es kann kompliziert sein, und manchmal ist es wirklich besser, eine Flagge zu verwenden. Ich experimentiere nur und suche nach einem Aufhänger, ich dachte, er dreht sich vielleicht unendlich, danke für die Antworten.

 
Seric29:

Es gibt eine Frage wie diese. Es gibt also eine Schleife

Die ersteUnterbrechung befindet sich nicht in der ersten Klammer der Schleife, sondern in darin verschachtelten Klammern. Die zweiteUnterbrechung ist noch tiefer in inneren Klammern verschachtelt.Um die Wahrheit zu sagen, habe ich nicht verstanden, ob es funktioniert hat oder nicht, aber das Programm hat sich aufgehängt und unnötige Iterationen gemacht. Um eine Schleife mit vielen Bedingungen zu beenden, habe ich ein Exit-Flag in die Schleife eingefügt. Vielleicht hatte ich den Eindruck, dass es nicht funktioniert, aber wer denkt schon über dieses Thema nach?

     for(...........)              
     {
          if(.........)
          {
               /* что-то делаем */
          }
          else
          {
               // Непонятно зачем? Если при любом варианте выходим из цикла
               if(.........) break;
               else break;
          }
     }
Ich würde folgendermaßen vorgehen
     for(...........)              
     {
          if(/* не соответствует условие */) break;
          /* что-то делаем */
     }
Aber vielleicht habe ich den Sinn Ihrer Idee nicht ganz verstanden.
 
Konstantin Nikitin:
Ich würde es folgendermaßen machen
Aber vielleicht verstehe ich den Sinn Ihrer Idee nicht ganz.

Das Wichtigste ist, dass man sich nicht verwirren lässt. Es gibt Fälle, wenn Sie eine andere Schleife innerhalb einer Schleife öffnen und beide Schleifen auf einmal verlassen müssen, aber mql4 bietet dies nicht nur durch ein Flag, C++ hat goto-Operator Ich frage mich, wie es funktioniert.

 
Seric29:

Das Wichtigste ist, dass man sich nicht verwirren lässt. Es gibt Fälle, wenn Sie eine andere Schleife innerhalb einer Schleife öffnen und beide Schleifen auf einmal verlassen müssen, aber mql4 bietet dies nicht nur durch ein Flag, C++ hat goto-Operator Ich frage mich, wie es funktioniert.

Sie führen alle Schleifen in einer Funktion aus, und wenn Sie eine verschachtelte Schleife - auch die dreihundertste - beenden müssen, kehren Sie zurück;

Grund der Beschwerde: