MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 893

 
Seric29 :

Böyle bir soru var. yani bir döngü var

Burada, 1. kırılmanın döngünün ilk parantezlerinde olmadığı, ancak zaten yuvalanmış olanlarda, 2. kırılmanın iç yuvalanmış parantezlerde daha da derinde olduğu ortaya çıkıyor. Anladığım kadarıyla, bu durumda, break basitçe çalışmıyor, gerçekte, çalışıp çalışmadığını anlamadım, ancak program askıda kaldı ve fazladan yinelemeler yaptı. Çok sayıda koşulda hala döngüden çıkabilmek için döngüye girdiğim bir çıkış bayrağı yaptım. Belki işe yaramaz gibi geldi bana, bu konuda kim düşünüyor?

Normal kod stiliyle, çöpün yapıldığını hemen görebilirsiniz:

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

Tam olarak aynı:

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

Mumlar güncellenemiyor ve onay işaretleri eklenemiyor.

İşte indeks kodu:

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

Gösterge daha sonra oranları kontrol etmek için uygulanır:

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

Çıktı:

Mumlar tamamen güncellendiyse, neden mumların sadece %50'si oran_toplamda görüntüleniyor?

Lütfen bana öneride bulun.


Dosyalar:
 
Artyom Trishkin :

Normal kod stiliyle, çöpün yapıldığını hemen görebilirsiniz:

Yani benim durumumda düzgün çalışmayabilir ve gerçekten döngüden çıkmayabilir, yoksa yine de koşulun bulunduğu gövdedeki en yakın döngüden çıkar mı?

 
Seric29 :

Yani benim durumumda düzgün çalışmayabilir ve gerçekten döngüden çıkmayabilir, yoksa yine de koşulun bulunduğu gövdedeki en yakın döngüden çıkacak mı?

Döngünün koşullarını görmüyorum - orada bir üç nokta var:

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

Döngü koşullarını görmüyorum - orada bir üç nokta var:

Mesele, döngünün koşulu değil, içeride birkaç if'nin daha olması ve bu if'lerden birinin bir çıktı üretmesi gerektiği gerçeğidir, yani soru şu ki, koşulun derinliği döngünün ayrılıp ayrılmayacağını etkiler mi? olumsuzluk?

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

yani soru, koşulun derinliğinin döngünün bırakılıp bırakılmayacağını etkileyip etkilemediğidir?

hiçbir etkisi yoktur, break en yakın döngü gövdesini kıracaktır, yani. şu anda yürütülmekte olduğu ve if () 'yi kaç kez kullandığınız önemli değil, ne iF () sayısı ne de derinliği

ve bir cümle parçası olarak, farklı koşullarda döngünün gövdesini kırmak istiyorsanız, bazen while() ve döngü kesme bayrağını kullanmak çok daha kolaydır, bunun gibi bir şey:

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

   i--;
}
 
Igor Makanu :

hiçbir etkisi yoktur, break en yakın döngü gövdesini kıracaktır, yani. şu anda yürütülmekte olduğu ve if () 'yi kaç kez kullandığınız önemli değil, ne iF () sayısı ne de derinliği

ve bir cümle parçası olarak, farklı koşullarda döngünün gövdesini kırmak istiyorsanız, bazen while() ve döngü kesme bayrağını kullanmak çok daha kolaydır, bunun gibi bir şey:

Açıkçası bana öyle geldi. Evet, karmaşık bir şema var ve bazen bir bayrak kullanmak daha iyidir. Sadece denedim, takıldığını görüyorum, genel olarak sonsuza kadar dönebileceğini düşündüm, cevaplar için teşekkürler.

 
Seric29 :

Böyle bir soru var. yani bir döngü var

Burada, 1. kırılmanın döngünün ilk parantezlerinde olmadığı, ancak zaten yuvalanmış olanlarda, 2. kırılmanın iç yuvalanmış parantezlerde daha da derinde olduğu ortaya çıkıyor. Anladığım kadarıyla, bu durumda, break basitçe çalışmıyor, gerçekte, çalışıp çalışmadığını anlamadım, ancak program askıda kaldı ve fazladan yinelemeler yaptı. Çok sayıda koşulda hala döngüden çıkabilmek için döngüye girdiğim bir çıkış bayrağı yaptım. Belki işe yaramaz gibi geldi bana, bu konuda kim düşünüyor?

     for (...........)              
     {
           if (.........)
          {
               /* что-то делаем */
          }
           else
          {
               // Непонятно зачем? Если при любом варианте выходим из цикла
               if (.........) break ;
               else break ;
          }
     }
böyle yapardım
     for (...........)              
     {
           if ( /* не соответствует условие */ ) break ;
           /* что-то делаем */
     }
Her ne kadar fikrinizin anlamını tam olarak anlayamasam da.
 
Konstantin Nikitin :
böyle yapardım
Her ne kadar fikrinizin anlamını tam olarak anlayamasam da.

Ana şey kafa karıştırmamak. Döngü içinde başka bir döngü açtığınızda bir durum vardır ve koşul ihlal edilirse, her iki döngüden de aynı anda çıkmak gerekir, ancak mql4'te bu sadece bir bayrak aracılığıyla sağlanmaz, c++'da bir goto operatörü vardır, Nasıl çalıştığını merak ediyorum.

 
Seric29 :

Ana şey kafa karıştırmamak. Döngü içinde başka bir döngü açtığınızda bir durum vardır ve koşul ihlal edilirse, her iki döngüden de aynı anda çıkmak gerekir, ancak mql4'te bu sadece bir bayrak aracılığıyla sağlanmaz, c++'da bir goto operatörü vardır, Nasıl çalıştığını merak ediyorum.

Bir işlevdeki tüm döngüleri yaparsınız ve iç içe geçmiş herhangi bir döngüden çıkmanız gerekirse - hatta üç yüzüncü döngüden - geri dönersiniz;