Скачать MetaTrader 5

Тестер стратегий. Помогите разобраться с ошибкой.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Много подписчиков на сигнале? Задумайся о платной подписке!
Henadiy E. Batohov
326
Henadiy E. Batohov 2010.09.02 16:27 

Помогите разобраться, плиз.

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

В первом эксперте (TestMACD_1.mq5) handle индикатора объявляется как глобальная переменная, индикатор инициализируется в OnInit() и передается в функцию.

Во втором  примере (TestMACD_2.mq5) handle индикатора объявляется как локальная переменная и инициализируется внутри функции.

Если "бросаем" любой из этих экспертов на график, то все работает как положено. Однако, в тестере стратегий первый эксперт отрабатывает правильно. Но при запуске второго (вызов функции CopyBuffer) возникает ошибка 4806 - Запрошенные данные не найдены.

В чем может быть проблема? Для тестирования необходимо использовать иной подход? Или тестер работает только с глобальными хэндлами? 

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
Файлы:
o_o
Модератор
23692
o_o 2010.09.02 17:23  

проблемы с тестером (даже на новом 319).

напишите в сервисдеск. 

Henadiy E. Batohov
326
Henadiy E. Batohov 2010.09.02 17:48  

понятно, bug в тестере. добавил в сервисдеск.

А я за два дня перерыл всю документацию, статьи, форум.... а все так просто решается. :-)

Slawa
Модератор
6840
Slawa 2010.09.02 18:09  
Batohov:

понятно, bug в тестере. добавил в сервисдеск.

А я за два дня перерыл всю документацию, статьи, форум.... а все так просто решается. :-)

Это - не баг тестера.

Действуйте рекомендованным в документации способом. А именно, хэндлы открывайте предварительно (в функции OnInit или в конструкторе объекта). Тогда Вы гарантированно получите рассчитанный индикатор при следующем обращении.

В тестере созданные индикаторы пересчитываются перед запуском эксперта и не пересчитываются сразу после создания. Здесь, как и в жизни, необходимо дождаться расчёта индикатора. Например, при помощи цикла с вызовом функции Sleep(10). (В тестере, кстати, хватит всего одного вызова Sleep(1000) - в этом случае, когда вы ждёте секунду и более, все индикаторы гарантированно пересчитаются)

То, что на графике Вы сразу получаете результат, это Вам просто везёт

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
Henadiy E. Batohov
326
Henadiy E. Batohov 2010.09.02 20:11  
stringo:

Это - не баг тестера.

Действуйте рекомендованным в документации способом. А именно, хэндлы открывайте предварительно (в функции OnInit или в конструкторе объекта). Тогда Вы гарантированно получите рассчитанный индикатор при следующем обращении.

В тестере созданные индикаторы пересчитываются перед запуском эксперта и не пересчитываются сразу после создания. Здесь, как и в жизни, необходимо дождаться расчёта индикатора. Например, при помощи цикла с вызовом функции Sleep(10). (В тестере, кстати, хватит всего одного вызова Sleep(1000) - в этом случае, когда вы ждёте секунду и более, все индикаторы гарантированно пересчитаются)

То, что на графике Вы сразу получаете результат, это Вам просто везёт

 

Спасибо, я понял Вашу стратегию, будем применять, то что возможно.

В  функции OnInit далеко не всегда удобно открывать хэндлы индикаторов для больших проектов. В конструкторе класса тоже не отрабатывает корректно. Остается функция Sleep или, как написал Alexey Danilevich "Посмотрите справку по функции BarsCalculated()". Будем искать решение...

Я пока еще не настолько хорошо изучил MQL5, чтобы открывать дискуссии, поэтому  будем слушать гуру и учиться дальше. :-) Удачи и успехов всем!..

Alexey Da
Модератор
6599
Alexey Da 2010.09.03 10:56  
Batohov:

Спасибо, я понял Вашу стратегию, будем применять, то что возможно.

В  функции OnInit далеко не всегда удобно открывать хэндлы индикаторов для больших проектов. В конструкторе класса тоже не отрабатывает корректно. Остается функция Sleep или, как написал Alexey Danilevich "Посмотрите справку по функции BarsCalculated()". Будем искать решение...

Я пока еще не настолько хорошо изучил MQL5, чтобы открывать дискуссии, поэтому  будем слушать гуру и учиться дальше. :-) Удачи и успехов всем!..

Не совсем понятно почему вам не подходит OnInit.

В любом случае, раз вы еще на стадии изучения, будет полезно и статьи почитать. Вы ведь как раз советника начинаете писать? Вот статья: Пошаговое руководство по написанию MQL5-советников для начинающих

Vladimir Batrudinov
4924
Vladimir Batrudinov 2010.09.03 14:20  
Batohov:

Спасибо, я понял Вашу стратегию, будем применять, то что возможно.

В  функции OnInit далеко не всегда удобно открывать хэндлы индикаторов для больших проектов. В конструкторе класса тоже не отрабатывает корректно. Остается функция Sleep или, как написал Alexey Danilevich "Посмотрите справку по функции BarsCalculated()". Будем искать решение...

Я пока еще не настолько хорошо изучил MQL5, чтобы открывать дискуссии, поэтому  будем слушать гуру и учиться дальше. :-) Удачи и успехов всем!..

Вот как раз OnInit и стоит получать хендлы для индюков, еще лучше в констрторе специализированного класса.

При получении данных стоит просто проверять на инвалидность эти самые хендлы, а также данные на доступность (в том числе при помощи BarsCalculated).

Henadiy E. Batohov
326
Henadiy E. Batohov 2010.09.09 18:02  
Interesting:

Вот как раз OnInit и стоит получать хендлы для индюков, еще лучше в констрторе специализированного класса.

При получении данных стоит просто проверять на инвалидность эти самые хендлы, а также данные на доступность (в том числе при помощи BarsCalculated).

Спасибо. Я понимаю, что решить и обойти можно практически любую проблему.

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

1. создается объект (в данном случае поток) .

2. инициализируется  с использованием исходных данных.

3. помещается в какое-либо хранилище.

4. возвращает хэндл на этот объект.

Получив хэндл, я подразумеваю, что объект готов к использованию, т.е. все его данные, все его public свойства и методы доступны. Ба, а оказывается нет! Я должен еще что то ждать и проверять "а могу ли я его использовать"....

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
Henadiy E. Batohov
326
Henadiy E. Batohov 2010.09.09 19:11  
alexvd:

Не совсем понятно почему вам не подходит 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));

 

MetaQuotes
Админ
24944
Renat Fatkhullin 2010.09.09 19:21  
В статьях как раз описывается асинхронность модели подготовки данных.
Henadiy E. Batohov
326
Henadiy E. Batohov 2010.09.10 11:50  
Renat:
В статьях как раз описывается асинхронность модели подготовки данных.

Renat, спасибо. По данной теме я понял все. Будем, как обычно, делать из того что есть, то что хочется. (:

Если не сложно, посмотрите, пожалуйста, ветку https://www.mql5.com/ru/forum/1997 (оптимизация в Тестере стратегий). Я нашел на форуме, что летом были подобные вопросы, и Вы всех отправили или в личку или сервисдеск. Решения я так и не нашел.

Оптимизация в Тестере стратегий
Оптимизация в Тестере стратегий
  • www.mql5.com
из которых ТОЛЬКО 546 ms было затрачено именно на тестирование эксперта.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий