Есть ли ограничение на количество уровней вложенности ресурсов при компиляции MQL5-программ?

 

Всем привет!

Занят сейчас разработкой советника и индикаторов «ZigZag» для MT5. У меня получается вот такая трехэтажная конструкция.

В самом низу находится базовый индикатор «ZigZag 1» по оригинальному алгоритму, который просто строит индикатор на текущем ТФ.

Далее этот индикатор встраивается в качестве ресурса при компиляции и вызывается из индикатора второго уровня «ZigZag 2 MTF». Как следует из его названия это мультитаймфреймовый вариант, т.е. его можно бросить, например, на график H1 и заказать построение зигзага для любого ТФ старше H1, например, H2, H3, H4 и т.д. Кроме того, он же генерирует сигналы Buy/Sell для дальней передачи их советнику.

Последний заключительный уровень – это сам советник «ZigZag 3», который также включает в себя индикатор «ZigZag 2 MTF» в качестве ресурса при компиляции советника.

У меня вопрос – имеет ли право на существование такая трехэтажная конструкция? Спрашиваю потому, что советник «ZigZag 3» не получает сигналы Buy/Sell от встроенного в него индикатора «ZigZag 2 MTF» (поступают пустые значения EMPTY_VALUE), хотя встроенный индикатор второго уровня все рисует на экране, в том числе стрелки по этим сигналам.

Все проверил, но никак не могу найти ошибку, вот и начал сомневаться в количестве уровней вложенности ресурсов при компиляции.
Есть ли ограничение на количество уровней вложенности ресурсов при компиляции MQL5-советников и индикаторов?

 
Eugene Myzrov:

У меня вопрос – имеет ли право на существование такая трехэтажная конструкция? Спрашиваю потому, что советник «ZigZag 3» не получает сигналы Buy/Sell от встроенного в него индикатора «ZigZag 2 MTF» (поступают пустые значения EMPTY_VALUE), хотя встроенный индикатор второго уровня все рисует на экране, в том числе стрелки по этим сигналам.

Все проверил, но никак не могу найти ошибку, вот и начал сомневаться в количестве уровней вложенности ресурсов при компиляции.
Есть ли ограничение на количество уровней вложенности ресурсов при компиляции MQL5-советников и индикаторов?

В принципе - должно работать, но там много нюансов. Например, не используются ли события OnChartEvent - они транслируются только в программы непосредственно, нанесенные на чарт, а не созданные из них программно. Как именно получаются сигналы?

Не слишком ли длинный путь ресурсов получается? - вроде там были ограничения и что-то может не подгружаться, но тогда по идее в логе должны были бы быть ошибки. Посмотрите на всякий случай этот раздел книги.

Следует иметь в виду, что подход с вложенными индикаторами не особо эффективный по потреблению ресурсов и скорости выполнения - желательно перенести все расчеты в один индикатор или еще лучше в сам эксперт.

Учебник по MQL5: Расширенные средства языка / Ресурсы / Подключение пользовательских индикаторов как ресурсов
Учебник по MQL5: Расширенные средства языка / Ресурсы / Подключение пользовательских индикаторов как ресурсов
  • www.mql5.com
Для работы MQL-программ может потребоваться один или несколько пользовательских индикаторов. Все они могут быть включены в исполняемый ex5-файл как...
 
Eugene Myzrov:

Всем привет!

У меня вопрос – имеет ли право на существование такая трехэтажная конструкция?

У меня нет ответа, есть рекомендация.

Не использовать трёхэтажную конструкцию в советнике. Вызывайте обычный индикатор, но с того таймфрема который вам надо.

Если вам нужны линии индикатора со старшего таймфрема на младшем, то можно в индикаторе добавить рисование линий графическими объектами.

Вот пример советник торгует на 1Н,  опираясь на  FVG с 4Н

Вот так выглядят графические объекты на 1Н

а так выглядит индикатор на 4Н

12


В итоге у вас есть привычны доступ к данным индикаторных буферов и отображение индикатора на младшем тайме.


ЗЫ. Заодно когда вы попытаетесь нарисовать обычному зигзагу ноги объектами OBJ_TREND, вы увидите как часто он перерисовывает и то, что он рисует в онлайне, сильно отличается от того, что он нарисует, например после переключения тф.

 
Stanislav Korotky #:

В принципе - должно работать, но там много нюансов. Например, не используются ли события OnChartEvent - они транслируются только в программы непосредственно, нанесенные на чарт, а не созданные из них программно. Как именно получаются сигналы?

Не слишком ли длинный путь ресурсов получается? - вроде там были ограничения и что-то может не подгружаться, но тогда по идее в логе должны были бы быть ошибки. Посмотрите на всякий случай этот раздел книги.

Следует иметь в виду, что подход с вложенными индикаторами не особо эффективный по потреблению ресурсов и скорости выполнения - желательно перенести все расчеты в один индикатор или еще лучше в сам эксперт.

1) нет, события OnChartEvent не используются;
2) нет, путь для ресурсов не слишком длинный (во всяком случает компилятор не ругается и в логе ошибок нет);
3) буду думать над подходом без вложения одного индикатора в другой...

   спасибо...

Учебник по MQL5: Расширенные средства языка / Ресурсы / Подключение пользовательских индикаторов как ресурсов
Учебник по MQL5: Расширенные средства языка / Ресурсы / Подключение пользовательских индикаторов как ресурсов
  • www.mql5.com
Для работы MQL-программ может потребоваться один или несколько пользовательских индикаторов. Все они могут быть включены в исполняемый ex5-файл как...
 
Eugene Myzrov #:

1) 
2) нет, путь для ресурсов не слишком длинный (во всяком случает компилятор не ругается и в логе ошибок нет);
3) 

На самом деле, в логе ошибок может и не быть, но во всех 3-х программах нужно после всех вызовов проверять _LastError.

 

Еще не было сказано, как эта конфигурация проверяется - в каких условиях проблемы - в тестере (в каком режиме), онлайн или еще как?

Лучше всего приложить упрощенный исходник, воспроизводящий проблему, потому что легко допустить ошибку, например, с чтением показаний не того бара (тем более, что речь о МТФ), не в том порядке "as series", какой ожидался, и т.д.

 
Aleksandr Slavskii #:

У меня нет ответа, есть рекомендация.

Не использовать трёхэтажную конструкцию в советнике. Вызывайте обычный индикатор, но с того таймфрема который вам надо.

Если вам нужны линии индикатора со старшего таймфрема на младшем, то можно в индикаторе добавить рисование линий графическими объектами.

Вот пример советник торгует на 1Н,  опираясь на  FVG с 4Н

Вот так выглядят графические объекты на 1Н

а так выглядит индикатор на 4Н

В итоге у вас есть привычны доступ к данным индикаторных буферов и отображение индикатора на младшем тайме.

ЗЫ. Заодно когда вы попытаетесь нарисовать обычному зигзагу ноги объектами OBJ_TREND, вы увидите как часто он перерисовывает и то, что он рисует в онлайне, сильно отличается от того, что он нарисует, например после переключения тф.

1) у меня был первый вариант индикатора, построенный на графических объектах, но я отказался от графических объектов в пользу индикаторных буферов, т.к. в планах тестировать советник в тестере стратегий; индикатор ZigZag использует оригинальный алгоритм, в котором конечно есть определенная задержка отрисовки, но зато без перерисовки;

2) у меня получилась трехэтажная конструкция - это если считать вместе с советником, т.е. советник обращается внутри себя как к ресурсу к индикатору ZZ2 (он генерирует сигналы для советника), а сам индикатор ZZ2 в свою очередь обращается внутри себя как к ресурсу к индикатору ZZ1, который создает некие уровни на старшем ТФ, при пересечении которых ZZ2 и генерирует сигналы. Как видите, если сделать оба индикатора самостоятельными ресурсами (не вложенными друг в друга), и оба их вызывать из советника, то придется алгоритм генерации сигналов перенести в советник, а это не есть хорошо - все-таки задача советника торговать поступившие к нему сигналы, сопровождать открытые позиции и др., а генерировать сигналы - это удел индикаторов...

За рекомендации спасибо...

 
Eugene Myzrov #:

1) но я отказался от графических объектов в пользу индикаторных буферов, т.к. в планах тестировать советник в тестере стратегий;

Я предлагал И, но это уже не важно, так как я не верно понял основную задачу -  рассчитывать сигнал не в советнике.

Ну насколько мне позволяет мой совсем не большой опыт, то я полагаю вы, что то делаете не так, так как вложенность индикаторов не должна стать причиной отказа работать индикатора в советнике, но это не точно)))

 

Действительно, после нескольких манипуляций, в частности перестановки местами (перенумерации) индикаторных буферов, советник получил непустые значения сигналов. Поэтому я делаю вывод, что вложенность индикаторов не была причиной отказа работы индикатора в советнике, но саму причину отказа я пока назвать не берусь.

Значит на свой вопрос, вынесенный в заголовок "Есть ли ограничение на количество уровней вложенности ресурсов при компиляции MQL5-программ?" ответ отрицательный.

Таким образом одну проблему решить удалось - теперь советник получает сигналы от индикатора и открывает сделки в режиме онлайн.
Но вот засада - в тестере стратегий с такими же настройками советник отказывается торговать. Было такое у кого-нибудь в своей практике?

 
Eugene Myzrov #:

Но вот засада - в тестере стратегий с такими же настройками советник отказывается торговать. Было такое у кого-нибудь в своей практике?

Для начала убедитесь в наличии #property tester_everytick_calculate в индикаторах или попробуйте запустить тест в визуальном режиме.

 
Eugene Myzrov #:

Таким образом одну проблему решить удалось - теперь советник получает сигналы от индикатора и открывает сделки в режиме онлайн.
Но вот засада - в тестере стратегий с такими же настройками советник отказывается торговать. Было такое у кого-нибудь в своей практике?

Угу. К экстрасенсам это не тут, это тудысь)))

Наводящие вопросы.

Тестируете в каком режиме? на OHLC , на сгенерированных тиках али на реальных?

Советник в своих сигналах нуждается в расчётах на каждом тике, али только открытия свечей?

Вариантов, что советник не хочет работать в тестере не много, но есть.

А вообще, наилучший вариант, поставить нужную дату в OnTick(), например дату когда открылась позиция на демо, я вставляю такую

   if(TimeCurrent() >= D'2023.01.20 00:00:00')
      Sleep(1);

Поставить точку остановки на Sleep и по быстренькому пробежать в тестере до этой даты. А потом по шагам. 

Другого  рецепта у меня нет.