Как узнать, какое сообщение поступило первым в OnTradeTransaction TRADE_TRANSACTION_HISTORY_ADD или TRADE_TRANSACTION_DEAL_ADD?

 

Всем привет!

Собственно САБЖ 

 
prostotrader:

Всем привет!

Собственно САБЖ 

Просто распечатать тип транзакции:

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---
   string   text     =EnumToString(trans.type);
   Print(__FUNCTION__,", ",text);
  }

и сразу станет понятно, какое событие было первым.

 

Добавлено: кстати, Вы увидите, что есть не только эти два события. Ещё можно пример посмотреть OrderSendAsync: там идёт распечатка более подробная в OnTarde() и в OnTradeTransaction().

 
Karputov Vladimir:

Просто распечатать тип транзакции:

и сразу станет понятно, какое событие было первым.

 

Добавлено: кстати, Вы увидите, что есть не только эти два события. Ещё можно пример посмотреть OrderSendAsync: там идёт распечатка более подробная в OnTarde() и в OnTradeTransaction().

Спасибо, но я хочу это "видеть" в коде, а не в журнале.
 
prostotrader:
Спасибо, но я хочу это "видеть" в коде, а не в журнале.

Так код я показал. 

Перефразируйте, что именно нужно. 

 

Добавлено.

Введите две переменные, в области глобальных переменных программы (советника) и сохраните в них время транзакций по типам. Одна переменная хранит время прихода TRADE_TRANSACTION_HISTORY_ADD , а вторая TRADE_TRANSACTION_DEAL_ADD.

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---
   if(trans.type==TRADE_TRANSACTION_HISTORY_ADD)
      time_HISTORY_ADD=GetMicrosecondCount();
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
      time_DEAL_ADD=GetMicrosecondCount();
  }
А там уже можете сравнивать эти два времени.
 

Видимо, я не совсем правильно поставил вопрос.

На ФОРТС, при парном трейдинге или календарном спреде, есть правило, которое минимизирует

проскальзывание, при открытии позиций.

Покупка(продажа) первой ноги происходит лимитным ордером (чтобы ухватить сколько дадут), а ответная сделка, для уравновешивания позиций,

должна производится как можно быстрее и рыночным ордером.

//+------------------------------------------------------------------+
//|                                                    Prioritet.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//
bool pause_trade;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   pause_trade=false;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   if(symbol==Symbol())
     {
      if(!pause_trade)
        {
         //Expert working....
        }
     }
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_DEAL_ADD:
         //pause_trade=??????????????????????????
         break;
      case TRADE_TRANSACTION_HISTORY_ADD:
         //Как узнать, что последнее событие TRADE_TRANSACTION_DEAL_ADD пришло или нет????
         //pause_trade=??????????????????????????
         break;
     }
  }
//+------------------------------------------------------------------+

 Но рыночный ордер может залится не одной сделкой, а несколькими, отсюда возникает проблема контроля, вызванная тем,

что нет очерёдности TRADE_TRANSACTION_DEAL_ADD  и TRADE_TRANSACTION_HISTORY_ADD.

Пока мы не получили TRADE_TRANSACTION_DEAL_ADD мы не можем правильно оценить баланс позиций.

На один  TRADE_TRANSACTION_HISTORY_ADD может приходится несколько TRADE_TRANSACTION_DEAL_ADD.

При открытии позиций по иструментам (до их полного выравнивания), необходимо делать паузу получения котировок pause_trade.

(чтобы небыло повторных срабатываний) 

Загвоздка в том когда нужно разблокировать  pause_trade.

Если первым пришло TRADE_TRANSACTION_HISTORY_ADD (всё, ордер в истории, но было ли TRADE_TRANSACTION_DEAL_ADD) мы не можем получить данные о позициях, пока не

получим  TRADE_TRANSACTION_DEAL_ADD.

 

Вот "Эксперты"

2016.08.05 19:29:19.872 OnTradeTransactionPartialСlosure (RTS-9.16,M1)  OnTradeTransaction, TRADE_TRANSACTION_ORDER_ADD
2016.08.05 19:29:19.873 OnTradeTransactionPartialСlosure (RTS-9.16,M1)  OnTradeTransaction, TRADE_TRANSACTION_REQUEST
2016.08.05 19:29:19.874 OnTradeTransactionPartialСlosure (RTS-9.16,M1)  OnTradeTransaction, TRADE_TRANSACTION_ORDER_UPDATE
2016.08.05 19:29:19.898 OnTradeTransactionPartialСlosure (RTS-9.16,M1)  OnTradeTransaction, TRADE_TRANSACTION_ORDER_UPDATE
2016.08.05 19:29:21.105 OnTradeTransactionPartialСlosure (RTS-9.16,M1)  OnTradeTransaction, TRADE_TRANSACTION_ORDER_UPDATE
2016.08.05 19:29:21.108 OnTradeTransactionPartialСlosure (RTS-9.16,M1)  OnTradeTransaction, TRADE_TRANSACTION_DEAL_ADD
2016.08.05 19:29:21.636 OnTradeTransactionPartialСlosure (RTS-9.16,M1)  OnTradeTransaction, TRADE_TRANSACTION_ORDER_DELETE
2016.08.05 19:29:21.640 OnTradeTransactionPartialСlosure (RTS-9.16,M1)  OnTradeTransaction, TRADE_TRANSACTION_HISTORY_ADD
2016.08.05 19:29:21.640 OnTradeTransactionPartialСlosure (RTS-9.16,M1)  OnTradeTransaction, TRADE_TRANSACTION_DEAL_ADD

а вот "Журнал":

2016.08.05 19:29:19.857 Trades  '1006437': sell limit 3.00 RTS-9.16 at 93110
2016.08.05 19:29:19.873 Trades  '1006437': sell limit 3.00 RTS-9.16 at 93110 placed for execution in 16 ms
2016.08.05 19:29:21.105 Trades  '1006437': deal #7441348 sell 2.00 RTS-9.16 at 93110 done (based on order #50801677)
2016.08.05 19:29:21.640 Trades  '1006437': deal #7441349 sell 1.00 RTS-9.16 at 93110 done (based on order #50801677)
 
Karputov Vladimir:

Вот "Эксперты"

а вот "Журнал":

Спасибо, но хотелось бы услышать и другие мнения.
 
prostotrader:
Спасибо
Как по мне - пока не прошла транзакция с типом TRADE_TRANSACTION_DEAL_ADD - нельзя ничего делать дальше - иначе может быть результат неопределённым.
 
Karputov Vladimir:
Как по мне - пока не прошла транзакция с типом TRADE_TRANSACTION_DEAL_ADD - нельзя ничего делать дальше - иначе может быть результат неопределённым.
"Как по Вам" мне понятно.
 

 Всем спасибо, проблему решил так:

Про получении  TRADE_TRANSACTION_HISTORY_ADD

Проверяю объёмы сделок по данному инструменту с нужным тикетом ордера, если их меньше,

чем инициировано в рыночном ордере, то будет ещё одно TRADE_TRANSACTION_DEAL_ADD 

 
prostotrader:

 Всем спасибо, проблему решил так:

Про получении  TRADE_TRANSACTION_HISTORY_ADD

Проверяю объёмы сделок по данному инструменту с нужным тикетом ордера, если их меньше,

чем инициировано в рыночном ордере, то будет ещё одно TRADE_TRANSACTION_DEAL_ADD 

А не будет проще, да и реакция кода станет более быстрой - так как не нужно будет обращаться к истории и смотреть историю ордеров, если изначально выставлять объём 1 лот? 
Причина обращения: