Обработка транзакций OnTradeTransaction - страница 6

 

День добрый.

Никто никого не запугал. 

prostotrader:

У Вас нет switch(trans.type)

Ну само собой приведенный case находится в switch(trans.type). Поскольку там были еще case я не стал выкладывать весь код, чтобы не нагружать лишней информацией.

fxsaber спасибо за пример!

Alexey, именно так и есть. При неттинговом режиме я торгую на одном инструменте 2мя разными роботами. Те 2 поста, которые вы процитировали, дополняют друг друга.

Интересно решить проблему, отталкиваясь от первичного триггера изменения - onTradeTransaction.

Итого текущие проблемы, который встретил:

1. deal_add срабатывает, но позы нет. Пока мыслей нет

2. deal_add срабатывает, но ордер находится в третьем измерении. Поставил слип, последние  пару дней вроде помогает. За 1 секунду ордер успевает добраться до истории. У меня не высокочастотные роботы и по рыночным ордерам не работаю, поэтому такой вариант решения подходит.

3. deal_add срабатывает 2 раза. то есть один и тот же deal_add срабатывает 2 раза. Решается проверкой тикета прошлой сделки и сравнения с текущей.

Остается пункт 1. Немного пояснения по нему. 

Вчера выставил sell_limit, он сработал, пришла deal_add, но позиция не появилась и мы открыли стоп ордера просто так. Начал смотреть на описание транзакции и увидел что тип сделки DEAL_TYPE_SELL, а тип ордера в ней ORDER_TYPE_BUY. При этом тикет одера наш. Как-то не логично. Решил поставить проверку в OnTradeTransaction на транзакцию deal_add, что тип ордера и тип сделки должны совпадать по направлению. 

Поставил робота на демо, пришла снова подобная транзакция , но этот раз позиция изменилась. Но из-за нашей проверки стоп ордера не выставились. Что происходит?!

2019.02.08 16:05:14 [INFO]: ( FrTrend_2_Si-3.19_33) TRADE_TRANSACTION_DEAL_ADD
TRADE_TRANSACTION_DEAL_ADD
Symbol: Si-3.19
Deal ticket: 12677775
Deal type: DEAL_TYPE_SELL
Order ticket: 82675535
Order type: ORDER_TYPE_BUY
Order state: ORDER_STATE_STARTED
Order time type: ORDER_TIME_GTC
Order expiration: 1970.01.01 00:00
Price: 66287
Price trigger: 0
Stop Loss: 0
Take Profit: 0
Volume: 1
Position: 82675534
Position by: 0

prostotrader, сразу скажу, это то, что приходит в терминал. Без моих выдумываний.

 
Илья Ребенок:

Вчера выставил sell_limit, он сработал, пришла deal_add, но позиция не появилась и мы открыли стоп ордера просто так. Начал смотреть на описание транзакции и увидел что тип сделки DEAL_TYPE_SELL, а тип ордера в ней ORDER_TYPE_BUY. При этом тикет одера наш. Как-то не логично. Решил поставить проверку в OnTradeTransaction на транзакцию deal_add, что тип ордера и тип сделки должны совпадать по направлению.

А вот тут стОит перечитать справку "Структура торговой транзакции" - в части, какие поля заполняются для типа deal_add.

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

 

С помощью этого  проще анализировать, как все происходит.


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

 
JRandomTrader:

А вот тут стОит перечитать справку "Структура торговой транзакции" - в части, какие поля заполняются для типа deal_add.

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

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

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

 

Илья Ребенок:

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

Тикет позиции в транзакции deal_add был, а позиции не было до этого и она не появилась при этом? Тут надо разбираться.

 
JRandomTrader:

Тикет позиции в транзакции deal_add был, а позиции не было до этого и она не появилась при этом? Тут надо разбираться.

позиции не было до этого

 
Илья Ребенок:

позиции не было до этого

А тикет позиции в транзакции был?

 
JRandomTrader:

А тикет позиции в транзакции был?

Постом выше я наверное немного внес непонимание. Позиция была, потом была закрыта по стоп ордерам. То есть кол-во позиции стало 0. Потом сработала сделка, но позиция не появилась 

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

Position: 82675534
 
Илья Ребенок:

Постом выше я наверное немного внес непонимание. Позиция была, потом была закрыта по стоп ордерам. То есть кол-во позиции стало 0. Потом сработала сделка, но позиция не появилась 

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

Если позиция по символу (совокупная, всех роботов и ручных сделок вместе) стала 0.0, то следующая сделка откроет (DEAL_ENTRY_IN) новую позицию, с новым тикетом (==тикету ордера).

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

 

Наличие позиций и DEAL_ENTRY-флаги никак не должны участвовать в логике.

Нужно смотреть только на мэджик и комментарий новых сделок и текущих ордеров, как на идентификаторы свой/чужой.


Рабочий код показывал. Там ровно это.

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

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

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


Переход на Async+Transactions сравни переходу с высокоуровневого языка на ассемблер. Т.е. его нужно производить на самом последнем этапе создания ТС, когда она ПОЛНОСТЬЮ исследована, готова к РЕАЛУ и осталось последнее - ускорить торговые операции БЕЗ изменения торговой логики.