//+------------------------------------------------------------------+ //| SavePos.mq4 | //| I_D | //| http://www.mymmk.com/ | //+------------------------------------------------------------------+ #property copyright "I_D" #property link "http://www.mymmk.com/" #property library //+------------------------------------------------------------------+ //| СПАСАЕМ ПОЗИЦИЮ | //| если для позиции № iTicket по проишествии iBarsInLoss баров | //| стоплосс не был перенесен в безубыток, то: | //| а) если курс в убытке - тейкпрофит на безубыток или, если не | //| можем (б.у. слишком близко к курсу), закрываем позицию; | //| б) если курс в профите - стоплосс в безубыток или, если не | //| можем (б.у. слишком близко к курсу), закрываем позицию. | //| iZepoPlus - расстояние (пунктов) от 0 (безубытка), на котором | //| устанавливаем стоплосс или тейкпрофит | //| Функция срабатывает на открытии нового бара (1 раз/бар) | //+------------------------------------------------------------------+ void SavePos(int iTicket,int iBarsInLoss,int iZepoPlus) { int i; // counter double dBid, dAsk; // проверяем переданные значения if ((iZepoPlus<0) || (iBarsInLoss<1) || (iTicket==0) ||(!OrderSelect(iTicket,SELECT_BY_TICKET))) { Print("*Спасение* позиции функцией SavePos () невозможно из-за некорректности значений переданных ей аргументов."); return(0); } if (OrderType()==OP_BUY) { dBid = MarketInfo(Symbol(),MODE_BID); // если стоплосс длинной позиции ниже курса открытия if (OrderStopLoss()=iBarsInLoss) { // если курс открытия очередного бара в зоне лоссов if (Open[0]<=OrderOpenPrice()) { // пытаемся установить тейкпрофит в безубыток + iZepoPlus пунктов if (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderOpenPrice()+iZepoPlus*Point,0,Red)) // если не вышло, закрываемся OrderClose(OrderTicket(),OrderLots(),dBid,3,Red); } // если курс открытия очередного бара в зоне профита if (Open[0]>OrderOpenPrice()) { // пытаемся установить стоплосс в безубыток if (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+iZepoPlus*Point,OrderTakeProfit(),0,Red)) // а если не получилось, закрываем позицию OrderClose(OrderTicket(),OrderLots(),dBid,3,Red); } } } } if (OrderType()==OP_SELL) { dAsk = MarketInfo(Symbol(),MODE_ASK); // если стоплосс короткой позиции выше курса открытия или стоплосс не определён if ((OrderStopLoss()>OrderOpenPrice()) || (OrderStopLoss()==0)) { // и с момента открытия прошло больше iBarsInLoss баров if (iBarShift(Symbol(),0,OrderOpenTime(),false)>=iBarsInLoss) { // если курс открытия очередного бара в зоне лоссов if (Open[0]>=OrderOpenPrice()) { // пытаемся установить тейкпрофит в безубыток + iZepoPlus пунктов if (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderOpenPrice()-(iZepoPlus+MarketInfo(Symbol(),MODE_SPREAD))*Point,0,Blue)) // если не вышло, закрываемся OrderClose(OrderTicket(),OrderLots(),dAsk,3,Blue); } // если курс открытия очередного бара в зоне профита if (Open[0]