Срабатывание отложенного ордера

 

Необходимо определить ситуацию, когда сделка появилась в результате срабатывания отложенного ордера. Появление сделки и срабатывание отложенного ордера - это элементы торговой истории. Пример торговой истории (окно "Инструменты", вкладка "История" и на вкладке "История" через правый клик выбрано отображение "Ордера и сделки") - сработал отложенный ордер Sell limit

выставлен отложенный ордер Sell limit

Транзакцию TRADE_TRANSACTION_DEAL_ADD (добавление сделки в историю) я отлавливаю в OnTradeTransaction(). И здесь же провожу проверку - точно ли эта сделка есть в торговой истории:

//+------------------------------------------------------------------+
//| 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)
     {
      Print("---");
      Print(__FILE__," ",__FUNCTION__,", TRADE_TRANSACTION_DEAL_ADD");
      //---
      if(HistoryDealSelect(trans.deal))
        {

        }
      else
        {
         Print(__FILE__," ",__FUNCTION__,", ERROR: ","HistoryDealSelect(",trans.deal,")");
         return;
        }
      //---
      if(HistoryOrderSelect(trans.order))
        {

        }
      else
        {
         Print(__FILE__," ",__FUNCTION__,", ERROR: ","HistoryOrderSelect(",trans.order,")");
         return;
        }
     }
  }

и затем пытаюсь получить ордер из торговой истории (ордер который инициировал эту сделку) - но получаю ошибку: HistoryOrderSelect() не может найти этот ордер в торговой истории. Очевидно, что в торговую истории сначала пишется сделка, а затем уже записывается ордер.


Какие есть идеи? Как при отловленной транзакции TRADE_TRANSACTION_DEAL_ADD получить из торговой истории и сделку и ордер?

 

Если пришла сделка и нет ее ордера, то взвести соответствующий флаг.

Если пришел ордер и взведен флаг, считать, что пришла сделка. Флаг обнулить.

 
fxsaber:

Если пришла сделка и нет ее ордера, то взвести соответствующий флаг.

Если пришел ордер и взведен флаг, считать, что пришла сделка. Флаг обнулить.

На случай множественных транзакций (одна за другой) думал или о двумерном массиве [тикет сделки][тикет ордера]. Но о конкретной реализации ещё не знаю. Массив на случай того, что транзакции могут прийти вразнобой (сначала сделка потом ордер или наоборот).

В OnTradeTransaction заполнять этот массив (для заполнения ордеров нужно будет отлавливать TRADE_TRANSACTION_ORDER_ADD), а в OnTick проверять массив.

 
Vladimir Karputov:

На случай множественных транзакций (одна за другой) думал или о двумерном массиве [тикет сделки][тикет ордера]. Но о конкретной реализации ещё не знаю. Массив на случай того, что транзакции могут прийти вразнобой (сначала сделка потом ордер или наоборот).

В OnTradeTransaction заполнять этот массив (для заполнения ордеров нужно будет отлавливать TRADE_TRANSACTION_ORDER_ADD), а в OnTick проверять массив.

Я использую

//--- request trade history
   HistorySelect(0,TimeCurrent());
//--- create objects
   string   name;
   uint     total=HistoryDealsTotal();

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

насколько я понимаю, цепочку ордер-сделка-позиция объединяет общий ID (я его использую, например, для поиска комиссии, которая числится в сделке, соответствующей позиции). должно и для ордера сработать - перебрать связки сделки-ордера с одинаковым ID и проверять тип ордера

Речь об этих свойствах:

 
Vladimir Karputov:

Необходимо определить ситуацию, когда сделка появилась в результате срабатывания отложенного ордера. Появление сделки и срабатывание отложенного ордера - это элементы торговой истории. Пример торговой истории (окно "Инструменты", вкладка "История" и на вкладке "История" через правый клик выбрано отображение "Ордера и сделки") - сработал отложенный ордер Sell limit


Транзакцию TRADE_TRANSACTION_DEAL_ADD (добавление сделки в историю) я отлавливаю в OnTradeTransaction(). И здесь же провожу проверку - точно ли эта сделка есть в торговой истории:

и затем пытаюсь получить ордер из торговой истории (ордер который инициировал эту сделку) - но получаю ошибку: HistoryOrderSelect() не может найти этот ордер в торговой истории. Очевидно, что в торговую истории сначала пишется сделка, а затем уже записывается ордер.


Какие есть идеи? Как при отловленной транзакции TRADE_TRANSACTION_DEAL_ADD получить из торговой истории и сделку и ордер?

Я для себя решил использовать OnTrade, т.к.  OnTradeTransaction() как раз и вызывается подряд несколько раз - 1. сделка заключена 2. позиция открылась 3. ордер удален из  открытых 4. ордер добавлен в историю.

И на всё это вызывается в конце один OnTrade. Если скорость не критична, тогда пойдёт. Иначе отслеживать события с типом TRADE_TRANSACTION_HISTORY_ADD, тогда значит ордер уже в истории.

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


Какие есть идеи? Как при отловленной транзакции TRADE_TRANSACTION_DEAL_ADD получить из торговой истории и сделку и ордер?

Если отложенный ордер исполнился всем объемом, то

TRADE_TRANSACTION_HISTORY_ADD 

Если не всем объемом, то в TRADE_TRANSACTION_DEAL_ADD

проверяем начальный объем ордера и текущий.

ord_data.vol_init = OrderGetDouble(ORDER_VOLUME_INITIAL);
ord_data.vol_cur = OrderGetDouble(ORDER_VOLUME_CURRENT);
 
prostotrader:

Если отложенный ордер исполнился всем объемом, то

TRADE_TRANSACTION_HISTORY_ADD 

Если не всем объемом, то в TRADE_TRANSACTION_DEAL_ADD

проверяем начальный объем ордера и текущий.

Вот за это огромное спасибо. Не сталкивался, так как нет биржевого счёта. Спасибо.


Добавлено:

Вероятно нужно ещё учесть и Общие принципы - Торговые операции

Следует учитывать, что в некоторых случаях результатом исполнения ордера могут быть сразу несколько сделок.

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