Наверняка не один трейдер наблюдал, как во время выхода новостей пара проходит за считанные минуты от 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/
Остается только установить на график индикатор, советник и задать необходимые параметры для торговли.
Комментарии (17)
19 lorik Сообщений: 357 - Лариса
35 AM2 Автор Сообщений: 16388 - Андрей
19 lorik Сообщений: 357 - Лариса
35 AM2 Автор Сообщений: 16388 - Андрей
12 SuperLSD Сообщений: 135
35 AM2 Автор Сообщений: 16388 - Андрей
12 SuperLSD Сообщений: 135
35 AM2 Автор Сообщений: 16388 - Андрей
14 beton2011 Сообщений: 895
В индикаторе можно.
35 AM2 Автор Сообщений: 16388 - Андрей
А в советник можно добавить функцию выбора важности новости по которой будет работать советник? Редактирован: 10 декабря 2015, 11:35
14 beton2011 Сообщений: 895
13 Buff Сообщений: 401 - Артем
15 div15 Сообщений: 71 - div15
Ошибок в журнале нет. Всё установлено успешно.
Может чего изменилось за это время?
3 Lagoda Сообщений: 53
4 lbv19 Сообщений: 388
3 Lagoda Сообщений: 53
индикатор рисует линии при приближении никакого эффекта???
0 aleksey-8283 Сообщений: 1
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий