//+------------------------------------------------------------------+ //| TrailingByTime.mq4 | //| I_D | //| http://www.mymmk.com/ | //+------------------------------------------------------------------+ #property copyright "I_D" #property link "http://www.mymmk.com/" #property library //+------------------------------------------------------------------+ //| ТРЕЙЛИНГ ПО ВРЕМЕНИ | //| Функции передаётся тикет позиции, интервал (минут), с которым, | //| передвигается стоплосс и шаг трейлинга (на сколько пунктов | //| перемещается стоплосс, trlinloss - тралим ли в убытке | //| (т.е. с определённым интервалом подтягиваем стоп до курса | //| открытия, а потом и в профите, либо только в профите) | //+------------------------------------------------------------------+ void TrailingByTime(int ticket,int interval,int trlstep,bool trlinloss) { // проверяем переданные значения if ((ticket==0) || (interval<1) || (trlstep<1) || !OrderSelect(ticket,SELECT_BY_TICKET)) { Print("Трейлинг функцией TrailingByTime() невозможен из-за некорректности значений переданных ей аргументов."); return(0); } double minpast; // кол-во полных минут от открытия позиции до текущего момента double times2change; // кол-во интервалов interval с момента открытия позиции (т.е. сколько раз должен был быть перемещен стоплосс) double newstop; // новое значение стоплосса (учитывая кол-во переносов, которые должны были иметь место) // определяем, сколько времени прошло с момента открытия позиции minpast = (TimeCurrent() - OrderOpenTime()) / 60; // сколько раз нужно было передвинуть стоплосс times2change = MathFloor(minpast / interval); // если длинная позиция (OP_BUY) if (OrderType()==OP_BUY) { // если тралим в убытке, то отступаем от стоплосса (если он не 0, если 0 - от открытия) if (trlinloss==true) { if (OrderStopLoss()==0) newstop = OrderOpenPrice() + times2change*(trlstep*Point); else newstop = OrderStopLoss() + times2change*(trlstep*Point); } else // иначе - от курса открытия позиции newstop = OrderOpenPrice() + times2change*(trlstep*Point); if (times2change>0) { if ((newstop>OrderStopLoss()) && (Bid>=(newstop + MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))) OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()); } } // если короткая позиция (OP_SELL) if (OrderType()==OP_SELL) { // если тралим в убытке, то отступаем от стоплосса (если он не 0, если 0 - от открытия) if (trlinloss==true) { if (OrderStopLoss()==0) newstop = OrderOpenPrice() - times2change*(trlstep*Point) - MarketInfo(Symbol(),MODE_SPREAD)*Point; else newstop = OrderStopLoss() - times2change*(trlstep*Point) - MarketInfo(Symbol(),MODE_SPREAD)*Point; } else newstop = OrderOpenPrice() - times2change*(trlstep*Point) - MarketInfo(Symbol(),MODE_SPREAD)*Point; if (times2change>0) { if (((OrderStopLoss()==0) || (OrderStopLoss()