Читаем Язык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5. Издание 2-е, исправленное и дополненное полностью

Поэтому в код необходимо включить файл ExpertSignal.mqh класса CExpertSignal, используя директиву include.

Далее должна присутствовать информация о модуле сигналов, предназначенная для мастера MQL5, которая используется для распознавания модуля сигналов мастером MQL5 при создании эксперта в окне добавления сигналов, а также при генерации самого кода эксперта.

Без этой информации мастер MQL5 просто не добавит сигнал в свой интерфейс, хотя файл сигнала и будет расположен в папке MQL5\Include\Expert\Signal.

После создания модуля сигналов редактор MetaEditor необходимо перезагрузить, чтобы сигнал добавился в мастер MQL5.

Здесь строка Title отображается в списке сигналов окна мастера MQL5, строка Page указывает на раздел справки и должна быть пустой, строки Parameter описывают методы установки параметров сигнала и используются при генерации кода советника.

Далее идет объявление параметров и методов класса модуля сигналов.

Здесь объекты m_ma* представляют скользящие средние, используемые системой Сидуса, параметр m_numberOpenPosition представляет количество баров, на которых будет проверяться пересечение скользящих средних.

Для генерации сигналов определим три модели прогноза цены — пересечение скользящими средними 5WMA и 8 WMA скользящих средних 18 ЕМА и 28 ЕМА, пересечение скользящей средней 5WMA скользящую среднюю 8 WMA, и пересечение скользящей средней 18 ЕМА скользящую среднюю 28 ЕМА.

И здесь метод ValidationSettings проверяет на корректность параметры сигнала, метод InitIndicators инициализирует объекты m_ma*.

Генерируемый эксперт будет получать сигналы модуля с помощью методов CheckOpenLong. CheckOpenShort, CheckCloseLong, CheckCloseShort, CheckReverseLong, CheckReverseShort класса CExpertSignal.

Однако эти методы, в свою очередь, формируют свои возвращаемые значения на основе значений, которые возвращаются методами LongCondition и ShortCondition нашего модуля.

Методы LongCondition и ShortCondition как раз и оперируют моделями прогноза цены.

Потому в модуле сигналов достаточно определить эти два метода.

Далее определим конструктор класса и его методы.

Здесь в методе LongCondition мы реализуем три модели прогноза цены на покупку.

И в методе ShortCondition мы реализуем три модели прогноза цены на продажу.

С помощью мастера MQL5 сгенерируем код эксперта на основе созданного модуля сигналов.

При оптимизации параметров данного эксперта на часовом графике EUR/USD получим, что эксперт лучше всего работает со следующими значениями параметров:

Signal_ThresholdOpen =20;Signal_ThresholdClose =20;Signal_MA_NumberOpenPosition =3;Signal_MA_Pattern_0 =60;Signal_MA_Pattern_1 =10;Signal_MA_Pattern_2 =100;Trailing_FixedPips_StopLevel =100;

Создание индикатора на основе модулей торговых сигналов эксперта

В качестве примера создадим индикатор на основе двух модулей сигналов SignalMA и SignalMACD, файлы которых находятся в каталоге MQL5\Include\Expert\Signal.

В мастере MQL5 создадим основу индикатора, выбрав вариант Пользовательский индикатор.

Теперь нам нужно указать свойства индикатора, а также определить функции OnInit и OnCalculate.

При создании индикатора на основе модулей торговых сигналов эксперта будем опираться на код сгенерированного с помощью MQL5 эксперта.

При работе такого эксперта, в функции OnTick, вызывается функция OnTick класса CExpert.

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

Так как функция Refresh является защищенной, а нам нужно обновлять данные модулей торговых сигналов в нашей функции OnCalculate, создадим свой класс CExpertInd, расширяющий класс CExpert.

Здесь мы просто перенесли код функции Refresh из класса CExpert, сделав функцию Refresh публичной.

Посмотрев на классы CSignalMA и CSignalMACD, мы увидим, что функции LongCondition и ShortCondition, дающие рыночные модели, вызываются на текущем баре.

Нам же нужно вызывать эти функции на всей истории символа.

Кроме того, нам нужна функция BarsCalculated, возвращающая количество рассчитанных значений в модуле сигналов.

Поэтому создадим классы CSignalMAInd и CSignalMACDInd, расширяющие классы CSignalMA и CSignalMACD.

Здесь мы определили функцию BarsCalculated, возвращающую количество рассчитанных значений в модуле сигналов.

И изменили функции LongCondition и ShortCondition, передавая в них в качестве параметра индекс бара, на котором нужно вычислить сигнал.

Тоже самое сделаем и в классе CSignalMACDInd, расширяющем класс CSignalMACD.

Определим функцию BarsCalculated, возвращающую количество рассчитанных значений в модуле сигналов.

И изменим функции LongCondition и ShortCondition, передавая в них в качестве параметра индекс бара, на котором нужно вычислить сигнал.

Перейти на страницу:

Похожие книги

Все жанры