Рекурсивный вызов в индикаторах на MQL5

 

Уважаемые форумчане.

Подскажите, как можно сделать рекурсивный вызов индикатора для MQL5.

Суть задачи в том, что существует на первый взгляд простая формула расчета индикатора: SMA(RSI)

Для отображения значений индикатора на текущем таймфрейме, всё делается просто. А как этот должно работать если индикатор мульти таймфреймный?

В MQL4 (код прилагается) это реализовано через вызов самого себя для нужного таймфрейма с последующим пересчётом значений для текущего теймфрейма графика.

Попытался реализовать это же для MQL5, и что-то не получается.

Все, у кого есть время и желание вникнуть в код, посмотрите пожалуйста и дайте пожалуйста свой совет.

Заранее благодарен.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
Файлы:
 
не давно встречал индикатор для МТ4, который рекурсивно вызывал себя, в коде индикатора были две независимые функции, при обычном расчете индикатора использовалась лишь одна функция, а в рекурсивном вызове использовалась вторая ф-ция, переключение между функциями осуществлялось с помощью внешней переменной типа extern bool . Может быть и в Вашем случае получится использовать такую конструкцию
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
IgorM:
 Может быть и в Вашем случае получится использовать такую конструкцию

Всё так и происходит как вы описали. Если передаем значение TimeFrame =-2 - ведем расчёт данных для выбранного таймфрейма и подставляем эти данные для отображения на таймфрейме графика

Проблема в том что сами данные содержат нули. Почему, пока неясно.

 

может в ините надо так?

   if(calculateValue)
   {
        rsi_handle=iRSI(NULL,_Period,RsiPeriod,PRICE_CLOSE);
        if(rsi_handle==INVALID_HANDLE){Print("Error handle #3");return(-1);}
        return(0);
   }
вам же типа ступенек надо получить старший на младшем?
 
sergeev:
может в ините надо так? вам же типа ступенек надо получить старший на младшем?

Спасибо Алексей, вы как всегда на высоте. Именно это и нужно было получить!

Для всех, кому будет интересно, выкладываю рабочую версию индикатора с рекурсией:

Файлы:
 

Код, который когда-то работал и прикреплен выше, перестал работать. А жаль. Если у кого есть время, посмотрите пожалуйста, что там не так.

Сейчас получаем ошибку 4806 при первом рекурсивном обращении вот здесь:

//--- количество баров на таймфрейме
   if(CopyBuffer(ret_handle,1,0,1,bars)!=1)
   {
      Print("Error ",GetLastError());
   }
Что делать? Есть у кого какие соображения?
 
avoitenko:

Код, который когда-то работал и прикреплен выше, перестал работать. А жаль. Если у кого есть время, посмотрите пожалуйста, что там не так.

работает


 

В общем разобрался. Дело было в неправильной обработке ошибки в коде. Мой баг.

На эту тему опубликовал чистый код индикатора с рекурсией MTF RSI Smoothed

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