отследить закрытие ИМЕННО позиции по стоп-лоссу? - страница 2

 
Содержание коммента - это недокументированная возможность. Надо сравнивать OrderClosePrice() и OrderStopLoss()
 
#property copyright "Copyright 2017 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
double pos_sl;
long pos_id;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(PositionSelect(Symbol()))
     {
      pos_sl = PositionGetDouble(POSITION_SL);
      pos_id = long(PositionGetInteger(POSITION_IDENTIFIER));
     }
  }
//+------------------------------------------------------------------+
// Expert Trade Transaction function                                 |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_DEAL_ADD:
         if(!PositionSelect(Symbol()))  //Позиции НЕТ закрыта
           {
            if(HistorySelectByPosition(pos_id))
              {
               //Смотрим всю необходимую инфу
              }
           }
         break;
     }
  }


 

 
Не забудьте проверить изменение баланса, всякое бывает ;) .
 
prostotrader:
#property copyright "Copyright 2017 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
double pos_sl;
long pos_id;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
intOnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
voidOnTick()
  {
   if(PositionSelect(Symbol()))
     {
      pos_sl = PositionGetDouble(POSITION_SL);
      pos_id = long(PositionGetInteger(POSITION_IDENTIFIER));
     }
  }
//+------------------------------------------------------------------+
// Expert Trade Transaction function                                 |
//+------------------------------------------------------------------+
voidOnTradeTransaction(constMqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        constMqlTradeResult &result)
  {
   switch(trans.type)
     {
      caseTRADE_TRANSACTION_DEAL_ADD:
         if(!PositionSelect(Symbol()))  //Позиции НЕТ закрыта
           {
            if(HistorySelectByPosition(pos_id))
              {
               //Смотрим всю необходимую инфу
              }
           }
         break;
     }
  }


 

Спасибо, рабочий вариант. У меня массив контролируемых ордеров, и SL переносятся выше цены открытия - переход в БУ. Вместо  if(!PositionSelect(Symbol())), делаю перебор ы цикле. Всё Ок.

 

prostotrader:
#property copyright "Copyright 2017 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
double pos_sl;
long pos_id;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
intOnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
voidOnTick()
  {
   if(PositionSelect(Symbol()))
     {
      pos_sl = PositionGetDouble(POSITION_SL);
      pos_id = long(PositionGetInteger(POSITION_IDENTIFIER));
     }
  }
//+------------------------------------------------------------------+
// Expert Trade Transaction function                                 |
//+------------------------------------------------------------------+
voidOnTradeTransaction(constMqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        constMqlTradeResult &result)
  {
   switch(trans.type)
     {
      caseTRADE_TRANSACTION_DEAL_ADD:
         if(!PositionSelect(Symbol()))  //Позиции НЕТ закрыта
           {
            if(HistorySelectByPosition(pos_id))
              {
               //Смотрим всю необходимую инфу
              }
           }
         break;
     }
  }


 

В Margin Mode: ACCOUNT_MARGIN_MODE_RETAIL_HEDGING !PositionSelect(Symbol()) работать не будет, так как в этом режиме позиция может быть не одна, поэтому, закрытие одной из позиций не приведет к !PositionSelect(Symbol()) == true, так как другие позиции продолжат оставаться в рынке.

Причина обращения: