проблемы с тестером (даже на новом 319).
напишите в сервисдеск.
понятно, bug в тестере. добавил в сервисдеск.
А я за два дня перерыл всю документацию, статьи, форум.... а все так просто решается. :-)
понятно, bug в тестере. добавил в сервисдеск.
А я за два дня перерыл всю документацию, статьи, форум.... а все так просто решается. :-)
Это - не баг тестера.
Действуйте рекомендованным в документации способом. А именно, хэндлы открывайте предварительно (в функции OnInit или в конструкторе объекта). Тогда Вы гарантированно получите рассчитанный индикатор при следующем обращении.
В тестере созданные индикаторы пересчитываются перед запуском эксперта и не пересчитываются сразу после создания. Здесь, как и в жизни, необходимо дождаться расчёта индикатора. Например, при помощи цикла с вызовом функции Sleep(10). (В тестере, кстати, хватит всего одного вызова Sleep(1000) - в этом случае, когда вы ждёте секунду и более, все индикаторы гарантированно пересчитаются)
То, что на графике Вы сразу получаете результат, это Вам просто везёт

- www.mql5.com
Это - не баг тестера.
Действуйте рекомендованным в документации способом. А именно, хэндлы открывайте предварительно (в функции OnInit или в конструкторе объекта). Тогда Вы гарантированно получите рассчитанный индикатор при следующем обращении.
В тестере созданные индикаторы пересчитываются перед запуском эксперта и не пересчитываются сразу после создания. Здесь, как и в жизни, необходимо дождаться расчёта индикатора. Например, при помощи цикла с вызовом функции Sleep(10). (В тестере, кстати, хватит всего одного вызова Sleep(1000) - в этом случае, когда вы ждёте секунду и более, все индикаторы гарантированно пересчитаются)
То, что на графике Вы сразу получаете результат, это Вам просто везёт
Спасибо, я понял Вашу стратегию, будем применять, то что возможно.
В функции OnInit далеко не всегда удобно открывать хэндлы индикаторов для больших проектов. В конструкторе класса тоже не отрабатывает корректно. Остается функция Sleep или, как написал Alexey Danilevich "Посмотрите справку по функции BarsCalculated()". Будем искать решение...
Я пока еще не настолько хорошо изучил MQL5, чтобы открывать дискуссии, поэтому будем слушать гуру и учиться дальше. :-) Удачи и успехов всем!..
Спасибо, я понял Вашу стратегию, будем применять, то что возможно.
В функции OnInit далеко не всегда удобно открывать хэндлы индикаторов для больших проектов. В конструкторе класса тоже не отрабатывает корректно. Остается функция Sleep или, как написал Alexey Danilevich "Посмотрите справку по функции BarsCalculated()". Будем искать решение...
Я пока еще не настолько хорошо изучил MQL5, чтобы открывать дискуссии, поэтому будем слушать гуру и учиться дальше. :-) Удачи и успехов всем!..
Не совсем понятно почему вам не подходит OnInit.
В любом случае, раз вы еще на стадии изучения, будет полезно и статьи почитать. Вы ведь как раз советника начинаете писать? Вот статья: Пошаговое руководство по написанию MQL5-советников для начинающих
Спасибо, я понял Вашу стратегию, будем применять, то что возможно.
В функции OnInit далеко не всегда удобно открывать хэндлы индикаторов для больших проектов. В конструкторе класса тоже не отрабатывает корректно. Остается функция Sleep или, как написал Alexey Danilevich "Посмотрите справку по функции BarsCalculated()". Будем искать решение...
Я пока еще не настолько хорошо изучил MQL5, чтобы открывать дискуссии, поэтому будем слушать гуру и учиться дальше. :-) Удачи и успехов всем!..
Вот как раз OnInit и стоит получать хендлы для индюков, еще лучше в констрторе специализированного класса.
При получении данных стоит просто проверять на инвалидность эти самые хендлы, а также данные на доступность (в том числе при помощи BarsCalculated).
Вот как раз OnInit и стоит получать хендлы для индюков, еще лучше в констрторе специализированного класса.
При получении данных стоит просто проверять на инвалидность эти самые хендлы, а также данные на доступность (в том числе при помощи BarsCalculated).
Спасибо. Я понимаю, что решить и обойти можно практически любую проблему.
Этот код я привел как простейший пример. Реально, я и пытался создавать в конструкторе класса. Я имею довольно продолжительный опыт в ООП, поэтому меня поставило в тупик другое, а именно то, что вызывая функцию, подобную вызову любого индикатора, мы подразумеваем:
1. создается объект (в данном случае поток) .
2. инициализируется с использованием исходных данных.
3. помещается в какое-либо хранилище.
4. возвращает хэндл на этот объект.
Получив хэндл, я подразумеваю, что объект готов к использованию, т.е. все его данные, все его public свойства и методы доступны. Ба, а оказывается нет! Я должен еще что то ждать и проверять "а могу ли я его использовать"....

- www.mql5.com
Не совсем понятно почему вам не подходит OnInit.
В любом случае, раз вы еще на стадии изучения, будет полезно и статьи почитать. Вы ведь как раз советника начинаете писать? Вот статья: Пошаговое руководство по написанию MQL5-советников для начинающих
А потому я не хочу получать хендлы в OnInit, что MQL5 - это объектно-ориентированный язык. Я намерен создать один раз свои классы, в которых используются индикаторы. А затем подключать эти классы в эксперты. Обычное ООП. Зачем "городить" все возможности ООП, а работать по старинке.
Придется писать свои wrappers для стандартных индикаторов, а не делать каждый раз что то подобное этому (пример из "мат.части")...
//--- попытаемся скопировать значения индикатора int i,copied=CopyBuffer(FractalsHandle,0,0,1000,Ups); if(copied<=0) { Sleep(50); for(i=0;i<100;i++) { if(BarsCalculated(FractalsHandle)>0) break; Sleep(50); } copied=CopyBuffer(FractalsHandle,0,0,1000,Ups); if(copied<=0) { Print("Не удалось скопировать верхние фракталы. Error = ",GetLastError(), "i=",i," copied= ",copied); return; } else Print("Удалось скопировать верхние фракталы.", " i = ",i," copied = ",copied); } else Print("Удалось скопировать верхние фракталы. ArraySize = ",ArraySize(Ups));
В статьях как раз описывается асинхронность модели подготовки данных.
Renat, спасибо. По данной теме я понял все. Будем, как обычно, делать из того что есть, то что хочется. (:
Если не сложно, посмотрите, пожалуйста, ветку https://www.mql5.com/ru/forum/1997 (оптимизация в Тестере стратегий). Я нашел на форуме, что летом были подобные вопросы, и Вы всех отправили или в личку или сервисдеск. Решения я так и не нашел.

- www.mql5.com

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Помогите разобраться, плиз.
Я приложил два простейших примера экспертов, которые используют индикатор.
В первом эксперте (TestMACD_1.mq5) handle индикатора объявляется как глобальная переменная, индикатор инициализируется в OnInit() и передается в функцию.
Во втором примере (TestMACD_2.mq5) handle индикатора объявляется как локальная переменная и инициализируется внутри функции.
Если "бросаем" любой из этих экспертов на график, то все работает как положено. Однако, в тестере стратегий первый эксперт отрабатывает правильно. Но при запуске второго (вызов функции CopyBuffer) возникает ошибка 4806 - Запрошенные данные не найдены.
В чем может быть проблема? Для тестирования необходимо использовать иной подход? Или тестер работает только с глобальными хэндлами?