В чем ошибка? Почему не действует?

 
Принцип следующий.
Допустим открыто 4 позиции, 2 Buy и 2 Sell у них S/L и T/P = 0.0000.
Эксперт проверяет если позиция S/L=00000 и Ask или Bid больше цены открытия на 20 пунктов, то ставится S/L на 10 пунктов меньше Ask или Bid.
И в дальнейшем он должен передвигать S/L на 10 позиций от Ask или Bid.
И еще если ставится S/L то смещается T/P выше Ask или Bid но 20 пунктов.

Но для тестирования я ставлю S/L > 10 и смотрю за выполнением.
Не работает, нет стабильности.
extern double TakeProfit = 50; 
extern double TrailingStop = 10; 

//====================================================================
void start() {
  double N, P;
  int    cnt, ticket, total;

  if (Bars<100) { Print("bars less than 100"); return; }
  if (TakeProfit<10) { Print("TakeProfit less than 10"); return; }

  total=OrdersTotal();
  Print("OrdersTotal", OrdersTotal());

  for (cnt=0; cnt<total; cnt++) {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
    if (OrderType()==OP_SELL) {
      Print("SELL=", OrderTicket());
      if (OrderStopLoss()==0) {
        if (OrderOpenPrice()>Ask+Point*20) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+Point*TrailingStop, OrderTakeProfit(), 0, Red);
        }                              
      }      
      if (OrderStopLoss()!=0) {
        if (OrderStopLoss()>Ask+Point*10) {
          OrderModify(OrderTicket(),OrderOpenPrice(), Ask+Point*TrailingStop, OrderTakeProfit(), 0, Red);
        }
      }
      if (OrderStopLoss()!=0 && OrderTakeProfit()>Ask-Point*20) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(), Ask-Point*20, 0, Red);
      }
      N=Ask+Point*10;
      P=Ask-Point*20;
      Print("S/L=", OrderStopLoss());
      Print("T/P=", OrderTakeProfit());
      Print("OpenPrice=", OrderOpenPrice());
      Print("Din_S/L_Sell=", N);
      Print("Din_T/P_Sell=", P);
    }
    if (OrderType()==OP_BUY) {
      Print("BUY=", OrderTicket());
      if (OrderStopLoss()==0) {
        if (OrderOpenPrice()<Bid-Point*20) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Point*TrailingStop, OrderTakeProfit(), 0, Red);
        }
      }
      if (OrderStopLoss()!=0) {
        if (OrderStopLoss()<Bid-Point*10) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Point*TrailingStop, OrderTakeProfit(), 0, Red);
        }
      }
      if (OrderStopLoss()!=0 && OrderTakeProfit()<Bid+Point*20) {
        OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), Bid+Point*20, 0, Red);
      }
      N=Bid-Point*20;
      P=Bid+Point*20;
      Print("S/L=", OrderStopLoss());
      Print("T/P=", OrderTakeProfit());
      Print("OpenPrice=", OrderOpenPrice());
      Print("Din_S/L_Buy=", N);
      Print("Din_T/P_Sell=", P);
    }
  }
}
//====================================================================


 
15:02:10 Compiling '!Din_SS' 
15:02:16 !Din_SS EURUSD,M1: loaded successfully 
15:02:46 !Din_SS EURUSD,M1: OrdersTotal8 
15:02:46 !Din_SS EURUSD,M1: SELL=907938 
15:02:47 !Din_SS EURUSD,M1: modify #907938 sell 0.10 EURUSD at 1.1874 sl: 1.1855 tp: 0.0000 ok 
15:02:47 !Din_SS EURUSD,M1: S/L=0 
15:02:47 !Din_SS EURUSD,M1: T/P=0 
15:02:47 !Din_SS EURUSD,M1: OpenPrice=1.1874 
15:02:47 !Din_SS EURUSD,M1: Din_S/L_Sell=1.1855 
15:02:47 !Din_SS EURUSD,M1: Din_T/P_Sell=1.1825 
15:02:47 !Din_SS EURUSD,M1: SELL=907939 
15:02:48 !Din_SS EURUSD,M1: modify #907939 sell 0.10 EURUSD at 1.1874 sl: 1.1855 tp: 0.0000 ok 
15:02:48 !Din_SS EURUSD,M1: S/L=0 
15:02:48 !Din_SS EURUSD,M1: T/P=0 
15:02:48 !Din_SS EURUSD,M1: OpenPrice=1.1874 
15:02:48 !Din_SS EURUSD,M1: Din_S/L_Sell=1.1855 
15:02:48 !Din_SS EURUSD,M1: Din_T/P_Sell=1.1825 

15:02:49 !Din_SS EURUSD,M1: SELL=907938 
15:02:49 !Din_SS EURUSD,M1: S/L=1.1855 
15:02:49 !Din_SS EURUSD,M1: T/P=0 
15:02:49 !Din_SS EURUSD,M1: OpenPrice=1.1874 
15:02:49 !Din_SS EURUSD,M1: Din_S/L_Sell=1.1856 
15:02:49 !Din_SS EURUSD,M1: Din_T/P_Sell=1.1826 
15:02:49 !Din_SS EURUSD,M1: SELL=907939 
15:02:49 !Din_SS EURUSD,M1: S/L=1.1855 
15:02:49 !Din_SS EURUSD,M1: T/P=0 
15:02:49 !Din_SS EURUSD,M1: OpenPrice=1.1874 
15:02:49 !Din_SS EURUSD,M1: Din_S/L_Sell=1.1856 
15:02:49 !Din_SS EURUSD,M1: Din_T/P_Sell=1.1826 

15:10:24 !Din_SS EURUSD,M1: SELL=907938 
15:10:24 !Din_SS EURUSD,M1: S/L=1.1855 
15:10:24 !Din_SS EURUSD,M1: T/P=0 
15:10:24 !Din_SS EURUSD,M1: OpenPrice=1.1874 
15:10:24 !Din_SS EURUSD,M1: Din_S/L_Sell=1.1854 
/[code] 
По идее должно было тут сработать! 
[code] 
15:10:24 !Din_SS EURUSD,M1: Din_T/P_Sell=1.1824 
15:10:24 !Din_SS EURUSD,M1: SELL=907939 
15:10:24 !Din_SS EURUSD,M1: S/L=1.1855 
15:10:24 !Din_SS EURUSD,M1: T/P=0 
15:10:24 !Din_SS EURUSD,M1: OpenPrice=1.1874 
15:10:24 !Din_SS EURUSD,M1: Din_S/L_Sell=1.1854 
15:10:24 !Din_SS EURUSD,M1: Din_T/P_Sell=1.1824
 
Ошибки:
1) не проверяется результат OrderSelect
2) множественные торговые операции без обновления информационного окружения через RefreshRates - об этом много раз писалось. Задайте себе вопрос - что произойдет после совершения (или просто попытки совершения) торговой операции? Может данные устареют?
3) после совершения торговой операции надо четко понимать, что данные ранее выбранного OrderSelect ордера уже невалидны. Если хотите работать с тем же самым ордером после его модификации, то надо еще раз попробовать сделать OrderSelect с 100% контролем результата выбора (да еще и через SELECT_BY_TICKET, а не через SELECT_BY_POS).
4) иногда тройные попытки проведения торговых операций без обновления рыночной информации через RefreshRates.
5) невнятные комментарии. Чтобы отловить ошибку, надо выводить комментарии до и после попыток.
Причина обращения: