Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 15462
- Рейтинг:
- Опубликован:
- 2020.07.21 11:42
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Введение
О стратегии Александра Элдера, использующей метод трёх экранов, не писал разве что ленивый. Она подробно описана в большинстве учебников и по ней учатся начинающие трейдеры. Стратегия имеет множество модификаций, но главная её идея остается неизменной, а особенность заключается в том, что эта торговая концепция применима на всех рынках. В этой статье я решил вспомнить старую добрую классику и показать, как эту идею я применил в автоматической торговле.Основная идея
Все мы знаем, как волнообразно ведет себя рынок, знаем об импульсах и коррекциях, поэтому я не буду на этом подробно останавливаться. Напомню лишь вкратце основную идею метода:
- На старшем временном интервале определяем направление торговли
- На среднем временном интервале ждем окончания коррекции и начала новой приливной волны
- На младшем временном интервале ищем возможность для более точного входа в рынок
Подобная фильтрация торговых операций позволяет получать стабильную прибыль при минимальных рисках.
Выбираем таймфрейм
Какие же временные интервалы являются наиболее оптимальными? Однозначного ответа на этот вопрос нет. Стратегия Александра Элдера универсальна и может применяться как для долгосрочной, так и для среднесрочной торговли и даже для скальпинга. Все зависит от того, какой из этих стилей торговли вы предпочитаете. Главное правило - временные интервалы должны отличаться друг от друга в 4-6 раз. Ниже показаны наиболее популярные интервалы для разных стилей торговли.
- Долгосрочная торговля W1/D1/H4
- Среднесрочная торговля H4/H1/M15
- Скальпинг М30/М5/М1
Это не истина в последней инстанции. При желании, трейдеры, опираясь на свой опыт работы, могут использовать свои наборы экранов.
Пишем советник
Итак, приступим. В блоке настроек укажем величину лота, отступ indent для открытия позиций и временные интервалы трех экранов. За основу я взял среднесрочную торговлю, поэтому первый экран H4 (240 минут), второй экран H1 (60 минут) и третий экран M15. Так же определим одну глобальную переменную логического типа.
//--- input parameters extern double lot = 0.1; // размер лота extern int indent = 10; // отступ от экстремумов свечей в пт extern int scr1 = 240; // 1 экран в минутах extern int scr2 = 60; // 2 экран в минутах extern int scr3 = 15; // 3 экран в минутах //--- Global variables ----------------------------------------------+ bool set;
Направление торговли мы будем определять на первом (старшем экране) H4. Для этого мы будем использовать экспоненциальную скользящую среднюю с периодом 13 и индикатор MACD(12,26,1). Логика следующая. Если столбики гистограммы индикатора MACD выше 0 и повышаются, а закрытая свеча выше скользящей средней, то это покупки. Для продаж логика обратная. Если индикаторы друг другу противоречат, то это не торговая ситуация и мы находимся вне рынка. Для определения направления движения напишем две функции:
//+------------------------------------------------------------------+ //| We buy | //+------------------------------------------------------------------+ bool SetBy() { if(iMACD(NULL,scr1,12,26,1,PRICE_CLOSE,MODE_MAIN,1)>iMACD(NULL,scr1,12,26,1,PRICE_CLOSE,MODE_MAIN,2) && iMACD(NULL,scr1,12,26,1,PRICE_CLOSE,MODE_MAIN,1)>0 && iClose(NULL,scr1,1)>iMA(NULL,scr1,13,0,MODE_EMA,PRICE_CLOSE,1)) return(true); else return(false); } //+------------------------------------------------------------------+ //| We sell | //+------------------------------------------------------------------+ bool SetSel() { if (iMACD(NULL,scr1,12,26,1,PRICE_CLOSE,MODE_MAIN,1)<iMACD(NULL,scr1,12,26,1,PRICE_CLOSE,MODE_MAIN,2) && iMACD(NULL,scr1,12,26,1,PRICE_CLOSE,MODE_MAIN,1)<0 && iClose(NULL,scr1,1)<iMA(NULL,scr1,13,0,MODE_EMA,PRICE_CLOSE,1)) return(true); else return(false); }
После того, как с направлением торговли определились, ищем сигналы на покупку или продажу на среднем экране H1. Для этого мы будем использовать всем нам хорошо знакомый индикатор Стохастик со стандартными настройками. Логика такая. Если стохастик выходит из зоны перепроданности, то покупаем, если стохастик выходит из зоны перекупленности, то продаем. Пишем для этого две функции:
//+------------------------------------------------------------------+ //| Buy signal | //+------------------------------------------------------------------+ bool SigBy() { if(iStochastic(NULL,scr2,5,3,3,MODE_SMA,0,MODE_MAIN,2)<=20 && iStochastic(NULL,scr2,5,3,3,MODE_SMA,0,MODE_MAIN,1)>20) return(true); else return(false); } //+------------------------------------------------------------------+ //| Sell signal | //+------------------------------------------------------------------+ bool SigSel() { if(iStochastic(NULL,scr2,5,3,3,MODE_SMA,0,MODE_MAIN,2)>=80 && iStochastic(NULL,scr2,5,3,3,MODE_SMA,0,MODE_MAIN,1)<80) return(true); else return(false); }
Открывать сделки будем на последнем экране M15. Логику рассмотрю на примере сигнала ПОКУПКА. После получения сигнала на экране M15 выставляем отложенный ордер BUY STOP выше максимума предыдущей свечи на величину отступа indent. StopLoss ставим ниже минимума предыдущей свечи на величину отступа indent. TakeProfit в три раза больше, чем StopLoss. Для продаж все делается с точностью наоборот. Значение TakeProfit мы будем получать при помощи следующей функции:
//+------------------------------------------------------------------+ //| Take Profit | //+------------------------------------------------------------------+ double tp() { double p = (iHigh(NULL,scr3,1) - iLow(NULL,scr3,1))/Point+3*indent; return(3*p); }
После того, как отложенный ордер установлен, логика работы советника следующая. Время жизни отложенного ордера равно временному интервалу третьего экрана. В нашем случае это 15 минут. Если по прошествии этого времени ордер не сработал, то он исчезает, и ставится новый отложенный ордер относительно вновь появившейся закрытой свечи при условии, что сигнал на покупку/продажу еще актуален. Таким образом, отложенный ордер будет следовать за ценой, пока он не сработает или пока сигнал на покупку/продажу не утратит свою актуальность. Пишем основной код советника, который реализует эту логику:
//+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ void start() { // -- checking trading conditions if (!SetBy()&&!SetSel()) {Comment("No trade"); return;} if (SetBy()) Comment("We buy"); if (SetSel()) Comment("We sell"); if (SetBy() && SigBy()) Comment("Buy signal"); if (SetSel() && SigSel()) Comment("Sell signal"); // -- placing orders if (SetBy() && SigBy() && OrdersTotal()==0) { set = OrderSend (Symbol(),OP_BUYSTOP,lot,iHigh(NULL,scr3,1)+(MarketInfo(Symbol(),MODE_SPREAD)+indent)*Point,5, iLow(NULL,scr3,1)-indent*Point,iHigh(NULL,scr3,1)+(MarketInfo(Symbol(),MODE_SPREAD)+indent)*Point+tp()*Point,NULL,0, TimeCurrent()+scr3*60,CLR_NONE); if (set) {Print("Successfully placed order Buy Stop"); return;} else {Print("OrderSend failed #", GetLastError()); return;} } if (SetSel() && SigSel() && OrdersTotal()==0) { set = OrderSend (Symbol(),OP_SELLSTOP,lot,iLow(NULL,scr3,1)-indent*Point,5,iHigh(NULL,scr3,1)+(MarketInfo(Symbol(), MODE_SPREAD)+indent)*Point,iLow(NULL,scr3,1)-indent*Point-tp()*Point,NULL,0,TimeCurrent()+scr3*60,CLR_NONE); if (set) {Print("Successfully placed order Sell Stop"); return;} else {Print("OrderSend failed #", GetLastError()); return;} } // -- exit from start return; }
Прикрепляю шаблон торговой системы и исходник советника. В этой статье мы разобрали основу, думаю тут есть потенциал для развития. Вот краткий список идей, что можно сюда добавить:
- перевод в безубыток
- частичная фиксация прибыли
- другой набор индикаторов
- поиск зоны консолидации на третьем графике
- выставление ордеров на границах зоны
- возможность работать на нескольких валютных парах
Заключение
Торговая система Александра Элдера очень хорошо подходит как для новичков, в плане знакомства с программированием на языках MQL4-5, так и для опытных программистов, в плане её дальнейшего усовершенствования, так как она очень проста для понимания в своем базовом варианте и не требует написания громоздкого и сложного кода.
![Советник на новостях OpenNewsTral .](https://c.mql5.com/i/code/expert.png)
Советник OpenNewsTral выставляет выбранные типы ордеров перед появлением новости на выбранном инструменте и использует динамический трейлингстоп и трейлингпрофит для первого рыночного ордера.
![DeGrid](https://c.mql5.com/i/code/expert.png)
Простой советник-помощник информирующий или закрывающий сетку
![Fibo Bars 3](https://c.mql5.com/i/code/indicator.png)
Трехслойный индикатор Fibo Bars 2 создателя Ивана Корнилова
![Overbought Oversold Level](https://c.mql5.com/i/code/indicator.png)
Индикатор без перерисовки уровней перекупленности / перепроданости по двум каналам Дончана.