- Ошибки, баги, вопросы
- Элитные показатели :)
- Помощь в кодировании
А точно ошибку выдает компилятор? Что такое загрузка? Наверное, запуск индикатора. После запуска компилятор уже не выдает никаких ошибок, т. к. программа успешно скомпилирована и запущена.
Видимо, речь идет об ошибке времени исполнения. То есть CopyBuffer() возвращает значение -1. Для такого случая в справке есть специальное описание:
When requesting data from the indicator, if requested timeseries are not yet built or they need to be downloaded from the server, the function will immediately return -1, but the process of downloading/building will be initiated.
int res = CopyBuffer(ma_handle,0,0,2,ma_buffer); int error = GetLastError(); if (res < 0 || error != 0) { Print("Error: ", error); // 4806 Запрошенные данные не найдены // 4401 Запрашиваемая история не найдена return 0; } Print("res=",res);
В качестве догадки предположу - потому что вызов Symbol() дергает ядро терминала на обновление таймсерий, и к моменту вызова CopyBuffer они уже готовы (но в принципе, время на синхронизацию может быть разным, и не факт что всегда на первом же вызове CopyBuffer() после Symbol() данные будут готовы), а вызов CopyBuffer("константная строка") - это первый запрос к указанной таймсерии и она только начинает строиться. Разумеется, предполагается, что другие MQL-программы не запросили тот же символ раньше - тогда по идее тайм серии уже должны быть готовы.
На графике какого символа запускаете индикатор?
В этом весь ответ… Symbol() возвращает имя текущего инструмента графика по которому загружена вся история. А когда пишете любой другой инструмент, то сначала история должна подгрузиться. А пока её нет, то и лезет ошибка.
В этом весь ответ… Symbol() возвращает имя текущего инструмента графика по которому загружена вся история. А когда пишете любой другой инструмент, то сначала история должна подгрузиться. А пока её нет, то и лезет ошибка.
int res = CopyBuffer(ma_handle,0,0,2,ma_buffer); if(ChartSymbol(0) == symbol && res < 0){ Print(__FUNCTION__," failed to copy array members, error ",GetLastError()); return false; }
Или я совершенно не понял сказанного, или совсем наоборот. Для текущего символа ошибки очень редки, а вот для любого другого очень часто. Вообще рекомендуется запрашивать свойства «не родного» символа каждые пару минут. Так сказать дёргать кота за причинное место… Ну а если обращение идёт чаще, то специально дёргать нет необходимости, просто при запуске если данные не получены вернуть 0 и пусть пересчитывается сначала…
Hi Alain,
I could make a post with all the articles I browsed about my search on "4806 error" and "Requested data not found" and still not an answer, lot of unanswered and unresolved issues and posts just abandoned because people gave up.
But if you could point me in the right direction that would be appreciated. Thanks
Yeah. You didn't search very well in this case.
You have 2 main issues :
1° You initialize the indicator (create the handle) and on the next statement you call CopyBuffer(), that will never work as the indicator need some time to be launched and calculated. You NEED to declare in OnInit(). (Strictly speaking it's not mandatory but it's way simpler when you don't know and understand all the process very clearly).
2° For multi-symbols (and/or multi-timeframes), you can ALWAYS get an error 4806 at some point because MT5 doesn't wait the data to be calculated, so it happens that the data are not ready on other symbols/timeframes. You have to deal with it, the simpler is just return and wait next tick.
Благодаря!

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования