Как в индикаторе получить данные с другого индикатора

 

По умолчанию индикаторы в MQL5 имеют такую индексацию: самый ЛЕВЫЙ бар имеет индекс "0".

Как это проверить: в OnCalculate() выведем на график значение '0" элемента из таймсерии time[]:

//+------------------------------------------------------------------+
//| 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 &volume[],
                const int &spread[])
  {
//---
   Comment("Проверка: time[0]=",time[0])
   return(rates_total);
  }

(этот пример в индикаторе "IndTime_0.mql5")

И вот, что выводит этот индикатор - перекрестие стоит на самом правом баре и показывает время открытия бара - 2016.12.26, а time[0] показывает 1993.04.27:

IndTime_0

То есть подтверждаем, что по-умолчанию в индикаторах MQL5 самый левый бар имеет индекс "0".

Дальше будет получать в индикаторе данные с другого индикатора... 

Файлы:
IndTime_0.mq5  4 kb
 

Помня о том, что в индикаторах MQL5 по умолчанию бар с индексом "0" - это самый ЛЕВЫЙ бар на графике, попробуем получить в нашем индикаторе данные с двух других индикаторов - MA и Alligator (этот пример в индикаторе "IndicatorFromIndicators.mql5").

В индикаторе попытаемся получить данные с MA и Alligator на баре с индексом "0", "1" и "2":

  {
//---
   Comment("Проверка: time[0]=",time[0],"\n",
           "rates_total-1: ",rates_total,"\n",
           "BarsCalculated(iMA): ",BarsCalculated(handle_iMA),"\n",
           "BarsCalculated(iAlligator): ",BarsCalculated(handle_iAlligator),"\n",
           "MA[",0,"]=",StringFormat("%."+IntegerToString(Digits()+1)+"f",iMAGet(0)),"\n",
           "MA[",1,"]=",StringFormat("%."+IntegerToString(Digits()+1)+"f",iMAGet(1)),"\n",
           "MA[",2,"]=",StringFormat("%."+IntegerToString(Digits()+1)+"f",iMAGet(2)),"\n",
           "Jaws[",0,"]=",StringFormat("%."+IntegerToString(Digits())+"f",iAlligatorGet(GATORJAW_LINE,0)),"\n",
           "Jaws[",1,"]=",StringFormat("%."+IntegerToString(Digits())+"f",iAlligatorGet(GATORJAW_LINE,1)),"\n",
           "Jaws[",2,"]=",StringFormat("%."+IntegerToString(Digits())+"f",iAlligatorGet(GATORJAW_LINE,2)));
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Прикрепим тестовый индикатор "IndicatorFromIndicators.mql5" на график и установим перекрестие на самый ПРАВЫЙ бар - то есть это не нулевой бар. Вот, что получилось:

IndicatorFromIndicators

Хотя перекрестие установлено на самый ПРАВЫЙ бар - то есть точно не на бар с индексом "0", при использовании CopyBuffer следует знать, что CopyBuffer будет копировать данные от настоящего к прошлому, то есть бар с индексом "0" означает текущий бар.

Файлы:
 
Что за бред? Нулевой бар, это бар high low close которого меняются в OnCalculate буквально каждых несколько секунд, если не викэнд конечно.
Это ПРАВЫЙ бар, самый крайний правый бар. Левым он быть не может. 
Из семантики "правый" и "левый", то это местоположение на графике. А не как оно расположено в таймсериях.
Программисту, который запутался в таймсериях, лучше пойти выпить пивка и отдохнуть, ведь "левый" нулевой бар перекочевал в левое полушарие мозга и не всегда это соответствует картинке, как это видится на гуи )))
Для тех кто еще не в лодке но мечтает быть в фуражке. В MT4 таймсерия начинается действительно с правой стороны, если массив рейтов начинать проносить где-то в уме и в индексации нулевой элемент массива будет концем хистори и настоящим временем. Нулевой элемент массива и нулевой бар - холивар уже в mt5.
В MT5 это было исправлено в худшую сторону, как я считаю. Нулевой элемент хистори - это 1970-й год с соотв. ТФ. А нулевой бар, это бар, от которого мы отсчитываем CopyRates с кол-вом назад, но результат приходит все равно в виде таймсерии, удобной для нубовосприятия.
Это ппц как запутывает, но если вас это запутывает, настало время отдохнуть и расслабить извилины )))
 
Vladimir Karputov:

По умолчанию индикаторы в MQL5 имеют такую индексацию: самый ЛЕВЫЙ бар имеет индекс "0".

Как это проверить: в OnCalculate() выведем на график значение '0" элемента из таймсерии time[]:

//+------------------------------------------------------------------+
//| 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 &volume[],
                const int &spread[])
  {
//---
   Comment("Проверка: time[0]=",time[0])
   return(rates_total);
  }


 

 

Карпутов, вы реально удивительный человек в своём упорстве. Вы берётесь пояснять, но при этом сами реально "плаваете" в сути вопроса.

 

Вы пишите: "По умолчанию индикаторы в MQL5 имеют такую индексацию" -- у нас индикаторы проиндексированы?

Читаем справку https://www.mql5.com/ru/docs/series/bufferdirection: "Все массивы и индикаторные буферы по умолчанию имеют направление индексации слева направо".

Вы пишите: "элемента из таймсерии time[]" -- дело в том, что time[] -- это не таймсерия, а массив -- и он индексируется слева направо.

Vladimir Karputov:

Помня о том, что в индикаторах MQL5 по умолчанию бар с индексом "0" - это самый ЛЕВЫЙ бар на графике ...

-- вы путаете -- массивы и таймсерии.

Потому что таймсерия (или бары на графике) -- нумеруются справа налево

И об этом также написано в справке https://www.mql5.com/ru/docs/series: "Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым)". И дальше: "Индекс 0 в массиве-таймсерии означает данные текущего бара, то есть  бара, который соответствует незавершенному промежутку времени на данном таймфрейме."

Документация по MQL5: Доступ к таймсериям и индикаторам / Направление индексации в массивах и таймсериях
Документация по MQL5: Доступ к таймсериям и индикаторам / Направление индексации в массивах и таймсериях
  • www.mql5.com
Доступ к таймсериям и индикаторам / Направление индексации в массивах и таймсериях - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5