AM2
Андрей

 
Уровень 35

  Торгую в компаниях:


Группа "Программирование на MQL"

Рейтинг 280



Как написать советник автомат, торгующий по новостям.

Наверняка не один трейдер наблюдал, как во время выхода новостей пара проходит за считанные минуты от 50 до 100 и более пунктов. И наверняка мечтал о таком советнике, который сможет на полном автопилоте, торговать в эти весьма прибыльные моменты.

Реализовать подобный эксперт оказывается не так уж и сложно, как может показаться на первый взгляд. Чтобы нам было намного проще воплотить в жизнь нашу идею, воспользуемся новостным индикатором «Urdala News» и кодом простого советника.



//+------------------------------------------------------------------+
//|                                                          NFP.mq4 |
//|                                            Copyright © 2011, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, AM2"
#property link      "http://www.forexsystems.biz"

#define MAGIC  20110406

extern int StopLoss    = 300;    //Стоплосс ордера
extern int TakeProfit  = 2000;   //Тейкпрофит ордера
extern int Trailing    = 300;    //Трейлингcтоп ордера
extern int BULevel     = 300;    //Уровень безубытка
extern int StartHour   = 14;     //Час начала торговли(терминальное время)
extern int EndHour     = 23;     //Час окончания торговли(терминальное время)
extern int Distance    = 300;    //Расстояние от цены для установки ордера
extern int Expiration  = 4;      //Время истечения ордера
extern double Lots     = 1;      //Лот

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int b,s,p,res;
   datetime expiration = TimeCurrent()+3600*Expiration;
   double BuyPrice=fND(Open[0]+Distance*Point);
   double SellPrice=fND(Open[0]-Distance*Point);  
   for (int i=OrdersTotal()-1;i>=0;i--)
     {
      if (OrderSelect(i, SELECT_BY_POS))
        {  
         if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC) continue;
         if (OrderType()==OP_BUYSTOP) b++;
         if (OrderType()==OP_SELLSTOP) s++;
         if (OrderType()==OP_BUY||OrderType()==OP_SELL) p++;
        }  
     }
   if(p>0) DelAllStop();
   if (BULevel!=0) BU();
   if(Trailing>0) Trail();
   if(Hour()==EndHour) ClosePositions();  
   if(Hour()>=StartHour && b<1 && p<1 && DayOfWeek()==5 && Day()<=7)
     {              
       res=OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,0,fND(BuyPrice-StopLoss*Point),fND(BuyPrice+TakeProfit*Point),"",MAGIC,expiration,Blue);      
     }  
        
   if(Hour()>=StartHour && s<1 && p<1 && DayOfWeek()==5 && Day()<=7)
     {              
       res=OrderSend(Symbol(),OP_SELLSTOP,Lots,SellPrice,0,fND(SellPrice+StopLoss*Point),fND(SellPrice-TakeProfit*Point),"",MAGIC,expiration,Red );
     }  
//----  
   return(0);
  }
//+------------------------------------------------------------------+
double fND(double d, int n=-1)
  {  
   if (n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }
//+------------------------------------------------------------------+
void ClosePositions()
  {
   for (int i=OrdersTotal()-1;i>=0;i--)
    {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol())
       {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC)
          {
            if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, 3, Blue);
            if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, 3, Red);
          }
      }
    }
  }
//+------------------------------------------------------------------+
void DelAllStop()
{
  for (int i=0; i<OrdersTotal(); i++)
   {                                              
     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
         if (OrderSymbol()!=Symbol()||OrderMagicNumber()!=MAGIC) continue;
         if (OrderType()==OP_BUYSTOP||OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket());
      }  
   }
}
//-------------------------------------------------------------------+
void Trail()
{
   for (int i=0; i<OrdersTotal(); i++)
     {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      if (OrderSymbol()==Symbol()||OrderMagicNumber()==MAGIC)
       if(OrderType()==OP_BUY)
         {
           if(Trailing>0)  
            {                
              if(Bid-OrderOpenPrice()>Point*Trailing)
               {
                 if(OrderStopLoss()<Bid-Point*Trailing)
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*Trailing,OrderTakeProfit(),0,Green);
                  }
               }
            }
         }
        
        if(OrderType()==OP_SELL)
         {
           if(Trailing>0)  
            {                
              if((OrderOpenPrice()-Ask)>(Point*Trailing))
               {
                 if((OrderStopLoss()>(Ask+Point*Trailing)) || (OrderStopLoss()==0))
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*Trailing,OrderTakeProfit(),0,Red);
                  }
               }
            }
         }  
   }
}
//+------------------------------------------------------------------+
void BU()
{
   for(int i=0; i<OrdersTotal(); i++)
      {
       if(OrderSelect(i, SELECT_BY_POS))
        {      
         if(OrderType()==OP_BUY)
          {
           if(OrderOpenPrice()<=(Bid-BULevel*Point)&&OrderOpenPrice()>OrderStopLoss())
            {      
             OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
            }
          }
            
         if(OrderType() == OP_SELL)
          {
           if(OrderOpenPrice()>=(Ask+BULevel*Point)&&OrderOpenPrice()<OrderStopLoss())
            {
             OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Red);
            }
          }
        }
      }
}
//--------------------------------------------------------------------+


Советник выставляет отложенные ордера, на некотором расстоянии от цены а индикатор скачивает с сайта файл с новостями и рисует линиями на графике предстоящие и прошедшие новости.


Рис. 1. Вид индикатора на графике.

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


double News=iCustom(Symbol(),0,"News",MinDo,MinPosle,ChasPoyas,0,0);


где:

TimeDo — время для срабатывания до ближайшей новости в минутах.
TimePosle — время для выхода из режима срабатывания после последней новости в минутах.
ChasPoyas — часовой пояс вашего терминала.( например для Альпари = 1)

Если функция возвращает 1, то есть срабатывание в выбранном временном интервале. Если 0, то срабатывания нет.

Настройки индикатора:


    MinDo=30;                 // Срабатывание минут до новости
    MinPosle= 30;             // Срабатывание минут после новости
    ChasPoyasServera=1;       // Часовой пояс. 0-GMT
    Vhigh=true;               // Установка важности новостей(показывать важные новости)
    Vmedium=true;             // Установка важности новостей(показывать новости средней важности)
    Vlow=true;                // Установка важности новостей(показывать новости низкой важности)
    RisovatLini=true;         // Рисовать линии?
    Next=false;               // Рисовать только линии будущих новостей?
    Signal=false;             // Сигналить о предстоящей новости?
    high= Red;                // Цвет важных новостей
    medium= Yellow;           // Цвет обычных новостей
    low= Lime;                // Цвет незначительных новостей
    Style=2;                  // Стиль линии



Рис. 2. Результат работы исходной версии советника.

В советнике изменим некоторые внешние переменные и условие для входа.

Настройки советника:

extern int StopLoss    = 300;    // Стоплосс ордера
extern int TakeProfit  = 2000;   // Тейкпрофит ордера
extern int Trailing    = 300;    // Трейлингcтоп ордера
extern int BULevel     = 300;    // Уровень безубытка
extern int MinDo       = 15;     // Срабатывание минут до новости 
extern int MinPosle    = 0;      // Срабатывание минут после новости
extern int ChasPoyas   = 1;      // Часовой пояс. 0-GMT
extern int Distance    = 300;    // Расстояние от цены для установки ордера
extern int Expiration  = 4;      // Время истечения ордера
extern double Lots     = 1;      // Лот


Условие для выставления ордеров у нас сейчас будет выглядеть следующим образом:


   if(b<1 && p<1 && News>0)
     {              
       res=OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,0,fND(BuyPrice-StopLoss*Point),fND(BuyPrice+TakeProfit*Point),"",MAGIC,expiration,Blue);      
     }  
        
   if(s<1 && p<1 && News>0)
     {              
       res=OrderSend(Symbol(),OP_SELLSTOP,Lots,SellPrice,0,fND(SellPrice+StopLoss*Point),fND(SellPrice-TakeProfit*Point),"",MAGIC,expiration,Red );
     }  


Функция для закрытия ордеров и условие закрытия сделки в конце дня, в предыдущей версии советника нам больше не понадобятся, поэтому из можно смело убрать из кода эксперта.

//+------------------------------------------------------------------+
void ClosePositions()
  {
   for (int i=OrdersTotal()-1;i>=0;i--)
    {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol())
       {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC)
          {
            if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, 3, Blue);
            if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, 3, Red);
          }
      }
    }
  }
//+------------------------------------------------------------------+


if(Hour()==EndHour) ClosePositions();



Рис. 3. Результат работы советника по индикатору после оптимизации.

Вот и практически все. Наш новостной эксперт готов!
Индикатор и советник можете найти в базе: www.opentraders.ru/downloads/513/
Остается только установить на график индикатор, советник и задать необходимые параметры для торговли.
  • +1
  • Просмотров: 19037
  • 22 ноября 2014, 18:30
  • AM2
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Программирование на MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Советник "Gerchik Trader Bot"
Следующая запись в группе  
Проверка торговой стратегии
01 ноября 2014
04 декабря 2014

Брокер для ваших роботов, 15 лет на рынке

Комментарии (17)

+
0
На тестере попробовала, ни одной сделки не открыл советник
avatar

  19  lorik Сообщений: 357 - Лариса

  • 22 ноября 2014, 19:36
+
0
что пишет в журнале? индикатор должен быть под именем «News»
avatar

  35  AM2 Автор Сообщений: 16388 - Андрей

  • 22 ноября 2014, 20:10
+
0
пишет Cannot open file 'C:\Program Files\InstaTrader\MQL4\indicators\News.ex4' [2]
avatar

  19  lorik Сообщений: 357 - Лариса

  • 23 ноября 2014, 09:45
+
0
переименуйте индикатор в News
avatar

  35  AM2 Автор Сообщений: 16388 - Андрей

  • 23 ноября 2014, 11:27
+
0
все равно не тестит(
avatar

  12  SuperLSD Сообщений: 135

  • 23 ноября 2014, 21:49
+
0
файл индикатора скомпилировали?
avatar

  35  AM2 Автор Сообщений: 16388 - Андрей

  • 23 ноября 2014, 22:02
+
0
да конечно
avatar

  12  SuperLSD Сообщений: 135

  • 23 ноября 2014, 22:18
+
0
тогда давай по скайпу посмотрим. я только что по ене оптил и гонял нормально все
avatar

  35  AM2 Автор Сообщений: 16388 - Андрей

  • 23 ноября 2014, 22:24
+
0
А можно как то сделать так в советнике чтобы можно было выбрать важность новости. Очень интересно погонять советник только на важных новостях :) 
avatar

  14  beton2011 Сообщений: 895

  • 10 декабря 2015, 10:33
+
0
А можно как то сделать так в советнике чтобы можно было выбрать важность новости. Очень интересно погонять советник только на важных новостях


В индикаторе можно.
avatar

  35  AM2 Автор Сообщений: 16388 - Андрей

  • 10 декабря 2015, 11:26
+
0
Это я знаю, сам уже давно пользуюсь этим индикатором, только у меня новее версия индикатора.

А в советник можно добавить функцию выбора важности новости по которой будет работать советник?
Редактирован: 10 декабря 2015, 11:35
avatar

  14  beton2011 Сообщений: 895

  • 10 декабря 2015, 11:35
+
0
Ребята тесты в студию
avatar

  13  Buff Сообщений: 401 - Артем

  • 23 ноября 2014, 21:06
+
0
классная идея. надо развивать.
avatar

  15  div15 Сообщений: 71 - div15

  • 23 ноября 2014, 22:18
+
0
У меня на тестере открывает, а на демо не открывает. И индикатор News не показывает новостей ( 
Ошибок в журнале нет. Всё установлено успешно.
Может чего изменилось за это время?
avatar

  3  Lagoda Сообщений: 53

  • 17 апреля 2015, 22:43
+
0
К новостям нельзя ничего прикручивать, очень глупо.
avatar

  4  lbv19 Сообщений: 388

  • 18 апреля 2015, 06:44
+
0
Это к чему сказано?
avatar

  3  Lagoda Сообщений: 53

  • 18 апреля 2015, 09:43
+
0
советник не открывает ордера почему?
индикатор рисует линии при приближении никакого эффекта???
avatar

  0  aleksey-8283 Сообщений: 1

  • 8 января 2018, 14:40

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий