Рекомендуемый ДЦ - Alpari !

Добрый день, Уважаемые подписчики!
Сегодня я публикую очередной урок по пришедшему мне вопросу:

Уважаемый Александр.
Имеется ли в MQL4 возможность работать с такими графическими объектами MetaTraderа, как трендовые, вертикальные и горизонтальные линии, каналы и т.д., имеющими в среде MetaTrader собственные имена и параметры? Если да — рассажите об этом в одном из своих уроков.

Давайте рассмотрим как работать с объектами MetaTraderа 4 на примере трендовой линии. Существует множество стратегий форекс, основаных на трендовых линиях. Например Стратегия форекс «3 касания» или Стратегия форекс «Trend Lines» и т.д. Обычно работают такие трговые стратегии на отскок цены от трендовой линии или на пробой трендовой линии. Рассмотрим как написать советника MT4 который будет отслеживать приближение цены к трендовой линии и открывать ордера с целью получить прибыль при ее отскоке. Конечно советник не будет полностью автоматическим. Трейдеру придется в ручную рисовать трендовую линию, но сидеть ждать подхода цены к трендовой линии будет не нужно.

Для начала определимся с параметрами, что нам нужно настраивать: — риск для расчета лота — тейкпрофит — стоплосс — расстояние от трендовой линии до установки ордера (цена может несколько пунктов не дойти до трендовой линии)

Подключим нашу библиотеку MyLib и укажем внешние параметры:
//±-----------------------------------------------------------------+
//|                                                    TrendLine.mq4 |
//|                                                Copyright c 2010. |
//|                                                http://mql4you.ru |
//±-----------------------------------------------------------------+
#property copyright "Copyright c 2010."
#property link      "http://mql4you.ru"
#include  <MyLib.mqh>
extern int    MaxRisk=2;
extern int    TakeProfit=600;
extern int    StopLoss=30;
extern int    Delta=5;
//±-----------------------------------------------------------------+
int init() {return(0);}
//±-----------------------------------------------------------------+
int deinit() {Comment();return(0);}
//±-----------------------------------------------------------------+
int
start()
{
return
(0);}
//±-----------------------------------------------------------------+

Проверим что есть трендовая линия и она в единственном экземпляре:
 if(ObjectsTotal(OBJ_TREND)!=1)
   {Comment(»Нарисуйте 1 трендовую линию!");
    return(0);}

Получим ИМЯ трендовой линии:
 for(int i=0;i<ObjectsTotal();i++)
   {string name=ObjectName(i);
    if(ObjectType(name)==OBJ_TREND) break;}

Проверим что трендовая линия нарисована правильно (по движению цены):
 datetime t1=ObjectGet(name,OBJPROP_TIME1);
 datetime t2=ObjectGet(name,OBJPROP_TIME2);
 if(t1>t2)
   {Comment("Неправильно нарисована трендовая линия!");
    return(0);}

Продолжим линию (свойство луч):
 ObjectSet(name,OBJPROP_RAY,true);

Определим тренд (вверх или вниз):
 bool trend=false;
 double p1=ObjectGet(name,OBJPROP_PRICE1);
 double p2=ObjectGet(name,OBJPROP_PRICE2);
 if(p1<p2) trend=true;

Определим текущее значение трендовой линии и сообщим ее параметры:
 double pr=ObjectGetValueByShift(name,0);
 Comment("Name=",name,"   Trend=",trend,"   Value=",pr);

Осталось подсчитать количество открытых ордеров и если их нет и цена подошла к трендовой линии открыть ордер.
Подсчитаем кол-во ордеров:
 int oBuy=0,oSell=0;
 for(i=OrdersTotal() −1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     if(OrderSymbol()==Symbol())
       {if(OrderType()==OP_BUY) oBuy++;
        if(OrderType()==OP_SELL) oSell++;}

Если нет ордеров и цена подошла к трендовой линии — откроем ордер:
 double tp=0,sl=0;
 double Lot=GetLot(MaxRisk);
 if(Lot==0.0) {Alert("Недостаточно средств!");return(0);}
 if(oBuy+oSell==0 && trend && Bid>=pr && Bid<=pr+Delta*Point)
   {if(TakeProfit>0) tp=Ask+TakeProfit*Point;
    if(StopLoss>0) sl=Ask-StopLoss*Point;
    NewOrder(OP_BUY,Lot,Ask,tp,sl);}
 if(oBuy+oSell==0 && !trend && Ask<=pr && Ask>=pr-Delta*Point)
   {if(TakeProfit>0) tp=Bid-TakeProfit*Point;
    if(StopLoss>0) sl=Bid+StopLoss*Point;
    NewOrder(OP_SELL,Lot,Bid,tp,sl);}

Советник форекс готов! Осталось его протестировать. Советники форекс подобного типа, тестируют только в визуальном режиме как в Уроке 10 «Работа с внешними индикаторами». Запустим тестирование и нарисуем трендовую линию:

Трендовая линия

Наблюдаем как идет тестирование. Вот цена подошла к трендовой линии и открылся ордер:

Открылся ордер

Далее цена развернулась и подошла к нашему профиту:

Развитие ситуации

В итоге ордер закрылся по тейкпрофиту и мы получили прибыль:

Ордер закрыт

Как видно из тестов, созданный нами эксперт МТ4, работает. Его можно использовать как для торговли, так и для тренировки умения рисовать трендовые линии в тестере стратегий Metatrader 4.

Скачать:  советник TrendLine