//+------------------------------------------------------------------+ //| Trailing_By_Object.mq4 | //| Copyright © Evgeniy Trofimov, 2010 | //| http://vkontakte.ru/id5374887/ | //+------------------------------------------------------------------+ #property copyright "Copyright © Evgeniy Trofimov, 2009" #property link "http://www.mql4.com/ru/users/EvgeTrofi" extern int Ticket = 0; // - Номер позиции, которую нужно модифицировать. Если 1, то все позиции по текущему инструменту extern string NameObject = ""; // - Наименование линии, на графике цены, по которой скользим StopLoss или отложенный ордер extern int SleepPage = 30; // - Точность закрытия позиции в пунктах extern int SparePips = 50; // - Запас в пунктах - расстояние на которое ордер сработает позднее extern bool CloseExtern = true; // - Закрывать открытую позицию сразу после пересечения линии extern bool OunlyOrders = false; // - Советник работает только на отложенные ордера (Sell Stop или Buy Stop) extern bool TrailingTP = false; // - Двигать TakeProfit в отложенных ордерах double Spare; //+------------------------------------------------------------------+ int start() { int x1,x2; double y1,y2, Price; string txt; int positions[], j; if(ObjectFind(NameObject)==0) {//Объект в окне графика цены x1=GetBar(ObjectGet(NameObject,OBJPROP_TIME1)); y1=ObjectGet(NameObject,OBJPROP_PRICE1); x2=GetBar(ObjectGet(NameObject,OBJPROP_TIME2)); y2=ObjectGet(NameObject,OBJPROP_PRICE2); Price = y2-(x2-0)*(y2-y1)/(x2-x1); if(Ticket==0){ txt=""; }else if(Ticket==1){ txt="\nAll tickets"; for (int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ if(OrderSymbol()==Symbol()){ ArrayResize(positions, j+1); positions[j]=OrderTicket(); j++; } } }//Next i for(i=0; iOrderStopLoss()+Spare){ if(IsTradeAllowed()){ OrderModify(myTicket, OrderOpenPrice(), NormalizeDouble(Price-Spare, Digits), OrderTakeProfit(), 0); } } } if(CloseExtern){ if(Price-Spare>Bid) { if(IsTradeAllowed()) { OrderClose(myTicket, OrderLots(), MarketInfo(Symbol(),MODE_BID), SleepPage); } } } } case OP_SELL: if(OunlyOrders==false){ if(Price>Ask+StopLevel){ if(OrderStopLoss()>Price+Spread+Spare) { if(IsTradeAllowed()) { OrderModify(myTicket, OrderOpenPrice(), NormalizeDouble(Price+Spread+Spare, Digits), OrderTakeProfit(), 0); } } } if(CloseExtern){ if(Bid>Price+Spare){ if(IsTradeAllowed()){ OrderClose(myTicket, OrderLots(), MarketInfo(Symbol(),MODE_ASK), SleepPage); } } } } case OP_BUYSTOP: if(Price>Ask+StopLevel){ if(OrderOpenPrice()>Price+Spread+Spare) { Delta=OrderOpenPrice()-(Price+Spread+Spare); if(Delta>NormalizeDouble(SleepPage*Point,Digits)){ if(IsTradeAllowed()){ Print("Попытка модификации ордера "+myTicket+" на цену "+DoubleToStr(OrderOpenPrice()-Delta, Digits)); if(OrderTakeProfit()>0) if(TrailingTP) tp=NormalizeDouble(OrderTakeProfit()-Delta, Digits); else tp=OrderTakeProfit(); else tp=0; if(OrderStopLoss()>0) sl=NormalizeDouble(OrderStopLoss()-Delta, Digits); else sl=0; OrderModify(myTicket, NormalizeDouble(OrderOpenPrice()-Delta, Digits), sl, tp, 0); } } } } case OP_SELLSTOP: if(PriceNormalizeDouble(SleepPage*Point,Digits)){ if(IsTradeAllowed()){ Print("Попытка модификации ордера "+myTicket+" на цену "+DoubleToStr(OrderOpenPrice()+Delta, Digits)); if(OrderTakeProfit()>0) if(TrailingTP) tp=NormalizeDouble(OrderTakeProfit()+Delta, Digits); else tp=OrderTakeProfit(); else tp=0; if(OrderStopLoss()>0) sl=NormalizeDouble(OrderStopLoss()+Delta, Digits); else sl=0; OrderModify(myTicket, NormalizeDouble(OrderOpenPrice()+Delta, Digits), sl, tp, 0); } } } } } } }//Move() //+------------------------------------------------------------------+ bool OrderExist(string fSymbol="", int fTicket=0) { int total = OrdersTotal(); for (int i = total-1; i >= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol()==fSymbol || fSymbol=="") { if(OrderTicket()==fTicket) { return(true); } } // Если свой } // Next i return(false); }//OrderExist() //+------------------------------------------------------------------+ int GetBar(datetime TimeBar, int start=0){ for(int i=start; i