динамические массивы значений индикаторов.
И на количестве баров numberBarOpenPosition проверяется пресечение 5WMA и 8 WMA туннеля из 18 ЕМА и 28 ЕМА.
В функции OnTradeSignalBuyStop и функции OnTradeSignalSellStop с помощью хэндлов индикаторов заполняются динамические массивы значений индикаторов и на количестве баров numberBarStopPosition проверяется пресечение 5WMA и 8 WMA и достижения ценой вершины или дна.
После компиляции советника в клиентском терминале нажмем правой кнопкой мышки на советнике и выберем Тестировать.
Попробуем оптимизировать параметры numberBarOpenPosition и numberBarStopPosition.
В результате оптимизации получим максимальный профит при значении numberBarOpenPosition = 11, и при значении numberBarStopPosition=4.
При изменении параметра цены индикаторов на PRICE_WEIGHTED показатель прибыли улучшается.
Условие достижения рынком дна или вершины можно заменить на горизонтальность линии EMA.
MathAbs (WMA5Buffer [1] — WMA5Buffer [numberBarStopPosition-1]) <0.001
И можно убрать действие сигналов TradeSignalBuyStop и TradeSignalSellStop и работать только на достижение Take Profit или Stop Loss.
Пример создания эксперта с использованием ООП
В предыдущем примере советника выделим функции OnCheckTradeInit, OnCheckTradeTick, OnTradeSignalBuy, OnTradeSignalBuyStop, OnTradeSignalSell, OnTradeSignalSellStop, а также код открытия и закрытия позиции в отдельные классы.
Проверочные функции OnCheckTradeInit и OnCheckTradeTick выделим в класс CheckTrade.
В этом классе мы объявляем два метода OnCheckTradeInit и OnCheckTradeTick.
В методе OnCheckTradeInit класса мы запрашиваем трейдера для запуска эксперта на реальном счете.
Затем мы проверяем соединение к серверу, отсутствие запрета торговли на стороне сервера, и отсутствие запрета брокером автоматической торговли.
И наконец, мы проверяем корректность объема, с которым мы собираемся выйти на рынок.
В методе OnCheckTradeTick мы проверяем соединение к серверу, включена ли кнопка авто-торговли в клиентском терминале, есть ли разрешение на торговлю с помощью эксперта в общих свойствах самого эксперта, и наступление события Margin Call.
Далее мы проверяем наступление события Stop Out и проверяем размер свободных средств на счете, доступных для открытия позиции.
И затем мы контролируем спред брокера, проверяем наличие ограничений на торговые операции по символу, установленные брокером, и проверяем достаточно ли баров в истории для расчета советника.
Код открытия и закрытия позиции выделим в класс Trade.
Здесь мы объявляем переменные экземпляра класса — стоплосс, тейкпрофит и объем торговли в лотах.
Также мы объявляем объекты библиотечных классов CPositionInfo и CTrade, которые мы будем использовать для закрытия позиций.
И здесь мы объявляем метод Order открытия позиции.
В методе Order мы используем входные параметры метода как флаги на открытие или закрытие позиции на покупку или продажу.
И функции сигналов торговой системы мы выделим в класс Sidus.
Здесь мы объявляем переменные экземпляра класса — хэндлы используемых индикаторов и их буферы.
И в конструкторе класса мы их инициализируем.
И мы также объявляем и реализуем методы вычисления сигналов на открытие или закрытие позиции на покупку или продажу.
В результате выделения функций в отдельные классы код советника существенно сократится.
Здесь мы сначала включаем файлы созданных нами классов с помощью директивы include.
Затем мы объявляем входные параметры советника и создаем экземпляры классов, передавая в конструкторы классов соответствующие входные параметры.
В методе OnInit советника мы просто теперь вызываем метод OnCheckTradeInit класса CheckTrade.
В методе OnTick советика для проверок мы вызываем метод OnCheckTradeTick класса CheckTrade.
И после получения исторических данных символа, мы вычисляем сигналы торговой системы, используя методы класса Sidus.
И отправляем запрос на ордер с помощью класса Trade.
Тестирование советников
Встроенный тестер терминала MetaTrader 5 позволяет протестировать и оптимизировать входные input параметры советника с использованием исторических данных финансовых инструментов.
Открыть тестер можно, нажав правой кнопкой мышки на советнике в окне Навигатор терминала и в контекстном меню выбрав Тестировать.
Также тестер можно открыть в меню Вид терминала с помощью команды Тестер стратегий.
Тестирование является многопоточным и проводится с помощью специальных сервисов-агентов, которые представлены тремя типами.
Это локальные агенты, устанавливаемые вместе с клиентским терминалом.
И число локальных агентов равно числу логических ядер процессора компьютера, которые используются агентами параллельно, поэтому при тестировании задействуются все доступные ресурсы компьютера.
Также для тестирования можно использовать локальные сетевые агенты, установленные на других компьютерах вместе с клиентскими терминалами.
Компьютеры должны быть соединены в локальную сеть, после чего создается ферма агентов с помощью менеджера агентов в меню Сервис терминала и производится подключение агентов во вкладе Агенты тестера терминала.
Локальные сетевые агенты также могут быть установлены на компьютере отдельно от торговой платформы с помощью файла metatester64.exe. Локальные сетевые агенты можно устанавливать только в 64-битных системах.
Еще один тип агентов это облачные агенты, использование которых платное и подключить которые также можно во вкладе Агенты тестера терминала.
Окно тестера позволяет выбрать интервал тестирования, финансовый инструмент для тестирования, если он явно не задан в советнике, временной период финансового инструмента, включить оптимизацию входных параметров советника, визуальный режим тестирования и др.
При включении визуального режима тестирования с помощью флажка Визуализация, на графике показываются используемые советником индикаторы.
Вкладка Бэктест окна тестера показывает результаты тестирования советника.
Для максимальной приближенности к условиям реальной торговли, при тестировании можно выбрать режим «Произвольная задержка», «Каждый тик на основе реальных тиков».
Быстро провести оптимизацию входных параметров можно в режиме «Форвард: 1/4», «Без задержки», «Только цены открытия».
«Только цены открытия» — расчет ведется только по ценам открытия баров.
Форвард-тестированием называется повторный прогон советника на другом временном периоде.
Такая возможность предусмотрена для исключения подгонки параметров советников на определенных участках исторических данных.
С включением этой опции история котировок валют и акций делится на две части.
Непосредственно оптимизация