Как в языке MQL4 определить тикет ордера, который возникает в результате закрытия встречных ордеров функцией OrderCloseBy() ? - страница 6

 
elmucon:

ну значит при его появлении проведите его модификацию ... 

Для этого надо сначала его тикет знать, а его-то и требуется узнать...
 
elmucon:

так создайте свой комент когда выставляете ордер и потом по нему  и ищите ... 


при закрытии ваш коммент будет удалён и добавлен свой ))

 
elmucon:

ну значит при его появлении проведите его модификацию ... 

Пользователь может указать комментарий лишь при выставлении ордера. Всё.

Остальные записи в комментарий для нас закрыты. В них может писать дальше только брокер. И он впишет туда нужную информацию. Вот по ней и искать то, что нужно.

 
Alexey Viktorov:

Следовательно если открывая ордер назначается комментарий, и ДЦ не затирает этот комментарий, то позиция с которой начинается тикет будет плавающей.

При закрытии по OrderCloseBy() Ваш комментарий трётся и добавляется свой типа to #12345678  или  from#12345678  - по другому пока не видел, единственное что к этому from#12345678 они могут ещё что-то добавить , например: from#12345678[0]  (это у меня так), но у меня этот вариант нормально отрабатывается, проверял.

А так да, если где-то делают как вы описали то надо делать Ваш вариант. В любом случае всё написанное сначала тестируется, проверяется, под конкретное ДЦ, а потом в бой ))

 

Уже обсуждалась похожая тема.

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

Получение истории по OrderCloseBy через MQL

Ihor Herasko, 2017.02.17 08:56

Чтобы установить соответствие между текущим выбранным ордером и его родителем после частичного или встречного закрытия, используйте следующий подход:

//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Определение наличия родительского ордера для текущего ордера (по итогам встречного или частичного закрытия)                                                                                       |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
int GetSignOfPartialOrCloseByClose()
{
   string comment = OrderComment();
   if (comment == "")
      return 0;
  
   // Ордер образовался вследствии частичного закрытия
   int fromStart = StringFind(comment, "from #");
   if (fromStart >= 0)
      return GetTicketByPartialClose(comment, fromStart, OrderType(), OrderOpenTime());
  
   // Ордер образовался вследствии встречного закрытия
   if (StringFind(comment, "partial close") >= 0)
   {
      datetime openTime = OrderOpenTime();
      int type = OrderType();
      for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
      {
         if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
            continue;
            
         if (OrderOpenTime() != openTime)
            continue;
            
         if (OrderType() != type)
            continue;
            
         if (StringFind(OrderComment(), "partial close") < 0)
            continue;
            
         return OrderTicket();
      }
   }
  
   return 0;
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Получение тикета родительского ордера после частичного закрытия                                                                                                                                   |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
int GetTicketByPartialClose(string comment, int fromStart, int orderType, datetime openTime)
{
   string sTicket = StringSubstr(comment, fromStart + 6);
   int iTicket = (int)StringToInteger(sTicket);
   int type = OrderType();
   if (!OrderSelect(iTicket, SELECT_BY_TICKET))
      return 0;
      
   if (OrderType() == type)                                                                        // Дочерний ордер указывает на родителя - уходим
      return iTicket;
      
   // Дочерний ордер указывает на противоположный ордер. Необходимо искать родительский
   for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
         continue;
        
      if (OrderType() != orderType || OrderOpenTime() != openTime)
         continue;
        
      int iFind = StringFind(OrderComment(), "close hedge by #");
      if (iFind < 0)
         continue;
        
      sTicket = StringSubstr(OrderComment(), iFind + 16);
      int iNewTicket = (int)StringToInteger(sTicket);
      if (iNewTicket != iTicket)
         continue;
        
      return OrderTicket();
   }
  
   return 0;
}


 


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