И всё-таки есть ли полный аналог функции iBarShift для MT5 или как его заменить? - страница 2

 

Попробовал сделать функцию такого вида:

int iBarShift(datetime time,bool exact=false) { return(Bars(_Symbol,_Period,time,TimeNow)-1); }

где переменная TimeNow задаётся в области видимости всей программы и определяется в функции OnCalculate как время последнего текущего бара из массива time. На графике и в тестере работает, а на указанную ошибку попробую данный вариант в понедельник во время работы рынка. Параметр exact оставлен исключительно для "совместимости"...

 
Sergey Efimenko:
У вас нет параметра exact, кроме того данная конструкция напоминает приведённый мною выше кусок текущего кода, который не работает в описанной ситуации.
Напоминать - не значит быть. Пока не попробуете, не поймёте.
 
Artyom Trishkin:
Напоминать - не значит быть. Пока не попробуете, не поймёте.

Я пробовал вот эту вашу конструкцию https://www.mql5.com/ru/forum/160683/page5#comment_3834201

картину получил подобную. 

 
Sergey Efimenko:

Я пробовал вот эту вашу конструкцию https://www.mql5.com/ru/forum/160683/page5#comment_3834201

картину получил подобную. 

Я проверял - работает идентично iBarShift()

Вы ищите дальше.

 
Sergey Efimenko:

Поиск по статьям и форуму дал несколько вариантов, но все они имеют одну проблему. После нажатия на кнопку "обновить" контекстного меню графика, все значения смещаются вперёд. На скринах пример.

  после обновить -> 

а это пробовали?

https://www.mql5.com/ru/code/1864 

iBarShift
iBarShift
  • голосов: 39
  • 2013.10.25
  • Alain Verleyen
  • www.mql5.com
Многие ищут функцию iBarShift, которая была в языке MQL4. В языке MQL5 ее нет, но есть все возможности для ее реализации в виде библиотеки.
 

Вычисляем Bars за промежуток времени. Это и будет искомая функция

https://www.mql5.com/ru/docs/series/bars

Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Доступ к таймсериям и индикаторам / Bars - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Taras Slobodyanik:

а это пробовали?

https://www.mql5.com/ru/code/1864 

Да всё перепробовал, многие функции работают корректно в тестере и на графике, за исключением описанной мною ситуации, к ней решения пока так и не нашёл... Буфера смещаются при таком варианте обновления, не исключено, что дело не в функции поиска номера бара, а в чём-то другом...
 
Sergey Efimenko:
Да всё перепробовал, многие функции работают корректно в тестере и на графике, за исключением описанной мною ситуации, к ней решения пока так и не нашёл... Буфера смещаются при таком варианте обновления, не исключено, что дело не в функции поиска номера бара, а в чём-то другом...


К сожалению, у лучших решений, которые я находил на этом форуме, был общий дефект, который выражается вот этим 'чуть'

Ihor Herasko:

Единственное, что требуется учесть, так это тот факт, что knownTime должно попадать четко на время открытия бара (или быть чуть "правее" него). Иначе результат будет на 1 меньше. 


И поэтому они не более полезны чем штатный Bars. Гарантированно правильный результат даёт единственный вариант - примитивный перебор баров со счётчиком
 

Мне кажется там проблема в нулевой секунде бара. Получается бар в нулевую секунду в одном использовании времени считается, а в другом нет. Даже была тема с настоятельным, но не очень внятным объяснением этой проблемы и в связи с этой невнятностью топик-стартера неоднократно банили и в результате ничего не изменилось.

В общем, я как-то проверял функцию Bars и помню что получалось правильнее если указывать не текущее время, а время открытия нулевого бара. И ещё к стартовому времени прибавить единицу. Но прежде чем это использовать проверьте сами.

 
Alexey Viktorov:

Мне кажется там проблема в нулевой секунде бара. Получается бар в нулевую секунду в одном использовании времени считается, а в другом нет. Даже была тема с настоятельным, но не очень внятным объяснением этой проблемы и в связи с этой невнятностью топик-стартера неоднократно банили и в результате ничего не изменилось.

В общем, я как-то проверял функцию Bars и помню что получалось правильнее если указывать не текущее время, а время открытия нулевого бара. И ещё к стартовому времени прибавить единицу. Но прежде чем это использовать проверьте сами.

Алексей, объясни, а что в этой функции не так? Это от fxsaber

//+------------------------------------------------------------------+
int GetBarShift(const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) {
   int res=-1;
   datetime last_bar;
   if(SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE,last_bar)) {
      if(time>last_bar) res=0;
      else {
         const int shift=Bars(symbol_name,timeframe,time,last_bar);
         if(shift>0) res=shift-1;
         }
      }
   return(res);
}
//+------------------------------------------------------------------+

Много раз использую, и вродь нигде ещё не сталкивался с описываемыми багами.

Может чего проглядел?

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