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

 
Alain Verleyen:

Какую проблему вы обнаружили?

Вот пример ложной отработки Вашей функции - она работает под именем "BarShift1"


 
Aleksey Vyazmikin :

Вот пример ложной отработки Вашей функции - она работает под именем "BarShift1"


На самом деле это показывает только наоборот, моя версия является единственной, которая правильна. (И исходный iBarShift1 из этого кода верен).

Моя версия была задумана как автономная функция , точно так же, как mql4 iBarShift .

Он не оптимизирован для нескольких запросов, поэтому сравнение времени не имеет значения. @nicholishen опубликовала хорошую библиотеку, оптимизированную для массового вызова.


Actually it show just the reverse, my version is the only one that is correct. (Also the original iBarShift1 from this code is correct).

My version was conceived to be use as a standalone function, exactly like mql4 iBarShift.

It's not optimized for multiple requests, so time comparison is irrelevant. @nicholishen published a good library optimized for bulk call.

iBarShift
iBarShift
  • голосов: 46
  • 2013.10.25
  • Alain Verleyen
  • www.mql5.com
Многие ищут функцию iBarShift, которая была в языке MQL4 (например, 1,2,3). В языке MQL5 ее нет, но есть все возможности для ее реализации в виде библиотеки. В качестве альтернативы многие программисты предложили свои варианты реализации этой функции на MQL5. Обнаружилось, что все 4 версии содержат ошибки (не воспроизводят в точности работу...
 
Alain Verleyen:

На самом деле это показывает только наоборот, моя версия является единственной, которая правильна. (И исходный iBarShift1 из этого кода верен).

Моя версия была задумана как автономная функция , точно так же, как mql4 iBarShift .

Он не оптимизирован для нескольких запросов, поэтому сравнение времени не имеет значения. @nicholishen опубликовала хорошую библиотеку, оптимизированную для массового вызова.


Actually it show just the reverse, my version is the only one that is correct. (Also the original iBarShift1 from this code is correct).

My version was conceived to be use as a standalone function, exactly like mql4 iBarShift.

It's not optimized for multiple requests, so time comparison is irrelevant. @nicholishen published a good library optimized for bulk call.

Я не говорю про время обработки, я говорю о номере бара.

На картинке видно, что в 8:37 код считает, что ближайший бар это бар прошлого дня 23:00 , а на самом деле ближайший бар 10:00. Он ближе как по математике, так и по логике.

 
Aleksey Vyazmikin:

I'm not talking about processing time, I'm talking about the bar number.

The picture shows that at 8:37 the code considers that the nearest bar is the bar of the previous day at 23:00, but in fact the nearest bar is 10:00. He is closer both in mathematics and in logic.

давайте упрости.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Аналог iBarShift

Alain Verleyen, 2018.04.05 00:18

На самом деле это показывает только наоборот, моя версия является единственной, которая правильна. (И исходный iBarShift1 из этого кода верен).

Моя версия была задумана как автономная функция , точно так же, как mql4 iBarShift.

Попробуйте mql4, сравните, то же самое.
 
Alain Verleyen:
давайте упрости.
Попробуйте mql4, сравните, то же самое.

Понял Ваш аргумент. Проверять не буду. Видимо, это моя задача отличается от общепринятой логики.

 
Alain Verleyen:

Какую проблему вы обнаружили?

Давно это писал. Уже не помню, но что-то меня смутило. 
Во всяком случае сейчас я нашел только одну нештатную ситуацию. 
Когда еще не подгружены данные по символу, может возвращать -1, а должен 0.

Это можно проверить с помощью скрипта для MQL4, который я прикрепляю. 

Этот скрипт берет случайное время и случайный таймфрейм. Если значение iBarShiftX не совпадает со штатной функцией iBarShift, тогда сообщение через Print.

Если Вы этот скрипт запустите на только что открытом символе, тогда увидите ошибки. Повторный запуск скрипта на этом же символе ошибок не даст.

Но это мелочь. В моем варианте та же проблема. 

У меня только одна претензия к Вашему варианту: он очень сложный и медленный.

Вот Ваш вариант:

int iBarShift2(string symbol,ENUM_TIMEFRAMES timeframe,datetime time,bool exact=false)
  {
   datetime LastBAR;
   if(!SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE,LastBAR))
     {
      datetime opentimelastbar[1];
      if(CopyTime(symbol,timeframe,0,1,opentimelastbar)==1)
         LastBAR=opentimelastbar[0];
      else
         return(-1);
     }
   if(time>LastBAR)
      return(0);
   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);
     }
   return(-1);
  }

А вот моя функция, которая делает тоже самое, но с простым алгоритмом и значительно быстрее:

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

Можно использовать еще короче без функции:

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

Попробуйте доказать обратное. Найдите хоть одну комбинацию параметров, когда ваша функция и моя будут показывать разные значения.

Только я не реализовывал в ней последний параметр exact, потому как вообще не понимаю зачем он нужен. Лично мне он ни разу не потребовался.

Но если кому-то очень нужен можно и реализовать.

Вариант iBarShift3 я оставил, т.к. он некорректно отрабатывает дырки в истории. Исправить можно, но не вижу смысла, т.к. вышеприведенного варианта достаточно.

Файлы:
 
Nikolai Semko:


Вариант iBarShift3 я оставил, т.к. он некорректно отрабатывает дырки в истории. Исправить можно, но не вижу смысла, т.к. вышеприведенного варианта достаточно.

Дырки из-за отсутствия проторговки на баре, или иные? И, в чём проявляется неточность?

 
Aleksey Vyazmikin:

Дырки из-за отсутствия проторговки на баре, или иные? И, в чём проявляется неточность?

Допустим берем воскресенье любое время когда нет торгов:

Print("iBarShift  = "+IntegerToString(iBarShift (_Symbol,PERIOD_H1,D'01.04.2018 10:00:00')));  
Print("iBarShift3 = "+IntegerToString(iBarShift3(_Symbol,PERIOD_H1,D'01.04.2018 10:00:00'))); // показывает на единицу меньше
 
Nikolai Semko:

Допустим берем воскресенье любое время когда нет торгов:

Т.е. показывает понедельник? Так это мне и надо... :)

 
Да чтож вы мою-то не попробуете функцию. Там применено решение, которое нивилирует начало и конец баров во времени. Вроде как корректно считает все. И по времени быстрее 3 версии ваше самой быстрой. Или ветка важнее?))) Или там тоже ошибки?) Я уже давно ей пользуюсь....
Причина обращения: