iMA в индикаторе и таймфреймы

 
Для проверки некоторых сомнений я изменил код функции ema() в примере Moving Averages.mq4:
void ema()
  {
   double pr=2.0/(MA_Period+1);
   int    pos=Bars-2;
   if(ExtCountedBars>2) pos=Bars-ExtCountedBars-1;
//---- main calculation loop
   while(pos>=0)
     {
      if(pos==Bars-2) ExtMapBuffer[pos+1]=Close[pos+1];
//      ExtMapBuffer[pos]=Close[pos]*pr+ExtMapBuffer[pos+1]*(1-pr);
      ExtMapBuffer[pos]=Close[pos]*pr+ExtMapBuffer[pos-pos%5+5]*(1-pr);
      ExtMapBuffer1[pos]=iMA(NULL,5,MA_Period,MA_Shift,MODE_EMA,PRICE_CLOSE,pos);
 	   pos--;
     }
  }

Ну и соответствующие добавки для прорисовки второго буфера. Вот картинка:
.
Чёрная линия - ExtMapBuffer1, красная - ExtMapBuffer, синяя - стандартная МА65 (то есть 5*MA_Period). История 5-минуток начинается с 4 января.
Получается, что пользоваться iMA с другого таймфрейма нельзя? Или это баг?

P.S. Прошу прощения за беспардонное обращение с кодом, хотелось побыстрее проверить.

 
Вы должны понимать, что разница между соседними барами в Вашем примере отличается как минимум в 5 раз.
Если Вы хотите на минутках отображать данные с пятиминуток, то Вам необходимо модифицировать индекс. Если грубо, то смещение 10 на минутках соответствует смещению 2 на пятиминутках.
 
Вы должны понимать, что разница между соседними барами в Вашем примере отличается как минимум в 5 раз.
Если Вы хотите на минутках отображать данные с пятиминуток, то Вам необходимо модифицировать индекс. Если грубо, то смещение 10 на минутках соответствует смещению 2 на пятиминутках.
Понятно. Мне просто казалось логичнее, чтобы в такой ситуации на "промежуточных" барах значение индикатора оставалось постоянным.
То есть нужно писать типа
ExtMapBuffer1[pos]=iMA(NULL,5,MA_Period,MA_Shift,MODE_EMA,PRICE_CLOSE,pos/5);

, только с учётом приведения типов. Полез в описание выяснять насчёт приведения типов :)

Спасибо.

 
Не так просто. В конце графика вроде все нормально

А дальше в историю появляется растущий сдвиг по времени

Буду разбираться.
 
Не так просто. В конце графика вроде все нормально

А дальше в историю появляется растущий сдвиг по времени

Буду разбираться.

Всё правильно. Среди минуток много пропусков. Поэтому бары надо синхронизировать не по смещению, а по времени.
Попробуйте использовать функцию iBarShift - она разрабатывалась как раз для таких случаев, как у Вас.
 
Попробуйте использовать функцию iBarShift - она разрабатывалась как раз для таких случаев, как у Вас.
Спасибо
Среди минуток много пропусков
Ого. Ценость этой информации выходит далеко за рамки топика. Отдельное спасибо.
 
Среди минуток много пропусков

Это - одна из причин, сподвигнувшая меня заняться разработкой советника, торгующего между тиками.
 
Ну а я для начала видимо перепишу историю, заполнив пропуски Close последнего бара. Поскольку пока мои советники ориентированы главным образом на тестер, возможность использовать номер бара в качестве эквивалента времени должна дать выигрыш в быстродействии.
 
Ну а я для начала видимо перепишу историю, заполнив пропуски Close последнего бара.
После предварительного знакомства с реальной ситуацией, оказалось, что предположения, лежавшие в основе этого намерения, были наивными :). Однако возникла идея, показавшаяся спасительной :). А именно, воспользоваться fxt файлом тестера, который должен моделировать отсутствующие бары. Так вот, с помощью опции "открыть автономно" выяснилось, что тестер не закрывает дыры в минутном графике. Уважаемые разработчики, это так или я что-то сделал неправильно? И если так, то почему?
 
Так вот, с помощью опции "открыть автономно" выяснилось, что тестер не закрывает дыры в минутном графике. Уважаемые разработчики, это так или я что-то сделал неправильно? И если так, то почему?

Так и должно быть. Мы моделируем уже состоявшееся поведение рынка. И если в минутной истории есть пропуски, значит не было ни одного тика. Что мы и воспроизводим.
 
Так и должно быть. Мы моделируем уже состоявшееся поведение рынка. И если в минутной истории есть пропуски, значит не было ни одного тика. Что мы и воспроизводим.
Именно так я сначала подумал. Однако применив history_data_analysis ( Bagadul ) счёл это моё предположение наивным. Например по eur/usd 14.12.2005 имеется дыра от 15:17 до 15:36 (19 минут!). В это время такое кажется крайне маловероятным. Мне также удалось обнаружить по крайней мере один случай, когда имелся 5-минутный бар при отсутствии в это время минуток, к сожалению, забыл дату. Правда у него были одинаковые Open и Close, но вполне заметные тени. Конечно ситуация непростая. С одной стороны, раз реальная игра идёт с дырами, система должна работать и с ними. С другой стороны, если на самом деле в это время "жизнь" продолжается, для анализа нужна бы непрерывная временная шкала. Ну что же, по крайней мере фактическая ситуация установлена, буду думать дальше.
Причина обращения: