Индекс индикатора.

 
Задам "глупый вопрос", надеясь получить "умный ответ" :)Вот MQL4 достаточно хорошо изучил, там с индикаторами всё понятно.А в MQL5 в параметрах индикатора где собственно ИНДЕКС ИНДИКАТОРА!?
 
Aleksandr55777:
Задам "глупый вопрос", надеясь получить "умный ответ" :)Вот MQL4 достаточно хорошо изучил, там с индикаторами всё понятно.А в MQL5 в параметрах индикатора где собственно ИНДЕКС ИНДИКАТОРА!?

Имеете в виду индекс буфера индикатора? Если да, то он указывается при вызове CopyBuffer(). i-функции (такие как iMA, iMACD и т. д.) в MQL5 создают только хендл (идентификатор) индикатора, но не возвращают значение буфера, как в MQL4. Чтобы получить значение индикаторного буфера на заданном баре, нужно использовать функцию CopyBuffer(). Ей в качестве первого параметра передается хендл индикатора. А вот индекс буфера указывается вторым параметром.

 
Ihor Herasko #:

Имеете в виду индекс буфера индикатора? Если да, то он указывается при вызове CopyBuffer(). i-функции (такие как iMA, iMACD и т. д.) в MQL5 создают только хендл (идентификатор) индикатора, но не возвращают значение буфера, как в MQL4. Чтобы получить значение индикаторного буфера на заданном баре, нужно использовать функцию CopyBuffer(). Ей в качестве первого параметра передается хендл индикатора. А вот индекс буфера указывается вторым параметром.

Очень четкий, исчерпывающий ответ. Удивляюсь, почему после таких объяснений новички начинают заламывать руки и плакать, что MQL5 ужасно сложный по сравнению с 4-кой. Наоборот, процесс получения данных с индикатора унифицировали.

 
Alexey Volchanskiy #:

Очень четкий, исчерпывающий ответ. Удивляюсь, почему после таких объяснений новички начинают заламывать руки и плакать, что MQL5 ужасно сложный по сравнению с 4-кой. Наоборот, процесс получения данных с индикатора унифицировали.

"красные штаны - три раза КУ" :-) 

интерфейс будет унифицирован (на самом деле НЕ ВПОЛНЕ и точно не сделают), когда во второй форме OnCalculate вместо const double &price[] появится хендл другого индикатора.
И будет явная возможность рассчёта "индикатора по индикатору"

потому-что сейчас "рассчёт на основе массива" это дико устаревшее. 

и использование хендлов ничуть не делают код короче и алгоритмы яснее. 

 
Alexey Volchanskiy #:

Очень четкий, исчерпывающий ответ. Удивляюсь, почему после таких объяснений новички начинают заламывать руки и плакать, что MQL5 ужасно сложный по сравнению с 4-кой. Наоборот, процесс получения данных с индикатора унифицировали.

Я имел ввиду, что например у меня 1-часовой таймфрейм, сейчаc допустим 12:00, а мне нужно показания индикатора, например MACD, за 11:00.Чтоб советник понимал, что MACD растёт.

 
Aleksandr55777 #:

Я имел ввиду, что например у меня 1-часовой таймфрейм, сейчаc допустим 12:00, а мне нужно показания индикатора, например MACD, за 11:00.Чтоб советник понимал, что MACD растёт.

Сравнить показания индикатора на соседних барах. Способ получения показаний в MQL4 и в MQL5 отличается, а вот само сравнение - нет, все одинаково. Сравнение производится по индексам баров для соответствующего буфера. В функции CopyBuffer() это 3-ий и 4-ый аргументы. Причем варианты есть на любой вкус: по индексу бара и количеству баров, по начальному времени и количеству баров, по начальному и конечному времени. То есть в MQL5, при соответствующем подходе к задаче, можно вообще уйти от индексов баров, оперируя исключительно временем, как Вы и указали.

 
Всё равно что-то не въеду :)А Вас не затруднит пример здесь написать?Например для MA или MACD?Буду Вам Мега благодарен!
 
Aleksandr55777 #:
Всё равно что-то не въеду :)А Вас не затруднит пример здесь написать?Например для MA или MACD?Буду Вам Мега благодарен!
//В заголовке советника объявляете хэндл и буфера индикатора.

int handleMA;//Объвляем хэндл индикатора которому позднее назначим параметры.

double bufferMA[];//Буфер в который будет копироваться значения индикатора.

int OnInit()
{
        handleMA = iMA(_Symbol,PERIOD_CURRENT,ma_period,ma_shift,MODE_SMA,PRICE_CLOSE);//Тут мы к хэндлу привязываем нужный нам индикатор с параметрами. Хэндл является так же уникальным номером индикатора с нужными нам параметрами. Если нужны индикаторы с разными параметрами, для каждого свой хэндл делаете.

        ArraySetAsSeries(bufferMA,true);//Опционально. Если необходимо чтобы данные последней свечи были с конца, с нулевого индекса, тогда этот параметр пишете.
        
}

void OnTick()

{
        if(CopyBuffer(handleMA,0,0,5,bufferMA)<0)//Функция CopyBuffer копирует данные индикатор в указанный массив. Первый аргумент это хэндл индикатора, второй это номер буфера индикатора, третий это с какого бара начать, четвертый это сколько баров копировать, и в какой массив копировать. В моем примере я копирую с 0 буфера, с начала, 5 последний свечей данных в массив bufferMA;
        {
                Print("Ошибка копирования буффера МА");
                return;
        }
        
        Print(bufferMA[0]);//Вывожу данные МА последней свечи
        Print(bufferMA[4];//Вывожу данные МА 5-й свечи с конца

	if(close[0]<bufferMA[0]&&close[1]>bufferMA[1])//Если последняя свеча закрылась ниже МА, а предыдущая свеча закрылась выше МА тогда
	{
		trade.Buy(...);//Открывае позицию на BUY
	}
        
}

На MQL4 вы считывали данные на прямую с индикатора, без создания хэндла и объявления параметров. Тут же используется функция CopyBuffer которая копирует последние данные в массив, для удобства обращения к нему.

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