Hatalar, hatalar, sorular - sayfa 3027

 
Сергей Таболин :

Göstergeler benim en zayıf noktam)))

Ancak!

Ya ben hiç bir şey anlamadım ya da biraz yanılıyorsunuz.

Bildiğim kadarıyla prev_calculated, hesaplanmamış verilerin sayacıdır. Ve alınan veriler hesaplandığından, bu sayaç sıfırlanır ... Aynen, bu kadar, dostum, hesaplanacak yeni veri yok ....)))

Ve bu durumda gösterge hangi nedenle tamamen yeniden hesaplanmalıdır - bilmiyorum!

---------------

biraz yalan söyledim)))

Göstergeler yeniden çizilmez, "hindi" sadece tarihe "güzel" görünmek için ;)

sayaç, programlayıcının kontrolü dışındaki nedenlerle, gösterge ilk kez başlatılmış gibi başlangıç durumuna sıfırlanır!

Mesajımın anlaşılmaz uygulamalar arasında kaybolmasını istemezdim ama yine de saygıdeğer geliştiricilere ulaştı.



OnCalculate() işlevi tarafından döndürülen değer ile ikinci giriş parametresi prev_calculated arasındaki ilişkiye dikkat edin. İşlev çağrılırken prev_calculated parametresi, önceki çağrıda OnCalculate() işlevi tarafından döndürülen değeri içerir. Bu, bu işlevin önceki başlatılmasından bu yana değişmeyen çubuklar için yeniden hesaplamalardan kaçınmak için özel bir göstergeyi hesaplamak için ekonomik algoritmalar uygulamanıza olanak tanır.

belgelerdendir. olması gerektiği gibi çalışmıyor önceki kireç, tüm ekonomik hesaplama kavramını bozar.
 
Andrey Dik :
sayaç, programlayıcının kontrolü dışındaki nedenlerle, gösterge ilk kez başlatılmış gibi başlangıç durumuna sıfırlanır!

Mesajımın anlaşılmaz uygulamalar arasında kaybolmasını istemezdim ama yine de saygıdeğer geliştiricilere ulaştı.

Bu her yeni barda mı? Reasürans falan..

Her birinde değilse, prev_calk'ın sıfırlanmasının farklı nedenleri vardır.

 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

Andrey Dik , 2021.05.27 13:53

verilerin alındığı yeni bir zaman dilimi çubuğu göründüğünde, ön_hesaplanan sayaç sıfırlanır. bu, tüm göstergenin ilkinde başlatılmış gibi yeniden hesaplanacağı anlamına gelir .

Bu yapı tanıdık geldi mi?

 if (rates_total == prev_calculated) return rates_total;
  
int startInd = rates_total - prev_calculated;

for ( int i = startInd; i >= 0 ; i--)
{
   //тут считаем индикатор, который обращается к другому индикатору на старшем ТФ
}

bu EA'nın mantığı değil (yeniden çizme, yeniden çizme, eksik çizme veya başka bir şey), ama kimse istemezken prev_calculated'ın sıfıra sıfırlanması gerçeği!

Bence sorun şu:

 if (rates_total == prev_calculated) return rates_total;

Başka bir TF üzerindeki aranan göstergenin her tikte hesaplanmasına izin vermiyorsunuz ve ardından onu çağırıyorsunuz ve geçmiş senkronize ediliyor ve bu gösterge sıfırdan hesaplanıyor.


bir test çizdim, aradığım gösterge her şeyi sayar ve prev_calculated == 0 olarak sıfırlanmaz

kapatma göstergesini çizin ve yeni çubuğu ve prev_calculated == 0 olayını yazdırın:

 // tst.mq5

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[])
{
   int start;
   static datetime t = 0 ;
   if (t != time[rates_total- 1 ])
   {
      t = time[rates_total- 1 ];
       Print ( MQLInfoString ( MQL_PROGRAM_NAME ), " New bar " , t);
   }
   
   if (prev_calculated == 0 )
   {
      start = 0 ;
       ArrayInitialize (Buffer, EMPTY_VALUE );
       Print ( MQLInfoString ( MQL_PROGRAM_NAME ), " prev_calculated == 0" );
   }
   else start = prev_calculated - 1 ;


   for ( int i = start; i < rates_total; i++)
   {
      Buffer[i] = close[i];
   }
//--- return value of prev_calculated for next call
   return (rates_total);
}

bu göstergeyi çağırın (tamponun son 2 değerini alırız) ve ayrıca TF'mize yaklaşın:

 input ENUM_TIMEFRAMES TF = PERIOD_M5;
int OnInit ()
{
//--- indicator buffers mapping
   SetIndexBuffer ( 0 , Buffer, INDICATOR_DATA );
   ind_handle = iCustom ( NULL , TF, "NewFolder\\tst" );
//---
   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[])
{
   int start;
   static datetime t = 0 ;
   if (t != time[rates_total- 1 ])
   {
      t = time[rates_total- 1 ];
       Print ( MQLInfoString ( MQL_PROGRAM_NAME ), " New bar " , t);
   }

   if (prev_calculated == 0 )
   {
      start = 0 ;
       ArrayInitialize (Buffer, EMPTY_VALUE );
       Print ( MQLInfoString ( MQL_PROGRAM_NAME ), " prev_calculated == 0" );
   }
   else start = prev_calculated - 1 ;


   for ( int i = start; i < rates_total; i++)
   {
      Buffer[i] = close[i];
   }
   double buf[];
   if ( CopyBuffer (ind_handle, 0 , 0 , 2 , buf) < 0 ) Print ( "Error CopyBuffer # " , GetLastError ());
//--- return value of prev_calculated for next call
   return (rates_total);
}


M1'deki son göstergeyi başlattı, günlük:

2021.05.27 21:48:34.196 tst_tf (EURUSD,M1) tst_tf Yeni bar 2021.05.27 21:48:00

2021.05.27 21:48:34.197 tst_tf (EURUSD,M1) tst_tf önceki_hesaplanmış == 0

2021.05.27 21:48:34.197 tst_tf (EURUSD,M1) Hata CopyBuffer#4806

2021.05.27 21:48:34.197 tst (EURUSD,M5) tst Yeni bar 2021.05.27 21:45:00

2021.05.27 21:48:34.197 tst (EURUSD,M5) tst prev_hesaplanmış == 0

2021.05.27 21:49:01.636 tst_tf (EURUSD,M1) tst_tf Yeni bar 2021.05.27 21:49:00

2021.05.27 21:50:00.149 tst_tf (EURUSD,M1) tst_tf Yeni bar 2021.05.27 21:50:00

2021.05.27 21:50:00.149 tst (EURUSD,M5) tst Yeni bar 2021.05.27 21:50:00

2021.05.27 21:51:01.789 tst_tf (EURUSD,M1) tst_tf Yeni bar 2021.05.27 21:51:00

2021.05.27 21:52:02.832 tst_tf (EURUSD,M1) tst_tf Yeni bar 2021.05.27 21:52:00

2021.05.27 21:53:00.920 tst_tf (EURUSD,M1) tst_tf Yeni bar 2021.05.27 21:53:00

2021.05.27 21:54:02.778 tst_tf (EURUSD,M1) tst_tf Yeni bar 2021.05.27 21:54:00

2021.05.27 21:55:000.308 tst_tf (EURUSD,M1) tst_tf Yeni bar 2021.05.27 21:55:00

2021.05.27 21:55:000.308 tst (EURUSD,M5) tst Yeni bar 2021.05.27 21:55:00

2021.05.27 21:56:00.118 tst_tf (EURUSD,M1) tst_tf Yeni bar 2021.05.27 21:56:00

2021.05.27 21:57:000.419 tst_tf (EURUSD,M1) tst_tf Yeni bar 2021.05.27 21:57:00

 
Andrey Khatimlianskii :

Bu her yeni barda mı? Reasürans falan..

Her birinde değilse, prev_calk'ın sıfırlanmasının farklı nedenleri vardır.

tam olarak eski TF'nin her yeni çubuğunda.

Örneğin, gösterge M1 üzerinde çalışıyorsa ve M5 üzerindeki göstergeye atıfta bulunuyorsa, gösterge her 5 dakikada bir tamamen yeniden hesaplanacaktır. optimizasyonda önemli bir yavaşlama garanti edilir.

 
Igor Makanu :

Bence sorun şu:

Başka bir TF üzerindeki aranan göstergenin her tikte hesaplanmasına izin vermiyorsunuz ve ardından onu çağırıyorsunuz ve geçmiş senkronize ediliyor ve bu gösterge sıfırdan hesaplanıyor.


bir test çizdim, aradığım gösterge her şeyi sayar ve prev_calculated == 0 olarak sıfırlanmaz

kapatma göstergesini çizin ve yeni çubuğu ve prev_calculated == 0 olayını yazdırın:

bu göstergeyi çağırın (tamponun son 2 değerini alırız) ve ayrıca TF'mize yaklaşın:

İstenen kıdemli TF (M5) üzerinde veri senkronizasyonu ve üzerindeki göstergenin hazır olup olmadığını kontrol ediyorum, hazır değilse çıkıyorum.

sonuç olarak, gösterge M1 çubuğunun açılışında yalnızca bir kez çalışır ve her tikte çalışmaz:


 //проверка готовности данных и индикатора на другом TF
if ( SeriesInfoInteger ( Symbol (), tf, SERIES_SYNCHRONIZED ))
{
   if ( iBars ( Symbol (), tf) != BarsCalculated (handleFr)) return 0 ;
}
else return 0 ;

//проверка на наличие нового бара
if (rates_total == prev_calculated) return rates_total;

Özel prev calc'inizi gerçekten kullanmak zorunda mısınız? Umarım geliştiriciler ricalarıma kulak verir.

 
Andrey Dik :

İstenen kıdemli TF (M5) üzerinde veri senkronizasyonu ve üzerindeki göstergenin hazır olup olmadığını kontrol ediyorum, hazır değilse çıkıyorum.

sonuç olarak, gösterge M1 çubuğunun açılışında yalnızca bir kez çalışır ve her tikte çalışmaz:


Özel prev calc'inizi gerçekten kullanmak zorunda mısınız? Umarım geliştiriciler ricalarıma kulak verir.

bu, göstergelerde düzgün çalışmamalıdır:

 if ( SeriesInfoInteger ( Symbol (), tf, SERIES_SYNCHRONIZED ))

yanılmıyorsam, yardım, tüm zaman dilimleri için veri yüklemek için komut dosyasının bir ayrıştırmasını içerir ve göstergenin çalışması nedeniyle göstergeden geçmiş verileri bu şekilde talep edemeyeceğinize dair bir uyarı olmalıdır. asenkron olarak

Evet ve tutamacı bağladıktan sonra BarsCalculated() öğesinin bir kez kullanılması önerilir


UPD: takas geçmişi için komut dosyası ve göstergelerde neden çalışmadığının açıklaması: https://www.mql5.com/en/docs/series/timeseries_access

 
Andrey Dik :

İstenen kıdemli TF (M5) üzerinde veri senkronizasyonu ve üzerindeki göstergenin hazır olup olmadığını kontrol ediyorum, hazır değilse çıkıyorum.

sonuç olarak, gösterge M1 çubuğunun açılışında yalnızca bir kez çalışır ve her tikte çalışmaz:


Özel prev calc'inizi gerçekten kullanmak zorunda mısınız? Umarım geliştiriciler ricalarıma kulak verir.

Neden böyle bir kontrol?

 //проверка готовности данных и индикатора на другом TF
if ( SeriesInfoInteger ( Symbol (), tf, SERIES_SYNCHRONIZED ))
{
   if ( iBars ( Symbol (), tf) != BarsCalculated (handleFr)) return 0 ;
}
else return 0 ;

Koşul dönüşü 0 olmadan yazmak daha kolay olacaktır; ve her şey...

Her yeni çubukta koşul karşılanacak ve senkronizasyondan bağımsız olarak tüm çubuklar yeniden hesaplanacaktır. Döküntü kodu yazdınız ve onu bir terminal hatası olarak ilettiniz ...

 
Derleme sırasında hata:
 union X1 { //(1) нормально
         char x11[ INT_MAX / 2 + 1 ];
};
union X2 { //(2) Error: 'X2' - struct is too large
         char x21[ INT_MAX / 2 + 1 ];
         char x22[ INT_MAX / 2 + 1 ];
};
Ve (1) ve (2) arasındaki temel fark nedir?
 
tek bir alanla birlik garip bir şey.
 
Alexey Viktorov :

Neden böyle bir kontrol?

Koşul dönüşü 0 olmadan yazmak daha kolay olacaktır; ve her şey...

Her yeni çubukta koşul karşılanacak ve senkronizasyondan bağımsız olarak tüm çubuklar yeniden hesaplanacaktır. Döküntü kodu yazdınız ve onu bir terminal hatası olarak ilettiniz ...

tekrar düşün.