Hatalar, hatalar, sorular - sayfa 2997

 
Alexey Viktorov :

Belki kayaklar kötüdür?


ve daha fazlası RTS-6.21


Bu zaten bir şey. Hangi komisyoncudan ve MT5'in hangi sürümüne sahipsiniz.

 
Alexey Viktorov :

Belki kayaklar kötüdür?


ve daha fazlası RTS-6.21


Yardım için teşekkürler. Anladım. Farklı klasörlerdeki göstergelerin farklı sürümleri bağlandı.

 
Francuz :

Evet, denedim. Sonuç değişmedi.

İnanmıyorum.
Tekrar deneyin

 datetime a = D'2021.04.08 10:00:00' ;
   int       handle;
   double    Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
{

   handle = iCustom ( _Symbol , PERIOD_CURRENT , "Examples\\ATR.ex5" , 14 );
   :: Print ( __FUNCTION__ + "| PERIOD_CURRENT = " , EnumToString ( _Period ));

   return ( INIT_SUCCEEDED );
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 ( prev_calculated> 0 && handle != INVALID_HANDLE )
   {
      :: CopyBuffer (handle, 0 , a, 1 , Buffer);
      
       double BS = :: NormalizeDouble (Buffer[ 0 ], _Digits );
      
      :: Print ( __FUNCTION__ + "| a = " , a);
      :: Print ( __FUNCTION__ + "| BS " , BS);
      
      handle = INVALID_HANDLE ;
   }
   
   // return value of prev_calculated for next call
   return (rates_total);
}
 
Nikolai Semko :

İnanmıyorum.
Tekrar deneyin

Bunu anladım. Sorun, farklı klasörlerden iki farklı ATR dosyasının bağlanmasıydı. Sonuç olarak, değerlerde bir tutarsızlık vardı.

Yardımın için teşekkürler.
 
Nikolai Semko :

İnanmıyorum.
Tekrar deneyin

Nicholas, başka bir sorunu vardı. Ben de soruyu hemen anlamadım, değerleri başka bir TF'den almak gerektiğini düşündüm. Kayakları yağladı ve her şey gitti.
 
Alexey Viktorov :
Nicholas, başka bir sorunu vardı. Ben de soruyu hemen anlamadım, değerleri başka bir TF'den almak gerektiğini düşündüm. Kayakları yağladı ve her şey gitti.

Garip, anlamadım.
Sorununu tam olarak tarif ettiği gibi kendi başıma yeniden ürettim.
Bunun nedeni, CopyBuffer'ın tek uygulamasının OnCalculate'e ilk girişte, prev_calculated == 0 olduğu ve çubukların zaten oluşturulmuş olduğunun garantisi olmadığı için gerçekleşmesidir.
Çözüm, bu ilk çağrıyı yok saymak ve yalnızca prev_calculated>0 olduğunda tek bir CopyBuffer çalıştırmaktı.
Ve burada " farklı klasörlerden iki farklı ATR dosyası " - anlamadım.

 
Nikolai Semko :

Garip, anlamadım.
Sorununu tam olarak tarif ettiği gibi kendi başıma yeniden ürettim.
Bunun nedeni, CopyBuffer'ın tek uygulamasının OnCalculate'e ilk girişte, prev_calculated == 0 olduğu ve çubukların zaten oluşturulmuş olduğunun garantisi olmadığı için gerçekleşmesidir.
Çözüm, bu ilk çağrıyı yok saymak ve yalnızca prev_calculated>0 olduğunda tek bir CopyBuffer çalıştırmaktı.
Ve burada " farklı klasörlerden iki farklı ATR dosyası " - anlamadım.

Peki, bir grafik açıksa ve mevcut zaman dilimi için bir gösterge oluşturulmuşsa, grafik açıldığında veriler zaten hazır olmalıdır. Öyle değil mi?

 
Alexey Viktorov :

Peki, bir grafik açıksa ve mevcut zaman dilimi için bir gösterge oluşturulmuşsa, grafik açıldığında veriler zaten hazır olmalıdır. Öyle değil mi?

Ah, kaç harika keşif bizim için hazırlanıyor ...

 
Alexey Viktorov :

Peki, bir grafik açıksa ve mevcut zaman dilimi için bir gösterge oluşturulmuşsa, grafik açıldığında veriler zaten hazır olmalıdır. Öyle değil mi?

tam olarak doğru ifade edilmemiştir. Barlar evet - büyük olasılıkla hazır. Ancak, prev_calculated == 0 olduğunda OnCalculate'deki ilk çalıştırmada tüm bu çubuklar için göstergenin yeniden hesaplandığının garantisi yoktur.
Bunu doğrulamak için böyle bir gösterge çalıştırabilirsiniz.
Bunu yalnızca teklifler geldiğinde yapmanız gerekir. Piyasa kapalıysa, bir uyumsuzluk görmezsiniz.
Bu nedenle, şimdi hafta sonu hareket halindeki bir kripto para biriminde denemek daha iyidir.
Tampon Boyutu dizisi = -1 ise, gösterge arabelleği henüz yeniden hesaplanmamıştır ve BS değeri doğru olmayacaktır.

   datetime a = D'2021.04.08 10:00:00' ;
   int       handle;
   double    Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
{

   handle = iCustom ( _Symbol , PERIOD_CURRENT , "Examples\\ATR.ex5" , 14 );
   :: Print ( __FUNCTION__ + "| PERIOD_CURRENT = " , EnumToString ( _Period ));

   return ( INIT_SUCCEEDED );
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 (handle != INVALID_HANDLE )
   {
      :: CopyBuffer (handle, 0 , a, 1 , Buffer);
      
       double BS = :: NormalizeDouble (Buffer[ 0 ], _Digits );
      
      :: Print ( __FUNCTION__ + "| a = " , a);
      :: Print ( __FUNCTION__ + "| BS " , BS);
       int total_bars = iBars ( NULL , PERIOD_CURRENT );
       int size = CopyBuffer (handle, 0 , 0 , total_bars, Buffer);
       Print ( "Total Bars = " + string (total_bars) + ", Size of Buffer array = " + string (size));
      
      handle = INVALID_HANDLE ;
   }
   
   // return value of prev_calculated for next call
   return (rates_total);
}


Bu, bir sonraki OnCalculate çağrısında yapılırsa (prev_calculated>0 olduğunda), böyle bir sorun olmayacaktır.

PS kodda bir hata oluştu - düzeltildi

 
Artyom Trishkin :

Ah, kaç harika keşif bizim için hazırlanıyor ...

Göstergeyi hesaplamak için verileri kastettim. kusura bakmayın))))

Neden: