Как определить торговые действия в функции OnTradeTransaction ()?

 

Я хочу определить, когда сделка является покупкой или продажей, или применен отложенный ордер, или ожидающий конвертируется в мгновенный ордер, или SL, или TP, или сделка закрывается.

Я хочу выполнить действие, когда процесс полностью выполнен и внутри OnTradeTransaction ().

Посоветуйте, пожалуйста, как мне это сделать.

 

Пример когда позиция открыта, когда позиция закрыта, когда сработал Стоп лосс или когда сработал Тейк профит:

//+------------------------------------------------------------------+
//|                                      OnTradeTransaction Info.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property version   "1.00"
//--- input parameters

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_ticket       =0;
      long     deal_order        =0;
      long     deal_time         =0;
      long     deal_time_msc     =0;
      long     deal_type         =-1;
      long     deal_entry        =-1;
      long     deal_magic        =0;
      long     deal_reason       =-1;
      long     deal_position_id  =0;
      double   deal_volume       =0.0;
      double   deal_price        =0.0;
      double   deal_commission   =0.0;
      double   deal_swap         =0.0;
      double   deal_profit       =0.0;
      string   deal_symbol       ="";
      string   deal_comment      ="";
      string   deal_external_id  ="";
      if(HistoryDealSelect(trans.deal))
        {
         deal_ticket       =HistoryDealGetInteger(trans.deal,DEAL_TICKET);
         deal_order        =HistoryDealGetInteger(trans.deal,DEAL_ORDER);
         deal_time         =HistoryDealGetInteger(trans.deal,DEAL_TIME);
         deal_time_msc     =HistoryDealGetInteger(trans.deal,DEAL_TIME_MSC);
         deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_entry        =HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_reason       =HistoryDealGetInteger(trans.deal,DEAL_REASON);
         deal_position_id  =HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID);

         deal_volume       =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
         deal_price        =HistoryDealGetDouble(trans.deal,DEAL_PRICE);
         deal_commission   =HistoryDealGetDouble(trans.deal,DEAL_COMMISSION);
         deal_swap         =HistoryDealGetDouble(trans.deal,DEAL_SWAP);
         deal_profit       =HistoryDealGetDouble(trans.deal,DEAL_PROFIT);

         deal_symbol       =HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_comment      =HistoryDealGetString(trans.deal,DEAL_COMMENT);
         deal_external_id  =HistoryDealGetString(trans.deal,DEAL_EXTERNAL_ID);
        }
      else
         return;

      string str_entry="-";
      if(deal_entry==DEAL_ENTRY_IN)
         str_entry="Entry in.";
      if(deal_entry==DEAL_ENTRY_OUT)
         str_entry="Entry out.";
      if(deal_entry==DEAL_ENTRY_INOUT)
         str_entry="Reverse.";
      if(deal_entry==DEAL_ENTRY_OUT_BY)
         str_entry="Close a position by an opposite one.";

      string str_reason="-";
      if(deal_reason==DEAL_REASON_SL)
         str_reason="The deal was executed as a result of Stop Loss activation.";
      if(deal_reason==DEAL_REASON_TP)
         str_reason="The deal was executed as a result of Take Profit activation.";

      Print("Adding a deal to the history."," ",str_entry," ",(str_reason=="-")?"":str_reason+" ",
            deal_symbol," ",DoubleToString(deal_volume,2));
     }
//--- if transaction is result of adding a new open order
   if(type==TRADE_TRANSACTION_ORDER_ADD)
     {

     }
  }
//+------------------------------------------------------------------+
Общие принципы - Торговые операции - Справка по MetaTrader 5
Общие принципы - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
Файлы:
 
Vladimir Karputov:

Пример когда позиция открыта, когда позиция закрыта, когда сработал Стоп лосс или когда сработал Тейк профит:

Зачем лишние действия?

ENUM_TRADE_TRANSACTION_TYPE type=trans.type;

Можно просто

switch(trans.type)
{
  case TRADE_TRANSACTION_DEAL_ADD:
   ///--------------------------------
  break; 

case TRADE_TRANSACTION_ORDER_ADD:
   ///--------------------------------
  break;
}
 
Vladimir Karputov :

Пример когда позиция открыта, когда позиция закрыта, когда сработал Стоп лосс или когда сработал Тейк профит:

Спасибо за ответ. OnTradeTransaction () не управляется графиком?

Потому что, когда я подаю заявку на EURUSD и GBPUSD, она печатается 2 раза.

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

 
jaffer wilson:

Спасибо за ответ. OnTradeTransaction () не управляется графиком?

Потому что, когда я подаю заявку на EURUSD и GBPUSD, она печатается 2 раза.

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

OnTradeTransaction отлавливает все транзакции. 

Ваша задача - отобрать нужную транзакцию (по символу ('deal_symbol') , по Magic number ('deal_magic'), по типу ('deal_entry').


Пример: в OnTradeTransaction отлавливает все транзакции TRADE_TRANSACTION_DEAL_ADD по текущему символу и Magic number, сделки DEAL_ENTRY_IN

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_ticket       =0;
      long     deal_order        =0;
      long     deal_time         =0;
      long     deal_time_msc     =0;
      long     deal_type         =-1;
      long     deal_entry        =-1;
      long     deal_magic        =0;
      long     deal_reason       =-1;
      long     deal_position_id  =0;
      double   deal_volume       =0.0;
      double   deal_price        =0.0;
      double   deal_commission   =0.0;
      double   deal_swap         =0.0;
      double   deal_profit       =0.0;
      string   deal_symbol       ="";
      string   deal_comment      ="";
      string   deal_external_id  ="";
      if(HistoryDealSelect(trans.deal))
        {
         deal_ticket       =HistoryDealGetInteger(trans.deal,DEAL_TICKET);
         deal_order        =HistoryDealGetInteger(trans.deal,DEAL_ORDER);
         deal_time         =HistoryDealGetInteger(trans.deal,DEAL_TIME);
         deal_time_msc     =HistoryDealGetInteger(trans.deal,DEAL_TIME_MSC);
         deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_entry        =HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_reason       =HistoryDealGetInteger(trans.deal,DEAL_REASON);
         deal_position_id  =HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID);

         deal_volume       =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
         deal_price        =HistoryDealGetDouble(trans.deal,DEAL_PRICE);
         deal_commission   =HistoryDealGetDouble(trans.deal,DEAL_COMMISSION);
         deal_swap         =HistoryDealGetDouble(trans.deal,DEAL_SWAP);
         deal_profit       =HistoryDealGetDouble(trans.deal,DEAL_PROFIT);

         deal_symbol       =HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_comment      =HistoryDealGetString(trans.deal,DEAL_COMMENT);
         deal_external_id  =HistoryDealGetString(trans.deal,DEAL_EXTERNAL_ID);
        }
      else
         return;
      ENUM_DEAL_ENTRY enum_deal_entry=(ENUM_DEAL_ENTRY)deal_entry;
      if(deal_symbol==m_symbol.Name() && deal_magic==InpMagic)
        {
         if(deal_type==DEAL_TYPE_BUY || deal_type==DEAL_TYPE_SELL)
           {
            if(deal_entry==DEAL_ENTRY_IN)
              {

              }
           }
        }
     }
  }
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Vladimir Karputov :

OnTradeTransaction отлавливает все транзакции. 

Ваша задача - отобрать нужную транзакцию (по символу (' deal_symbol ') , по Magic number (' deal_magic '), по типу (' deal_entry ').


Пример: в  OnTradeTransaction  отлавливает все транзакции  TRADE_TRANSACTION_DEAL_ADD по текущему символу и Magic number, сделки DEAL_ENTRY_IN

Что делать, если я пытаюсь торговать вручную? Магическое число всегда 0.

 
jaffer wilson:

Что делать, если я пытаюсь торговать вручную? Магическое число всегда 0.

Да, правильно. При ручной торговле Magic number автоматически проставляется как '0' - именно '0' является признаком ручной торговли.

(Но нужно ещё, на всякий случай, проверять 'deal_reason' на равенство DEAL_REASON_EXPERT)

 
Vladimir Karputov:

Да, правильно. При ручной торговле Magic number автоматически проставляется как '0' - именно '0' является признаком ручной торговли.

(Но нужно ещё, на всякий случай, проверять 'deal_reason' на равенство DEAL_REASON_EXPERT)

Поправлю: на неравенство - ведь нужно отследить ручное действие, а не советником. Тогда и магик не нужно отслеживать.

 

У меня все еще есть запрос. Если сделка была открыта 4 месяца назад, а теперь она закрывается через 4 месяца или даже 5 месяцев, будет доступна история, так как функция истории не может загружать историю более 28 дней, я полагаю.

И сработает ли функция OnTradeTransaction (), если брокер внезапно закроет позицию?

Пожалуйста, дайте мне знать.

 
jaffer wilson:

У меня все еще есть запрос. Если сделка была открыта 4 месяца назад, а теперь она закрывается через 4 месяца или даже 5 месяцев, будет доступна история, так как функция истории не может загружать историю более 28 дней, я полагаю.

Откуда такое мнение? У Вас есть доказательства?


jaffer wilson:

И сработает ли функция OnTradeTransaction (), если брокер внезапно закроет позицию?

Закрытие или открытие позиции - эти действия записываются в торговую историю. Соответственно сработает OnTradeTransaction.

 
История доступна вся имеющаяся. Другое дело, что по прошествии большого срока (зависит от брокера), история архивируется брокером и становится недоступной в терминале.
Причина обращения: