Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Переходите от теории к практике. Code Base поможет!
capricon
25
capricon 2012.11.08 18:57 

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

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

 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
2374
Leonid Borsky 2012.11.08 19:05  

Ордер переходит в 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 2012.11.08 19:17  
leonid553:


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



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

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

Leonid Borsky
2374
Leonid Borsky 2012.11.09 05:24  

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

Спасибо! 

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