double dbuffer[1]; if(CopyBuffer(hatr,ibuffer,i,1,dbuffer)==1) { //в 0 индексе буфера я получаю 0.0 !!! i - индекс бара который хочу получить , читаю 1 только бар. (обычно 1-й бар) }
Массив лучше взять динамический. Функция CopyBuffer вернет массив указанной длины. Вряд ли это решит проблему, но обычно делают так.
P.S. Ещё было бы не лишним проверить, какой код ошибки генерирует терминал после вызова CopyBuffer (ResetLastError, GetLastError).
Сделал простой тестовый индикатор на стандартных классах, требуется получать информацию АТР закрытого дня под индексом 1.
Интересный парадокс, на D1 он выдает данные, но если переключиться на меньший ТФ, то выдает какие то нереальные числа.
Запускаю на EURUSD. Проверил у 2х брокеров, аналогично т.е. брокер исключается. Остается сама работа iATR в терминале.
Билд 3401
//+------------------------------------------------------------------+ //| TestATR.mq5 | //| Copyright 2021, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_chart_window #property indicator_plots 0 #include <Indicators\Oscilators.mqh> CiATR g_atr; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping g_atr.Create(_Symbol,PERIOD_D1,14); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 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[]) { //--- g_atr.Refresh(); Print(DoubleToString(g_atr.Main(1),_Digits)); return(rates_total); } //+------------------------------------------------------------------+
а выдает вот такие чудеса в выходные.
2022.08.21 12:32:46.755 TestATR (EURUSDrfd,H1) 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.00000 2022.08.21 12:32:49.388 TestATR (EURUSDrfd,H4) 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.00000 2022.08.21 12:32:51.489 TestATR (EURUSDrfd,D1) 0.00942
Это явно ошибка в терминале в работе атр.
В будни все работает. В МТ4 работает это правильно в выходные!!!
Надеюсь разработчики увидят данную тему и исправят у меня из-за этого индикаторы и советники использующие АТР не работают.
Сделал простой тестовый индикатор на стандартных классах, требуется получать информацию АТР закрытого дня под индексом 1.
Интересный парадокс, на D1 он выдает данные, но если переключиться на меньший ТФ, то выдает какие то нереальные числа.
Запускаю на EURUSD. Проверил у 2х брокеров, аналогично т.е. брокер исключается. Остается сама работа iATR в терминале.
Билд 3401
а выдает вот такие чудеса в выходные.
Это явно ошибка в терминале в работе атр.
В будни все работает. В МТ4 работает это правильно в выходные!!!
Надеюсь разработчики увидят данную тему и исправят у меня из-за этого индикаторы и советники использующие АТР не работают.
Наверное в этой строке
Print(DoubleToString(g_atr.Main(1),_Digits));
1 — это первый бар текущего ТФ. Если надо ТФ D1 то надо индекс определить по времени.
Но в этом случае пользоваться стандартной библиотекой не совсем выгодно, на мой взгляд.
Наверное в этой строке
1 — это первый бар текущего ТФ. Если надо ТФ D1 то надо индекс определить по времени.
Но в этом случае пользоваться стандартной библиотекой не совсем выгодно, на мой взгляд.
лучше вообще не пользоваться "стандартной библиотекой" :-)
есть API терминала, от которых она никуда не ушла и ничего нового не добавила, кроме зарытых багов. А с выходными и праздники прямо-таки простор для всяких неопределённостей
в выходные получается следующая котовасия : на младших ТФ, бар не считается закрытым пока не откроется следующий. Следующий открывается только с приходом тика, но не может открыться в неторговое время. Если в выходной DC разродится тиком (а такое бывало, стоит понаблюдать - может и сейчас случается), то на какого папу записать ? Кстати, сегодня с точки зрения D1 всё ещё пятница (это её свеча имеет индекс 0), а ТС запросил 1 то есть видимо четверг.
PS/ В MT у свечей нет аттрибута "closed", что не вполне хорошо
лучше вообще не пользоваться "стандартной библиотекой" :-)
есть API терминала, от которых она никуда не ушла и ничего нового не добавила, кроме зарытых багов. А с выходными и праздники прямо-таки простор для всяких неопределённостей
в выходные получается следующая котовасия : на младших ТФ, бар не считается закрытым пока не откроется следующий. Следующий открывается только с приходом тика, но не может открыться в неторговое время. Если в выходной DC разродится тиком (а такое бывало, стоит понаблюдать - может и сейчас случается), то на какого папу записать ? Кстати, сегодня с точки зрения D1 всё ещё пятница (это её свеча имеет индекс 0), а ТС запросил 1 то есть видимо четверг.
PS/ В MT у свечей нет аттрибута "closed", что не вполне хорошо
Я не вижу проблем в том, что текущий бар D1 это пятница. Или любой другой не закрытый бар соответствующее время бара пятницы…
А если не случается, а мы будем перестраховываться? Зачем-же строить костыли на баги МТ3?
Я не вижу проблем в том, что текущий бар D1 это пятница. Или любой другой не закрытый бар соответствующее время бара пятницы…
А если не случается, а мы будем перестраховываться? Зачем-же строить костыли на баги МТ3?
при чём 3 ?
обсуждается неочевидное поведение класса ATR в библиотеки 5-ке, для днёвок в выходные дни, в зависимости ТФ чарта к которому приложено. В частности почему и откуда оно берётся.
Разборки с причинами необходимы чтобы с другими функциями/классами не наступить на те-же грабли.
---
в вышеприложенном кейсе (который якобы показывает в дырочку), много недостатков, в частности что запрашиваемый D1[1] это ЧЕТВЕРГ. Хотя ТС явно ожидал иного.
там много всего надо дополнять. ОБработки ошибкок при получении EMPTY_VALUE нет. Там доступность и синхронизация истории не проверяется (а это ворох кода) (сколько баров есть на другом ТФ и "подождать пока не наберуться")
Я не вижу проблем в том, что текущий бар D1 это пятница. Или любой другой не закрытый бар соответствующее время бара пятницы…
А если не случается, а мы будем перестраховываться? Зачем-же строить костыли на баги МТ3?
Не знал, что бар закрывается последним тиком не по времени, а по разнице времени тиков последнего клоз и первого опен. Думаю это грусть для выходных.
ЗЫ к тому же получается что последняя свеча при отсутствии тиков никогда не будет закрытой.при чём 3 ?
обсуждается неочевидное поведение класса ATR в библиотеки 5-ке, для днёвок в выходные дни, в зависимости ТФ чарта к которому приложено. В частности почему и откуда оно берётся.
Разборки с причинами необходимы чтобы с другими функциями/классами не наступить на те-же грабли.
---
в вышеприложенном кейсе (который якобы показывает в дырочку), много недостатков, в частности что запрашиваемый D1[1] это ЧЕТВЕРГ. Хотя ТС явно ожидал иного.
там много всего надо дополнять. ОБработки ошибкок при получении EMPTY_VALUE нет. Там доступность и синхронизация истории не проверяется (а это ворох кода) (сколько баров есть на другом ТФ и "подождать пока не наберуться")
Ааа… Я-то думал надо ехать, а оказывается нужны шашечки.
Я не пользую эти классы, потому и проверять не буду, а проверить не помешало-бы если есть желание разобраться
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
MQL5 проблемы с ATR в выходные дни.
Alexey Viktorov, 2022.08.21 12:59
Наверное в этой строке
Print(DoubleToString(g_atr.Main(1),_Digits));
1 — это первый бар текущего ТФ. Если надо ТФ D1 то надо индекс определить по времени.
Но в этом случае пользоваться стандартной библиотекой не совсем выгодно, на мой взгляд.
Не знал, что бар закрывается последним тиком не по времени, а по разнице времени тиков последнего клоз и первого опен. Думаю это грусть для выходных.
ЗЫ к тому же получается что последняя свеча при отсутствии тиков никогда не будет закрытой.Бар закрывается первым тиком следующего бара. И никак иначе.
Спасибо, понятно. Не понятно почему только. В выходные на дневном ТФ пятница закроется только в понедельник, если тиков после 24 часов не будет. А если будет, то тики воскресения попадут в понедельник или образуют свечу воскресения со случайными тиками.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Надеюсь это увидят разработчики терминала!
В МТ5 в индикаторе в выходной день напрочь отказываются функции CopyBuffer получать данные закрытого бара, например:
Инициализирую в OnInit как обычно индикатор
в OnCalculate
Почините эту проблемы, в мт4 такой проблемы нет.
Возникает только в выходные, когда котировок нет.
Либо проблема CopyBuffer или самого индикатора iATR (атр по D1), индикатор в котором используется на меньших тф. Задача получить значение АТР прошлого дня и похоже он пытается получить с субботы в воскресенье, где нет данных.