program file Experts\..\..ПУТЬ К ЭКСПЕРТУ..\CandlePatterns.ex5 read error

 

 Почему может появляться ошибка с таким содержанием?

2020.06.10 18:14:59.111 program file Experts\myBots\toTrade\patternsTrading\myIndicators\PA\CandlePatterns.ex5 read error

Вот 2 функции, которые поясняют сложившийся вопрос:

//==================================================================================================================================================================================================
// Создаёт handle индикатора CandlePatterns на заданном индексе. ===================================================================================================================================
int Signal :: createCandlePatternsHandle(const int bufferIndex, const int shift, ENUM_TIMEFRAMES tf = PERIOD_CURRENT) {
  int handle = iCustom(_Symbol, _Period, "CandlePatterns", true, true, true, 30);
  Print("_LastError = " + _LastError);
  Print("handle = " + handle);
//  return (handle != INVALID_HANDLE) ? true : false;
  return handle;
}
//==================================================================================================================================================================================================
// Возвращает значения индикатора CandlePatterns на заданном индексе. ==============================================================================================================================
double Signal :: getCandlePatternsValue(const int bufferIndex, const int shift, ENUM_TIMEFRAMES tf = PERIOD_CURRENT) {
  double havingPattern[];
  ArrayResize(havingPattern, 1);
  int handle = createCandlePatternsHandle(bufferIndex, shift, tf);
  ResetLastError();
  int res = CopyBuffer(handle, bufferIndex, shift, 1, havingPattern);
  Print("res = " + res);
  return havingPattern[0];
}

Все параметры индикатора используются дефолтовые. Соответственно, в MqlParam я поместил лишь название индикатора в первый индекс массива. Больше ничего. После создания хэндла индикатора я установил точку останова, чтобы выяснить причину ошибки. Скрин прикрепляю.

В окне отладчика видно, что хэндл индикатора 1. Соответственно, хэндл создан без ошибок т.к. нет ошибки -1.

Типы всех передаваемых переменных соответствуют требуемым по сигнатуре функции CopyBuffer()

Номер буфера указал 0-ой..

Как так получаеся, что какая-то ошибка чтения возникает? Ведь индикатор рабочий. Хэндл создан. Ошибка связана с отработкой функции CopyBuffer(), как я понимаю. Но как такое может быть? Как это проверить?

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Переменные должны быть объявлены перед их использованием. Для идентификации переменных используются уникальные имена. Описания переменных используются для их определения и объявления типов. Описание не является оператором. Индексом массива может быть только целое число. Допускаются не более чем четырехмерные массивы. Нумерация элементов массива...
Файлы:
Screen.png  22 kb
 
Индикаторы должны лежать в папке Индикаторс , а не Экспертс
 
Aleksey Mavrin:
Индикаторы должны лежать в папке Индикаторс , а не Экспертс

Они там и лежат. Первый момент я понял. По какой-то причине, если индикатор лежит не в самой папке Indicators, а глубже по иерархии, то возникает ошибка чтения индикатора. В моём случае, путь был таким:

Indicators/myIndicators/PA

Переношу индикатор в корень т.к. вариантов не много и ошибка чтения уже не появляется. Но остался ещё один момент.

Всё-равно, не считываются данные с индикаторного буфера функцией CopyBuffer(). CopyBuffer() возвращает -1 постоянно. Хотя, хэндл индикатора равен 10 и при создании хэндла индикатора ошибок нет вообще никаких..

 
Виктор Демихов:

Они там и лежат. Первый момент я понял. По какой-то причине, если индикатор лежит не в самой папке Indicators, а глубже по иерархии, то возникает ошибка чтения индикатора. В моём случае, путь был таким:

Переношу индикатор в корень т.к. вариантов не много и ошибка чтения уже не появляется. Но остался ещё один момент.

Всё-равно, не считываются данные с индикаторного буфера функцией CopyBuffer(). CopyBuffer() возвращает -1 постоянно. Хотя, хэндл индикатора равен 10 и при создании хэндла индикатора ошибок нет вообще никаких..

слэш должен быть двойной в путях к файлам  \\

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

в остальном код неполный чтобы подсказать. getCandlePatternsValue с каким пар-рами вызываете.

Да и может в индюке ошибка

 
Aleksey Mavrin:

Да и может в индюке ошибка

По поводу индюка я тоже подумал. Но, навряд ли. Индюк приложу к сообщению.

Я закоментировал код, который отрисовывает стрелочки и и пишет комментарии найденному паттерну, чтобы не усложнять понимание процессса т.к. там требуются дополнительные библиотеки.

По сути, по дефолту у меня в обоих буферах индикатора по дефолту значение EMPTY_VALUE

Я распечатывал рассчитанные непустые значения и заметил, что они корректные.

Файлы:
 
Виктор Демихов:

По поводу индюка я тоже подумал. Но, навряд ли. Индюк приложу к сообщению.

Я закоментировал код, который отрисовывает стрелочки и и пишет комментарии найденному паттерну, чтобы не усложнять понимание процессса т.к. там требуются дополнительные библиотеки.

По сути, по дефолту у меня в обоих буферах индикатора по дефолту значение EMPTY_VALUE

Я распечатывал рассчитанные непустые значения и заметил, что они корректные.

а ошибку проверяли после выдачи -1 ?

 
Aleksey Mavrin:

слэш должен быть двойной в путях к файлам  \\

Откуда такие сведения? У меня написан класс один, который протестирован уже ни один раз. Так с 1 слэшем. Вот так там написано:


Aleksey Mavrin:

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

в остальном код неполный чтобы подсказать. getCandlePatternsValue с каким пар-рами вызываете.

То что я создал 2 раза тот же хэндл, это лишь случайность. Тестировал, проверял. Переписал всё в одной функции без проверок под идеальные условия для тестера. В реале, конечно, допишу проверки. Вот что вышло:

//==================================================================================================================================================================================================
// Возвращает значения индикатора CandlePatterns на заданном индексе. ==============================================================================================================================
double Signal :: getCandlePatternsValue(const int bufferIndex, const int shift, ENUM_TIMEFRAMES tf = PERIOD_CURRENT) {
  double havingPattern[];
  ArrayResize(havingPattern, 1);
  int handle = iCustom(_Symbol, _Period, "CandlePatterns");
  ResetLastError();
  int res = CopyBuffer(handle, bufferIndex, shift, 1, havingPattern);
  Print("res = " + res);
  return havingPattern[0];
}

Параметры функции getCandlePatternsValue() видны на прикреплённом скрине.

Я бы мог показать целый код, но это усложнит анализ кода. Я вижу, что ошибка в этом момент. Поэтому я его и показываю.

Там более, видно, что функция CopyBuffer() возвращает res == -1. А это значит, что не получается считать данные с буфера индикатора CandlePatterns.

Файлы:
Screen.png  33 kb
 
Aleksey Mavrin:

а ошибку проверяли после выдачи -1 ?

А как я её проверю? Вижу, что ошибка. Типы параметры верные. Почему ошибка - вопрос..

 
Виктор Демихов:

А как я её проверю? Вижу, что ошибка. Типы параметры верные. Почему ошибка - вопрос..

GetLastError для начала

 
Aleksey Mavrin:

GetLastError для начала

2020.06.11 11:42:59.460 2018.09.27 00:00:00   _LastError = 4806

ERR_INDICATOR_DATA_NOT_FOUND

4806

Запрошенные данные не найдены

Как я изначально и сказал. Не находятся данные в индикаторе.

Интересно то, что данные в буферах имеются. Но почему-то функция CopyBuffer() не может получить эти данные.

Сейчас индюк запоминает цену закрытия предыдущего бара паттерна. Паттерна сейчас лишь 2. Но это лишь заготовка.

Вот функция, которая присваивает значение в буфер тогда, когда сформировано бычье поглощение:

void checkingBullishEngulfing(int index) {
  if ((barClosePrice(index + 1) < barOpenPrice(index + 1)) && (barOpenPrice(index) < barLowPrice(index + 1)) && (barClosePrice(index) > barOpenPrice(index + 1))) {
    bullishEngulfingBuf[index] = barClosePrice(index + 1);
    if (toDrawPatternsInfo)
      drawPatternInfo(BULLISHENGULFING_NAME, index, LOCATION_BELOW, 241, clrBlue);
  } else {
    bullishEngulfingBuf[index] = EMPTY_VALUE;
  }
}

Смысл в том, что в строке:

bullishEngulfingBuf[index] = barClosePrice(index + 1);

сохраняется ценазакрытия в буфер индикатора, а дальше следующими двумя строками я отрисовываю некоторые вещи на этом баре. Эти строки я добавил из своего статического класса, чтобы увидеть, что индикатор перно находит нужные места. На скрине, которые я прилагаю к этому сообщению всё это видно.

В придачу ко всему, буферные массивы изначально инициализируются пустыми значениями EMPTY_VALUE при инициализации. Вот я и спрашиваю, как может такое быть, что нет возможности получить данные из индикаторного буфера. Кто же его знает как работает функция CopyBuffer(). Её не отладить никак..

Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Прочие константы
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Прочие константы
  • www.mql5.com
Константа CLR_NONE служит для указания отсутствия цвета, то есть графический объект или графическая серия индикатора не будут отображены. Эта константа не вошла в список констант с наименованиями Web-цветов, но может применяться везде, где требуется указание цвета. Константа EMPTY_VALUE обычно соответствует тем значениям индикаторов, которые не...
Файлы:
Screen.png  26 kb
 
Виктор Демихов:
 Вот я и спрашиваю, как может такое быть, что нет возможности получить данные. 

Такое бывает, если неправильно указан индекс буфера. Проверьте значение bufferIndex, передаваемое в getCandlePatternsValue и посмотрите, есть ли в индикаторе буфер с таким индексом. Его явно нет.


P. S. А почему тема в разделе для MQL4? Думаю, стоит перенести в раздел для MQL5.

Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
При создании пользовательского индикатора можно указать один из 18 типов графического построения (способа отображения на главном окне графика или в подокне графика), значения которых указаны в перечислении ENUM_DRAW_TYPE. В зависимости от стиля рисования, может потребоваться от одного до четырех буферов значений (отмеченных как INDICATOR_DATA...
Причина обращения: