Обсуждение статьи "Создание многомодульных советников"

 

Опубликована статья Создание многомодульных советников:

Язык программирования MQL позволяет реализовать концепцию модульного проектирования торговых стратегий. В статье показан пример создания многомодульного советника, состоящего из отдельно скомпилированных файловых модулей.

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

  • Модуль №1 — модуль управления капиталом. На выходе он дает размер лота.
  • Модуль №2 — модуль сопровождения позиции и установки SL. На выходе он дает расстояние до стоп-лосса в пунктах от цены открытия позиции.
  • Модуль №3 — модуль сопровождения позиции и установки TP. На выходе он дает расстояние до тейк-профита в пунктах от цены открытия позиции.
  • Модуль №4 — модуль сопровождения позиции и установки трейлинг-стопа. На выходе он дает расстояние до стоп-лосса в пунктах от текущей цены.
  • Модуль №5 — модуль генерации торговых сигналов. На выходе он дает значение сигнала.
  • Модуль №6 — модуль фильтрации торговых сигналов. На выходе он дает значение фильтра.
  • Модуль №7 — модуль сопровождения позиции и установки уровня безубытка. На выходе он дает расстояние до стоп-лосса от цены открытия позиции.


Рис. 2. Функция OnInit() и инициализация внешних модулей

Автор: Sergey Pavlov

 
Какой необычный тезис "Вспомогательный (внешний) модуль — это индикатор", а автор проводил тестирование быстродействия и особенно потребления ресурсов такой конструкцией?
 

Многомодульность торговой системы определяется прежде всего природой процесса (для финансовых рынков движение цен - это нестационарный процесс).

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

 
Aleksandr Masterskikh:

Многомодульность торговой системы определяется прежде всего природой процесса (для финансовых рынков движение цен - это нестационарный процесс).

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

Да-да, такой подход, думаю, применяет большинство - реализуют через функции и классы, в крайнем случае подключают просто кусок кода из другого файла. Мне то как раз интересно, в чем преимущество обработки данных в индикаторах по сравнению с вышеописанными подходами.

 
модулность ради модульности?
выносить тралл и без убыток в 2 разных отдельных модуля? серьезно?
автор видимо никогда не занимался оптимизацией, особенно в Мт4.
Большинство пишет такими методами, простейшие функции выносят в отдельный модуль вызываемый за один тик десятки раз.
Подобные решения увеличивают время оптимизации от десятков до тысяч раз.
 
Aleksey Vyazmikin:
Какой необычный тезис "Вспомогательный (внешний) модуль — это индикатор", а автор проводил тестирование быстродействия и особенно потребления ресурсов такой конструкцией?

Статья как раз и родилась после того, как я столкнулся с проблемой быстродействия одного индикатора. Он пожирал ресурсы и время тестирования. А так как он использовался для генерации торговых сигналов, то вместо него я сделал внешний модуль (сигнальный индикатор), который ничего не рисовал. В итоге советник с внешним модулем "залетал", хотя все расчёты остались в полном объёме.

Согласен с Вами в одном, что любая технология имеет свои накладные расходы. Здесь нужен компромисс и выбрать что важнее. Иногда важнее скрыть алгоритм, а не производительность. Хотя при модульном программировании производительность и снижается, но не критично. На рисунке "повесил" все внешние модули на один график:


Потом, проверил загрузку компа самим советником: в режиме работы без внешних модулей и с ними. Результат удовлетворительный:


Затем запустил в тестере стратегий.

Без внешних модулей:

2018.03.26 06:32:23.684 Core 1  EURUSD,M1: 2378530 ticks, 24349 bars generated. Environment synchronized in 0:00:00.140. Test passed in 0:00:07.769 (including ticks preprocessing 0:00:00.171).


И с внешними модулями:

2018.03.26 06:33:49.859 Core 1  EURUSD,M1: 2378530 ticks, 24349 bars generated. Environment synchronized in 0:00:00.047. Test passed in 0:00:06.349.

Как видно, с внешними модулями тестирование закончилось быстрее.

Цель статьи: показать как можно скрыть свои алгоритмы используя их в чужих кодах.

 
Nikolay Khrushchev:
модулность ради модульности?
выносить тралл и без убыток в 2 разных отдельных модуля? серьезно?
...

В статье показана технология модульного программирования: любую необходимую функцию или группу функций можно спрятать во внешнем модуле (модулях).

 
Sergey Pavlov:

Статья как раз и родилась после того, как я столкнулся с проблемой быстродействия одного индикатора. Он пожирал ресурсы и время тестирования. А так как он использовался для генерации торговых сигналов, то вместо него я сделал внешний модуль (сигнальный индикатор), который ничего не рисовал. В итоге советник с внешним модулем "залетал", хотя все расчёты остались в полном объёме.

Согласен с Вами в одном, что любая технология имеет свои накладные расходы. Здесь нужен компромисс и выбрать что важнее. Иногда важнее скрыть алгоритм, а не производительность. Хотя при модульном программировании производительность и снижается, но не критично. На рисунке "повесил" все внешние модули на один график:


Потом, проверил загрузку компа самим советником: в режиме работы без внешних модулей и с ними. Результат удовлетворительный:


Затем запустил в тестере стратегий.

Без внешних модулей:


И с внешними модулями:

Как видно, с внешними модулями тестирование закончилось быстрее.

Цель статьи: показать как можно скрыть свои алгоритмы используя их в чужих кодах.

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

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

 
Aleksey Vyazmikin:

Да-да, такой подход, думаю, применяет большинство - реализуют через функции и классы, в крайнем случае подключают просто кусок кода из другого файла. Мне то как раз интересно, в чем преимущество обработки данных в индикаторах по сравнению с вышеописанными подходами.

Важно различать:

- модульность программы (когда одна простая модель разбивается на модули)

- и модульность сложной модели (где каждый модуль - это независимая модель).


Любой традиционный индикатор - это простая модель, а нужна сложная модель,

так как простой модели недостаточно для получения достаточной точности

отображения процесса.

 
Aleksandr Masterskikh:

Важно различать:

- модульность программы (когда одна простая модель разбивается на модули)

- и модульность сложной модели (где каждый модуль - это независимая модель).


Любой традиционный индикатор - это простая модель, а нужна сложная модель,

так как простой модели недостаточно для получения достаточной точности

отображения процесса.

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

Приведите пример сложной модели заложенной в индикаторе.

 

Мне, как не проффесианалу было позновательно. Хорошая статья для начинающих.

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

Как пример, вместо кода:

 if(on_lot)
     { // If there is an additional module
      double buffer_m1[];
      ArraySetAsSeries(buffer_m1,true);
      if(CopyBuffer(handle_m1,0,0,1,buffer_m1)<0) return;
      lot=buffer_m1[0];
     }

код:

 if(on_lot)
     { 
        LotCulcFuntion(lot);//А функция реализованна в отдельном файле.
     }

P.S. Имена модульных индикаторов в главном файле, не совпадают с названиями файлов. В главном модуле нужно довавить "_ind". Например, должно быть: "Module_training_module_Filter_ind" ,  а не "Module_training_module_Filter"