//+------------------------------------------------------------------+ //| Revers.mq4 | //| Copyright © 2009, MetaQuotes Software Corp. | //| http://www.carbonclub.ru | //+------------------------------------------------------------------+ extern double TakeProfit = 5; // ТЭЙКПРОФИТ extern double Lots = 0.02; // Сумма ставки extern double StopLoss = 70; // СТОПЛОСС extern double OrderLimitPrice = 5; // Программный СТОПЛОСС extern int StartHour = 23; // Время начала работы extern int EndHour = 5; // Окончание работы extern int MM = 2; // Множитель ставки extern int MagicNumber = 111; // Magic number extern int MaxLot = 45; // Максимальная сумма лота для отбивки int count=0; // Глобальная перемен. bool BoSpos=0; // Флаг на покупку длиной или короткой позиции. int TicketOrder; // Номер текущего убыточного ордера string Symb; // Наименование котировки. USDEUR int Lpos,LposR,Count2; // Последняя убыточная ставка. На SELL or BUY int z=0, // счетчик циклов Clost, total, // Общее кол-во ордеров POrder, // Номер текушего открытого ордера TOrder, // Номер отложенного ордера Total, // Количество ордеров в окне Tip=-1, // Тип выбран. ордера (B=0,S=1) Ticket, // Номер ордера ticket; double // Lots, // Ставка LPCOrder, // Объём закрытия последнего убыточного ордера MA_1_t, // Значен. МА_1 текущее MA_2_t, // Значен. МА_2 текущее Lot, // Колич. лотов в выбран.ордере Lts, // Колич. лотов в открыв.ордере Min_Lot, // Минимальное количество лотов Step, // Шаг изменения размера лота Free, // Текущие свободные средства One_Lot, // Стоимость одного лота PS_Lot, // Последняя стоимость пройгрышного лота Price, // Цена выбранного ордера SL, // SL выбранного ордера TP; // TP выбранного ордера bool Work, Ans=false, // Ответ сервера после закрытия Cls_B=false, // Критерий для закрытия Buy Cls_S=false, // Критерий для закрытия Sell Opn_B=false, // Критерий для открытия Buy Opn_S=false; // Критерий для открытия Sell //-------------------------------------------------------------------- int init() // Спец. ф-ия init() { Symb=Symbol(); // Название фин.инстр. return; } //-------------------------------------------------------------------- // ------------------------------------------------- // expert deinitialization function // ------------------------------------------------- int deinit() { return(0); } //-------------------------------------------------------------------- // ------------------------------------------------- // Меняет позицию на противоположную // ------------------------------------------------- int LastPosChg(int Lpos) { if (Lpos == OP_BUY) {Lpos=OP_SELL; } else {Lpos=OP_BUY; } return(Lpos); } //////////////////////////////////////////////////// //+------------------------------------------------------------------+ //| не превысили ли мы временной интервал | //+------------------------------------------------------------------+ bool CheckTimeLimit(int b, int e) { bool isEnd=false; if (b=e) { isEnd=true; } if (OrdersTotal()>0 || Work==true) { isEnd=false; } if (OrdersTotal()==0) { if (OrderSelect(TicketOrder, SELECT_BY_POS, MODE_HISTORY)==true) // Берём 1-ый ордер { if (OrderProfit()>0) // Проверка на открытые ордера { isEnd=true; } else isEnd=false; } } if (b>e) { isEnd=true; if (TimeHour(TimeCurrent())>=b) {isEnd=false;} if (TimeHour(TimeCurrent())=1) {total=1; Print("Есть совпадения, больше советнику нельзя открывать ордера по данной паре, total =",total); } else {total=0; Print("Счётчик пуст, совпадений нет total =",total);} } //--------------------------------------------------------------- 5 -- if(total<1) // Если ли открытые ордера? { if(AccountFreeMargin()<(1000*Lots)) // Есть ли деньги на счету { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // Проверка на (BUY) позицию if(BoSpos == 0) { if(Work == true) { PS_Lot=Price*MM; Lpos=LastPosChg(LposR); if (PS_Lot>=MaxLot) {Work=false; return(0);} TicketOrder=OrderSend(Symbol(),Lpos,PS_Lot,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point," =1= Order Profit BUY ",MagicNumber,0,Green); Print("PS_Lot for BUY order = ", PS_Lot); Print("COUNT = ",Clost); if (TicketOrder>0){Work=false;} } else { Clost=0; TicketOrder=OrderSend(Symbol(),Lpos,Lots,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"Standart Order BUY",MagicNumber,0,Green); Work=false; } } // Проверка на (SELL) позицию if (BoSpos == 1) { if (Work == true) { PS_Lot=Price*MM; if (PS_Lot>=MaxLot) {Work=false; return(0);} TicketOrder=OrderSend(Symbol(),Lpos,PS_Lot,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,"=1= Order Profit SELL",MagicNumber,0,Red); Print("PS_Lot for SELL order = ", PS_Lot); Print("COUNT = ",Clost); if (TicketOrder>0){Work=false;} } else { Clost=0; TicketOrder=OrderSend(Symbol(),Lpos,Lots,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,"Standart Order SELL",MagicNumber,0,Red); Work=false; } } } // it is important to enter the market correctly, // but it is more important to exit it correctly... for(count=0;count0) { if(OrderSelect(count,SELECT_BY_POS,MODE_TRADES)) { Print("BUY order closed : ",OrderClosePrice()); } } Clost++; } } // check for trailing stop /* if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()(OrderOpenPrice()+OrderLimitPrice*Point) ) // should it be closed?*/ { Count2=OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position Price=OrderLots(); // Берём значение текущей цены LposR=OrderType(); // Значение последней пройгрышной позиции BUY or SELL Work=true; // Раз профит меньше 0 тогда заводим ставку в цикл. Пока не сыграет профит. TicketOrder=OrderTicket(); // Запоминаем порядковый номер ордера Print("Ticket убыточного ордера в цикле закрытия ордеров : ",TicketOrder); if(Count2>0) { if(OrderSelect(count,SELECT_BY_POS,MODE_TRADES)) { Print("SELL order closed : ",OrderClosePrice()); } } Clost++; } // check for trailing stop /* if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } */ } } } return(0); } // the end.