Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
capricon
25
capricon  

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

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

 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 или останется тем же типом? 

Спасибо. 

Leonid Borsky
2381
Leonid Borsky  

Ордер переходит в 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.
 

capricon
25
capricon  
leonid553:


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



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

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

Leonid Borsky
2381
Leonid Borsky  

Ну, в самом простейшем случае можно задействовать ф-ю 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) { ......

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

capricon
25
capricon  

Спасибо! 

Привинтил каким-то неожиданным образом функцию 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();
          }
        }
      }
    }
  }
}
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий