Отслеживание последнего открытого ордера

 

Добрый день, господа!

Подскажите как грамотно отследить последний открытый ордер. Имею конструкцию типа:

 if(OrdersTotal()<1)
      {     
      if(buy_signal==1)
            {
            int ticket=0;                        
            i=1;                                                
            ticket=OrderSend(Symbol(),OP_BUY,0.05,MarketInfo(Symbol(),MODE_ASK),10,0,0,"Buy",1,i,Green);
            return(0);                  
            }
      if(sell_signal==1)
            {
            ticket=0;                               
            i=1;                  
            ticket=OrderSend(Symbol(),OP_SELL,0.05,MarketInfo(Symbol(),MODE_BID),10,0,0,"sell",1,i,Red);
            return(0);                  
            }      
      }  
  for (int k=0; k<OrdersTotal(); k++)
      {
      OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber()==i)
            {            
            type=OrderType(); 
            if(type==1)
                  {                  
                  i++; 
                  ticket=OrderSend(Symbol(),OP_BUYSTOP,0.05,OrderOpenPrice()+delta,10,0,0,"buy",1,i,Green);
                  return(0);
                  }      
            if(type==0)   // long position is opened
                  {                     
                  i++;                  
                  ticket=OrderSend(Symbol(),OP_SELLSTOP,0.05,OrderOpenPrice()-delta,10,0,0,"sell",1,i,Red);
                  return(0);                                                               
                  }
            }
      }

 Проблема в том, что после открытия отложенного ордера цикл прекращается и последний открытый отложенный ордер не ослеживается.

Попутный вопрос - при срабатывании отложенного ордера его тип перейдет из OP_BUYSTOP в OP_BUY или останется тем же типом? 

Спасибо. 

 

Ордер переходит в OP_BUY

А зачем вам нужно отследить посл. ордер? Возможно, вам помогут функции в адресе https://www.mql5.com/ru/forum/131859 

- см. там содержание стр.3 и стр.4:

GetIndexByTicket - Возвращает индекс ордера или позиции по тикету.
  GetIndexLastPos - Возвращает индекс последней открытой позиции или -1
GetLotLastPos - Возвращает размер лота последней открытой позиции или -1
GetMaxLotFromOpenPos - Возвращает максимальный размер лота из открытых позиций
GetMinLotFromOpenPos - Возвращает минимальный размер лота из открытых позиций
NumberOfPositions - Возвращает количество позиций.
  GetProfitOpenPosInCurrency - Возвращает суммарный профит открытых позиций в валюте депозита
GetProfitOpenPosInPoint - Возвращает суммарный профит открытых позиций в пунктах
GetTicketLastPos - Возвращает тикет последней открытой позиции или -1

GetTypeLastClosePos - Возвращает тип последней закрытой позиции или -1
GetTypeLastOpenPos - Возвращает тип последней открытой позиции или -1
  isLossLastPos - Возвращает флаг убыточности последней позиции.
isTradeToDay - Возвращает флаг торгов сегодня
  NumberOfBarOpenLastPos - Возвращает номер бара открытия последней позиции или -1.
 

 
leonid553:


А зачем вам нужно отследить посл. ордерр? Возможно, вам помогут функции в адресе https://www.mql5.com/ru/forum/131859 



Спасибо, обязательно посмотрю, просто я ненастоящий сварщик и не уверен, что смогу применить эту функцию. 

Ослеживается последний ордер на предмет его состояния (если отложеный сработал, то должен быть открыт следующий отложенный), его параметров (цены открытия ит.д.).   

 

Ну, в самом простейшем случае можно задействовать ф-ю NumberOfOrders - Возвращает количество ордеров.

Располагаем эту функцию (т.е. копируем её код) вне функции СТАРТ, например - в самый-самый низ кода советника.

 Далее, например, Вы открыли позиции в первой половине вашего кода. Теперь вам нужно выставлять бай-отложки. Стоповые. Вместо второй части вашего кода - попробуйте задать:

if ( NumberOfOrders(NULL,OP_BUYSTOP,-1) <1)  {//если нет отложенных байстоп ордеров,
                               // то устанавливаем на расстоянии дельта от текущей цены: 
ticket=OrderSend(Symbol(),OP_BUYSTOP,0.05,MarketInfo(Symbol(),MODE_ASK)+delta,10,0,0,"buy",1,i,Green);
                  return(0);
                                                   }      

Аналогично и по селлстопам. if ( NumberOfOrders(NULL, OP_SELLSTOP , -1)<1) { ......

Примерно так..... И теперь по мере срабатывания очередной байстоп отложки - сразу должна открываться новая.

 

Спасибо! 

Привинтил каким-то неожиданным образом функцию GetTypeLastOpenPos, правда внутри функции старт (видимо, совсем не так как предполагал автор :-) и дописал в неё отслеживание отложенных ордеров, поскольку по умолчанию она отслеживает только открытые ордера. Получилось следующее: 

int start()
  {
  //..........
  datetime t;
  int i, k=OrdersTotal(), r=-1;
  int mn=-1;
  string sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP) {
          if (t<OrderOpenTime()) {
            t=OrderOpenTime();
            r=OrderType();
          }
        }
      }
    }
  }
}
Причина обращения: