Написал советник который использует скользяшки, две на текущем ТФ и две на высшем ТФ. В функции инициализации проверяю хэндл на "инвалидность" и количество посчитанных баров. В терминале все работает отлично, но в тестере выдает ошибки. Причем один хэндл для медленной скользяшки на текущем создается, а для быстрой нет, если поменять создание хэндлов местами в коде, то выходит наоборот, то есть создается хэндл который первый в коде. В чем может быть причина?
Посмотрите, для примера, этот советник. В нём реализована проверка гораздо проще, без циклов.
С уважением, Владимир.Посмотрите, для примера, этот советник. В нём реализована проверка гораздо проще, без циклов.
С уважением, Владимир.Савсибо за Ваш ответ. Но в справке к CopyBuffer написано:
"При запросе данных из индикатора, если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, то функция сразу же вернет -1, но при этом сам процесс загрузки/построения будет инициирован.
При запросе данных из эксперта или скрипта, будет инициирована загрузка с сервера, если локально этих данных у терминала нет, либо начнется построение нужной таймсерии, если данные можно построить из локальной истории, но они еще не готовы. Функция вернет то количество данных, которые будут готовы к моменту истечения таймаута."
Я где то читал что нужно подождать пока данные подтянутся, поэтому и цикл.
Савсибо за Ваш ответ. Но в справке к CopyBuffer написано:
"При запросе данных из индикатора, если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, то функция сразу же вернет -1, но при этом сам процесс загрузки/построения будет инициирован.
При запросе данных из эксперта или скрипта, будет инициирована загрузка с сервера, если локально этих данных у терминала нет, либо начнется построение нужной таймсерии, если данные можно построить из локальной истории, но они еще не готовы. Функция вернет то количество данных, которые будут готовы к моменту истечения таймаута."
Я где то читал что нужно подождать пока данные подтянутся, поэтому и цикл.
циклов не должно быть там, программа в случае ошибки создания хендла должна выйти по return(INIT_FAILED);
и начать с начала, смотрите предложенный пример
цикл при создании хендлов используют только когда создается массив, для мультисимвола например
а ошибка копибуфер, просто на новом тике получит данные или сообщениями засыпет, но я такого не помню даже
тут есть пример в справке, скрипт, его если включить в робота при запуске, то и ошибок не будет при запуске, с недостатком истории, сейчас не буду искать его
add
вспомнил по названию
https://www.mql5.com/ru/docs/series/timeseries_access
он за секунду проверяет историю, если не хватает - загружает ее, потом уже начинаете работать со своими хендлами...
- www.mql5.com
Написал советник который использует скользяшки, две на текущем ТФ и две на высшем ТФ. В функции инициализации проверяю хэндл на "инвалидность" и количество посчитанных баров. В терминале все работает отлично, но в тестере выдает ошибки. Причем один хэндл для медленной скользяшки на текущем создается, а для быстрой нет, если поменять создание хэндлов местами в коде, то выходит наоборот, то есть создается хэндл который первый в коде. В чем может быть причина?
Всё не правильно, неправильная структура кода
Хендл создаётся в OnInit(), на этом всё оканчивается
остальное проверяется в OnTick()
int OnInit() { // hATR=iATR( NULL , 0, 100); if(hATR==-1) { Print("Error handle ATR"); return(INIT_FAILED); } // return(INIT_SUCCEEDED); }
Всё не правильно, неправильная структура кода
Хендл создаётся в OnInit(), на этом всё оканчивается
остальное проверяется в OnTick()
Сделал вот так
MA_SlowCurrTF_Handle = iMA(_Symbol, CurrentTimeframe, MA_SlowCurrTF, 0, MODE_SMA, PRICE_CLOSE); Print("BarsCalculated MA_SlowCurrTF_Handle = ",BarsCalculated(MA_SlowCurrTF_Handle)); if(MA_SlowCurrTF_Handle == -1) Print("Error creating MA_SlowCurrTF_Handle. Error - ", GetLastError()); if(BarsCalculated(MA_SlowCurrTF_Handle) >= MA_SlowCurrTF) Print("MA_SlowCurrTF_Handle created"); MA_FastCurrTF_Handle = iMA(_Symbol, CurrentTimeframe, MA_FastCurrTF, 0, MODE_SMA, PRICE_CLOSE); Print("BarsCalculated MA_FastCurrTF_Handle = ",BarsCalculated(MA_FastCurrTF_Handle)); if(MA_FastCurrTF_Handle == -1) Print("Error creating MA_FastCurrTF_Handle. Error - ", GetLastError()); if(BarsCalculated(MA_FastCurrTF_Handle) >= MA_FastCurrTF) Print("MA_FastCurrTF_Handle created");
В терминале работает, но тестере нет, хэндл создается но BarsCalculated() равно -1
Сделал вот так
В терминале работает, но тестере нет, хэндл создается но BarsCalculated() равно -1
статья ок по теме вроде этой может поможет - там и о хендлах есть правда пользоват - го инд- ра
- 2023.12.08
- www.mql5.com
но BarsCalculated() равно -1
На сайте есть Учебник. Там всё хорошо расписано про BarsCalculated(). Обратите там особое внимание на то, что проверка количества просчитанных баров делается в OnInit().
С уважением, Владимир.
На сайте есть Учебник. Там всё хорошо расписано про BarsCalculated(). Обратите там особое внимание на то, что проверка количества просчитанных баров делается в OnInit().
С уважением, Владимир.
Я походу разобрался, упростил код до
MA_SlowCurrTF_Handle = iMA(_Symbol, CurrentTimeframe, MA_SlowCurrTF, 0, MODE_SMA, PRICE_CLOSE); if(MA_SlowCurrTF_Handle == INVALID_HANDLE) Print("Error creating MA_SlowCurrTF_Handle. Error - ", GetLastError()); MA_FastCurrTF_Handle = iMA(_Symbol, CurrentTimeframe, MA_FastCurrTF, 0, MODE_SMA, PRICE_CLOSE); if(MA_FastCurrTF_Handle == INVALID_HANDLE) Print("Error creating MA_FastCurrTF_Handle. Error - ", GetLastError());
Просто в тестере в режиме "Только цены открытия" на ТФ Н1 данные индикатора на ТФ Н4 на текущем баре рассчитываются неккоректно, так как "тик" только пришел.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования

Написал советник который использует скользяшки, две на текущем ТФ и две на высшем ТФ. В функции инициализации проверяю хэндл на "инвалидность" и количество посчитанных баров. В терминале все работает отлично, но в тестере выдает ошибки. Причем один хэндл для медленной скользяшки на текущем создается, а для быстрой нет, если поменять создание хэндлов местами в коде, то выходит наоборот, то есть создается хэндл который первый в коде. В чем может быть причина?
2025.07.18 16:06:48.520 2022.06.01 00:00:00 ---------
2025.07.18 16:06:48.520 2022.06.01 00:00:00 Not enough bars calculated for MA_SlowCurrTF_Handle. BarsCalculated = -1, i = 0 Error - 4806
2025.07.18 16:06:48.844 2022.06.01 00:00:01 ---------
2025.07.18 16:06:48.844 2022.06.01 00:00:01 Bars calculated for MA_SlowCurrTF_Handle = 11721
2025.07.18 16:06:48.844 2022.06.01 00:00:01 Not enough bars calculated for MA_FastCurrTF_Handle. BarsCalculated = -1, i = 0 Error - 4806
2025.07.18 16:06:48.844 2022.06.01 00:00:02 Not enough bars calculated for MA_FastCurrTF_Handle. BarsCalculated = -1, i = 1 Error - 4806
2025.07.18 16:06:48.844 2022.06.01 00:00:03 Not enough bars calculated for MA_FastCurrTF_Handle. BarsCalculated = -1, i = 2 Error - 4806
2025.07.18 16:06:48.844 2022.06.01 00:00:04 Not enough bars calculated for MA_FastCurrTF_Handle. BarsCalculated = -1, i = 3 Error - 4806
2025.07.18 16:06:48.844 2022.06.01 00:00:05 Not enough bars calculated for MA_FastCurrTF_Handle. BarsCalculated = -1, i = 4 Error - 4806
2025.07.18 16:06:48.844 2022.06.01 00:00:06 Not enough bars calculated for MA_FastCurrTF_Handle. BarsCalculated = -1, i = 5 Error - 4806
2025.07.18 16:06:48.903 ETHUSD,M5: history cache allocated for 365384 bars and contains 139921 bars from 2021.01.04 00:05 to 2022.05.31 23:55
2025.07.18 16:06:48.903 ETHUSD,M5: history begins from 2021.01.04 00:05
2025.07.18 16:06:48.904 2022.06.01 00:00:07 Not enough bars calculated for MA_SlowHighTF_Handle. BarsCalculated = -1, i = 0 Error - 4806
2025.07.18 16:06:48.904 2022.06.01 00:00:08 Not enough bars calculated for MA_SlowHighTF_Handle. BarsCalculated = -1, i = 1 Error - 4806
2025.07.18 16:06:48.904 2022.06.01 00:00:09 Not enough bars calculated for MA_SlowHighTF_Handle. BarsCalculated = -1, i = 2 Error - 4806
2025.07.18 16:06:48.904 2022.06.01 00:00:10 Not enough bars calculated for MA_SlowHighTF_Handle. BarsCalculated = -1, i = 3 Error - 4806
2025.07.18 16:06:48.904 2022.06.01 00:00:11 Not enough bars calculated for MA_SlowHighTF_Handle. BarsCalculated = -1, i = 4 Error - 4806
2025.07.18 16:06:48.904 2022.06.01 00:00:12 Not enough bars calculated for MA_SlowHighTF_Handle. BarsCalculated = -1, i = 5 Error - 4806
2025.07.18 16:06:48.904 2022.06.01 00:00:13 Not enough bars calculated for MA_FastHighTF_Handle. BarsCalculated = -1, i = 0 Error - 4806
2025.07.18 16:06:48.904 2022.06.01 00:00:14 Not enough bars calculated for MA_FastHighTF_Handle. BarsCalculated = -1, i = 1 Error - 4806
2025.07.18 16:06:48.904 2022.06.01 00:00:15 Not enough bars calculated for MA_FastHighTF_Handle. BarsCalculated = -1, i = 2 Error - 4806
2025.07.18 16:06:48.904 2022.06.01 00:00:16 Not enough bars calculated for MA_FastHighTF_Handle. BarsCalculated = -1, i = 3 Error - 4806
2025.07.18 16:06:48.904 2022.06.01 00:00:17 Not enough bars calculated for MA_FastHighTF_Handle. BarsCalculated = -1, i = 4 Error - 4806
2025.07.18 16:06:48.904 2022.06.01 00:00:18 Not enough bars calculated for MA_FastHighTF_Handle. BarsCalculated = -1, i = 5 Error - 4806