Простой универсальный (но не самый эффективный) способ сделать из любого индикатора МТФ:
input ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT; // * TimeFrame ENUM_TIMEFRAMES TF = PERIOD_CURRENT; int RedrawBars = 0; int OnInit() { if ( PeriodSeconds( TimeFrame ) <= PeriodSeconds() ) { TF = PERIOD_CURRENT; RedrawBars = 1; } else { TF = TimeFrame; RedrawBars = PeriodSeconds( TF )/PeriodSeconds() + 1; } int OnCalculate() { //--- last counted bar will be recounted int limit = rates_total - prev_calculated - 1; if ( prev_calculated > 0 ) limit += RedrawBars + 1; if ( limit >= rates_total ) limit = rates_total - 1; //--- if ( TF != PERIOD_CURRENT ) { for( int i = limit; i >= 0; i-- ) { int bar = iBarShift( _Symbol, TF, time[i] ); if ( iTime( _Symbol, TF, bar ) > time[i] ) bar ++; buffer[i] = iCustom( _Symbol, TF, WindowExpertName(), ... parameters ...., 0, bar ); } return(rates_total); } //--- Расчет на текущем ТФ for( int i = limit; i >= 0; i-- ) { buffer[i] = some value;
Спасибо за ответ, а то уж я начал думать, что мультитаймфреймовые индикаторы - это такая экзотика, что здесь никто не хочет заморачиваться.
Но, судя по использованным функциям iBarShift() и WindowExpertName(), Вы предлагаете решении для MQL4. Есть ли аналогичное готовое решение для MQL5?
а есть же примеры в кодбазе, вот например, стохастик
https://www.mql5.com/ru/code/177
- голосов: 25
- 2010.08.25
- ak20 ak20
- www.mql5.com
Спасибо, посмотрю.
Maxim Dmitrievsky: а есть же примеры в кодбазе, вот например, стохастик https://www.mql5.com/ru/code/177
Еще раз, спасибо, проанализировал пример стохастика в кодбазе, разобрался. Всего-то не хватало нескольких строк в самом начале функции OnCalculate().
Кол-во рассчитанных данных для запрашиваемого индикатора ATR не должно быть меньше кол-ва баров в истории по соответствующему символу периоду.
Добавил недостающую проверку и все заработало.
//+------------------------------------------------------------------+ //| Custom indicator iteration function //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // размер входных таймсерий const int prev_calculated, // обработано баров на предыдущем вызове const datetime &time [], const double &open [], const double &high [], const double &low [], const double &close[], const long &tick_volume[], const long &real_volume[], const int &spread[]) { ResetLastError(); // сбросим код ошибки // Возвращает кол-во баров в истории по соответствующему символу периоду int bars_total =Bars(_Symbol, ATR_TIMEFRAME); // Возвращает кол-во баров в истории по соответствующему символу периоду (для запрашиваемого индикатора) int bars_calculated=BarsCalculated(atr.handle); if (bars_calculated<bars_total) return(0); ...
Правда, осталась проблема обработки нулевого бара в режиме online, но это не беда, порешаем...
Еще раз, спасибо, проанализировал пример стохастика в кодбазе, разобрался. Всего-то не хватало нескольких строк в самом начале
функции OnCalculate().
Кол-во рассчитанных данных для запрашиваемого индикатора ATR не должно быть меньше кол-ва баров в истории по
соответствующему символу периоду.
Добавил недостающую проверку и все заработало.
Правда, осталась проблема обработки нулевого бара в режиме online, но это не беда, порешаем...
У Вас тут if
(bars_calculated<bars_total) return(0);
на каждом новом
баре заданного ТФ будет выполняться это условие, где Вы всегда возвращаете 0, что будет пересчитывать весь
период в цикле заново!
P.S. Решение проблемы с нулевым баром вижу так
for(int i=N; i>=0 && !IsStopped(); i--) { datetime time0=time[i]; ATR_MTF[i]=getATR(i, time0); } //ATR_MTF[0]=EMPTY_VALUE;
- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Столкнулся со следующей проблемой. Не смог получить значение индикатора ATR с более высокого таймфрейма (D1) из другого индикатора, который работает на таймфрейме H1. Так и не решив ее, решил упростить задачу - написать более простой индикатор "ATR MTF", который должен просто отображать значения ATR с дневного ТФ на графике более низкого ТФ, например, часового. Казалось бы, чего проще, ан нет, значения ATR начинают отображаться только с появлением нового бара, а на истории - нет.
Пожалуйста, если у кого-то есть опыт написания мультитаймфреймовых индикаторов, взгляните на код, что в нем не так или чего в нем не хватает?