iBarShift'e benzer - sayfa 14

 
fxsaber :

O zaman Bars'ın neden 18:00:01'in 18:00 değil de 18:01 M1-bar'a ait olduğunu düşündüğünü anlamıyorum.

Ve burada, sadece bir hafta önce bir yıl dönümüne rağmen, kızımın şimdi ikinci yılında olduğu gerçeğiyle aynı mantık. Veya bugün 04/09/2018, 01 Ocak 00 2017 yıl 3 ay 8 gün önce olmasına rağmen.

Bu arada, TimeCurrent, SYMBOL_TIME ile değiştirilmelidir.

Teşekkür ederim! Böyle bir tanımlayıcıyı gerçekten bilmiyordum.

 

Bu arada, iBars algoritmasının doğruluğunu MQL4'teki Bars standardı ile karşılaştırarak çeşitli seçenekleri rastgele sıralayarak test ettiğimde, Bars'ta bir hata keşfettim:

 Print ( Bars ( _Symbol , PERIOD_MN1 , D'2005.08.31 00:00:00' , D'2005.08.31 23:00:00' )); // 1  должен быть 0, т.к. временной диапазон находиться внутри одного бара.
Print ( Bars ( _Symbol , PERIOD_MN1 , D'2006.08.31 00:00:00' , D'2006.08.31 23:00:00' )); // 0

Üstelik bu hata MQL5'te mevcut değil.

Tabii ki, önemsiz çünkü. yalnızca TF = MN1'de, 30 ve 31 tarihlerinde, durma_zamanı saatinde = 23 ve yalnızca 2005'e kadar görünür :)))

İşte onu yakalayan MQL4 için bir betik, iBar'ların yerel Barlardan daha standart olduğu ortaya çıktı.

Dosyalar:
TestiBars.mq4  10 kb
 
fxsaber :


Bu arada, TimeCurrent, SYMBOL_TIME ile değiştirilmelidir.

Hayır, ihtiyacı yok.
Doğruluk katmaz, çünkü TimeCurrent() tüm karakterler için evrenseldir, çünkü mevcut sembol için değil, tüm semboller için teklifin en son varış zamanını döndürür.

Aynı zamanda, SymbolInfoInteger(symbol_name,SYMBOL_TIME) TimeCurrent() ile karşılaştırıldığında çok yavaştır ve bu süre iBars'a yapılan her çağrı için gereklidir.

 

İlgilenenler için.

iBars'ın düzenlenmiş versiyonu (yerleşik Barlara benzer, yalnızca aksaklıklar olmadan ve daha hızlı).

Bazı hatalar düzeltildi.

MQL5 kodunuzun sebepsiz yere 10-20 saniye donduğunu ve 0 döndürebilen bir Çubuk işlevi olduğunu fark ettiyseniz, bu seçenekle değiştirmenizi şiddetle tavsiye ederim.
Bu kapatma olmadan daha hızlı çalışacaktır.

 int iBars ( string symbol_name, ENUM_TIMEFRAMES   timeframe, datetime start_time, datetime stop_time)
  {
   static string LastSymb= NULL ;
   static ENUM_TIMEFRAMES LastTimeFrame= 0 ;
   static datetime LastTime= 0 ;
   static datetime LastTime0= 0 ;
   static int PerSec= 0 ;
   static int PreBars= 0 ;
   static datetime LastBAR= 0 ;
   static datetime LastTimeCur= 0 ;
   datetime TimeCur;
   if (stop_time<start_time) {TimeCur=stop_time; stop_time=start_time; start_time=TimeCur; }
   TimeCur= TimeCurrent ();
   if (LastTimeFrame!=timeframe) if (timeframe== PERIOD_MN1 ) PerSec= 2419200 ; else PerSec=:: PeriodSeconds (timeframe);
   if (timeframe< PERIOD_W1 ) TimeCur-=TimeCur%PerSec;
   if (start_time>TimeCur) {LastSymb= NULL ; return ( 0 );}
   if (LastTimeFrame!=timeframe || LastSymb!=symbol_name || ((TimeCur-LastBAR)> 0 && TimeCur!=LastTimeCur))
      LastBAR=( datetime ) SeriesInfoInteger (symbol_name,timeframe, SERIES_LASTBAR_DATE );

   LastTimeCur=TimeCur;
   if (PerSec== 0 ) return ( 0 );
   if (start_time>LastBAR)
     {LastTimeFrame=timeframe; LastSymb=symbol_name; return ( 0 );}

   datetime tS,tF= 0 ;
   bool check= true ;
   if (timeframe< PERIOD_W1 ) tS=start_time-(start_time- 1 )%PerSec- 1 ;
   else if (timeframe== PERIOD_W1 ) tS=start_time-(start_time- 259201 )%PerSec- 1 ;
   else
     {
      PerSec= 2678400 ;
       MqlDateTime dt;
       TimeToStruct (start_time- 1 ,dt);
      tS=dt.year* 12 +dt.mon;
     }
   if (stop_time<=LastBAR)
     {
       if (timeframe< PERIOD_W1 ) tF=stop_time-(stop_time)%PerSec;
       else if (timeframe== PERIOD_W1 ) tF=stop_time-(stop_time- 259200 )%PerSec;
       else
        {
         MqlDateTime dt0;
         TimeToStruct (stop_time,dt0);
         tF=dt0.year* 12 +dt0.mon;
        }
       if (tS==tF) {PreBars= 0 ; check= false ;}
     }
   if ((LastTimeFrame!=timeframe || LastSymb!=symbol_name || tS!=LastTime || tF!=LastTime0) && check)
      PreBars= Bars (symbol_name,timeframe,start_time,stop_time);
   LastTime=tS; LastTime0=( datetime )tF;
   LastTimeFrame=timeframe;
   LastSymb=symbol_name;
   return (PreBars);
  }
 
Nikolai Semko :

iBars'ın düzenlenmiş versiyonu ( yerleşik Bars'a benzer , yalnızca aksaklıklar olmadan ve daha hızlı).

Bazı hatalar düzeltildi.

Yerleşik Bars() aşırı yüklendi:

 1. int Bars ( const string symbol_name, ENUM_TIMEFRAMES timeframe)
 2. int Bars ( const string symbol_name, ENUM_TIMEFRAMES timeframe, datetime start_time, datetime stop_time)

Tek bir arama şekliniz var.

 
Artyom Trishkin :

Yerleşik Bars() aşırı yüklendi:

Tek bir arama şekliniz var.

kısa bir form istiyorsanız, yerleşik formu kullanmanızda bir sakınca yoktur. Neredeyse hiç aksaklık yok.

 
Nikolai Semko :

Hayır, ihtiyacı yok.
Doğruluk katmaz, çünkü TimeCurrent() tüm karakterler için evrenseldir, çünkü mevcut sembol için değil, tüm semboller için teklifin en son varış zamanını döndürür.

Aynı zamanda, SymbolInfoInteger(symbol_name,SYMBOL_TIME) TimeCurrent() ile karşılaştırıldığında çok yavaştır ve bu süre iBars'a yapılan her çağrı için gereklidir.

Alıntılar, ilgilenilen biri hariç tüm sembolleri takip edebilir.

Tamam, yeni kaynağa baktım. Bahsedilen düzenlemelerin yapılmadığını gördüm. Ayrılıyorum.

 
Bu yüzden geliştiriciler bunu kendileri yapmıyor mu?
 
Kullanıcıların bir işlevi çağırması ve çeşitli enstrümanlar için zamanla senkronize edilmiş (hizalanmış) bir dizi dizisi elde etmesi çok daha uygun olacaktır.
 
Bu arada, Bars() işlevi hakkında. Belki de bu kliniğin nedenidir .