MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 893

 
Seric29 :

그런 질문이 있습니다. 그래서 주기가 있다.

여기에서 첫 번째 나누기 가 주기의 첫 번째 괄호에 있지 않고 이미 중첩된 괄호 안에 있는 것으로 나타났습니다. 두 번째 나누기 는 내부 중첩 괄호에 더 깊게 중첩되어 있습니다. 제가 알기로는 이 경우 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 중 하나가 출력을 생성해야 한다는 사실입니다. 따라서 문제는 조건의 깊이가 루프를 떠날지 여부에 영향을 미치는지 여부입니다. 아니다?

     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 :

그런 질문이 있습니다. 그래서 주기가 있다.

여기에서 첫 번째 나누기 가 주기의 첫 번째 괄호에 있지 않고 이미 중첩된 괄호 안에 있는 것으로 나타났습니다. 두 번째 나누기 는 내부 중첩 괄호에 더 깊게 중첩되어 있습니다. 제가 알기로는 이 경우 break 는 단순히 동작하지 않습니다. 사실 동작 여부를 이해하지 못했는데 프로그램이 정지되고 추가 반복을 수행했습니다. 많은 조건에서 루프를 계속 종료하기 위해 루프에 입력한 종료 플래그를 만들었습니다. 아마도 작동하지 않는 것처럼 보였을 것입니다. 누가이 문제에 대해 생각합니까?

     for (...........)              
     {
           if (.........)
          {
               /* что-то делаем */
          }
           else
          {
               // Непонятно зачем? Если при любом варианте выходим из цикла
               if (.........) break ;
               else break ;
          }
     }
나는 이렇게 할 것이다
     for (...........)              
     {
           if ( /* не соответствует условие */ ) break ;
           /* что-то делаем */
     }
비록 아이디어의 의미를 잘 이해하지 못할 수도 있지만.
 
Konstantin Nikitin :
나는 이렇게 할 것이다
비록 나는 아이디어의 의미를 잘 이해하지 못할 수도 있습니다.

가장 중요한 것은 혼동하지 않는 것입니다. 싸이클 내부에서 다른 싸이클을 여는 경우가 있고 조건을 위반하면 두 싸이클을 동시에 종료해야 하는 경우가 있지만 mql4에서는 플래그를 통해서만 제공되지 않고 C++에는 goto 연산자가 있습니다. 어떻게 작동하는지 궁금합니다.

 
Seric29 :

가장 중요한 것은 혼동하지 않는 것입니다. 싸이클 내부에서 다른 싸이클을 여는 경우가 있고 조건을 위반하면 두 싸이클을 동시에 종료해야 하는 경우가 있지만 mql4에서는 플래그를 통해서만 제공되지 않고 C++에는 goto 연산자가 있습니다. 어떻게 작동하는지 궁금합니다.

함수에서 모든 루프를 수행하고 중첩된 루프를 종료해야 하는 경우 - 300번째 루프라도 - 반환합니다.