Помогите определиться с понятием трейлинг-стопа...

 

Скачал библиотеку трейлинг - стопов TrailingFuncLib.mq4 с библиотеки кодэбазе. 

Отредактировал стандартный tral_stop.mqh инклюда учебника трейлингом из этой библиотеки по 2-м ATR.

//--------------------------------------------------------------------
// Tral_Stop.mqh
//
// ТРЕЙЛИНГ ПО 2-ум ATR (Average True Range, Средний истинный диапазон)  
// период АТR и коэффициент, на который умножается ATR. Т.о. стоплосс "тянется" на расстоянии
// ATR х N от текущего курса; перенос - на новом баре (т.е. от цены 
// открытия очередного бара). Выбирается из двух АТР максимальный, чтобы из-за возможной           
// низкой волатильности рынка, дерганьем цены не выбило лося.
//--------------------------------------------------------------- 1 --
// Функция модификации StopLoss всех ордеров указанного типа
// Глобальные переменные:
// Mas_Ord_New             Массив ордеров последний известный
// int TralingStop         Значение TralingStop(количество пунктов)
//--------------------------------------------------------------- 2 --
int Tral_Stop(int Tip)
  {
   int Ticket;                      // Номер ордера
   double
   Price,                           // Цена открытия рыночного ордера
   TS,                              // TralingStop (относит.знач.цены)
   SL,                              // Значение StopLoss ордера
   TP;                              // Значение TakeProfit ордера
   bool Modify;                     // Признак необходимости модифи.
   
   double curr_atr1;                // текущее значение ATR - 1
   double curr_atr2;                // текущее значение ATR - 2
   double best_atr;                 // большее из значений ATR
   double atrXmul;                  // результат умножения большего из ATR на множитель
   double newstop;                  // новый стоплосс
//--------------------------------------------------------------- 3 --
   for(int i=1;i<=Mas_Ord_New[0][0];i++)  // Цикл по всем ордерам
     {                                    // Ищем ордера задан. типа
      if (Mas_Ord_New[i][6]!=Tip)         // Если это не наш тип..
         continue;                        //.. то переступим ордер
      Modify=false;                       // Пока не назначен к модифи
      Price =Mas_Ord_New[i][1];           // Цена открытия ордера
      SL    =Mas_Ord_New[i][2];           // Значение StopLoss ордера
      TP    =Mas_Ord_New[i][3];           // Значение TakeProft ордера
      Ticket=Mas_Ord_New[i][4];           // Номер ордера
      //if (TralingStop<Level_new)          // Если меньше допустимого..
      //   TralingStop=Level_new;           // .. то допустимый
      //   TS=TralingStop*Point;               // То же в относит.знач.цены
      //--------------------------------------------------------- 4 --
       // текущее значение ATR-1, ATR-2
   curr_atr1 = iATR(Symbol(),0,ATRPeriod_1,0);
   curr_atr2 = iATR(Symbol(),0,ATRPeriod_2,0);
   
   // большее из значений
   best_atr = MathMax(curr_atr1,curr_atr2);
   
   // после умножения на множитель
   atrXmul = best_atr * Mul;      
      
      switch(Tip)                         // Переход на тип ордера
        {
         case 0 :                         // Ордер Buy
                                          // откладываем от текущего курса новый стоплосс
                                          // модифицируем его
               SL=Bid-atrXmul;            // Новый его StopLoss
               Modify=true;               // Назначен к модифи.
              
            break;                        // Выход из switch
         case 1 :                         // Ордер Sell
                                          // откладываем от текущего курса новый стоплосс
                                          // модифицируем его
               SL=Ask+atrXmul;            // Новый его StopLoss
               Modify=true;               // Назначен к модифи.
              
        }                                 // Конец switch
      if (Modify==false)                  // Если его не надо модифи..
         continue;                        // ..то идём по циклу дальше
      bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифицируем его!
      //--------------------------------------------------------- 5 --
      if (Ans==false)                     // Не получилось  
        {                                 // Поинтересуемся ошибками:
         if(Errors(GetLastError())==false)// Если ошибка непреодолимая
            return;                       // .. то уходим.
         i--;                             // Понижение счётчика
        }
      Terminal();                         // Функция учёта ордеров 
      Events();                           // Отслеживание событий
     }
   return;                                // Выход из пользов. функции
  }
//--------------------------------------------------------------- 6 --

Получается, что трейлинг-стоп передвигается как в сторону повышения, так и в сторону понижения. Я понимаю, что трейлинг-стоп движется только в 

одну сторону за трендом (если - бай - то вверх, если - селл - то вниз). А здесь получается, что открывается позиция (бай), устанавливается стоп-лосс, если 

цена идет в сторону стоп-лосса, то он посредством данной функции тр-стопа может отодвигаться на большее расстояние от первоначального размещения...

Допустим был стоп-лосс при открытии бай: 1,42345, цена пошла вниз - стоп-лосс стал 1,42000.

Или если цена идет вверх при "бай", тр-стоп также на расстоянии АТР*коэфф. движется вверх, цена развернулась и пошла вниз - тр-стоп также на расстоянии АТР*коэфф. пошел вниз, пока случайным сильным движением цены не будет выбит.

Если я правильно понимаю, то подобные движения трейлинг-стопа противоречат его определению - лоси не увеличиваются от первоначальных на сделке и 

трейлинг стоп идет строго по тренду за ценой: если "бай" - то строго вверх, если "селл" - то строго вниз... Т.е. ф-ия изначально была не доработана, тре-

буется правка кода... Я все правильно по этому вопросу понимаю? Будет время проконсультируйте... 

Библиотеку трейлингов прилагаю.

Файлы: