//+------------------------------------------------------------------+ //| Trailing.mq4 | //| I_D | //| http://www.mymmk.com/ | //+------------------------------------------------------------------+ #property copyright "I_D" #property link "http://www.mymmk.com/" #property library //+------------------------------------------------------------------+ //| ТРЕЙЛИНГ ПО ТЕНЯМ N СВЕЧЕЙ | //| Функции передаётся тикет позиции, количество баров, по теням | //| которых необходимо трейлинговать (от 1 и больше) и отступ | //| (пунктов) - расстояние от макс. (мин.) свечи, на которое | //| переносится стоплосс (от 0), trlinloss - тралить ли в лоссе | //+------------------------------------------------------------------+ void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent,bool trlinloss) { int i; // counter double new_extremum; // проверяем переданные значения if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET))) { Print("Трейлинг функцией TrailingByShadows() невозможен из-за некорректности значений переданных ей аргументов."); return(0); } // если длинная позиция (OP_BUY), находим минимум bars_n свечей if (OrderType()==OP_BUY) { for(i=1;i<=bars_n;i++) { if (i==1) new_extremum = iLow(Symbol(),tmfrm,i); else if (new_extremum>iLow(Symbol(),tmfrm,i)) new_extremum = iLow(Symbol(),tmfrm,i); } // если тралим и в зоне убытков if (trlinloss==true) { // если найденное значение "лучше" текущего стоплосса позиции, переносим if (((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) OrderModify(ticket,OrderOpenPrice(),new_extremum - indent*Point,OrderTakeProfit(),OrderExpiration()); } else { // если новый стоплосс не только лучше предыдущего, но и курса открытия позиции if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum - indent*Point)>OrderOpenPrice())) OrderModify(ticket,OrderOpenPrice(),new_extremum-indent*Point,OrderTakeProfit(),OrderExpiration()); } } // если короткая позиция (OP_SELL), находим минимум bars_n свечей if (OrderType()==OP_SELL) { for(i=1;i<=bars_n;i++) { if (i==1) new_extremum = iHigh(Symbol(),tmfrm,i); else if (new_extremum