Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 893

 
Seric29:

Есть такой вопрос. Значит есть цикл

Здесь получается 1ый break находится не в первых скобочках цикла а уже во вложенных, 2ой break находится ещё глубже вложен во внутренние вложенные скобочки. Как я понял в данном случае break попросту не срабатывает, по правде я так и не понял срабатывает или нет но программа зависала и производила лишние итерации. Чтобы всё таки выйти из цикла в большом количестве условий я делал флаг выхода который вписывал в цикл. Может мне показалось что оно не работает, кто что думает по данному вопросу?

При нормальной стилизации кода сразу видно, что фигню сделали:

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

Точно то же самое:

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

Невозможно обновить свечи и добавить галочки.

Вот код показателей:

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

Затем индикатор применяется для проверки ставок:

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

Выход:

Если свечи полностью обновлены, то почему в rate_total отображается только 50% свечей?

Пожалуйста, посоветуй мне.


Файлы:
 
Artyom Trishkin:

При нормальной стилизации кода сразу видно, что фигню сделали:

Значит в моём случае может некорректно сработать и оно и вправду может не выйти из цикла или оно в любом случае выйдет из ближайшего цикла в теле которого находится условие?

 
Seric29:

Значит в моём случае может некорректно сработать и оно и вправду может не выйти из цикла или оно в любом случае выйдет из ближайшего цикла в теле которого находится условие?

Я не вижу условий цикла - там многоточие у вас:

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

Я не вижу условий цикла - там многоточие у вас:

Дело не в условии цикла а в том что внутри если может быть ещё несколько если и одно из этих если должно будет сгенерировать выход, так вот вопрос в том что влияет ли глубина условия на то будет ли покинут цикл или нет?

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

так вот вопрос в том что влияет ли глубина условия на то будет ли покинут цикл или нет?

не влияет, break  разорвет ближайшее тело цикла, т.е. в котором он сейчас выполняется, а сколько раз Вы используете if() не важно, ни количество iF() ни их глубина

ну и в части предложения, если Вы хотите разорвать тело цикла по разным условиями, иногда намного проще использовать while() и флаг прерывания цикла, примерно так:

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

   i--;
}
 
Igor Makanu:

не влияет, break  разорвет ближайшее тело цикла, т.е. в котором он сейчас выполняется, а сколько раз Вы используете if() не важно, ни количество iF() ни их глубина

ну и в части предложения, если Вы хотите разорвать тело цикла по разным условиями, иногда намного проще использовать while() и флаг прерывания цикла, примерно так:

Понятно значит мне показалось. Ну да бывает сложная схема и иногда лучше и в правду использовать флаг. Просто я эксперементировал смотрю виснет думал может крутит бесконечно в общем спасибо за ответы.

 
Seric29:

Есть такой вопрос. Значит есть цикл

Здесь получается 1ый break находится не в первых скобочках цикла а уже во вложенных, 2ой break находится ещё глубже вложен во внутренние вложенные скобочки. Как я понял в данном случае break попросту не срабатывает, по правде я так и не понял срабатывает или нет но программа зависала и производила лишние итерации. Чтобы всё таки выйти из цикла в большом количестве условий я делал флаг выхода который вписывал в цикл. Может мне показалось что оно не работает, кто что думает по данному вопросу?

     for(...........)              
     {
          if(.........)
          {
               /* что-то делаем */
          }
          else
          {
               // Непонятно зачем? Если при любом варианте выходим из цикла
               if(.........) break;
               else break;
          }
     }
Я бы сделал вот так
     for(...........)              
     {
          if(/* не соответствует условие */) break;
          /* что-то делаем */
     }
Хотя может смысл вашей идеи не совсем понял.
 
Konstantin Nikitin:
Я бы сделал вот так
Хотя может смысл вашей идеи не совсем понял.

Главное не запутаться. Бывает случай когда внутри цикла открываешь ещё цикл и при нарушения условия есть нужда выйти из обоих циклов сразу, но в mql4 это не предусмотрено только через флаг, в с++ есть оператор goto интересно как он работает.

 
Seric29:

Главное не запутаться. Бывает случай когда внутри цикла открываешь ещё цикл и при нарушения условия есть нужда выйти из обоих циклов сразу, но в mql4 это не предусмотрено только через флаг, в с++ есть оператор goto интересно как он работает.

Все циклы делаете в функции, и если нужно выйти из любого вложенного - хоть трёхсотого - return;

Причина обращения: