Особенности языка mql5, тонкости и приёмы работы - страница 30
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вот прям совсем не понял...
В индикаторе создаю хэндл стандартного АО, но с задаваемым таймфреймом. При получении данных от АО с таймфреймом, не совпадающим с текущим получаю ... ничего не получаю - ошибку 4806.
Вопрос: как правильно брать данные от стандартных индикаторов с таймфреймов, не совпадающих с текущим?
Вот прям совсем не понял...
В индикаторе создаю хэндл стандартного АО, но с задаваемым таймфреймом. При получении данных от АО с таймфреймом, не совпадающим с текущим получаю ... ничего не получаю - ошибку 4806.
Вопрос: как правильно брать данные от стандартных индикаторов с таймфреймов, не совпадающих с текущим?
Про получение значений ИНДИКАТОРА в ИНДИКАТОРЕ:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Как в индикаторе получить данные с другого индикатора
Vladimir Karputov, 2016.12.27 08:41
Помня о том, что в индикаторах 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" означает текущий бар.
CopyBuffer: Отсчет элементов копируемых данных (индикаторный буфер с индексом buffer_num) от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар (значение индикатора для текущего бара).
То есть в индикаторе MQL5, если в нём используются операции CopyBuffer, нужно переворачивать массив (ArraySetAsSeries) так, чтобы самый правый бар на графике соответствовал индексу "0" в индикаторном буфере (сейчас в примере "iMTF_AO.mq5" самый правый бар на графике соответствует rates_total-1).
Про получение значений ИНДИКАТОРА в ИНДИКАТОРЕ:
CopyBuffer: Отсчет элементов копируемых данных (индикаторный буфер с индексом buffer_num) от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар (значение индикатора для текущего бара).
То есть в индикаторе MQL5, если в нём используются операции CopyBuffer, нужно переворачивать массив (ArraySetAsSeries) так, чтобы самый правый бар на графике соответствовал индексу "0" в индикаторном буфере (сейчас в примере "iMTF_AO.mq5" самый правый бар на графике соответствует rates_total-1).
Получаю-то лишь один бар. И индикатор на "родном" таймфрейме нормально выводит данные. На "неродном" - пустое значение. Эмпирическим путём вывел то, что пока не подгрузится вся история по таймфрейму, с которого получаю данные от АО, так и будет возвращаться пустое значение.
Вопрос тогда будет звучать иначе: как не заходить в цикл, пока история по таймфрейму подгружается? Просто - это лишь тест, а вообще в индикаторе идут расчёты по истории заданного тф, и не нужно их пытаться выполнять пока истории нету.
Получаю-то лишь один бар. И индикатор на "родном" таймфрейме нормально выводит данные. На "неродном" - пустое значение. Эмпирическим путём вывел то, что пока не подгрузится вся история по таймфрейму, с которого получаю данные от АО, так и будет возвращаться пустое значение.
Вопрос тогда будет звучать иначе: как не заходить в цикл, пока история по таймфрейму подгружается? Просто - это лишь тест, а вообще в индикаторе идут расчёты по истории заданного тф, и не нужно их пытаться выполнять пока истории нету.
"i" равен не "0", а какому-то заоблачному значению. В итоге: допустим запустили пример на M15 - имеем на этом периоде 5000 баров. Запрашиваем данные с H4 - на нём всего 400 баров. Далее происходит попытка запроса "AO(4999)".
То есть с периода H4 делается попытка запроса бара с индексом "4999" - а такого бара на H4 нет вообще, там всего-то 400 баров, хотя запрашивать нужно бар "0" и если в индикаторе используются операции CopyBuffer, нужно переворачивать массив (ArraySetAsSeries) так, чтобы самый правый бар на графике соответствовал индексу "0" в индикаторном буфере (сейчас в примере "iMTF_AO.mq5" самый правый бар на графике соответствует rates_total-1).
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
fxsaber, 2017.04.12 08:38
Небольшой лайфхак. Обход оператора присваиванияРезультат
Вот здесь:
"i" равен не "0", а какому-то заоблачному значению. В итоге: допустим запустили пример на M15 - имеем на этом периоде 5000 баров. Запрашиваем данные с H4 - на нём всего 400 баров. Далее происходит попытка запроса "AO(4999)".
То есть с периода H4 делается попытка запроса бара с индексом "4999" - а такого бара на H4 нет вообще, там всего-то 400 баров, хотя запрашивать нужно бар "0" и если в индикаторе используются операции CopyBuffer, нужно переворачивать массив (ArraySetAsSeries) так, чтобы самый правый бар на графике соответствовал индексу "0" в индикаторном буфере (сейчас в примере "iMTF_AO.mq5" самый правый бар на графике соответствует rates_total-1).
Не, ну я постарался конечно высчитать лимит:
... но вижу, что напортачил второпях - это только для текущего тф подходит
Не, ну я постарался конечно высчитать лимит:
... но вижу, что напортачил второпях - это только для текущего тф подходит
Ты вообще код глядел, который показываю? А запускал его?
Я спрашивал не о том как заполнить буфер индикатора, а о том, почему если брать значения от АО не с текущего бара, то возвращаются пустые значения.
Это понял - нет истории - она подгружается, и пока она подгружается АО с неродного тф возвращает ошибку "нет данных".
Вопрос теперь стоит так: как узнать что история по нужному тф полностью загружена чтобы не заходить в цикл индикатора?