Очерёдность приходящих транзакций

 

Решил я сегодня проверить всю цепочку приходящих транзакций. Если теоритически я всё это уже понимаю, но когда принтанул в журнале всё, я понял, что понимаю это иначе, а не так как есть, на самом деле.

Суть следующая.. Сова ставит 2 отложки в обе стороны. Отложки установились. Доходит дело до функции OnTradeTransaction(). Там вот такой код:

    Print("\n---===Транзакция===---");
    PrintFormat("Тикет сделки: %d", transaction.deal);
    PrintFormat("Тип сделки: %s", EnumToString(transaction.deal_type));
    PrintFormat("Тикет ордера: %d", transaction.order);
    PrintFormat("Состояние ордера: %s", EnumToString(transaction.order_state));
    PrintFormat("Тип ордера: %s", EnumToString(transaction.order_type));
    PrintFormat("Цена: %0." + IntegerToString(_Digits) + "f", transaction.price);
    PrintFormat("Уровень Stop Loss: %0." + IntegerToString(_Digits) + "f", transaction.price_sl);
    PrintFormat("Уровень Take Profit: %0." + IntegerToString(_Digits) + "f", transaction.price_tp);
    PrintFormat("Цена срабатывания стоп-лимитного ордера: %0." + IntegerToString(_Digits) + "f", transaction.price_trigger);
    PrintFormat("Торговый инструмент: %s", transaction.symbol);
    PrintFormat("Срок истечения отложенного ордера: %s", TimeToString(transaction.time_expiration));
    PrintFormat("Тип ордера по времени действия: %s", EnumToString(transaction.time_type));
    PrintFormat("Тип торговой транзакции: %s", EnumToString(transaction.type));
    PrintFormat("Объём в лотах: %0.2f", transaction.volume);

    if (transaction.type == TRADE_TRANSACTION_REQUEST) {
      //--- вывод информации о запросе
      Print("\n---===Запрос===---");
      PrintFormat("Тип выполняемого действия: %s", EnumToString(request.action));
      PrintFormat("Комментарий к ордеру: %s", request.comment);
      PrintFormat("Отклонение от запрашиваемой цены: %d", request.deviation);
      PrintFormat("Срок истечения ордера: %s", TimeToString(request.expiration));
      PrintFormat("Магик советника: %d", request.magic);
      PrintFormat("Тикет ордера: %d", request.order);
      PrintFormat("Цена: %0." + IntegerToString(_Digits) + "f", request.price);
      PrintFormat("Уровень Stop Loss ордера: %0." + IntegerToString(_Digits) + "f", request.sl);
      PrintFormat("Уровень Take Profit ордера: %0." + IntegerToString(_Digits) + "f", request.tp);
      PrintFormat("Уровень StopLimit ордера: %0." + IntegerToString(_Digits) + "f", request.stoplimit);
      PrintFormat("Торговый инструмент: %s", request.symbol);
      PrintFormat("Тип ордера: %s", EnumToString(request.type));
      PrintFormat("Тип ордера по исполнению: %s", EnumToString(request.type_filling));
      PrintFormat("Тип ордера по времени действия: %s", EnumToString(request.type_time));
      PrintFormat("Объём в лотах: %0.2f", request.volume);

      //--- вывод информации об ответе
      Print("\n---===Ответ===---");
      PrintFormat("Код результата операции: %d", result.retcode);
      PrintFormat("Тикет сделки: %d", result.deal);
      PrintFormat("Тикет ордера: %d", result.order);
      PrintFormat("Объём сделки: %0.2f", result.volume);
      PrintFormat("Цена в сделке: %0." + IntegerToString(_Digits) + "f", result.price);
      PrintFormat("Бид: %0." + IntegerToString(_Digits) + "f", result.bid);
      PrintFormat("Аск: %0." + IntegerToString(_Digits) + "f", result.ask);
      PrintFormat("Комментарий к операции: %s", result.comment);
      PrintFormat("Идентификатор запроса: %d", result.request_id);

Вот, что в журнале вижу:

2018.08.09 16:20:22.211 2016.01.04 00:30:00   buy stop 0.10 GBPJPY at 177.443 tp: 177.593 (177.250 / 177.327 / 177.250)
2018.08.09 16:20:22.211 2016.01.04 00:30:00   sell stop 0.10 GBPJPY at 177.070 tp: 176.920 (177.250 / 177.327 / 177.250)
2018.08.09 16:20:22.212 2016.01.04 00:30:00   
2018.08.09 16:20:22.212 2016.01.04 00:30:00   ---===Транзакция===---
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тикет сделки: 0
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тип сделки: DEAL_TYPE_BUY
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тикет ордера: 2
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Состояние ордера: ORDER_STATE_PLACED
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тип ордера: ORDER_TYPE_BUY_STOP
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Цена: 177.443
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Уровень Stop Loss: 0.000Состояние ордера: ORDER_STATE_PLACED
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Уровень Take Profit: 177.593
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Цена срабатывания стоп-лимитного ордера: 0.000
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Торговый инструмент: GBPJPY
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Срок истечения отложенного ордера: 1970.01.01 00:00
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тип ордера по времени действия: ORDER_TIME_GTC
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тип торговой транзакции: TRADE_TRANSACTION_ORDER_ADD
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Объём в лотах: 0.10
2018.08.09 16:20:22.212 2016.01.04 00:30:00   
2018.08.09 16:20:22.212 2016.01.04 00:30:00   ---===Транзакция===---
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тикет сделки: 0
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тип сделки: DEAL_TYPE_BUY
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тикет ордера: 0
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Состояние ордера: ORDER_STATE_STARTED
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тип ордера: ORDER_TYPE_BUY
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Цена: 0.000
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Уровень Stop Loss: 0.000
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Уровень Take Profit: 0.000
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Цена срабатывания стоп-лимитного ордера: 0.000
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Торговый инструмент: 
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Срок истечения отложенного ордера: 1970.01.01 00:00
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тип ордера по времени действия: ORDER_TIME_GTC
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тип торговой транзакции: TRADE_TRANSACTION_REQUEST
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Объём в лотах: 0.00
2018.08.09 16:20:22.212 2016.01.04 00:30:00   
2018.08.09 16:20:22.212 2016.01.04 00:30:00   ---===Запрос===---
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тип выполняемого действия: TRADE_ACTION_PENDING
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Комментарий к ордеру: 
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Отклонение от запрашиваемой цены: 0
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Срок истечения ордера: 1970.01.01 00:00
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Магик советника: 7153021
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тикет ордера: 0
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Цена: 177.443
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Уровень Stop Loss ордера: 0.000
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Уровень Take Profit ордера: 177.593
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Уровень StopLimit ордера: 0.000
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Торговый инструмент: GBPJPY
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тип ордера: ORDER_TYPE_BUY_STOP
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тип ордера по исполнению: ORDER_FILLING_RETURN
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тип ордера по времени действия: ORDER_TIME_GTC
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Объём в лотах: 0.10
2018.08.09 16:20:22.212 2016.01.04 00:30:00   
2018.08.09 16:20:22.212 2016.01.04 00:30:00   ---===Ответ===---
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Код результата операции: 10009
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тикет сделки: 0
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Тикет ордера: 2
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Объём сделки: 0.10
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Цена в сделке: 0.000
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Бид: 177.250
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Аск: 177.327
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Комментарий к операции: 
2018.08.09 16:20:22.212 2016.01.04 00:30:00   Идентификатор запроса: 0
2018.08.09 16:20:22.212 2016.01.04 00:30:00   

Выделенное жёлтым очень интересно и странно. Получается, что изначально, состояние ордера - принят:

Состояние ордера: ORDER_STATE_PLACED

А после состояние уже становится:

Состояние ордера: ORDER_STATE_STARTED

Т.е. ещё не принят. Это что за чушь? В тестере функция OnTradeTransaction() работает не корректно? Имею ввиду не работает даже, а возвращает данные.

Суть в том, что у меня всё работает правильно при торговле. Но вот выводит в журнал какую-то чушь. А я хотел проследить цепочку всю приходящих транзакций, что бы закрыть этот вопрос раз и навсегда.

 

Печатайте все транзакции, тогда будет видна связь.

Статья С чего начать при создании торгового робота для Московской биржи MOEX. "... вы можете запустить на своем счете советника TradeTransactionListener.mql5, который просто слушает события TradeTransaction и выводит краткую информацию по ним: ... "

 

Внимательней надо читать документацию.

Один торговый запрос, отправленный из терминала вручную или через торговые функции OrderSend()/OrderSendAsync(), может порождать на торговом сервере несколько последовательных торговых транзакций. При этом очередность поступления этих транзакций в терминал не гарантирована, поэтому нельзя свой торговый алгоритм строить на ожидании поступления одних торговых транзакций после прихода других.


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

Печатайте все транзакции, тогда будет видна связь.

Так я все и печатаю. Код выше же привёл. Там нет фильтров.


Vladimir Karputov:

Статья С чего начать при создании торгового робота для Московской биржи MOEX. "... вы можете запустить на своем счете советника TradeTransactionListener.mql5, который просто слушает события TradeTransaction и выводит краткую информацию по ним: ... "

У меня же и так всё пишется, к чему другие какие-то советники?


Alexey Viktorov:

Внимательней надо читать документацию.

Судя по всему, косяк именно в этом. Приходят транзакции не в том порядке, в котором испольняются события. Хотя, это странно, я бы сказал. Порядок исполнения событий определённый и здесь без вариантов. Как говорится, яйцо курицу не снесёт. Так и здесь, ордер не будет принят, пока он не пройдут все проверки требуемые. Поэтому как получается разбежка в возврате сервером данных хаотичная это очень даже странно. Буду знать, что ж ещё сказать..

 
Viktar Dzemikhau:

Судя по всему, косяк именно в этом. Приходят транзакции не в том порядке, в котором испольняются события. Хотя, это странно, я бы сказал. Порядок исполнения событий определённый и здесь без вариантов. Как говорится, яйцо курицу не снесёт. Так и здесь, ордер не будет принят, пока он не пройдут все проверки требуемые. Поэтому как получается разбежка в возврате сервером данных хаотичная это очень даже странно. Буду знать, что ж ещё сказать..

Я думаю здесь не большая потеря по сравнению с выигрышем скорости. Ведь если поставить чёткую очерёдность, то вообще отпадает смысл OrderSendAsync() а отсюда и
OrderSend() попадает туда-же.

 
Alexey Viktorov:

Я думаю здесь не большая потеря по сравнению с выигрышем скорости. Ведь если поставить чёткую очерёдность, то вообще отпадает смысл OrderSendAsync() а отсюда и
OrderSend() попадает туда-же.

Вы не внимательно прочтали моё сообщение. Я не писал, что должна быть очередь исполнения или прихода данных о транзакциях в целом. Я имею ввиду, что если по факту тразакция конкретного тикета происходить в понятном порядке, например, ордер - сделки - позиция. То и приход данных об этой цепочке логично, что бы был таким же, а не хаотичных. Тоже самое, если состояние изначально ордера не определённое, а уже в финальной стадии ордер принят брокером, то должна в таком порядке и приходить информация а цепочке транзакций, а не наоборот.

Замечу, что на скорость эта никак не повляет. Ждать то не нужно синхронности. Асинхронно то всё-равно всё происходит. Но транзакция исполняется всё-равно синхронно, как ни крути. Не бывает такого. что бы ордер был принят изначально, а потом его состояние стало не определено. Это дичь.
 
Viktar Dzemikhau:

Вы не внимательно прочтали моё сообщение. Я не писал, что должна быть очередь исполнения или прихода данных о транзакциях в целом. Я имею ввиду, что если по факту тразакция конкретного тикета происходить в понятном порядке, например, ордер - сделки - позиция. То и приход данных об этой цепочке логично, что бы был таким же, а не хаотичных. Тоже самое, если состояние изначально ордера не определённое, а уже в финальной стадии ордер принят брокером, то должна в таком порядке и приходить информация а цепочке транзакций, а не наоборот.

Замечу, что на скорость эта никак не повляет. Ждать то не нужно синхронности. Асинхронно то всё-равно всё происходит. Но транзакция исполняется всё-равно синхронно, как ни крути. Не бывает такого. что бы ордер был принят изначально, а потом его состояние стало не определено. Это дичь.

Да вроде нормально прочёл. Вот если представить, что выполняются не только ваши ордера... Все остальные должны ждать пока сервер отправит на терминал в определённой последовательности всю цепочку транзакций? А если вашим ордерам придётся ждать? Видимо начнём возмущаться скоростью исполнения.

 
Alexey Viktorov:

Да вроде нормально прочёл. Вот если представить, что выполняются не только ваши ордера... Все остальные должны ждать пока сервер отправит на терминал в определённой последовательности всю цепочку транзакций? А если вашим ордерам придётся ждать? Видимо начнём возмущаться скоростью исполнения.

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

Я к тому, что писало бы оно нормально, любой бы открыл терминал.. прогнал любой сов и поглядеть цепочку... - понял всё усвоил, и вопрос снять, даже без обмусоливания этих вещей, которые должны быть изначально понятны. Потому что я почитал вчера, и пришёл к выводу, что большинство форучан не догоняют вообще причины появления этой функции. Он до сих пор думают, что это нужно лишь при ассинхронной торговле. Это признак новичка. Ведь, и, в правду, кто не работал ни с чем, кроме как мкл, тому попробуй объясни что такое слушатель и вообще события. Я для себя решил, что это самый стабильный и быстрый, по крайне мере, теоритически, способ получать извещения и изменении состояния ордера или позиции, причём не важно, торговля ассинхронная или синхронная. Потому что иначе придётся порождать дополнителные циклы и переменные, что не есть хорошо, как в плане увеличенич размера кода, так и в плане скорости выполнения. Скорость нынче и так высокая, т.к. процы продвинулись прилично, а вот когда код визуально увеличивается в разы, это уже не есть хорошо, в плане сопровождения кода, если что..

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

 
Viktar Dzemikhau:

... и пришёл к выводу, что большинство форучан не догоняют вообще причины появления этой функции.

Ну это уж совсем неправда.

Выделенная красным цитата из документации уже удалена в связи с исправлениями. Сейчас никакие транзакции не теряются.

Вопрос о функции OnTradeTransaction
Вопрос о функции OnTradeTransaction
  • 2015.02.05
  • www.mql5.com
Вот и вытекает вопрос: А для чего тогда нужна эта функция обработки события?
 
Alexey Viktorov:

Ну это уж совсем неправда.

Выделенная красным цитата из документации уже удалена в связи с исправлениями. Сейчас никакие транзакции не теряются.

Я это читал. Да и не писал я о том, что транзакции теряются. У меня всё приходит, но приходит всё хаотично т.е. в разнобой так сказать. Я об этом уже пишу не первый раз.
 
Alexey Viktorov:

Ну это уж совсем неправда.

Выделенная красным цитата из документации уже удалена в связи с исправлениями. Сейчас никакие транзакции не теряются.

  Еще как теряются - самый простой способ это проверить - организовать поток транзакций и отключить интернет на короткий промежуток времени
Причина обращения: