Вопрос о функции OnTradeTransaction - страница 5

 
papaklass:

OnTradeTransaction() - это ОБРАБОТЧИК торгового события. Не важно чем вызвано событие, важно то, что событие произошло.

Выписка из документации:

OrderSend() / OrderSendAsync() - это ТОРГОВЫЕ ФУНКЦИИ.

Для OnTradeTransaction() нет никакой разницы с помощью какой функции Вы отправили торговый приказ OrderSend() или OrderSendAsync().

Так вот это я перечитал столько раз, прежде чем создать тему, ... промолчу.

Но всё-же, вывод сделал такой, что вероятность потери из кучи транзакций более вероятна, чем потеря одной транзакции в течении секунды, а может и не одной (секунды). Вот именно это я и пытаюсь выяснить. Пытаюсь выяснить ваше мнение по этому поводу. Какова вероятность потери транзакции, если они достаточно редки и одинарные?

 
papaklass:
С точки зрения вероятностей не знаю.

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

Потихоньку осваиваю, пытаюсь не нарушать логики, но иногда получается что одно мешает другому...

 
AlexeyVik:

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

Потихоньку осваиваю, пытаюсь не нарушать логики, но иногда получается что одно мешает другому...

Алексей, задайте себе простой вопрос:

Что лучше, копаться в истории, после каждой команды, или 1 раз, а может, вовсе ни разу, перепроверить ордер (не сработал OnTradeTransaction)? 

Проверку реализовать не просто (кстати,  в моём примере есть ошибки ), но вполне реально, главное принцип - КАЖДОМУ ордеру - СВОЙ Magic.

И ещё. Я уже говорил, что каждый волен идти своим путём.... 

 
Mikalas:

Алексей, задайте себе простой вопрос:

Что лучше, копаться в истории, после каждой команды, или 1 раз, а может, вовсе ни разу, перепроверить ордер (не сработал OnTradeTransaction)? 

Проверку реализовать не просто (кстати,  в моём примере есть ошибки ), но вполне реально, главное принцип - КАЖДОМУ ордеру - СВОЙ Magic.

И ещё. Я уже говорил, что каждый волен идти своим путём.... 

Михаил, именно простой ответ на этот простой вопрос и заставил меня всё это обсуждать. И пока я не собираюсь бросать эту затею. Но так и не могу понять, возможна-ли потеря транзакции после команды OrderSend() или активации отложки, или при закрытии позиции по стопу\тейку.

Из первого твоего ответа я понял что у тебя даже OrderSendAsync() не теряются транзакции. Пытаюсь понять это для решения, а надо-ли городить проверку при таких, достаточно редких транзакциях. Тем более учитывая выделенное.

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

 

Парни, вот такая непонятка вылезла:

Если открывать позицию, то OnTradeTransaction отрабатывает только TRADE_TRANSACTION_DEAL_ADD... Всё нормально.

Если ставить отложку, к примеру SellStop, отрабатывает только TRADE_TRANSACTION_ORDER_ADD... Тоже всё нормально.

А вот если поставить и позицию и следом отложку, то отрабатывает TRADE_TRANSACTION_DEAL_ADD и дважды TRADE_TRANSACTION_ORDER_ADD

почему так?

#include <Trade\Trade.mqh>


double point, FirstOpenPrice, TakeProfit, SecondOpenPrice, MaxPrice , MinPrice, SecondTake;
bool  NewStart;
       
    CTrade Trade;
    MqlTradeResult v_res, v_result;
    MqlTradeTransaction v_Trans;

/*******************Expert initialization function*******************/
int OnInit()
{
 point = _Digits%2 == 0 ? _Point : _Point * 10;
  NewStart = true;
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
 if(NewStart)
  {
   Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, 0.1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0.0, 0.0);
    Trade.SellStop(0.78, SymbolInfoDouble(_Symbol, SYMBOL_BID)-52*point, Symbol(), 0.0, 0.0, 0, 0);
   NewStart = false;
  }
}/*******************************************************************/

/*********************TradeTransaction function**********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{

  ENUM_TRADE_TRANSACTION_TYPE type = (ENUM_TRADE_TRANSACTION_TYPE)trans.type;
   
   switch(type)
    {
     case TRADE_TRANSACTION_ORDER_ADD:
      {
       Print("order add    * Тикет ордера * ", trans.order);
        Print("order add    * Объём ордера * ", trans.volume);
       break;
      }
     case TRADE_TRANSACTION_DEAL_ADD:
      {
       Print("deal add    * Тикет сделки * ", trans.deal);
        Print("deal add    * Объём сделки * ", trans.volume);
       break;
      }
     default: break;
    }

}/*******************************************************************/
 
AlexeyVik:

Парни, вот такая непонятка вылезла:

Если открывать позицию, то OnTradeTransaction отрабатывает только TRADE_TRANSACTION_DEAL_ADD... Всё нормально.

Если ставить отложку, к примеру SellStop, отрабатывает только TRADE_TRANSACTION_ORDER_ADD... Тоже всё нормально.

А вот если поставить и позицию и следом отложку, то отрабатывает TRADE_TRANSACTION_DEAL_ADD и дважды TRADE_TRANSACTION_ORDER_ADD

почему так?

Вы где-то ошиблись. И в первом и во втором случае должно быть как минимум два события: TRADE_TRANSACTION_ORDER_ADD и TRADE_TRANSACTION_DEAL_ADD. Почему Вы не получаете TRADE_TRANSACTION_ORDER_ADD не понятно.

Попробуйте switch закомментировать и вывести полный лог всех поступивших в  OnTradeTransaction событий.

 
C-4:

Вы где-то ошиблись. И в первом и во втором случае должно быть как минимум два события: TRADE_TRANSACTION_ORDER_ADD и TRADE_TRANSACTION_DEAL_ADD. Почему Вы не получаете TRADE_TRANSACTION_ORDER_ADD не понятно.

Попробуйте switch закомментировать и вывести полный лог всех поступивших в  OnTradeTransaction событий.

Да пробовал конечно. Перед switch(type) в пустой строке было Print(EnumToString(type)); И распечатывало именно так как я описал.

Вот повторные экперименты.




 

Проверил Ваш код у себя. - Все правильно работает.

 Вариант без отправки стоп ордера в догонку:

2015.02.10 18:32:03.332 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:32:03.331 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

Вариант с отправкой стоп-ордера:

2015.02.10 18:35:59.633 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_UPDATE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD


з.ы. Время на полный цикл приятно удивило: стаблильно 60-70 мсек. Разработчики молодцы, хорошо постарались!
 
C-4:

Проверил Ваш код у себя. - Все правильно работает.

 Вариант без отправки стоп ордера в догонку:

Вариант с отправкой стоп-ордера:

з.ы. Время на полный цикл приятно удивило: стаблильно 60-70 мсек. Разработчики молодцы, хорошо постарались!

Видимо это и есть потеря транзакций... и, в первую очередь, (вырезка из документации)

При этом очередность поступления этих транзакций в терминал не гарантирована

Василий, а это тестер или демка? У меня пробы с тестера. Интересно есть-ли разница срабатывания OnTradeTransaction в тестере и на счёте? При случае проверю.


ps; Получается так, что после потери транзакции она вдруг появляется при следующей активации функции OnTradeTransaction.

 
AlexeyVik:

Видимо это и есть потеря транзакций... и, в первую очередь, (вырезка из документации)

Василий, а это тестер или демка? У меня пробы с тестера. Интересно есть-ли разница срабатывания OnTradeTransaction в тестере и на счёте? При случае проверю.


ps; Получается так, что после потери транзакции она вдруг появляется при следующей активации функции OnTradeTransaction.

Нет, транзакции не теряются, просто они могут приходить не в определённой последовательности.

Только TRADE_TRANSACTION_REQUEST приходит всегда первым, иначе Вы не получите билет ордера. 

Читайте ВНИМАТЕЛЬНО документацию. 

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