Hatalar, hatalar, sorular - sayfa 3031

 
Igor Makanu :

kodum " her kene üzerinde harmanlayacak" yalnızca yazdığınız 1 numaralı göstergeniz:

bu, terminalin bağımsız olarak bir "kıdemli TF" oluşturmasını sağlar

benim için, "eski zaman diliminde" geçmişi senkronize ederken kodunuzda gerçekleşen 1 numaralı göstergenin tam bir yeniden hesaplamasını yapmaktan "daha ucuz".

evet, ama neden düşük zaman diliminde önceki kireç sıfırlanıyor?

 
Andrey Dik :

evet, ama neden düşük zaman diliminde önceki kireç sıfırlanıyor?

çünkü 0 döndür;
 
Andrey Dik :

evet, ama neden düşük zaman diliminde önceki kireç sıfırlanıyor?

birçok seçenek, uygulamayı bilmiyoruz


Geçen yıl MT4'te benzer bir tartışma vardı, geliştiricilerden biri (sanırım Slava) "kıdemli TF"ye yapılan her çağrının gerekirse veri senkronizasyonunu başlattığını söyledi....

MT5'te terminalin gerekirse bağımsız olarak TF'ler oluşturduğunu düşünüyorum, ancak ağ gecikmeleri varsa veya ..... uygulamayı bilmiyorsak?... o zaman terminal, eski TF'deki göstergeye veri vermeden önce , bu anında gerçekleştiğinde ve belki uzun bir süre boyunca, muhtemelen prev_calculated = 0 olduğunda geçmiş verileri sunucuyla senkronize eder.

 
Igor Makanu :

birçok seçenek, uygulamayı bilmiyoruz

İndirme işlemi alt TF'nin geçmiş verilerini değiştirirse, alt TF'nin sayacı terminalin kendisi tarafından zorla sıfırlanır, birdenbire problem yaratmaya gerek yoktur

 
Andrey Dik :

Sözlerimi onaylıyorsun, yoldaş.

Ben ... kodlayıcı bir arkadaş değil. Bu bir onay değil, bir ipucu, 0 döndürmeyin. Bundan tüm sorunlarınız. Göstergenin tam yeniden hesaplanmasını kendiniz arayın.

 


prev_hesaplanan hiç artmaz, hesaplama sonunda döndüğümüz gibi her zaman aynı olacaktır.

 return (rates_total);


onlar. OnCalculated()'dan çıkışta döndürülen, prev_calculated'daki bir sonraki tikte alacağımız şeydir (prev_calculated == 0 dışında, gösterge başladığında veya TF senkronize edildiğinde terminal bunu yapar ...... )


Andrei Trukhanovich :

İndirme işlemi alt TF'nin geçmiş verilerini değiştirirse, alt TF'nin sayacı terminalin kendisi tarafından zorla sıfırlanır, birdenbire problem yaratmaya gerek yoktur

peki, ona ikinci gün için yazıyorum - Mladen'den göstergeler alın ve çalışın - çalışıyorlar ve TF'ler arasında herhangi bir karmaşık senkronizasyon olmadan ve burada ... kaynakları koruyoruz ve terminalin denilen TF'leri oluşturmasına izin vermiyoruz

 
Andrei Trukhanovich :

yer değiştirmek

üzerinde

ve test edin.

Söyleme... Nasılsa inanmayacaksın.

 
Alexey Viktorov :

Ben ... kodlayıcı bir arkadaş değil. Bu bir onay değil, bir ipucu, 0 döndürmeyin. Bundan tüm sorunlarınız. Göstergenin tam yeniden hesaplanmasını kendiniz arayın.

Herhangi bir aptal söyleyebilir, ancak herkes ayrıntılı olarak anlayamaz ve yardımcı olamaz.

 
Andrei Trukhanovich :

yer değiştirmek

üzerinde

ve test edin.

Teşekkürler Andrey. Soruyu tam olarak anlayan tek kişi sensin.

2021.05.28 21:22:54.394 LitTF (EURUSD,M2) 3. periyottaki gösterge henüz hesaplanmadı

2021.05.28 21:22:54.396 LitTF (EURUSD,M2) 3. periyottaki gösterge henüz hesaplanmadı

2021.05.28 21:22:54.397 EskiTF (EURUSD,M3) 0.000262 sn, hesaplanan 50046 çubuk, toplam 50046 çubuk

2021.05.28 21:22:55.796 LitTF (EURUSD,M2) 0,007693 sn, hesaplanan 50000 bar, toplam 50000 bar

2021.05.28 21:24:02.286 LitTF (EURUSD,M2) 3. periyottaki gösterge henüz hesaplanmadı

2021.05.28 21:24:02.286 EskiTF (EURUSD,M3) 0.000000 sn, hesaplanan 1 çubuk, toplam çubuklar 50047

2021.05.28 21:24:03.017 LitTF (EURUSD,M2) 0.000015 sn, hesaplanan 1 bar, toplam 50001 bar

2021.05.28 21:26:03.898 LitTF (EURUSD,M2) 0.000007 sn, hesaplanan 1 çubuk, toplam 50002 çubuk

şimdi her şey istendiği gibi çalışıyor, göstergeler ilk çalıştırmada yalnızca bir kez ve daha sonra - her biri yeni çubuğunda yalnızca bir kez tam olarak hesaplanıyor.


ikinci göstergenin son kodu, umarım birileri için faydalı olacaktır:

 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[])
{
   ulong t = GetMicrosecondCount ();
   if (rates_total == prev_calculated) return rates_total;

   
   if ( SeriesInfoInteger ( Symbol (), OldTF, SERIES_SYNCHRONIZED ))
   {
       if ( iBars ( Symbol (), OldTF) != BarsCalculated (Handle))
      {
         Print ( "Индикатор на периоде " , OldTF, " ещё не рассчитан" );
         return prev_calculated;
      }
   }
   else 
   {
     Print ( "Период " , OldTF, " не синхронизирован." );
     return prev_calculated;
   }

   ArraySetAsSeries (high, true );
   ArraySetAsSeries (time, true );

   int limit = rates_total - prev_calculated - 1 ;

   double buff [];
   int ind = 0 ;
   for ( int i = limit; i >= 0 ; i--)
   {
      ind = iBarShift ( Symbol (), OldTF, time [i], false );
       if ( CopyBuffer (Handle, 0 , ind, 1 , buff) != - 1 )
      {
        IBuffer [i] = buff [ 0 ];
      }
       else
      {
         Print ( "Ошибка копирования буфера " , GetLastError ());
         return 0 ;
      }
   }

   //----------------------------------------------------------------
   double e = ( GetMicrosecondCount () - t) / 1000000.0 ;
   Print ( DoubleToString (e, 6 ), " sec, расcчитано " , rates_total - prev_calculated, " баров, всего баров " , rates_total);
   return (rates_total);
}
 
Andrey Dik :

Herhangi bir aptal söyleyebilir, ancak herkes ayrıntılı olarak anlayamaz ve yardımcı olamaz.

Sana kaç aptal dediklerini say... sadece bir bilge adam kimseyi duymaz ve dinlenir... ... ... ... ...

Andrei Trukhanovich'in tavsiyesini başka nereye genişletmek için orada ve her şey bir aptal için açık ... Kendiniz için bir sorun yarattınız ve ... kodunuzu bir mql hatası olarak göstermeye çalışıyorsunuz.