新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 893

 
Seric29:

有一个这样的问题。因此,有一个循环

第1个断点 不是位于循环的第一个小括号内,而是位于嵌套在小括号内的小括号内。 第2个断点 嵌套在小括号内,甚至更深。正如我所理解的,在这种情况下,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:

我没有看到循环条件--你那里有一条虚线。

这不是关于循环条件的问题,而是关于在if里面可能有更多的if,而其中一个if要产生退出,所以问题是,条件的深度是否影响循环是否会离开?

     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个断点 不是位于循环的第一个小括号内,而是位于嵌套在小括号内的小括号内。 第2个断点 嵌套在小括号内,甚至更深。正如我所理解的,在这种情况下,break 根本不起作用,说实话,我不明白它是否起作用,但程序挂起了,并进行了不必要的反复。为了退出一个有很多条件的循环,我给循环添加了一个退出标志。也许在我看来,它不起作用,谁在这个问题上想过?

     for(...........)              
     {
          if(.........)
          {
               /* что-то делаем */
          }
          else
          {
               // Непонятно зачем? Если при любом варианте выходим из цикла
               if(.........) break;
               else break;
          }
     }
我将这样做
     for(...........)              
     {
          if(/* не соответствует условие */) break;
          /* что-то делаем */
     }
虽然也许我没有完全理解你的想法。
 
Konstantin Nikitin:
我将这样做
虽然,也许我不太明白你的想法的意义。

最主要的是不要被迷惑。有些情况下,你在一个循环内打开另一个循环,需要同时退出两个循环,但是mql4没有提供这个,只能通过一个标志,C++有goto操作符,我想知道它是如何工作的。

 
Seric29:

最主要的是不要被迷惑。有些情况下,你在一个循环内打开另一个循环,需要同时退出两个循环,但是mql4没有提供这个,只能通过一个标志,C++有goto操作符,我想知道它是如何工作的。

你在一个函数中做所有的循环,如果你需要退出任何一个嵌套的--甚至是第三百个--返回。

原因: