iBarShift'e benzer - sayfa 12

 
Nikolai Semko :

Her şeyin MQL4'teki gibi çalışması gerektiğini söylediniz.

Ancak bu komut dosyası MQL5'te de çalıştırılabilir

Kesin=True ve future tense ile -1 döndürmeniz gerekir.

Ve senaryom sende garip bir hata buldu:

Bu hata, bu kontrol tarafından onaylanır:

Yani algoritmanızdaki anormal durumların varlığı konusunda hala haklıydım.

Sonunda hatayı bulduğunuza sevindim.

Kontrol edeceğim, teşekkürler.

 

Herkese iyi akşamlar. Belki bir şeyi yanlış anlıyorum ve yine de Bars'ın () başlangıcında zaten önerilen standart işlevin neden uygun olmadığı tam olarak açık değil. Ben sürekli kullanıyorum ve hiçbir problem yaşamıyorum. Daha sonra karşılaşabileceğiniz tek şey "aralık dışı dizi" veya TimeCurrent() kullanırken negatif bir değerdir, ancak buna göre kontrol etmeniz gerekir. Örnekler:

 //найти бар на котором продали
Bar_sell_H4= Bars ( Symbol (), PERIOD_H4 ,P_opentime, 32000000000 )- 1 ;
if (Bar_sell_H4<= 0 )
   {
      Bar_time_sell_H4=Time_H4[ 0 ];
   }
else
   {
      Bar_time_sell_H4=Time_H4[Bar_sell_H4];
   }
Bars_forsearch_highfr_H1= Bars ( Symbol (), PERIOD_H1 , TimeCurrent (),Time_M15[B_DownTrend_M15_int]);
if (Bars_forsearch_highfr_H1<= 0 )
   {
      high_H1_int= 0 ;
   }
else
   {
      high_H1_int= ArrayMaximum (High_H1, 0 ,Bars_forsearch_highfr_H1);
   }
 
Almat Kaldybay :

Herkese iyi akşamlar. Belki bir şeyi yanlış anlıyorum ve yine de Bars'ın () başlangıcında zaten önerilen standart işlevin neden uygun olmadığı tam olarak açık değil. Ben sürekli kullanıyorum ve hiçbir problem yaşamıyorum. Daha sonra karşılaşabileceğiniz tek şey "aralık dışı dizi" veya TimeCurrent() kullanırken negatif bir değerdir, ancak buna göre kontrol etmeniz gerekir. Örnekler:

32000000000 sayısına bakılırsa, bu aynı zamanda benim eserim. UINT_MAX sadece daha kısa ve daha sağlam görünüyor. ))

Gerçek şu ki, bu seçenek ortaya çıktığı gibi daha doğru:

 Bars (Symb,TimeFrame,time+ 1 , UINT_MAX );

Ama değil

 Bars (Symb,TimeFrame,time, UINT_MAX )- 1 ;

neredeyse hiçbir dış fark yoktur. Ancak öte yandan, üst sürüm, MQL4'ün standart iBarShift işlevini çok doğru bir şekilde tekrarlar.

 
Nikolai Semko :

32000000000 sayısına bakılırsa, bu aynı zamanda benim eserim. UINT_MAX sadece daha kısa ve daha sağlam görünüyor. ))

Gerçek şu ki, bu seçenek ortaya çıktığı gibi daha doğru:

Ama değil

neredeyse hiçbir dış fark yoktur. Ancak öte yandan, üst sürüm, MQL4'ün standart iBarShift işlevini çok doğru bir şekilde tekrarlar.

Peki nerede durdunuz, en kolay ve doğru olan nedir?

 
Vitaly Muzichenko :

Peki nerede durdunuz, en kolay ve doğru olan nedir?

Şimdilik bu seçenek , ancak şimdi hizmet masasına aboneliğimi iptal ettiğim Barlar işlevinin askıya alınmasıyla ilgili bu hatayı atlaması için onu tamamlamak istiyorum.

Bu hatanın özü, Bars işlevindeki start_time ve stop_time'ın her ikisinin de aynı çubuğun içinde veya gelecekte (sıfır çubuğunun sağında) olması durumunda, bu işlevin 10 saniyeden fazla donmasıdır.

Belki biraz sonra, yine de doğru sürümü daha hızlı yapacağım, ancak daha hantal.

 

Farklı bir yol seçmeye karar verdim.
iBarShift'i yeniden yapmayacağım, ancak buggy Bars işlevini yeniden yapacağım.

Ayrıca, yeni iBars işlevi yalnızca donma hatasını atlamakla kalmayacak, aynı zamanda orijinal Barlardan daha hızlı çalışacaktır.

Bu fonksiyon diğer algoritmaları kullanabilecek ve mevcut algoritmalar daha hızlı çalışacaktır.

Sadece zamana ihtiyacım var. Bunu ertesi güne kadar yapamayacağım.

 
Nikolai Semko :

Farklı bir yol seçmeye karar verdim.
iBarShift'i yeniden yapmayacağım, ancak buggy Bars işlevini yeniden yapacağım.

Ayrıca, yeni iBars işlevi yalnızca donma hatasını atlamakla kalmayacak, aynı zamanda orijinal Barlardan daha hızlı çalışacaktır.

Bu fonksiyon diğer algoritmaları kullanabilecek ve mevcut algoritmalar daha hızlı çalışacaktır.

Sadece zamana ihtiyacım var. Bunu ertesi güne kadar yapamayacağım.

Çok iyi! İple çekiyorum!

 
Nikolai Semko :

Yaptığım tüm analizlerden, sonuç, bunun iBarShift işlevinin tam bir analogu olduğunu gösteriyor:

 int iBarShift ( const string Symb, const ENUM_TIMEFRAMES TimeFrame, datetime time, bool exact= false )
  {
   int Res= Bars (Symb,TimeFrame,time+ 1 , UINT_MAX );
   if (exact) if ((TimeFrame!= PERIOD_MN1 || time> TimeCurrent ()) && Res== Bars (Symb,TimeFrame,time- PeriodSeconds (TimeFrame)+ 1 , UINT_MAX )) return (- 1 );
   return (Res);
  }

açık ara en doğru ve aynı zamanda en hızlı ve en basit ve en kısa algoritmaya sahip.

güzel, ama kafa karıştırıcı bir şey ...

test edilmelidir)

 

iBars işlevinin çok hantal olduğu ortaya çıkmış olsa da, MQ içindeki takılma hatasını düzeltene kadar normal Barlar yerine onu kullanmanızı tavsiye ederim.

Mantıksal olarak 0 döndürmesi gerektiğinde iBar askıda kalıyor. Genellikle 10 saniyeden fazla döndürür. MQL4'te böyle bir hata yok.

Çoğu görevde, iBar'lar normal Çubuklardan daha hızlı çalışır, çünkü yalnızca hatayı atlamakla kalmaz, aynı zamanda önceki değerleri koruma algoritması sayesinde Çubuklar ve SeriesInfoInteger işlevlerini mümkün olduğunca kullanmamaya çalışır.

 int iBars ( string symbol_name, ENUM_TIMEFRAMES   timeframe, datetime start_time, datetime stop_time) // stop_time > start_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 (start_time>TimeCur) {LastSymb= NULL ; return ( 0 );}
   if (LastTimeFrame!=timeframe) if (timeframe== PERIOD_MN1 ) PerSec = 2419200 ; else PerSec=:: PeriodSeconds (timeframe);
   if (LastTimeFrame!=timeframe || LastSymb!=symbol_name || ((TimeCur-LastBAR)>=PerSec && 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 t,t0= 0 ;
   bool check= true ;
   if (timeframe< PERIOD_W1 ) t=start_time-(start_time- 1 )%PerSec;
   else if (timeframe== PERIOD_W1 ) t=start_time-(start_time- 259201 )%PerSec;
   else
     {
      PerSec= 2678400 ;
       MqlDateTime dt;
       TimeToStruct (start_time- 1 ,dt);
      t=dt.year* 12 +dt.mon;
     }
   if (stop_time<=LastBAR)
     {
       if (timeframe< PERIOD_W1 ) t0=stop_time-(stop_time)%PerSec;
       else if (timeframe== PERIOD_W1 ) t0=stop_time-(stop_time- 259200 )%PerSec;
       else
        {
         MqlDateTime dt0;
         TimeToStruct (stop_time,dt0);
         t0=dt0.year* 12 +dt0.mon;
        }
       if (t0==t) {PreBars= 0 ; check= false ;}
     }
   if ((LastTimeFrame!=timeframe || LastSymb!=symbol_name || t!=LastTime || t0!=LastTime0) && check)
      PreBars= Bars (symbol_name,timeframe,start_time,stop_time);
   LastTime=t; LastTime0=t0;
   LastTimeFrame=timeframe;
   LastSymb=symbol_name;
   return (PreBars);
  }

Bu işlevi hem yukarı hem de aşağı test etti. Barları tamamen tekrarlıyor gibi görünüyor.

Belki daha zarif bir şekilde yapılabilir. Kimin arzusu var - rica ederim. Hatalar bulursanız, onları düzelteceğiz.

Böyle...

Ardından, iBarsShift işlevinin tam analogu şöyle görünecektir:

 int iBarShift ( const string Symb, const ENUM_TIMEFRAMES TimeFrame, datetime time, bool exact= false )
  {
   int Res= iBars (Symb,TimeFrame,time+ 1 , UINT_MAX );
   if (exact) if ((TimeFrame!= PERIOD_MN1 || time> TimeCurrent ()) && Res== iBars (Symb,TimeFrame,time- PeriodSeconds (TimeFrame)+ 1 , UINT_MAX )) return (- 1 );
   return (Res);
  }

Ve çoğu durumda kullanılan son kesin parametre olmayan seçenek şöyle görünecektir:

 int iBarShift1( const string Symb, const ENUM_TIMEFRAMES TimeFrame, datetime time, bool exact= false )
  {
   return ( iBars (Symb,TimeFrame,time+ 1 , UINT_MAX ));
  }
// ИЛИ БОЛЕЕ СОКРАЩЕННЫЙ БЕЗ ФУНКЦИИ:

iBars (Symb,TimeFrame,time+ 1 , UINT_MAX );
 

@Alain Verleyen'in yerleşik Barlar ve iBarShift işleviyle karşılaştırıldığında iBars işlevinin performansını gösteren bir gösterge
Mikrosaniye cinsinden işlev yürütme süresi.


Dosyalar: