Как мониторить факт срабатывания отложенного ордера?

 

Появилась необходимость мониторить момент, когда отработает ордер т.е. когда он станет рыночным. Соответственно, если он станет рыночных, нужно будет дальнейшие действия производить. Как это промониторить лучше?

Я так понимаю для подобных операций и нужно функция OnTradeTransaction() исходя из логики. Попробую щяс реализовать..

 

https://www.mql5.com/ru/docs/basis/function/events#ontrade

Функция OnTrade()

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

https://www.mql5.com/ru/docs/basis/function/events#ontrade

Функция OnTrade()

Я чутка промахнулся. Значит OnTradeTransaction() мне по прежнему не нужна, как я понимаю.

 
Viktar Dzemikhau:

Я чутка промахнулся. Значит OnTradeTransaction() мне по прежнему не нужна, как я понимаю.

Можно и OnTradeTransaction(). Это дублирующиеся функции.

 
Viktar Dzemikhau:

Появилась необходимость мониторить момент, когда отработает ордер т.е. когда он станет рыночным. Соответственно, если он станет рыночных, нужно будет дальнейшие действия производить. Как это промониторить лучше?

Я так понимаю для подобных операций и нужно функция OnTradeTransaction() исходя из логики. Попробую щяс реализовать..

Работать нужно только с OnTradeTransaction() - это правильно:

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

Контроль ордеров

Vladimir Karputov, 2017.10.04 06:38


Когда отложенный ордер срабатывает - появляется позиция. Этот момент (появление позиции) отслеживается в OnTradeTransaction:

ловим транцакцию с типом TRADE_TRANSACTION_DEAL_ADD

смотрим на направление сделки, которая породила транзакцию (ENUM_DEAL_ENTRY) - отлавливаем вход


Всё. Момент появления позиции мы словили. То есть используется событийная модель и в таком случае не нужны никакие таймеры.

 
Sergey Savinkin:

Можно и OnTradeTransaction(). Это дублирующиеся функции.

Зачем Вы вводите людей в заблуждение?

Используя OnTrade() нужно "танцевать с бубном", чтобы узнать, что произошло с ордером,

тогда как OnTradeTransaction() сразу "скажет" что произошло.

 

Я смотрю мнения разделились, что логично т.к. в справке ничего не сказано о том, как с этим работать. Можно, конечно, проверять, но это времени нужно N-ое количество. А желание есть дописать алгоритм, а не догадываться))

Так всё-таки с чем работать? С OnTrade() или с OnTradeTransaction() ?

Я только что в тестере расставил точки остановка в OnTrade(), и, ни одного раза ни при какомсобытии у меня не остановился тестер. Он в тестере не работает что-ли в режиме отладчика? Как тогда тестировать бота на истории? Алгоритм то нужно протестировать, что он работает корректно..

Я ещё свой код не писал для этого т.к. только вот в эту тему начал вникать. Взял статью за пример. В том switch'е, который там приводится я расставил точки останова. В общем, какой-то OnTrade() привой, на первый взгляд. Ну а если пользоваться лишь функцией OnTradeTransaction(), тогда зачем нужна функция OnTrade()?

Я так понимаю, не только я в этом вопросе плаваю..)) Т.к. мнения разделились.. Да и не нужно было мне это до сегодняшнего утра.. Смотрел я на эти функции, видел статьи, но думал.. "зачем они ими пользуются!". Так вот теерь пришёл я к выводу, что это нужно.

 
Viktar Dzemikhau:

Я смотрю мнения разделились, что логично т.к. в справке ничего не сказано о том, как с этим работать. Можно, конечно, проверять, но это времени нужно N-ое количество. А желание есть дописать алгоритм, а не догадываться))

Так всё-таки с чем работать? С OnTrade() или с OnTradeTransaction() ?

Я только что в тестере расставил точки остановка в OnTrade(), и, ни одного раза ни при какомсобытии у меня не остановился тестер. Он в тестере не работает что-ли в режиме отладчика? Как тогда тестировать бота на истории? Алгоритм то нужно протестировать, что он работает корректно..

Я ещё свой код не писал для этого т.к. только вот в эту тему начал вникать. Взял статью за пример. В том switch'е, который там приводится я расставил точки останова. В общем, какой-то OnTrade() привой, на первый взгляд. Ну а если пользоваться лишь функцией OnTradeTransaction(), тогда зачем нужна функция OnTrade()?

Я так понимаю, не только я в этом вопросе плаваю..)) Т.к. мнения разделились.. Да и не нужно было мне это до сегодняшнего утра.. Смотрел я на эти функции, видел статьи, но думал.. "зачем они ими пользуются!". Так вот теерь пришёл я к выводу, что это нужно.

Сначала появилась функции OnTrade. Потом появилась мощная и намного более информативная OnTradeTransaction. Только OnTradeTransaction позволяет получать обширную и точную информацию. 

 

Я делаю так:

   //--- проверка установленных ордеров
   if(!order_exist && my_Position.Select(Symbol()) && my_Position.Symbol()==Symbol())
   {
      pos_price = my_Position.PriceOpen();
      if(my_Position.PositionType() == POSITION_TYPE_BUY)   trend = trend_up;
      else                                                  trend = trend_dn;
      
      if(order_exist_stop)
      {
         if(trend == trend_up)   Comment("Сработал отложенный ордер на покупку.\nВзял под контроль...");
         else                    Comment("Сработал отложенный ордер на продажу.\nВзял под контроль...");
      }
      else
      {
         if(trend == trend_up)   Comment("Найден ордер на покупку.\nВзял под контроль...");
         else                    Comment("Найден ордер на продажу.\nВзял под контроль...");
      }
   }
   // установленные вручную
   if(!order_exist_stop && !order_exist)
   {
      for(int k=OrdersTotal()-1;k>=0;k--)
      {
         ticket_num = OrderGetTicket(k);
         if(OrderSelect(ticket_num) && my_Order.Symbol() == Symbol())
         {
            //Comment(ticket_num);
            if(my_Order.OrderType()==ORDER_TYPE_BUY_STOP)
            {
               Comment("Найден отложенный ордер на покупку...\nticket = "+IntegerToString(ticket_num));
               ....
               break;
            }
            else if(my_Order.OrderType()==ORDER_TYPE_BUY_LIMIT)
            {
               Comment("Найден лимитный ордер на покупку...\nticket = "+IntegerToString(ticket_num));
               ....
               break;
            }
            else if(my_Order.OrderType()==ORDER_TYPE_SELL_STOP)
            {
               Comment("Найден отложенный ордер на продажу...\nticket = "+IntegerToString(ticket_num));
               ....
               break;
            }
            else if(my_Order.OrderType()==ORDER_TYPE_SELL_LIMIT)
            {
               Comment("Найден лимитный ордер на продажу...\nticket = "+IntegerToString(ticket_num));
               ....
               break;
            }
         }
      }
   }
   
   //--- очистка удалённых вручную и по стопу
   if(order_exist && !my_Position.Select(Symbol())) clearData();
   if(order_exist_stop && !OrderSelect(ticket_num)) clearData();
 
Vladimir Karputov:

Сначала появилась функции OnTrade. Потом появилась мощная и намного более информативная OnTradeTransaction. Только OnTradeTransaction позволяет получать обширную и точную информацию. 

Вот то, что в отладчиком OnTrade() не дружит, это косяк.

Сергей Таболин:

Я делаю так:

Можно и так. Можно вообще проверять изменение количества ордеров или позиций, но как-бы это костыль. Проще пользоваться слушателями. Хотя, нормальных слушателей в мкл нет,  тем не менее, есть некоторое подобие. Поэтому, проверю я всё-таки как с отладчиком другит OnTradeTransaction(). Если не будет работать напишу в саппорт.

 
Viktar Dzemikhau:

Вот то, что в отладчиком OnTrade() не дружит, это косяк.

Можно и так. Можно вообще проверять изменение количества ордеров или позиций, но как-бы это костыль. Проще пользоваться слушателями. Хотя, нормальных слушателей в мкл нет,  тем не менее, есть некоторое подобие. Поэтому, проверю я всё-таки как с отладчиком другит OnTradeTransaction(). Если не будет работать напишу в саппорт.

Какой  суппорт? Если сами не научитесь думать -никто не научит :) .


Пример, как ловить появление позиции - ловим транзакцию TRADE_TRANSACTION_DEAL_ADD (Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета), далее ловим сделку с типом DEAL_ENTRY_IN (Вход в рынок), страхуемся - это должна быть именно сделка DEAL_TYPE_BUY (Покупка) или DEAL_TYPE_SELL (Продажа)

//--- 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_type=-1;
      long     deal_entry        =-1;
      long     deal_magic        =0;
      string   deal_symbol       ="";
      if(HistoryDealSelect(trans.deal))
        {
         deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_entry        =HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_symbol       =HistoryDealGetString(trans.deal,DEAL_SYMBOL);
        }
      else
         return;
      if(deal_symbol==m_symbol.Name() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
            if(deal_type==DEAL_TYPE_BUY || deal_type==DEAL_TYPE_SELL)
              {
               DeleteAllPendingOrders();
               //---
               if((ENUM_DEAL_TYPE)deal_type==DEAL_TYPE_BUY)
                  ClosePositions(POSITION_TYPE_SELL);
               if((ENUM_DEAL_TYPE)deal_type==DEAL_TYPE_SELL)
                  ClosePositions(POSITION_TYPE_BUY);
              }
     }

Всё, мы словили момент, когда гарантированно появилась позиция. И никаких ордеров! Только сделки!

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