Помня о том, что в индикаторах 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" на график и установим перекрестие на самый ПРАВЫЙ бар - то есть это не нулевой бар. Вот, что получилось:
Хотя перекрестие установлено на самый ПРАВЫЙ бар - то есть точно не на бар с индексом "0", при использовании CopyBuffer следует знать, что CopyBuffer будет копировать данные от настоящего к прошлому, то есть бар с индексом "0" означает текущий бар.
Это ПРАВЫЙ бар, самый крайний правый бар. Левым он быть не может.
Из семантики "правый" и "левый", то это местоположение на графике. А не как оно расположено в таймсериях.
Программисту, который запутался в таймсериях, лучше пойти выпить пивка и отдохнуть, ведь "левый" нулевой бар перекочевал в левое полушарие мозга и не всегда это соответствует картинке, как это видится на гуи )))
Для тех кто еще не в лодке но мечтает быть в фуражке. В MT4 таймсерия начинается действительно с правой стороны, если массив рейтов начинать проносить где-то в уме и в индексации нулевой элемент массива будет концем хистори и настоящим временем. Нулевой элемент массива и нулевой бар - холивар уже в mt5.
В MT5 это было исправлено в худшую сторону, как я считаю. Нулевой элемент хистори - это 1970-й год с соотв. ТФ. А нулевой бар, это бар, от которого мы отсчитываем CopyRates с кол-вом назад, но результат приходит все равно в виде таймсерии, удобной для нубовосприятия.
Это ппц как запутывает, но если вас это запутывает, настало время отдохнуть и расслабить извилины )))
По умолчанию индикаторы в 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[] -- это не таймсерия, а массив -- и он индексируется слева направо.
Помня о том, что в индикаторах MQL5 по умолчанию бар с индексом "0" - это самый ЛЕВЫЙ бар на графике ...
-- вы путаете -- массивы и таймсерии.
Потому что таймсерия (или бары на графике) -- нумеруются справа налево
И об этом также написано в справке https://www.mql5.com/ru/docs/series: "Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым)". И дальше: "Индекс 0 в массиве-таймсерии означает данные текущего бара, то есть бара, который соответствует незавершенному промежутку времени на данном таймфрейме."
- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
По умолчанию индикаторы в 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:
То есть подтверждаем, что по-умолчанию в индикаторах MQL5 самый левый бар имеет индекс "0".
Дальше будет получать в индикаторе данные с другого индикатора...