Коллеги, нужна помощь……

 

Приветствую всех! Коллеги, передо мной стоит задача, преобразовать данный код, так, что бы время сверялось с самой первой позицией, из открытых, с определенным магиком и без магика. Не могу только понять. Каким образом вызвать и использовать нужные мне данные вот здесь OrderOpenTime(). На данный момент блок кода берет ближайшую открытую позицию и без магического номера, сверяет текущее время и время открытие ближайшей позиции. А нужно чтобы данные брались с первой позиции из открытых, с определенным магическим номером. Кто поможет? Тому буду очень благодарен!!!

// Блок проверки времени жизни сделки, если MaxOpenTime=0, то проверку не проводим.
  if(MaxOpenTime>0)
  {
    for(cnt=0;cnt<total;cnt++)
    {
      if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
      {
         tmp = (TimeCurrent() - OrderOpenTime())/3600.0;
         if (((NormalizeDouble(tmp,8) - MaxOpenTime)>=0))
        {     
          RefreshRates();
          if (OrderType() == OP_BUY)
            closeprice=Bid;
          else  
            closeprice=Ask;          
          if (OrderClose(OrderTicket(), OrderLots(), closeprice,10, Green))
          {
            Print("Принудительное закрытие сделки - №", OrderTicket());
            OrderPrint();
          }
          else 
            Print("OrderClose() в блоке проверки времени жизни сделки вернул ошибку - ",GetLastError());        
        } 
      }
      else 
        Print("OrderSelect() в блоке проверки времени жизни сделки вернул ошибку - ",GetLastError());
    } 
  }     
  return(0);
}
 
MrSerj:

 


    уже не хочу код писать - поздно, но у Вас неправильная логика поиска ордера с наименьшим временем открытия, Вы зачем то используете время сервера, производите расчеты и пр. 

-используйте перебор ордеров которые в рынке OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)

-затем проверяйте свой магик, символ и пр. тип ордера Buy или Sell не разделяйте раз нет необходимости отдельно обрабатывать ордера на покупку и продажу

-убедились, что ордер Вашего кода, возьмите запомните время открытия:   OrderOpenTime()

- и потом сравнивайте с запомненным временем открытия все новые итерации цикла перебора ордеров, тип datetime можно сравнивать между собой как обычные int на > или < 

в итоге, по окончанию цикла у Вас будет в переменной минимальное время  открытия ордера, а там дальше на Ваше усмотрение

вот поиском нашел анализ ордеров из истории терминала, немного не по сабжу, но принцип тот же:

void history(){
int time = 0;double profit = 0;//обьявляем необходимые нам переменные куда мы положим интересующие нас характеристики ордера
for(int i = OrdersHistoryTotal();i>=0;i--){// Перебираем все закрытые ордера
  if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){//если ордер с таким номером (i) в списке закрытых ордеров есть ( не путать с тикетом)
    if(OrderSymbol() == Symbol()){//если выбранный ордер был открыт по нашей валютной паре
      if(time<OrderCloseTime()){//(сравниваем его с хранящимся в пероеменной time) 
        time=OrderCloseTime();//если время закрытия ордера больше - ложим его в переменную
        profit=OrderProfit();//и заодно запоминаем прибыль ордера
      }
    }
  }
}
//по окончании этой процедуры в наших переменных будут сидет наибольшее время закрытия, и его профит. Или по нулям если история чистая.
//теперь мы можем выставлять условия в зависимости от результата процедуры
   
if(profit == 0 &&time == 0){//действия если история чистая}
}

if(profit >= 0){//действия если последний ордер был прибыльным, или нулевым}
}

if(profit <  0 ){//действия если последний ордер был убыточным}
}

return;
}
 

Почти все правильно

 if(MaxOpenTime>0)
  {
    for(cnt=total-1;cnt>=0;cnt==)
    {
      if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)&&OrderMagicNumber()>0}      {
         tmp = TimeCurrent() - OrderOpenTime();//это в порядке совета, но можно и оставить как было
         if (tmp - MaxOpenTime*3600>=0)
        {     
          RefreshRates();
          if (OrderType() == OP_BUY)
            closeprice=Bid;
          else  
            closeprice=Ask;          
          if (OrderClose(OrderTicket(), OrderLots(), closeprice,10, Green))
          {
            Print("Принудительное закрытие сделки - №", OrderTicket());
            OrderPrint();
          }
          else 
            Print("OrderClose() в блоке проверки времени жизни сделки вернул ошибку - ",GetLastError());        
        } 
      }
      else 
        Print("OrderSelect() в блоке проверки времени жизни сделки вернул ошибку - ",GetLastError());
    } 
  }     
  return(0);
}
 
Roger, IgorM. Благодарю Вас за помощь! С уважением.
Причина обращения: