Библиотеки: iBarShift - страница 3

 
angevoyageur:

Thank you, I have to fix my code also when exact is true, as I misunderstood this parameter. English documentation for iBarShift is wrong.

I think this is my error too, iBarShift should return bar which contain specified time (not with exact open time).

Could I use your function in my library (with your copyrights, of course)? If it is faster and correct, why should I reinvent the wheel?) 

 
komposter:

I think this is my error too, iBarShift should return bar which contain specified time (not with exact open time).

Could I use your function in my library (with your copyrights, of course)? If it is faster and correct, why should I reinvent the wheel?) 

Of course.
 
Corrected code, taking well into account 'exact' parameter, has been published.
 
angevoyageur:

Thank you, I have to fix my code also when exact is true, as I misunderstood this parameter. English documentation for iBarShift is wrong.

The mql5 bug is on Bars() function, I reported it to Service Desk.

Seems the Bars() bug is now corrected in build 880.
 
В Build 880 исправлена ошибка в Bars(), и теперь все работает нормально.
 
angevoyageur:
В Build 880 исправлена ошибка в Bars(), и теперь все работает нормально.
 

 

косяковая версия. на м2 с м1 значения при тру, почему-то имеют значения не -1, а на нулевом баре идет возврат на 1-й бар. 

 

Функция кривая как минимум в двух местах:

 1)   if(time>LastBar)

      return(0);

Если exact=true, логика должна возвращать -1 в случае явной не принадлежности time последнему бару, т.е. если time>LastBar+PeriodSeconds(timeframe).

2)    if(CopyTime(symbol,timeframe,time,1,checkcandle)==1)

       ...

       return(-1);

Опять же, если exact=false, то должен быть возвращен ближайший бар, в этом случае Bars(symbol, timeframe)-1. 

 

 

Я думаю, что в вашем коде есть небольшая ошибка:

//--- если время > LastBar, мы всегда возвращаем 0
   if(time>LastBar)
      return(0);

Если последний тик "открывает" новый бар, то if(time>LastBar) становится ложным - потому что теперь time == LastBar

И позже мы попадаем сюда:

 if(checkcandle[0]==time)
         return(shift-1);

И теперь shift == 0, что возвращает -1 вместо 0!

Поэтому я думаю, что это:

//--- если время > LastBar, мы всегда возвращаем 0
   if(time>LastBar)
      return(0);

должно быть изменено на

//--- если время > LastBar, мы всегда возвращаем 0
   if(time>=LastBar)
      return(0);

Calli

 
Carl Schreiber:

Я думаю, что в вашем коде есть небольшая ошибка:

Если последний тик "открывает" новый бар, то if(time>LastBar) становится ложным - потому что теперь time == LastBar

Не уверен, что вы имеете в виду? Я думаю, что "последний тик" не имеет значения. Когда вы используете функцию, либо время=LastBar, либо нет.

И позже мы приземляемся здесь:

А теперь shift == 0 , что возвращает -1 вместо 0!

Если time==Lastbar, то shift=1, а не 0. Так что ошибки нет (shift берется из Bars(), которая является счетчиком баров, поэтому мы возвращаем 'shift-1').

Поэтому я думаю, что это:

должно быть изменено на

Calli

Ваше исправление тоже будет работать, но случай 'time==LastBar' обрабатывается как "нормальный" случай.

Утверждение

 if(time>LastBar)

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