//+----------------------------------------------------------------------------------------------------------------------+
//| ------------------Прочитать перед компиляцией------------- |
//| Советник работает в канале образованном двумя линиями Name_the_top_line(Имя верхней линии) и Name_of_the_bottom_line|
//| (Имя нижней линии).Если цена находится в верхней половине между линиями, то выставляется Селл, если в нижней |
//| половине, то Бай. Линии рисуются вручную на графике трендовыми линиями, потом переименовываются. |
//| Если переменная Тейкпрофит=0, то ТР выставляется внутри канала, ближе к ордеру чем дальняя линия на 1 пункт + спрэд, |
//| СЛ ставится за дальней линией, на 1 пункт+спрэд, если переменная Тейкпрофит не равна 0, то ТР=Тейкпрофит |
//| Есть встроеный тралл, который переменной UseTrailing можно включить/выключить. |
//| TrailingStop - растояние с которого начинаем тралить, TrailingStep - шаг тралла. |
//| Количество ордеров задается переменной Sum_orders. Так же можно задать обьем лота переменной Lots. |
//+----------------------------------------------------------------------------------------------------------------------+
#property copyright "Игорь Александров"
#property link "
[email protected]"
extern string Name_the_top_line="11111"; //Имя верхней линии
extern string Name_of_the_bottom_line="22222"; //Имя нижней линии
extern int Всего_ордеров_на_счете=10;//Кол-во выставляемых ордеров на счете
extern int Всего_ордеров_на_инструменте=10;//Кол-во выставляемых ордеров
extern string Order_Comment = "Поставлен роботом"; //Коментарий для ордера
extern double Lots =1; // Объем лота
extern int Тейкпрофит=10;//Тейкпрофит
//+----------------------------------------------------------------------+
//+ трейлинг-стоп +
extern bool UseTrailing = true; //включение/выключение T-SL
extern int TrailingStop = 35; // Фиксированный размер трала
extern int TrailingStep = 2; // Шаг трала
//+ трейлинг-стоп +
//+----------------------------------------------------------------------+
//+-------------------------------------------------------------------------------------------------------------------+
//| Функция трейлинг стоп лосс |
void T_SL()
{
int i=0;
if(!UseTrailing) return;
for(i=0; i<OrdersTotal(); i++)
{
if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderType()==OP_BUY)
{
if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(TrailingStop*Point,Digits))
{
if(NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-(TrailingStop+TrailingStep-1)*Point,Digits))
{
OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*Point,Digits), OrderTakeProfit(), 0, CLR_NONE);
}
} //end if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(TrailingStop*Point,Digits))
} //end if(OrderType()==OP_BUY)
if(OrderType()==OP_SELL)
{
if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)>NormalizeDouble(TrailingStop*Point,Digits))
{
if(NormalizeDouble(OrderStopLoss(),Digits)>NormalizeDouble(Ask+(TrailingStop+TrailingStep-1)*Point,Digits))
{
OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point,Digits), OrderTakeProfit(), 0, CLR_NONE);
}
} //end if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)>NormalizeDouble(TrailingStop*Point,Digits))
} //end if(OrderType()==OP_SELL)
} //end for(i=0; i<OrdersTotal(); i++)
} //end void T_SL()
//| Конец функции трейлинг стоп лосс |
//+-------------------------------------------------------------------------------------------------------------------+
//-------------------------------------------Стартуем--------------------------------------------------------------
int start()
{
//+------------------------------------------------------------
//| Обьявляем локальные переменные
int Total; //Количество рабочих ордеров открытых данным экспертом
int Total_all ; //Кол-во ордеров на счете
int TotalBuy ; //Кол-во рабочих ордеров Buy
int TotalSell ; //Кол-во рабочих ордеров Sell
int Ticket_Order_Buy; //Тикет открытого ордера Бай
int Ticket_Order_Sell; //Тикет открытого ордера Селл
int STOP_LEVER; //Минимальное растояние для TP и SL
double Lots_Order_Buy; //Объем открытого ордера Бай
double Lots_Order_Sell; //Объем открытого ордера Селл
double tp; //ТР открываемого ордера
double sl; //СЛ открываемого ордера
bool Open_Buy=false; //Флаг открытия ордера Бай
bool Open_Sell=false; //Флаг открытия ордера Селл
//| Конец объявления локальных переменных
//+-----------------------------------------------------------
//----
for(int i = 0; i < OrdersTotal(); i ++) //Выбираем общее кол-во открытых и отложенных ордеров
{
//-----------------Перебираем рабочие ордера-------
if (OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующий рабочий
{ // Анализ ордеров
Total_all++; //Всего ордеров на счете
if(OrderSymbol()!=Symbol()) continue; // Не наш фин. инструм.
Total++; // Счётчик рыночных ордеров установленных данным экспертом
//-------------------------Проверяем ордера Бай----------------
if (OrderType()==OP_BUY) //Перебираем все рабочие ордера BUY
{
TotalBuy ++; // считаем их кол-во
Lots_Order_Buy=OrderLots(); // запоминаем его объем
Ticket_Order_Buy= OrderTicket(); //запоминаем его тикет
}
//---------------------------Проверяем ордера Селл-----------------
if(OrderType() == OP_SELL) //Перебираем все рабочие ордера SELL
{
TotalSell++; // считаем их кол-во
Lots_Order_Sell=OrderLots(); // запоминаем его объем
Ticket_Order_Sell= OrderTicket(); //запоминаем его тикет
}
}//end if (OrderSelect(i,SELECT_BY_POS)==true)
//---------------Конец перебора рабочих ордеров----------------------
}// end for(int i = 0; i < OrdersTotal(); i ++)
//--------------------------------------------------------------------------------------------------------------------------
if((TotalBuy+TotalSell)<Всего_ордеров_на_инструменте&&Total_all<Всего_ордеров_на_счете) //Если рабочих ордеров меньше заданного кол-ва, то считаем дальше
{
//+--------------------------------------------------------------------
//| Определяем торговые критерии и уровень стоп приказов
if(ObjectFind(Name_the_top_line)==-1)return;//Если нет верхней линии выходим из старт
if(ObjectFind(Name_of_the_bottom_line)==-1)return;//Если нет нижней линии выходим из старт
if((ObjectGetValueByShift(Name_the_top_line, 0)-Ask)<0)return;//Если Ask выше верхней линии выходим из старт
if((Bid-ObjectGetValueByShift(Name_of_the_bottom_line, 0))<0)return;//Если Bid ниже нижней линии выходим из старт
int Spread=MarketInfo(Symbol(),MODE_SPREAD);//Запрашиваем спред в пунктах
int STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);//Запрашиваем минимально допустимый уровень стоп-лосса/тейк-профита в пунктах
if((ObjectGetValueByShift(Name_the_top_line, 0)-Ask)>(Bid-ObjectGetValueByShift(Name_of_the_bottom_line, 0)))
{//Если растояние от верхней линии до Аск больше растояния от нижней линии до Бид,то
Open_Buy=true; //поднимаем флаг открытия ордера Бай
tp=ObjectGetValueByShift(Name_the_top_line,0)-(1+Spread)*Point;//Тр ставим ниже цены верхней линии на 1+Spread пунктов
if((tp-Ask)/Point<STOPLEVEL)//Если Тр на расстоянии меньше минимально допустимого, то
{
tp=Ask+STOPLEVEL*Point;//Тр устанавливаем на минимально допустимом расстоянии
}
sl=ObjectGetValueByShift(Name_of_the_bottom_line,0)-(1+Spread)*Point;//СЛ ставим ниже цены нижней линии на 1+Spread пунктов
if((Bid-sl)/Point<STOPLEVEL)//Если СЛ на расстоянии меньше допустимого, то
{
sl=Bid-STOPLEVEL*Point;//СЛ устанавливаем на минимально допустимом расстоянии
}
}//end if((ObjectGetValueByShift(Name_the_top_line, 0)-Ask)>(Bid-ObjectGetValueByShift(Name_of_the_bottom_line, 0)))
if((ObjectGetValueByShift(Name_the_top_line, 0)-Ask)<(Bid-ObjectGetValueByShift(Name_of_the_bottom_line, 0)))
{//Если растояние от верхней линии до Аск меньше растояния от нижней линии до Бид,то
Open_Sell=true; //поднимаем флаг открытия ордера Селл
tp=ObjectGetValueByShift(Name_of_the_bottom_line,0)+(1+Spread)*Point;//Тр ставим выше цены нижней линии на 1+Spread пунктов
if((Bid-tp)/Point<STOPLEVEL)//Если Тр на расстоянии меньше минимально допустимого, то
{
tp=Bid-STOPLEVEL*Point;//Тр устанавливаем на минимально допустимом расстоянии
}
sl=ObjectGetValueByShift(Name_the_top_line,0)+(1+Spread)*Point;//СЛ ставим выше цены верхней линии на 1+Spread пунктов
if((sl-Ask)/Point<STOPLEVEL)//Если СЛ на расстоянии меньше допустимого, то
{
sl=Ask+STOPLEVEL*Point;//СЛ устанавливаем на минимально допустимом расстоянии
}
} //end if((ObjectGetValueByShift(Name_the_top_line, 0)-Ask)<(Bid-ObjectGetValueByShift(Name_of_the_bottom_line, 0)))
//| Конец определения торговых критериев и уровня стоп приказов
//+--------------------------------------------------------------------
}//end if((TotalBuy+TotalSell)<Sum_orders)
//+--------------------------------------------------------------------
//| Установка ордеров
if((TotalBuy+TotalSell)<Всего_ордеров_на_инструменте&&Total_all<Всего_ордеров_на_счете) //Если рабочих ордеров меньше заданного кол-ва, то считаем дальше
{
if(Open_Buy&&!Open_Sell)
{
if(Тейкпрофит>0){
tp=Ask+Тейкпрофит*Point;
if((tp-Ask)/Point<STOPLEVEL)//Если Тр на расстоянии меньше минимально допустимого, то
{
tp=Ask+STOPLEVEL*Point;//Тр устанавливаем на минимально допустимом расстоянии
}
}//end if(Тейкпрофит>0){
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,sl,tp,Order_Comment,0,0,CLR_NONE);
return;
}//end if(Open_Buy&&!Open_Sell)
if(Open_Sell&&!Open_Buy)
{
if(Тейкпрофит>0){
tp=Bid-Тейкпрофит*Point;
if((Bid-tp)/Point<STOPLEVEL)//Если Тр на расстоянии меньше минимально допустимого, то
{
tp=Bid-STOPLEVEL*Point;//Тр устанавливаем на минимально допустимом расстоянии
}
}//end if(Тейкпрофит>0){
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,sl,tp,Order_Comment,0,0,CLR_NONE);
return;
}//end if(Open_Sell&&!Open_Buy)
}//end if((TotalBuy+TotalSell)<Sum_orders)
//| Конец установки ордеров
//+--------------------------------------------------------------------
//----
T_SL();//Обращение к функции трала
return(0);
}//end int start()
//+------------------------------------------------------------------+