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

 

Вот самый быстрый, корректный рабочий вариант на всех ТФ:

int iBarShift3(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static int PerSec=::PeriodSeconds(LastTimeFrame);

   if(LastTimeFrame!=TimeFrame) PerSec=::PeriodSeconds(TimeFrame);
   if(TimeFrame<PERIOD_D1) time-=time%PerSec;

   if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame))
     {
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX);
      if(TimeFrame<PERIOD_D1) Res--;
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }

   return(Res);
  }

Скорость замедляется для ТФ D1, W1 и MN1

А вот тестовый индикатор, который наглядно показывает отработку разных версий, а так же их скорость ( вторая цифра. Чем меньше цифра, тем быстрее  функция) 


Правильно отрабатывают 3 и 4 варианты. Но 3 быстрее работает.

Варианты с CopyTime самые медленные.

Это можно проверить на MQL4 (индикатор прилагаю)

Авторство разных вариантов не указываю, т.к. уже запутался. 
Но третий, самый рабочий вариант, на 80 % вроде от @fxsaber. Я только чуть доработал.

Файлы:
 
Nikolai Semko:

Правильно отрабатывают 3 и 4 варианты. Но 3 быстрее работает. Варианты с CopyTime самые медленные.

 
fxsaber:

Да здесь замеры особо не важны. И так видно, что логика самая быстрая.

 
Nikolai Semko:

Вот самый быстрый, корректный рабочий вариант на всех ТФ:

Скорость замедляется для ТФ D1, W1 и MN1

А вот тестовый индикатор, который наглядно показывает отработку разных версий, а так же их скорость ( вторая цифра. Чем меньше цифра, тем быстрее  функция) 


Правильно отрабатывают 3 и 4 варианты. Но 3 быстрее работает.

Варианты с CopyTime самые медленные.

Это можно проверить на MQL4 (индикатор прилагаю)

Авторство разных вариантов не указываю, т.к. уже запутался. 
Но третий, самый рабочий вариант, на 80 % вроде от @fxsaber. Я только чуть доработал.

Добавил в Ваш индикатор TF - первые два алгоритма непригодные вообще получаются..

На рисунках текущий TF - H1, а расчет по дневкам.



 
Renat Akhtyamov:
Да (выделено)

-1 - это единица с минусом (уточняюсь), возвращенная функцией ошибка, которая говорит о том, что такого бара нет

То есть моя функция

также требует доработки

хотяяяяя...

Документация:

"Примечание

Если данные для таймсерии с указанными параметрами при вызове функции Bars() еще не сформированы в терминале, или данные таймсерии в момент вызова функции не синхронизированы с торговым сервером, то функция вернет нулевое значение."

====

Если  res==0, то мы итак поймаем от функции -1.

===

Так что все работает, пользуйтесь на здоровье!

На выше приведенном индикаторе очень хорошо видно, как врет сей способ.

 
Nikolai Semko:

Вот самый быстрый, корректный рабочий вариант на всех ТФ:

Скорость замедляется для ТФ D1, W1 и MN1

А вот тестовый индикатор, который наглядно показывает отработку разных версий, а так же их скорость ( вторая цифра. Чем меньше цифра, тем быстрее  функция) 


Правильно отрабатывают 3 и 4 варианты. Но 3 быстрее работает.

Варианты с CopyTime самые медленные.

Это можно проверить на MQL4 (индикатор прилагаю)

Авторство разных вариантов не указываю, т.к. уже запутался. 
Но третий, самый рабочий вариант, на 80 % вроде от @fxsaber. Я только чуть доработал.

Вариант iBarShift3 работает не правильно.

 

Держите мой вариант. Вроде работает и с младшими и с старшими фреймами. Скорость немного выше чем у ибаршифт3.


int iBarShift(string symbol, ENUM_TIMEFRAMES timeframe, datetime time){

datetime t1 = TimeCurrent()+10000000;

int ps = PeriodSeconds(timeframe);

double div = time/(double)ps;

double mant = div - MathFloor(div);

int ret = Bars(symbol, timeframe, (datetime)(time-(ps*mant)), t1)-1;

return(ret);

}

 
Vitaly Muzichenko:

Вариант iBarShift3 работает не правильно.

Можно пример не правильной работы?

Значит остается только четвертый вариант?

 
Vitaly Muzichenko:

Вариант iBarShift3 работает не правильно.

Голословность - это наше всё.

 
Nikolai Semko:

Голословность - это наше всё.

Я проверил быстро: есть функция которая работает не первый день, вместо неё подставил iBarShift3 и получил неправильную работу советника. С этого и сделал вывод.

Вот та, которую использую

int iBarShift(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 we always return 0
  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);
 }
Причина обращения: