Правильно ли написана функция трейлинг стопа

 

При тестировании, когда модифицируется ордер (трейлинг стоп), возникает ошибка №1, при чем возникает только на ордерах типа BUY. Подскажите пожалуйста где допущена ошибка.

void DoTrail() {
   for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {
      if (OrderSelect(l_pos_8, SELECT_BY_POS, MODE_TRADES)){
      if (OrderSymbol() == Symbol()) {
         if (OrderType() == OP_BUY) {
            if (OrderMagicNumber() == BuyMagic) {
               if (Bid - TrailingStop * Point> OrderOpenPrice() && OrderOpenPrice() > OrderStopLoss()) { 
                  if (!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TrailingStop * Point, OrderTakeProfit(), 0, Pink)) Print("It is impossible to modify order №" + IntegerToString(OrderTicket()) + ". Error № " + IntegerToString(GetLastError()));
               } else {
                  if (OrderStopLoss() > OrderOpenPrice() && Bid - OrderStopLoss() >= TrailingStop * Point)
                     if (!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TrailingStop * Point, OrderTakeProfit(), 0, Pink)) Print("It is impossible to modify order №" + IntegerToString(OrderTicket()) + ". Error № " + IntegerToString(GetLastError()));
               }
            }
         } else {
            if (OrderType() == OP_SELL) {
               if (OrderMagicNumber() == SellMagic) {
                  if (Ask + TrailingStop * Point*Slippage < OrderOpenPrice() && (OrderStopLoss() > OrderOpenPrice() || OrderStopLoss() == 0.0)) {
                     if (!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TrailingStop * Point, OrderTakeProfit(), 0, Pink)) Print("It is impossible to modify order №" + IntegerToString(OrderTicket()) + ". Error № " + IntegerToString(GetLastError()));
                   } else {
                     if (OrderStopLoss() < OrderOpenPrice() && OrderStopLoss() - Ask >= TrailingStop )
                        if (!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TrailingStop * Point, OrderTakeProfit(), 0, Pink)) Print("It is impossible to modify order №" + IntegerToString(OrderTicket()) + ". Error № " + IntegerToString(GetLastError()));
                     }
                  }
               }
            }
         }
      }
   }
}
 

А зачем по два раза пытаться модифицировать ордер? Не лучше ли сначала всё проверить, а уже потом один раз отослать приказ на модификацию?

И зачем вообще велосипед стопитцотый раз придумывать, когда столько примеров уже есть в кодобазе?

А ещё у вас вариант для трала продаж с ошибками.

 
Vitalie Postolache:

А зачем по два раза пытаться модифицировать ордер? Не лучше ли сначала всё проверить, а уже потом один раз отослать приказ на модификацию?

И зачем вообще велосипед стопитцотый раз придумывать, когда столько примеров уже есть в кодобазе?

Да, есть много примеров функций трейлинг стопа, но все же хотелось разобраться что не так с этой функцией. Почему же на ордерах типа BUY, при модификации, возникает ошибка №1?
 
Tatiana Zyrianova:
Да, есть много примеров функций трейлинг стопа, но все же хотелось разобраться что не так с этой функцией. Почему же на ордерах типа BUY, при модификации, возникает ошибка №1?
Потому, что вы не проверяете перед модификацией значение текущего стоплосса и пытаетесь то же самое значение отослать.
 
Vitalie Postolache:
Потому, что вы не проверяете перед модификацией значение текущего стоплосса и пытаетесь то же самое значение отослать.
Спасибо, разобралась!
Причина обращения: