Отлов события s\l и t\p

 
Как можно получить информацию о срабатывании Stoploss и Take profit, в советнике? Мне необходимо реализовать задержку после закрытия ордера. Если ордер закрыт через OrderClose, то всё нормально. Но как отловить когда он закрывается автоматически?
 
По-моему, здесь выхода два:
  1) следить за текущим значением Bid, Ask и сравнивать их со стопом, профитом каждого работающего ордера.
      Но не факт, что брокер закроет ордер, допустим, при сильном движении рынка. Это может случиться и через 5 сек, а может и через несколько минут.
  2) запоминать все рабочие ордера (в любом серьезном советнике      должна быть функция сбора информации о текущих ордерах),  а на следующем тике сравнить с имеюшимися и узнать какой из них пропал.   
     Недостаток этого способа в том, что не знаешь конкретно,  по профиту или стопу закрылся ордер. Потребуется обращение к истории сделок.
 
golem59:
Как можно получить информацию о срабатывании Stoploss и Take profit, в советнике? Мне необходимо реализовать задержку после закрытия ордера. Если ордер закрыт через OrderClose, то всё нормально. Но как отловить когда он закрывается автоматически?
Самое примитивное.

Если есть открытый ордер, запоминай время. Если нет открытых позиций, жди столько сколько тебе надо, начиная отсчет от этой записанной переменной.
 
Vladimir11:
golem59:
Как можно получить информацию о срабатывании Stoploss и Take profit, в советнике? Мне необходимо реализовать задержку после закрытия ордера. Если ордер закрыт через OrderClose, то всё нормально. Но как отловить когда он закрывается автоматически?
Самое примитивное.

Если есть открытый ордер, запоминай время. Если нет открытых позиций, жди столько сколько тебе надо, начиная отсчет от этой записанной переменной.
Как реализовать задержку я знаю, меня интересует нет ли какой нибудь функции возвращающей истину если на данном тике произошёл выход по Stoploss и Take profit. Или придется запоминать в массив профиты и лоссы всех открытых ордеров, и потом сравнивать текущую цену с ними? Есть ли гарантия что это поможет?
 
Прямого способа отследить закрытие ордера по s/l || t/p в МТ нет. Придется вести в эксперте внутренний реестр ордеров, по мере надобности обращаясь к истории сделок. Несколько морочно, зато надежно.
 
//+----------------------------------------------------------------------------+
//|  Возвращает флаг закрытия последней позиции по стопу.                      |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sym="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();
 
  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sym) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sym, MODE_DIGITS);
    if (dg==0) if (StringFind(sym, "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl) return(True);
  }
  return(False);
}
 
//+----------------------------------------------------------------------------+
//|  Возвращает флаг закрытия последней позиции по тейку.                      |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sym="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();
 
  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sym) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sym, MODE_DIGITS);
    if (dg==0) if (StringFind(sym, "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}
 
А коментарий ордера посмотреть, разве не подойдет...
как-то так:
      string sCom=OrderComment(); 
      int len=StringLen(sCom);
      if(len>=4){sCom=StringSubstr(sCom,len-3,3);
                 if(sCom=="sl]")      len=1; //exit type SL
                 else if(sCom=="tp]") len=2; //exit type TP
                 else                 len=0; //exit type "???"
                }
      else                            len=0; //exit type "???"

      return(len);
 
События в МetaТrader 4 [ en ]

Статья посвящена программному отслеживанию событий в терминале МetaТrader 4, таких как открытие, закрытие и модификация ордеров, и рассчитана на пользователя, обладающего базовыми навыками работы с терминалом и программирования на MQL4.

 
KimIV:
//+----------------------------------------------------------------------------+
//|  Возвращает флаг закрытия последней позиции по стопу.                      |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sym="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();
 
  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
...

Думаю экономичнее запоминать количество ордеров в истории на момент предыдущего вызова и перебирать только вновь появившиеся
Причина обращения: