Аналог iBarShift - страница 11

 
Nikolai Semko:

Ну да. Странное вообще-то поведение штатной функции. Ведь мы здесь занимаемся именно подгонкой значений под ее "эталонность".

Штатная функция iBarShift из MQL4 при попадании запрашиваемого времени в дырку возвращает номер левого бара (т.е. субботний в данном случае), а iBarShift3 возвращает номер правого от дырки бара(т.е.  понедельник), что логичнее.

Если находимся в дырке, то логично вернуть левый бар, последнее известное значение, но никак не будущее.

 
Vitaly Muzichenko:

Если находимся в дырке, то логично вернуть левый бар, последнее известное значение, но никак не будущее.

Ну да. Что то я туплю. Прошлое с будущим перепутал )). Наверное потому что 1(прошлое) > 0(будущее). Запрограммировался.
 
Alain Verleyen:


В большинстве случаев функция возвращает неправильный результат

PS: Is it needed to post English version or Russian translation is correct ?

Yes, the translation is correct.

Run this script and you will see that the functions produce exactly the same result.

Can you give an example of a timeframe and the time at which the values of these functions are different?

By the way, your function is often mistaken. Returns the value -1

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
Файлы:
 
Alain Verleyen:

Требование состоит в том, чтобы иметь ТОЛЬКО как версию mql4


У Вас функция не правильно работает с параметром exact=true.

Это видно из этого скрипта.

И вот полный рабочий аналог функции iBarShift с параметром exact:

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

Без этого параметра ее можно упростить до такого вида:

Bars(Symb,TimeFrame,time+1,UINT_MAX);
Файлы:
 
Nikolai Semko:

Yes, the translation is correct.

Run this script and you will see that the functions produce exactly the same result.

Can you give an example of a timeframe and the time at which the values of these functions are different?

By the way, your function is often mistaken. Returns the value -1

Please be serious. My code is for mql5.

It returns -1 because Bars() function is unreliable under MT4.

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

Script running on AUDUSD, M5 chart.

This is not happening with MT5.

 
Alain Verleyen:

Please be serious. My code is for mql5.

It returns -1 because Bars() function is unreliable under MT4.

Script running on AUDUSD, M5 chart.

This is not happening with MT5.

Вы же говорили что все должно работать как в MQL4.

Но этот скрипт можно запустить на MQL5 тоже

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

При exact=True  и будущем времени возвращать нужно -1

И еще мой скрипт нашел у вас странную ошибку:

Эта ошибка подтверждается этой проверкой:

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
Значит я все же был прав про существование нештатных ситуаций в вашем алгоритме.
Файлы:
 

Из всего анализа, который я сделал, напрашивается вывод, что вот этот полный аналог функции iBarShift:

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

на сегодняшний день является самым корректным, и при этом самый быстрым и с самым простым и коротким алгоритмом.

Если не нужен параметр exact, то можно использовать упрощенную версию:

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

или просто пользоваться таким равноценным вариантом без вызова функции:

Bars(Symb,TimeFrame,time+1,UINT_MAX);
Или я не прав?
 
Молчание - знак согласия.
 
Nikolai Semko:
Молчание - знак согласия.

Через CTRL+SHIFT+F  в ME сделал поиск "BarShift". Оказалось, что не использую подобной функции. Видимо, не нужно было самому.

Написал когда-то вариант для конвертации MT4-советников в MT5 одной строкой. Похоже, это единственная причина его написания.

С барами не работаю и не понимаю, почему так же не поступают все остальные.

В Ваш код не вникал. Но всегда рад, когда получается быстрое решение.

 
fxsaber:

Через CTRL+SHIFT+F  в ME сделал поиск "BarShift". Оказалось, что не использую подобной функции. Видимо, не нужно было самому.

Написал когда-то вариант для конвертации MT4-советников в MT5 одной строкой. Похоже, это единственная причина его написания.

С барами не работаю и не понимаю, почему так же не поступают все остальные.

В Ваш код не вникал. Но всегда рад, когда получается быстрое решение.

Я понимаю - о чем Вы, но для меня работа с барами пока актуальна. Может быть когда-нибудь для меня это станет тоже рудиментом.

Причина обращения: