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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
jaffer wilson
2451
jaffer wilson  

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

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

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

Vladimir Karputov
Модератор
181885
Vladimir Karputov  

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

//+------------------------------------------------------------------+
//|                                      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
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
Файлы:
prostotrader
8048
prostotrader  
Vladimir Karputov:

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

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

ENUM_TRADE_TRANSACTION_TYPE type=trans.type;

Можно просто

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

case TRADE_TRANSACTION_ORDER_ADD:
   ///--------------------------------
  break;
}
jaffer wilson
2451
jaffer wilson  
Vladimir Karputov :

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

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

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

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

Vladimir Karputov
Модератор
181885
Vladimir Karputov  
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: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
jaffer wilson
2451
jaffer wilson  
Vladimir Karputov :

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

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


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

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

Vladimir Karputov
Модератор
181885
Vladimir Karputov  
jaffer wilson:

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

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

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

Artyom Trishkin
Модератор
52783
Artyom Trishkin  
Vladimir Karputov:

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

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

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

jaffer wilson
2451
jaffer wilson  

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

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

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

Vladimir Karputov
Модератор
181885
Vladimir Karputov  
jaffer wilson:

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

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


jaffer wilson:

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

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

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