Аппроксимация индикатора старшего периода Close[0] на младшем периоде - страница 2

 
chv писал (а):
Да, интересная идея, значит, Вы не вычисляете значения индикаторов через iCustom для других нужных timeframes, а просто вешаете индикаторы на нужные графики и через глобальные переменные читаете их? Попробую так, я просто делал автономного советника, не завязанного на тики индикаторов в других окнах.
А приведение сдвига по барам (Close[shift]) для разных timeframes, конечно, нужно делать, ибо Close[3] для D1, конечно, не равно Close[3] для M15 :)

Я делаю это так:
   // shift - бар на текущем графике
   // shift_curr - бар на указанном timeframe графике
   int shift_curr = ShiftOffset0Bars + 0
      , err = 0;
 
   while (iTime(
            NULL //string symbol
            , timeframe
            , shift_curr
         ) > 
         Time[shift])
   {
      shift_curr++;
   }
На выходе shift_curr даёт нужный индекс бара.

Если я правильно понял - сдвиг Вам нужен для "исторического" отрезка?
To Rosh: а что такое IBarShift() я не знаю, полез в хелпер, если пригодится для поиска соответствия баров на разных ТФ - отчень хочется :).
 
int iBarShift( string symbol, int timeframe, datetime time, bool exact=false)
Поиск бара по времени. Функция возвращает смещение бара, которому принадлежит указанное время. Если для указанного времени бар отсутствует ("дыра" в истории), то функция возвращает, в зависимости от параметра exact, -1 или смещение ближайшего бара.
Параметры:
symbol - Символьное имя инструмента. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
time - Значение времени для поиска.
exact - Возвращаемое значение если бар не найден. FALSE - iBarShift возвращает ближайший. TRUE - iBarShift возвращает -1.
Пример:
  datetime some_time=D'2004.03.21 12:00';
int shift=iBarShift("EUROUSD",PERIOD_M1,some_time);
Print("shift of bar with open time ",TimeToStr(some_time)," is ",shift);
 
Rosh:
int iBarShift( string symbol, int timeframe, datetime time, bool exact=false)
Поиск бара по времени. Функция возвращает смещение бара, которому принадлежит указанное время. Если для указанного времени бар отсутствует ("дыра" в истории), то функция возвращает, в зависимости от параметра exact, -1 или смещение ближайшего бара.
Параметры:
symbol - Символьное имя инструмента. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
time - Значение времени для поиска.
exact - Возвращаемое значение если бар не найден. FALSE - iBarShift возвращает ближайший. TRUE - iBarShift возвращает -1.
Пример:
  datetime some_time=D'2004.03.21 12:00';
int shift=iBarShift("EUROUSD",PERIOD_M1,some_time);
Print("shift of bar with open time ",TimeToStr(some_time)," is ",shift);

И где тут аппроксимация :)
 
Тут справка по функции iBarShift()
 
Rosh, спасибо за подсказку по iBarShift(), я не знал об этой функции API MT4. Но, боюсь, это не поможет изначальной задаче. Как я найду нужный бар, не так уж важно, потому что, например, для графика M15 большинство его последних баров, а точнее 96, будут лежать в пределах до 1-го бара для D1 графика.

Задача в том, что в эксперте на барах графика, например, H1, я хочу получить для каждого H1 бара актуальное значение индикаторов периода D1, H4, M15. Индикаторы, которые я построил, выдают нормальные значения шести линий (m5,15,30,h1,h4,d1) на любом графике, но в эксперте эти значения почему-то отличаются и сильно скачут. Это непонятно и удручает, не даёт дальше двигаться :-(

Думаю, попробую вариант, предложенный выше, а именно - разложить нужные индикаторы на нужных периодах, и из индикаторов сохранять актуальные значения в global variables, а эксперт будет брать их оттуда.
 
chv писал (а):

Задача в том, что в эксперте на барах графика, например, H1, я хочу получить для каждого H1 бара актуальное значение индикаторов периода D1, H4, M15. Индикаторы, которые я построил, выдают нормальные значения шести линий (m5,15,30,h1,h4,d1) на любом графике, но в эксперте эти значения почему-то отличаются и сильно скачут. Это непонятно и удручает, не даёт дальше двигаться :-(

Думаю, попробую вариант, предложенный выше, а именно - разложить нужные индикаторы на нужных периодах, и из индикаторов сохранять актуальные значения в global variables, а эксперт будет брать их оттуда.

Что значит сильно скачут? Вы учитываете тот факт что одно и тоже значение индикатора, например c D1, будет как минимум на 24-х барах H1. А если используется текущий день, то значения будут "скакать" до тех пор, пока день не закончиться.
 
Конечно, это очевидно. Я использовал линейную аппроксимацию отрезка между [i] и [i-1] баром. Например, для H1 графика будет 24 различных текущих значения графика D1, после закрытия каждого H1 бара. Я беру два последних значения D1 графика: Close[1]_D1 и Close[0]_D1. причём первое уже история и потому фиксированное. Между ними строится отрезок, и разница между Close[1] и Close[0] (delta) делится на 24 (соотношение D1/H1), т.е. величину приращения на каждом H1 баре. В итоге, например, на 3-ем H1 баре берётся Close[1]_D1 + delta * 3. На каждом H1 баре значение Close[0]_D1 меняется, и всё пересчитывается: delta, и значение на i-м баре H1.

Вопрос в том, что в индикаторе это работает, а когда я получаю эти значения в эксперте, они местами сильно отличаются от значений в индикаторе.
Или есть какие-то другие предложения по подобному расчёту?
 
Чтобы было понятнее, покажу на рисунке. На графике два индикатора. Когда они пересекаются, это вероятный сигнал к открытию. Зелёные точки, построены (через ObjectCreate) по значениям эксперта, аналогичны коричневому графику, розовые точки из эксперта аналогичны белому графику.
Как видно, розовые точки достаточно хорошо следуют по белому (H4) графику, а вот зелёные точки совсем не следуют по коричневому (D1) графику индикатора, хотя методика их расчёта одинакова.

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