Индикаторы должны лежать в папке Индикаторс , а не Экспертс
Они там и лежат. Первый момент я понял. По какой-то причине, если индикатор лежит не в самой папке Indicators, а глубже по иерархии, то возникает ошибка чтения индикатора. В моём случае, путь был таким:
Indicators/myIndicators/PA
Переношу индикатор в корень т.к. вариантов не много и ошибка чтения уже не появляется. Но остался ещё один момент.
Всё-равно, не считываются данные с индикаторного буфера функцией CopyBuffer(). CopyBuffer() возвращает -1 постоянно. Хотя, хэндл индикатора равен 10 и при создании хэндла индикатора ошибок нет вообще никаких..
Они там и лежат. Первый момент я понял. По какой-то причине, если индикатор лежит не в самой папке Indicators, а глубже по иерархии, то возникает ошибка чтения индикатора. В моём случае, путь был таким:
Переношу индикатор в корень т.к. вариантов не много и ошибка чтения уже не появляется. Но остался ещё один момент.
Всё-равно, не считываются данные с индикаторного буфера функцией CopyBuffer(). CopyBuffer() возвращает -1 постоянно. Хотя, хэндл индикатора равен 10 и при создании хэндла индикатора ошибок нет вообще никаких..
слэш должен быть двойной в путях к файлам \\
почему вы постоянно создаете индикатор? хэндл надо бы сохранять один раз.
в остальном код неполный чтобы подсказать. getCandlePatternsValue с каким пар-рами вызываете.
Да и может в индюке ошибка
Да и может в индюке ошибка
По поводу индюка я тоже подумал. Но, навряд ли. Индюк приложу к сообщению.
Я закоментировал код, который отрисовывает стрелочки и и пишет комментарии найденному паттерну, чтобы не усложнять понимание процессса т.к. там требуются дополнительные библиотеки.
По сути, по дефолту у меня в обоих буферах индикатора по дефолту значение EMPTY_VALUE
Я распечатывал рассчитанные непустые значения и заметил, что они корректные.
По поводу индюка я тоже подумал. Но, навряд ли. Индюк приложу к сообщению.
Я закоментировал код, который отрисовывает стрелочки и и пишет комментарии найденному паттерну, чтобы не усложнять понимание процессса т.к. там требуются дополнительные библиотеки.
По сути, по дефолту у меня в обоих буферах индикатора по дефолту значение EMPTY_VALUE
Я распечатывал рассчитанные непустые значения и заметил, что они корректные.
а ошибку проверяли после выдачи -1 ?
слэш должен быть двойной в путях к файлам \\
Откуда такие сведения? У меня написан класс один, который протестирован уже ни один раз. Так с 1 слэшем. Вот так там написано:
почему вы постоянно создаете индикатор? хэндл надо бы сохранять один раз.
в остальном код неполный чтобы подсказать. 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.
а ошибку проверяли после выдачи -1 ?
А как я её проверю? Вижу, что ошибка. Типы параметры верные. Почему ошибка - вопрос..
А как я её проверю? Вижу, что ошибка. Типы параметры верные. Почему ошибка - вопрос..
GetLastError для начала
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(). Её не отладить никак..
- www.mql5.com
Такое бывает, если неправильно указан индекс буфера. Проверьте значение bufferIndex, передаваемое в getCandlePatternsValue и посмотрите, есть ли в индикаторе буфер с таким индексом. Его явно нет.
P. S. А почему тема в разделе для MQL4? Думаю, стоит перенести в раздел для MQL5.
- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Почему может появляться ошибка с таким содержанием?
Вот 2 функции, которые поясняют сложившийся вопрос:
Все параметры индикатора используются дефолтовые. Соответственно, в MqlParam я поместил лишь название индикатора в первый индекс массива. Больше ничего. После создания хэндла индикатора я установил точку останова, чтобы выяснить причину ошибки. Скрин прикрепляю.
В окне отладчика видно, что хэндл индикатора 1. Соответственно, хэндл создан без ошибок т.к. нет ошибки -1.
Типы всех передаваемых переменных соответствуют требуемым по сигнатуре функции CopyBuffer()
Номер буфера указал 0-ой..
Как так получаеся, что какая-то ошибка чтения возникает? Ведь индикатор рабочий. Хэндл создан. Ошибка связана с отработкой функции CopyBuffer(), как я понимаю. Но как такое может быть? Как это проверить?