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

 
Aleksey Vyazmikin:

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

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

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

 
Nikolai Semko:

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

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

А что будет, если мы сейчас находимся в дырке (реал тайм) и ожидаем получить информацию по бару, какой индекс нам будет предложен? Предполагаю, что в MQL4 это будет "1", в то время как у третьего алгоритма это будет "0", или нет?

Я думаю, что у функции MQL4 посыл "не заглядывать в будущее", что в какой то мере верно - всё зависит от задачи.

 

Nikolai Semko :

... 

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

Когда я опубликовал его (4 года назад), главной целью была точность (еще раз), поскольку все остальные версии, которые я нашел, были неправильными (по сравнению с версией mql4).

Я знаю, что это может быть быстрее.

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

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

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

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

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

Аналог iBarShift

Alain Verleyen, 2018.04.05 00:18

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

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


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

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

А где же она есть, Ваша функция, что б её опробовать?

 
Aleksey Vyazmikin:

А что будет, если мы сейчас находимся в дырке (реал тайм) и ожидаем получить информацию по бару, какой индекс нам будет предложен? Предполагаю, что в MQL4 это будет "1", в то время как у третьего алгоритма это будет "0", или нет?

Я думаю, что у функции MQL4 посыл "не заглядывать в будущее", что в какой то мере верно - всё зависит от задачи.

Нет. Первый - это и есть нулевой. В реал тайме работает одинаково.

 
Aleksey Vyazmikin:

А где же она есть, Ваша функция, что б её опробовать?

Так на 7 странице в самом конце)) 

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

Вот так может удобнее

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

Улыбнуло )))

Вот Ваша функция:

int iBarShift4(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);
  }

В виду того что Вы не знаете некоторых математических операторов, например % - остаток от деления

проведем некоторое упрощение вашей функции.

Получилось:

int iBarShift4(string symbol,ENUM_TIMEFRAMES timeframe,datetime time)
  {
   time-=time%PeriodSeconds(timeframe);
   return(Bars(symbol,timeframe,time,UINT_MAX)-1);
  }

А вот моя функция:

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

Очень похожи. Правда?

Только ваша очень неправильно все делает и при этом медленнее.

Можете убедиться в этом с помощью этого скрипта на MQL4

Файлы:
 
Nikolai Semko:

Нет. Первый - это и есть нулевой. В реал тайме работает одинаково.

Хорошо - просто какой то мне алгоритм сегодня показывал "-1" на будущих данных....

 
Nikolai Semko:

Улыбнуло )))


Ну да и правда выдает нестыковки)) Поковыряю ок.

 
vladevgeniy:

Ну да и правда выдает нестыковки)) Поковыряю ок.

Да я сам кругами долго ходил. Только сейчас допер до кратчайшего решения.