В функции OnTick, мы вводим новые функции OnTradeSignalBuy и OnTradeSignalSell для вычисления сигналов на покупку и продажу.
И функции OnTradeSignalBuyStop и OnTradeSignalSellStop для вычисления сигналов на закрытие позиций на покупку и продажу.
Таким образом, мы должны дополнить код функции OnTick закрытием позиции на покупку и продажу.
В самом начале появления MQL5 закрытие позиции осуществлялось путем отправки противоположного ордера с тем же объемом, то есть закрытие позиции на покупку делалось путем отправки ордера на продажу с тем же объемом, и наоборот, для закрытия позиции на продажу.
То есть платформа MetaTrader 5 изначально создавалась для биржевой торговли с неттинговым учетом позиций.
При неттинговом учете по одному финансовому инструменту можно иметь только одну позицию, поэтому все дальнейшие операции по нему ведут к изменению объема, закрытию или развороту существующей позиции.
Но чтобы расширить возможности трейдеров, в платформу была добавлена вторая система учета — хеджинг.
Теперь по инструменту можно иметь множество позиций, в том числе — разнонаправленных.
Это позволяет реализовывать торговые стратегии с так называемым локированием — если цена пошла против трейдера, он имеет возможность открыть позицию в противоположном направлении.
Поэтому для надежного закрытия позиции мы используем библиотечные классы CPositionInfo и CTrade.
Поэтому включим в код файлы этих классов и создадим их экземпляры.
И в функции OnTick, мы в цикле проверяем все открытые позиции, и с помощью метода PositionClose класса CTrade закрываем позиции определенного типа.
И конечно же мы должны определить функции сигналов торговой системы, так как в методе OnTick для получения сигналов на продажу или покупку вызываются функции OnTradeSignalBuy, OnTradeSignalSell, OnTradeSignalBuyStop, OnTradeSignalSellStop.
Но сначала, перед функциями обратного вызова, мы объявляем входные параметры numberBarOpenPosition — количество баров, на которых будет проверяться пересечение 5WMA и 8 WMA туннеля из 18 ЕМА и 28 ЕМА, и numberBarStopPosition — количество баров, на которых будет проверяться пересечение 5WMA и 8 WMA и достижения ценой вершины или дна.
В функции OnTradeSignalBuy и функции OnTradeSignalSell с помощью хэндлов индикаторов заполняются динамические массивы значений индикаторов.
И на количестве баров 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, которые мы будем использовать для закрытия позиций.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии