Не удаляеться ордер.

 
  
  Не пойму почему ордер не удаляеться.
  
  bool isCloseLastPosByTake(string sym="", int op=-1, int mn=-1) {
  datetime oct=0.0;
  double   otp, ocp;
  int       i, j=-1, k=OrdersHistoryTotal();
 
  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_TICKET, MODE_HISTORY)) {
      if (OrderSymbol()==sym) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (oct<OrderCloseTime()) {
                oct=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    ocp=NormalizeDouble(OrderClosePrice(), Digits);
    otp=NormalizeDouble(OrderTakeProfit(), Digits);
    if (ocp==otp) return(true);
  }
  return(false);
}
 bool ud()
 {
 for(int i=1; i<=OrdersTotal(); i++)
 {
 if (OrderSelect(i-1,SELECT_BY_POS)==true)
 ticket1=OrderTicket();
 ticket2=OrderTicket();
 if (ticket1<0&&isCloseLastPosByTake())
 Ans=OrderDelete(ticket2);
 
 if (ticket2<0&&isCloseLastPosByTake())
 Ans=OrderDelete(ticket1);
 return(true);
 }
 return(false);
 }
 
 

Потому, что слишком замудрёно написано. Тестирую я сейчас свой советник и там счудил ошибку по которой наставилось немыслемое количество ордеров на демо счёте, как рыночных так и отложников. Чтобы быстренько всё почистить написал простенький скриптик...

/*********************************************************************\
                                                         CleanAll.mq4 |
                                             Copyright 2016, Viktorov |
                                                    v4forex@yandex.ru |
\*********************************************************************/
#property copyright "Copyright 2016, Viktorov"
#property link      "v4forex@yandex.ru"
#property version   "1.00"
#property strict

/********************Script program start function********************/
void OnStart()
{
   int i, total = OrdersTotal();
    for(i = total ; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS))
       {
        if(OrderType() > OP_SELL)
         {
          if(!OrderDelete(OrderTicket()))
          printf("***********");
         }
        if(OrderType() < OP_SELLSTOP)
         {
          if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100))
          printf("***********");
         }
       }
     }
}/********************************************************************/

Посчитай сколько строк и выбери не нужное в своём коде.

 

Ой!!! Извини, не сразу посмотрел что выбираешь i-тый ордер по тикету из истории...

for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_TICKET, MODE_HISTORY)) {

Даже не знаю что сказать...

Причина обращения: