Как в MQL5 узнать, закрылась сделка по стоп-лосу или по тейку?

 
Добрый день.
Может кто сможет подсказать, как в MQL5 можно узнать, закрылась сделка по стопу или по тейку в том случае, если стоп был перенесён в безубыток? Я пробовал основываться на прибыли по сделке, но при переносе стопа в безубыток, итоговая прибыль по сделке может быть как минус немного денег, так и плюс немного денег.
При вызове функции HistoryDealGetInteger(pos_ticket, DEAL_REASON) всегда выдаёт DEAL_REASON_EXPERT, так как ордера выставляются через советник. Если бы выдавал DEAL_REASON_SL или DEAL_REASON_TP то вопросов бы не было :(


Заранее благодарю!

 
Kinoman:
Добрый день.
Может кто сможет подсказать, как в MQL5 можно узнать, закрылась сделка по стопу или по тейку в том случае, если стоп был перенесён в безубыток? Я пробовал основываться на прибыли по сделке, но при переносе стопа в безубыток, итоговая прибыль по сделке может быть как минус немного денег, так и плюс немного денег.
При вызове функции HistoryDealGetInteger(pos_ticket, DEAL_REASON) всегда выдаёт DEAL_REASON_EXPERT, так как ордера выставляются через советник. Если бы выдавал DEAL_REASON_SL или DEAL_REASON_TP то вопросов бы не было :(


Заранее благодарю!

Здравствуйте! Не знаю поможет или нет, но опробуйте этот код (выдернул часть из одного своего скрипта):

//+------------------------------------------------------------------+
//| ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ                                            |
//+------------------------------------------------------------------+
ulong    ticket;
ulong    deal_ticket;
ulong    history_ticket;
ulong    history_order_ticket;
ulong    order_ticket;
ulong    pos_ticket;
double   price;
double   volume;
double   profit;
datetime time;
string   symbol;
ulong    type;
ulong    entry;
ulong    reason;
ulong    pos_ID;
ulong    order_ID;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   HistorySelect(0,TimeCurrent()); // запросим всю историю сделок и ордеров за указанный период
//--- БЛОК ИСТОРИИ ОРДЕРОВ
   uint history_orders_total=HistoryOrdersTotal(); // получим количество ордеров в истории
   if(history_orders_total>0) // если ордера в истории получены
      Print("< ========== БЛОК ИСТОРИИ ОРДЕРОВ ========== >"); // печатаем название раздела
   for(uint i=history_orders_total-10; i<history_orders_total; i++) // переберём 10-ть последних ордеров
     {
      if((history_order_ticket=HistoryOrderGetTicket(i))>0) // если получили тикеты ордеров
        {
         //--- получим все остальные свойства сделок
         history_ticket=HistoryOrderGetInteger(history_order_ticket,ORDER_TICKET);
         symbol     =HistoryOrderGetString(history_order_ticket,ORDER_SYMBOL);
         time       =(datetime)HistoryOrderGetInteger(history_order_ticket,ORDER_TIME_DONE);
         type       =HistoryOrderGetInteger(history_order_ticket,ORDER_TYPE);
         volume     =HistoryOrderGetDouble(history_order_ticket,ORDER_VOLUME_INITIAL);
         price      =HistoryOrderGetDouble(history_order_ticket,ORDER_PRICE_OPEN);
         reason     =HistoryOrderGetInteger(history_order_ticket,ORDER_REASON);
         order_ID   =HistoryOrderGetInteger(history_order_ticket,ORDER_POSITION_ID);
         //--- если выбрана история ордеров для текущего символа
         if(symbol==_Symbol)
           {
            string text_type=(type==0 ? "Рын. ордер на покупку" : type==1 ? "Рын. ордер на продажу " :
                              type==2 ? "Отл. ордер Buy Limit " : type==3 ? "Отл. ордер Sell Limit " :
                              type==4 ? "Отл. ордер Buy Stop  " : "Отл. ордер Sell Stop  ");
            string text_reason=(reason==0 ? "Ордер выставлен из десктопного терминала " :
                                reason==1 ? "Ордер выставлен из мобильного приложения " :
                                reason==2 ? "Ордер выставлен из веб-платформы " :
                                reason==3 ? "Ордер выставлен советником или скриптом " :
                                reason==4 ? "Ордер выставлен в результате срабатывания Stop Loss " :
                                reason==5 ? "Ордер выставлен в результате срабатывания Take Profit" :
                                "Ордер выставлен в результате наступления события Stop Out ");
            Print("Символ: ",symbol," Тикет: ",history_order_ticket," Время: ",time," Тип: ",text_type,
                  " Объём: ",DoubleToString(volume,2)," Цена: ",DoubleToString(price,5),
                  " Причина: ",text_reason," Идентификатор: ",order_ID);
           }
        }
     }
  }
//+------------------------------------------------------------------+

Если даже не поможет, то хоть натолкнёт на какую-нибудь мысль.

С уважением, Владимир.

 
Kinoman:
Добрый день.
Может кто сможет подсказать, как в MQL5 можно узнать, закрылась сделка по стопу или по тейку в том случае, если стоп был перенесён в безубыток? Я пробовал основываться на прибыли по сделке, но при переносе стопа в безубыток, итоговая прибыль по сделке может быть как минус немного денег, так и плюс немного денег.
При вызове функции HistoryDealGetInteger(pos_ticket, DEAL_REASON) всегда выдаёт DEAL_REASON_EXPERT, так как ордера выставляются через советник. Если бы выдавал DEAL_REASON_SL или DEAL_REASON_TP то вопросов бы не было :(


Заранее благодарю!

Сравнить цену закрытия сделки и цену стоп-лосса. Абсолютное значение их разности сравнить с некой величиной,
например 5 пунктов т.к. закрытие может произойти не точно по цене СЛ, а с проскальзыванием.

 
MrBrooklin #:

Здравствуйте! Не знаю поможет или нет, но опробуйте этот код (выдернул часть из одного своего скрипта):

Если даже не поможет, то хоть натолкнёт на какую-нибудь мысль.

С уважением, Владимир.

Благодарю, сегодня просмотрю

 
Kinoman:
Добрый день.
Может кто сможет подсказать, как в MQL5 можно узнать, закрылась сделка по стопу или по тейку в том случае, если стоп был перенесён в безубыток? Я пробовал основываться на прибыли по сделке, но при переносе стопа в безубыток, итоговая прибыль по сделке может быть как минус немного денег, так и плюс немного денег.
При вызове функции HistoryDealGetInteger(pos_ticket, DEAL_REASON) всегда выдаёт DEAL_REASON_EXPERT, так как ордера выставляются через советник. Если бы выдавал DEAL_REASON_SL или DEAL_REASON_TP то вопросов бы не было :(


Заранее благодарю!

Вы точно проверяете сделку типа DEAL_ENTRY_OUT? Складывается впечатление, что проверяется сделка DEAL_ENTRY_IN.

Проверьте результат выполнения этого кода:

void OnStart()
{
   HistorySelect(0, TimeCurrent()); 
   for (int i = HistoryDealsTotal() - 1;i >= 0; --i) 
   { 
      ulong ulTicket = HistoryDealGetTicket(i); 
      Print("Deal #", ulTicket, ", entry: ", EnumToString((ENUM_DEAL_ENTRY)HistoryDealGetInteger(ulTicket, DEAL_ENTRY)), ", reason: ", EnumToString((ENUM_DEAL_REASON)HistoryDealGetInteger(ulTicket, DEAL_REASON))); 
   } 
}

У меня так:

2023.04.04 14:27:17.536 Test (EURUSD,M1)        Deal #1631136465, entry: DEAL_ENTRY_OUT, reason: DEAL_REASON_SL
2023.04.04 14:27:17.537 Test (EURUSD,M1)        Deal #1631129873, entry: DEAL_ENTRY_IN, reason: DEAL_REASON_CLIENT
2023.04.04 14:27:17.537 Test (EURUSD,M1)        Deal #1624754938, entry: DEAL_ENTRY_OUT, reason: DEAL_REASON_CLIENT
2023.04.04 14:27:17.537 Test (EURUSD,M1)        Deal #1624249158, entry: DEAL_ENTRY_OUT, reason: DEAL_REASON_CLIENT
2023.04.04 14:27:17.537 Test (EURUSD,M1)        Deal #1624247933, entry: DEAL_ENTRY_IN, reason: DEAL_REASON_CLIENT
2023.04.04 14:27:17.537 Test (EURUSD,M1)        Deal #1617235319, entry: DEAL_ENTRY_OUT, reason: DEAL_REASON_CLIENT
2023.04.04 14:27:17.537 Test (EURUSD,M1)        Deal #1617234008, entry: DEAL_ENTRY_IN, reason: DEAL_REASON_CLIENT
2023.04.04 14:27:17.537 Test (EURUSD,M1)        Deal #1532779966, entry: DEAL_ENTRY_IN, reason: DEAL_REASON_CLIENT
 
Kinoman:
Добрый день.
Может кто сможет подсказать, как в MQL5 можно узнать, закрылась сделка по стопу или по тейку в том случае, если стоп был перенесён в безубыток? Я пробовал основываться на прибыли по сделке, но при переносе стопа в безубыток, итоговая прибыль по сделке может быть как минус немного денег, так и плюс немного денег.
При вызове функции HistoryDealGetInteger(pos_ticket, DEAL_REASON) всегда выдаёт DEAL_REASON_EXPERT, так как ордера выставляются через советник. Если бы выдавал DEAL_REASON_SL или DEAL_REASON_TP то вопросов бы не было :(


Заранее благодарю!

Сначала надо получить сделку выход из рынка

DEAL_ENTRY_IN

Вход в рынок

DEAL_ENTRY_OUT

Выход из рынка

DEAL_ENTRY_INOUT

Разворот

DEAL_ENTRY_OUT_BY

Закрытие встречной позицией


И только потом проверять как позиция была закрыта

      /******************* Если закрылась позиция********************/
      if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_OUT)
       {
        if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_TP)
              Print("Закрыто по тейку");
        if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_SL)
              Print("Закрыто по стопу"));
       }

Это выдранный кусок из функции OnTradeTransaction()

 
Ihor Herasko #:

Вы точно проверяете сделку типа DEAL_ENTRY_OUT? Складывается впечатление, что проверяется сделка DEAL_ENTRY_IN.

Игорь, с целью самообучения, подскажите, пжл, а зачем вообще смотреть на сделку, если закрытие позиции всё-равно происходит путем выставления противоположного ордера с тем же объёмом? Вот этого никак не пойму.

С уважением, Владимир

 
MrBrooklin #:

Игорь, с целью самообучения, подскажите, пжл, а зачем вообще смотреть на сделку, если закрытие позиции всё-равно происходит путем выставления противоположного ордера с тем же объёмом? Вот этого никак не пойму.

С уважением, Владимир

Если закрытие по SL или TP, то история все равно покажет тип DEAL_ENTRY_OUT, что при хедже, что при неттинге. Если же речь о неттинге и закрытие проводится противоположным ордером, то тип выхода будет DEAL_ENTRY_OUT или DEAL_ENTRY_INOUT, а в причине появится все, что угодно, кроме DEAL_REASON_SL или DEAL_REASON_TP. Закрытие ведь не по SL/TP.

 
MrBrooklin #:

Игорь, с целью самообучения, подскажите, пжл, а зачем вообще смотреть на сделку, если закрытие позиции всё-равно происходит путем выставления противоположного ордера с тем же объёмом? Вот этого никак не пойму.

С уважением, Владимир

Владимир, вот эту картинку посмотри

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопрос о функции OnTradeTransaction

fxsaber, 2023.03.28 10:24


На скрине сделки, порожденные тейками позиций. При этом тейки не представлены в виде MT5-ордеров.


 
Ihor Herasko #:

Если закрытие по SL или TP, то история все равно покажет тип DEAL_ENTRY_OUT, что при хедже, что при неттинге. Если же речь о неттинге и закрытие противоположным ордером, то тип выхода будет DEAL_ENTRY_OUT или DEAL_ENTRY_INOUT, а в причине появится все, что угодно, кроме DEAL_REASON_SL или DEAL_REASON_TP. Закрытие ведь не по SL/TP.

Огромное спасибо! Про неттинг вообще не думал, т.к. у меня его нет. Теперь буду знать.

С уважением, Владимир.

 
Alexey Viktorov #:

Владимир, вот эту картинку посмотри

Спасибо, Алексей! Век живи - век учись... )))

С уважением, Владимир.

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