Hatalar, hatalar, sorular - sayfa 3028

 
fxsaber :
tek bir alanla birlik garip bir şey.

Bu, struct ile aynıdır - yalnızca hata daha açık bir şekilde görülebilir. Bu belgelerde bile yazıyor: " Aksi takdirde , birlik bir yapı gibi davranır "

union\char\char bağlantısı da garip ve ayrıca netlik için, ancak bunu şu şekilde yeniden yazabilirsiniz:

 union X3 { //(3) Error: 'X2' - struct is too large
         char x31[ INT_MAX / 2 + 1 ];
         int   x32[ INT_MAX / 8 + 1 ];
};
birine garip gelmesin diye
 
Andrey Dik :

tekrar düşün.

Andrew'u düşünmen gerek. Kodunuzda hamamböceği var.

Pekala, bugün çok motive oldum ... Doğru yönde ilerlemeye çalışacağım:

Yeni bir çubuk açıldı… iBars() bir arttı…… Ancak hesaplanan çubuk sayısı değişmedi. Ve bu yeni çubuk yeniden hesaplanana kadar değişmeyecek...

Sıradaki ne

 
Igor Makanu :

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

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

Kodun anlamını anladığınızdan emin misiniz?

 
Alexey Viktorov :

Andrew'u düşünmen gerek. Kodunuzda hamamböceği var.

Pekala, bugün çok motive oldum ... Doğru yönde ilerlemeye çalışacağım:

Yeni bir çubuk açıldı… iBars() bir arttı…… Ancak hesaplanan çubuk sayısı değişmedi. Ve bu yeni çubuk yeniden hesaplanana kadar değişmeyecek...

Sıradaki ne

sevgili. Lütfen bana yazmayın, konu dışısınız.

veya kod ile kanıtlayın.

 
Andrey Dik :

Kodun anlamını anladığınızdan emin misiniz?

yüksek olasılıkla - emin ve anlaşıldı

Başka bir gösterge çağırmadan önce göstergeden "daha yüksek zaman aralığını" senkronize etmek istiyorsunuz

göstergem çalışıyor mu? - buna BarsCalculated() da ekleyebilirsiniz - ancak teslimattaki gösterge örneklerinde olduğu gibi, örneğin MACD.mql5


Not: KB'de çok zaman dilimli göstergeler var, neyi ve nasıl yapacağımı hatırlamam gerekirse, genellikle Mladen Rakic'in göstergelerini ararım ve ona bakarım, kodu yazma tarzı tuhaf (veya daha doğrusu biçimlendirme), ancak kesinlikle %100 verimli

https://www.mql5.com/ru/users/mladen

 
Andrey Dik :

sevgili. Lütfen bana yazmayın, konu dışısınız.

veya kod ile kanıtlayın.

O zaman sana afiyet olsun...

Geliştiriciler böyle saçmalıklara tepki vermiyor, Igor da yakında sıkılacak ... Ve kendi kendine konuşmaya devam et ...

Sadece davulcudan, doğru olanı bozmamak için dışavurumlarınızı ayrı bir konuya taşımasını istemeniz yeterlidir ...

 

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

Hatalar, hatalar, sorular

Andrey Dik , 2021.05.28 05:16

İ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.

Kodunuzu tam olarak anlamadım. "dönüş 0"dan sonra ne olmalı; OnCalculate'e bir sonraki çağrıda?
 
Alexey Viktorov :

Igor da yakında sıkılacak ...

sadece anlamak istiyorum

MT5'in senkronizasyonla ilgili birçok tuzakları var, şimdi soru tam da bununla ilgili

IMHO, gösterge her çubukta yapılar kullanıyorsa (oklar değil çizgiler)

o zaman böyle bir döngü ekonomik bir hesaplama için yeterlidir:

 for ( int i = prev_calculated; i < rates_total; i++)
   {
      Buffer[i] = close[i];
   }

ilk arama varsa, prev_calculated = 0 olur, sonraki aramalarda yeni çubuklar yeniden hesaplanır


ve her iki gösterge de doğru yazılırsa, ek olarak hiçbir şeyi senkronize etmeye gerek yoktur, her şey işe yarayacaktır, geriye kalan tek şey CopyBuffer() ile çağrılan göstergenin gerekli sayıda değeriyle karşılaştırmaktır.

 
Igor Makanu :

sadece anlamak istiyorum

MT5'in senkronizasyonla ilgili birçok tuzakları var, şimdi soru tam da bununla ilgili

IMHO, gösterge her çubukta yapılar kullanıyorsa (oklar değil çizgiler)

o zaman böyle bir döngü ekonomik bir hesaplama için yeterlidir:

ilk arama varsa, prev_calculated = 0 olur, sonraki aramalarda yeni çubuklar yeniden hesaplanır


ve her iki gösterge de doğru yazılırsa, ek olarak hiçbir şeyi senkronize etmeye gerek yoktur , her şey işe yarayacaktır, geriye kalan tek şey, çağrılan göstergenin gerekli sayıda değeriyle CopyBuffer()'ı karşılaştırmaktır.

Ve ben de aynı şeyden bahsediyorum. İlk çalıştırmadan önce senkronizasyonu denemek güzel olurdu ve bu nedenle …………

 
Igor Makanu :

sadece anlamak istiyorum

MT5'in senkronizasyonla ilgili birçok sorunu var, şimdi soru tam da bununla ilgili

IMHO, gösterge her çubukta yapılar kullanıyorsa (oklar değil çizgiler)

o zaman böyle bir döngü ekonomik bir hesaplama için yeterlidir:

ilk arama varsa, prev_calculated = 0 olur, sonraki aramalarda yeni çubuklar yeniden hesaplanır


ve her iki gösterge de doğru yazılırsa, ek olarak hiçbir şeyi senkronize etmeye gerek yoktur, her şey işe yarayacaktır, geriye kalan tek şey CopyBuffer() ile çağrılan göstergenin gerekli sayıda değeriyle karşılaştırmaktır.

Eğer anlamak ve karşı çıkmamak için bir istek varsa, o zaman aşağıdaki koda benzer bir şey yazmalısınız:

 #property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1

#property indicator_label1    "I"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1

double          IBuffer[];

int OnInit ()
{
   SetIndexBuffer    ( 0 ,IBuffer, INDICATOR_DATA );
   ArraySetAsSeries (IBuffer, true );

   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 (rates_total == prev_calculated) return rates_total;
   
   ulong t = GetMicrosecondCount ();
   
   ArraySetAsSeries (high,         true );

   int limit = rates_total - prev_calculated - 1 ;

   for ( int i = limit; i >= 0 ; i--)
   {
      IBuffer [i] = high [i];
   }

   //----------------------------------------------------------------
   double e = ( GetMicrosecondCount () - t) / 1000000.0 ;
   Print ( DoubleToString (e, 6 ), " sec, рассчитано " , rates_total - prev_calculated, " баров, всего баров " , rates_total);
   return (rates_total);
}
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1

//--- plot I
#property indicator_label1    "I"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1

input ENUM_TIMEFRAMES   OldTF = PERIOD_M5 ;

double IBuffer[];
int     Handle = 0 ;

int OnInit ()
{
   SetIndexBuffer    ( 0 ,IBuffer, INDICATOR_DATA );
   ArraySetAsSeries (IBuffer, true );

   Handle = iCustom ( Symbol (), OldTF, "OldTF.ex5" );
   if (Handle == INVALID_HANDLE )
   {
       Print ( "Не удалось получить хендл индикатора OldTF.ex5" );
       return INIT_FAILED ;
   }

   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 (rates_total == prev_calculated) return rates_total;

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

   ulong t = GetMicrosecondCount ();

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

her iki kodu da derleyin ve ikincisini çalıştırın. M1 ve M3'te eski göstergeyi çalıştırırken günlüklerde böyle bir şey alın:

2021.05.28 19:05:01.408 EskiTF (EURUSD,M3) 0.000234 sn, hesaplanan 50000 bar, toplam 50000 bar

2021.05.28 19:05:03.860 LitTF (EURUSD,M1) 0,007452 sn, hesaplanan 50023 çubuk, toplam 50023 çubuk

2021.05.28 19:06:00.670 EskiTF (EURUSD,M3) 0,00001 sn, hesaplanan 1 çubuk, toplam 50001 çubuk

2021.05.28 19:06:02.211 LitTF (EURUSD,M1) 0.008180 sn, hesaplanan 50024 bar, toplam 50024 bar

2021.05.28 19:07:00.780 LitTF (EURUSD,M1) 0.000004 sn, hesaplanan 1 bar, toplam 50025 bar

2021.05.28 19:08:01.246 LitTF (EURUSD,M1) 0.000014 sn, hesaplanan 1 bar, toplam 50026 bar

2021.05.28 19:09:00.959 EskiTF (EURUSD,M3) 0.000000 sn, hesaplanan 1 çubuk, toplam 50002 çubuk

2021.05.28 19:09:01.775 LitTF (EURUSD,M1) 0,006898 sn, hesaplanan 50027 çubuk, toplam 50027 çubuk

2021.05.28 19:10:00.830 LitTF (EURUSD,M1) 0.000004 sn, hesaplanan 1 bar, toplam 50028 bar

Çıplak gözle bile, ilk olarak, hızlı göstergeler oluşturmak için mümkün olan en hızlı seçeneği ve ikinci olarak, ön kireçlemenin sıfıra sıfırlandığını fark edebilirsiniz,

istenmediğinde ve bu, optimizasyon sırasında performansta önemli ölçüde makul olmayan bir düşüşe yol açacaktır. bu örnekte, gösterge her yeni M3 çubuğunda tamamen yeniden hesaplama yapmaya zorlanır. senkronize etmezseniz, göstergeyi oluştururken delikler alırsınız.

Alexey Viktorov :

O zaman sana afiyet olsun...

Geliştiriciler böyle saçmalıklara tepki vermiyor, Igor da yakında sıkılacak ... Ve kendi kendine konuşmaya devam et ...

Sadece davulcudan, doğru olanı bozmamak için dışavurumlarınızı ayrı bir konuya taşımasını istemeniz yeterlidir ...

yukarıdaki koda bakın, pasaportunuzu yiyin, başınıza kül serpin ve kibirinizi kimsenin göremeyeceği bir yere sokun.