iBarShift'e benzer - sayfa 11

 
Nikolai Semko :

İyi evet. Normal işlevin genel davranışında garip. Sonuçta, burada "referansı" altındaki değerleri tam olarak ayarlıyoruz.

MQL4'ten normal iBarShift işlevi, istenen zaman deliğe düştüğünde, sol çubuğun numarasını (yani bu durumda Cumartesi) döndürür ve iBarShift3, delikten sağdaki çubuğun numarasını (yani Pazartesi) döndürür. daha mantıklı.

Bir delikteysek, o zaman geleceği değil, bilinen son değeri olan sol çubuğu döndürmek mantıklıdır.

 
Vitaly Muzichenko :

Bir delikteysek, o zaman geleceği değil, bilinen son değeri olan sol çubuğu döndürmek mantıklıdır.

İyi evet. Aptal olduğum bir şey. Geçmişle geleceği karıştırmak. Muhtemelen çünkü 1(geçmiş) > 0(gelecek). Programlanmış.
 
Alain Verleyen :


Çoğu durumda, işlev yanlış sonuç verir.

Not: İngilizce versiyonunu yayınlamak gerekli mi yoksa Rusça çeviri doğru mu?

Evet, çeviri doğru.

Bu betiği çalıştırın ve işlevlerin tam olarak aynı sonucu verdiğini göreceksiniz.

Bu fonksiyonların değerlerinin farklı olduğu zaman dilimine ve zamana bir örnek verebilir misiniz?

Bu arada, işleviniz genellikle yanlıştır. -1 değerini döndürür

 2018.04 . 04 22 : 51 : 05.666 TestBarShift2 AUDUSD,M5: BarShiftX   PERIOD_M1    0    - 1      2018.04 . 05 05 : 45 : 00
2018.04 . 04 22 : 50 : 46.867 TestBarShift2 AUDUSD,M5: BarShiftX   PERIOD_M1    0    - 1      2018.04 . 05 05 : 46 : 00
2018.04 . 04 22 : 50 : 41.255 TestBarShift2 AUDUSD,M5: BarShiftX   PERIOD_M1    0    - 1      2018.04 . 05 05 : 47 : 00
2018.04 . 04 22 : 50 : 23.496 TestBarShift2 AUDUSD,M5: BarShiftX   PERIOD_M1    0    - 1      2018.04 . 05 05 : 45 : 00
2018.04 . 04 22 : 50 : 05.596 TestBarShift2 AUDUSD,M5: BarShiftX   PERIOD_M1    0    - 1      2018.04 . 05 05 : 47 : 00
2018.04 . 04 22 : 48 : 38.638 TestBarShift2 AUDUSD,M5: BarShiftX   PERIOD_M1    0    - 1      2018.04 . 05 05 : 47 : 00
Dosyalar:
 
Alain Verleyen :

Gereksinim SADECE mql4 sürümü gibi olmaktır


İşleviniz kesin=true parametresiyle düzgün çalışmıyor.

Bu komut dosyasından görülebilir.

Ve işte tam parametre ile iBarShift işlevinin tam çalışan analogu:

 int iBarShift1( 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);
  }

Bu parametre olmadan, bu forma basitleştirilebilir:

 Bars (Symb,TimeFrame,time+ 1 , UINT_MAX );
Dosyalar:
 
Nikolai Semko :

Evet, çeviri doğru.

Bu betiği çalıştırın ve işlevlerin tam olarak aynı sonucu verdiğini göreceksiniz.

Bu fonksiyonların değerlerinin farklı olduğu zaman dilimine ve zamana bir örnek verebilir misiniz?

Bu arada, işleviniz genellikle yanlıştır. -1 değerini döndürür

Lütfen ciddi olun. Kodum mql5 içindir.

-1 döndürür çünkü Bars() işlevi MT4 altında güvenilir değildir.

...   
   int shift= Bars (symbol,timeframe,time,LastBAR);

   datetime checkcandle[ 1 ];

   if ( CopyTime (symbol,timeframe,time, 1 ,checkcandle)== 1 )
     {
       if (checkcandle[ 0 ]==time)
         return (shift- 1 );
       else if (exact && time>checkcandle[ 0 ]+ PeriodSeconds (timeframe))
         return (- 1 );
       else
         return (shift);
     }
...

AUDUSD, M5 grafiğinde çalışan komut dosyası.

Bu MT5 ile olmuyor.

 
Alain Verleyen :

Lütfen ciddi olun. Kodum mql5 içindir.

-1 döndürür çünkü Bars() işlevi MT4 altında güvenilir değildir.

AUDUSD, M5 grafiğinde çalışan komut dosyası.

Bu MT5 ile olmuyor.

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

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

 2018.04 . 05 09 : 52 : 40.760 TestBarShift2 (EURUSD,M12)       PERIOD_M3   BarShift1 = - 1   BarShift2 = 0      2018.08 . 10 18 : 39 : 49    exact = true
2018.04 . 05 09 : 52 : 40.760 TestBarShift2 (EURUSD,M12)       PERIOD_M10   BarShift1 = - 1   BarShift2 = 0      2018.04 . 15 00 : 25 : 08    exact = true
2018.04 . 05 09 : 52 : 40.761 TestBarShift2 (EURUSD,M12)       PERIOD_M6   BarShift1 = - 1   BarShift2 = 0      2018.04 . 21 04 : 26 : 03    exact = true
2018.04 . 05 09 : 52 : 40.761 TestBarShift2 (EURUSD,M12)       PERIOD_M15   BarShift1 = - 1   BarShift2 = 0      2018.05 . 29 17 : 10 : 52    exact = true
2018.04 . 05 09 : 52 : 40.761 TestBarShift2 (EURUSD,M12)       PERIOD_M12   BarShift1 = - 1   BarShift2 = 0      2018.09 . 16 13 : 10 : 33    exact = true
2018.04 . 05 09 : 52 : 40.762 TestBarShift2 (EURUSD,M12)       PERIOD_M10   BarShift1 = - 1   BarShift2 = 0      2018.09 . 25 21 : 24 : 50    exact = true
2018.04 . 05 09 : 52 : 40.762 TestBarShift2 (EURUSD,M12)       PERIOD_M10   BarShift1 = - 1   BarShift2 = 0      2018.05 . 30 20 : 04 : 10    exact = true
2018.04 . 05 09 : 52 : 40.762 TestBarShift2 (EURUSD,M12)       PERIOD_M5   BarShift1 = - 1   BarShift2 = 0      2018.04 . 29 16 : 12 : 16    exact = true

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

Ve benim senaryom seninkinde garip bir hata buldu:

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

 Print (iBarShift2( _Symbol , PERIOD_MN1 , D'2015.12.31 21:03:54' , true )); // -1
Print (iBarShift1( _Symbol , PERIOD_MN1 , D'2015.12.31 21:03:54' , true )); // 28
Yani algoritmanızdaki anormal durumların varlığı konusunda hala haklıydım.
Dosyalar:
 

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.

Tam parametre gerekli değilse, basitleştirilmiş bir sürüm kullanılabilir:

 int iBarShift( const string Symb, const ENUM_TIMEFRAMES TimeFrame, datetime time)
  {
   return ( Bars (Symb,TimeFrame,time+ 1 , UINT_MAX ));
  }

veyaişlevi çağırmadan sadece bu eşdeğer seçeneği kullanın:

 Bars (Symb,TimeFrame,time+ 1 , UINT_MAX );
Yoksa yanılıyor muyum?
 
Sessiz, rıza anlamına gelir.
 
Nikolai Semko :
Sessiz, rıza anlamına gelir.

ME'de CTRL + SHIFT + F ile "BarShift" için bir arama yaptı. Benzer bir işlev kullanmadığım ortaya çıktı. Görünüşe göre buna gerek yoktu.

Bir keresinde MT4 Expert Advisor'ları tek satırda MT5'e dönüştürmek için bir varyant yazmıştım. Bunu yazmanın tek nedeni bu gibi görünüyor.

Barlarla çalışmıyorum ve neden herkesin aynı şeyi yapmadığını anlamıyorum.

Kodunuzu anlamadım. Ama hızlı bir çözüm bulduğumda her zaman mutlu olurum.

 
fxsaber :

ME'de CTRL + SHIFT + F ile "BarShift" için bir arama yaptı. Benzer bir işlev kullanmadığım ortaya çıktı. Görünüşe göre buna gerek yoktu.

Bir keresinde MT4 Expert Advisor'ları tek satırda MT5'e dönüştürmek için bir varyant yazmıştım. Bunu yazmanın tek nedeni bu gibi görünüyor.

Barlarla çalışmıyorum ve neden herkesin aynı şeyi yapmadığını anlamıyorum.

Kodunuzu anlamadım. Ama hızlı bir çözüm bulduğumda her zaman mutlu olurum.

Ne demek istediğini anlıyorum ama benim için barlarla çalışmak hala geçerli. Belki bir gün benim için de bir iz olur.