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

 
prostotrader:

можно обойтись без таймера (всё зависит от конкретной задачи).

 Зачем множество решений зависящих от конкретных задач, когда есть одно универсальное решение?
 
A100:
 Зачем множество решений зависящих от конкретных задач, когда есть одно универсальное решение?

Имелось ввиду срабатывание отложенного ордера (стоящего в очереди), да и способ отправки ордера

тоже имеет значение (ассинхронный или нет).

 

Откуда ушли, туда же и пришли. В итоге все сводится к тому, что надо писать функцию анализирующую историю и только на основании анализа истории принимать решение. Если надо ускориться на 33 тысячных секунды, то дополнительно вызывать эту функцию из OnTradeTransaction()... из таймера... откуда угодно.

 
Dmitry Fedoseev:

Откуда ушли, туда же и пришли. В итоге все сводится к тому, что надо писать функцию анализирующую историю и только на основании анализа истории принимать решение. Если надо ускориться на 33 тысячных секунды, то дополнительно вызывать эту функцию из OnTradeTransaction()... из таймера... откуда угодно.

Выходит действительно так получается. Только сейчас понял, что можно даже в OnTradeTransaction не анализировать чего там пришло, а просто на дурака вызывать функцию анализирующую историю, следуя логике "если что появилось, то оно появилось, а если нет - то его нет":))

 

Dmitry FedoseevVasiliy Sokolov

Глобально Вы правы, но бывают ТС в которых просто необходимо как можно быстрее ответить на сообщение об отправленном ордере (н-р парный трейдинг)

И в OnTradeTransaction TRADE_TRANSACTION_DEAL_ADD позволяет оперативно отреагировать на совершение первой сделки.

Добавлено

Вот подтверждение моих слов (реал)

2018.08.13 14:58:05.876 Trades  'xxxxx': deal #51640488 buy 2.00 RTS-12.18 at 105590 done (based on order #91559424)
2018.08.13 14:58:05.876 Trades  'xxxxx': exchange sell 2.00 RTS-9.18 at market
2018.08.13 14:58:05.882 Trades  'xxxxx': accepted exchange sell 2.00 RTS-9.18 at market
2018.08.13 14:58:05.883 Trades  'xxxxx': exchange sell 2.00 RTS-9.18 at market placed for execution in 6.493 ms
2018.08.13 14:58:05.890 Trades  'xxxxx': deal #51640489 sell 1.00 RTS-9.18 at 105960 done (based on order #91559458)
2018.08.13 14:58:05.892 Trades  'xxxxx': deal #51640490 sell 1.00 RTS-9.18 at 105960 done (based on order #91559458)

Ответная сделка(ки) произошла через 14-16 мс.

На самом деле, быстрее (пока сервер обработал ответ биржи и отправил в терминал)

А время реагирования измеряется микросекундами

2018.08.13 14:58:05.876 Trades  'xxxxx': deal #51640488 buy 2.00 RTS-12.18 at 105590 done (based on order #91559424)
2018.08.13 14:58:05.876 Trades  'xxxxx': exchange sell 2.00 RTS-9.18 at market

Добавлено

Совсем забыл...

Если установлен отложенный ордер (стоит в стакане в очереди), то по таймеру (OnTick(), OnBookEvent()), мы будем просто бессмысленно "долбить" функцию проверки торгового окружения!

И в истории ордера не будет!

 

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

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

Viktar Dzemikhau, 2018.08.11 13:23

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

Верно подмечено, что-то не то... наверное случайность...

Правда у автора есть такой пассаж в упомянутой статье:

4. Универсальный обработчик

Давайте посмотрим глазами конечного пользователя на программу, которая умеет работать с событием TradeTransaction. Наверное, пользователю понадобится именно та, которая сможет успешно работать как с ордерами, так и с позициями. Тогда программист должен написать код для обработчика OnTradeTransaction() таким образом, чтобы последний умел идентифицировать все транзакции и их комбинации, независимо от того, что обрабатывалось – позиция или ордер. Ну и желательно, чтобы по завершению обработки серии транзакций программа смогла бы сказать, какая торговая операция была выполнена.

В моём примере используется последовательная обработка транзакций. Однако разработчик языка MQL5 утверждает следующее:

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

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

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

Кстати, можно придумать какой-нибудь контейнер. Заполняться он будет транзакциями, которые могут поступать без "правильной" последовательности. И как только контейнер заполнится, то он сообщит, что произошло какое-то торговое событие. Вот как-то так...


P.S. А я думал, что в августе все на пляже :-)) 

 
Denis Kirichenko:

...

P.S. А я думал, что в августе все на пляже :-)) 

Лично я уже свое отвалялся на горячем песочке:)

 
Vasiliy Sokolov:

Да, совершенно точно. При работе с OnTradeTransaction нужно всегда писать две независимые логики: одну для OnTradeTranaction, другую альтернативную, например проверять состояние позиций и ордеров по таймеру. При том, если сработала логика для OnTradeTranaction делать так, что бы по OnTimer логика уже не срабатывала (исключить двойное срабатывание). Это серьезное усложнение алгоритма.

Единственное преимущество OnTradeTranaction в Вашем случае, на сколько я понимаю, это скорость. Вы по пришедшему событию узнаете о изменениях сразу, не дожидаясь нового тика или вызова таймера. Однако если делать логику по таймеру с временем 100 мсек., то в среднем Вы будете узнавать об изменениях на рынке на всего на 50 мсек позже, чем они фактически произойдут. И это без всяких усложнений логики. Выходит что топорный таймер делает тоже, почти также быстро и гораздо надежней. Как-то вот так получается.

Это уже излишество. Проверять то, что "работает", а потом то, чем проверяешь "проверять". Ну можно ещё проверить то, чем будет проверять OnTradeTranaction(). И будет совсем идиотизм. Я ни кого не оскорбляю своим постом. Дело в том, что у меня сложились такие мысли, когда я про это думал.

Есть 2 вариант. Использовать проверки событий по тиково или по таймеру. Другого нет. Я сам пока что не решил. По ходу, таймер удобен тем, что таким образом можно отделить логику совы от логики событий. (ещё больше отделить т.к. у меня и так к каждой сове прилагается класс Signal, в котором формируется торговый сигнал.

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

 
Viktar Dzemikhau:

--> Ну и кк это можно сделать? Дублировать проверку? Т.е. тоже самое, только как-то с другой стороны без транзакции писать и узнавать те же данные? Тогда зачем эот чудесный метод, если всё за него нужно перепроверять?

МТ-5 - это приложение Клиент- Сервер и т.к ответы сервера приходят ассинхронно, то какие-то проверки торгового окружения - неизбежны.

Сегодня думаю напишу. Возможно даже, в течение часа-двух.

 
Vasiliy Sokolov:

Выходит действительно так получается. Только сейчас понял, что можно даже в OnTradeTransaction не анализировать чего там пришло, а просто на дурака вызывать функцию анализирующую историю, следуя логике "если что появилось, то оно появилось, а если нет - то его нет":))

И как это понимать? Ну если ничего там не анализировать, тогда можно и в таймере историю вызвать и потиково. Нафига нам тогда OnTradeTransaction() ?

Да и если не отлавливать событие, как Вы выразились, то OnTradeTransaction() можно выкинуть и лопатить историю без него. Странные у Вас мысли..