ФОРТС. Вопросы по исполнению - страница 15

 

Добрый день, Ренат!

Не могли бы Вы прокомментировать следующую ситуацию на ФОРТС (реал):

В стакане есть цена с объёмом 8. Этот объём сделали два корреспондента (по 4 с одинаковой ценой)

Я покупаю (продаю) этот объём (8) лимитированным ордером.

Происходит следующее:

1. Если ордер полностью заливается, то я в OnTradeTransaction получаю:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_FILLED

 

 2. Если ордер заливается объёмом 2-го корреспондента, то то я в OnTradeTransaction получаю:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_PARTIAL

 

 3.  Если ордер заливается объёмом 1-го корреспондента, то то я в OnTradeTransaction получаю:

 

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_CANCELED

 

 Почему? Ведь во втором и третьем случае ордер частично исполнился.

2015.03.02 17:10:26.204 Trades  'xxxxx': sell limit 8.00 GOLD-6.15 at 1222.1
2015.03.02 17:10:26.234 Trades  'xxxxx': sell limit 8.00 GOLD-6.15 at 1222.1 placed for execution in 23 ms
2015.03.02 17:10:26.254 Trades  'xxxxx': deal #9801184 sell 4.00 GOLD-6.15 at 1222.1 done (based on order #11413991)

2015.03.02 17:10:26.254 Forts_trader (GOLD-6.15,H1)     OnTradeTransaction: ордер удалён. Билет = 11413991


 

Написал проверку по этому ордеру, вот результат:

 

Это происходило на 1060 билде терминала и на 1035 билде сервера.

После вечернего (основновного) клиринга терминал обновился до 1085, но я

прекратил торговлю до выяснения причины. 

На демо (1085 - 1085) не получается воспроизвести ошибку (нет быстрых изменений в стаканах)  

 

"Поднял" историю всех своих ордеров.

Ошибка существует 1035, 1060 и 1085 билдах  

 

В первом случае ордер исполняется полностью одной сделкой и неисполненный остаток не снимается, т.к. ордер исполнился на полный объем. В лога видим одну, приведенную вами, запись:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_FILLED


Во втором случае происходит частичное исполнение ордера и снятие неисполненного остатка. Такое происходит потому что вы задали политику исполнения ордера - ORDER_FILLING_IOC:

Означает согласие совершить сделку по максимально доступному на рынке объему в пределах указанного в ордере. В случае невозможности полного исполнения ордер будет исполнен на доступный объем, а неисполненный объем ордера будет отменен.


В Вашем случае ордер был на 8 лотов по цене 1222.1. В момент выставления ордера на биржу, объем встречных ордеров по цене не хуже 1222.1 был 4 лота. В итоге 4 лота исполнились в виде одной сделки (потому что 4 лота были представлены одним встречным ордером). Остаток ордера снялся, т.е. ордер отменили.

По приведенным вами логам:

ордер частично исполнился:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_PARTIAL

далее остаток снялся, т.е. ордер отменился:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_CANCELED
 
Renat:

В первом случае ордер исполняется полностью одной сделкой и неисполненный остаток не снимается, т.к. ордер исполнился на полный объем. В лога видим одну, приведенную вами, запись:



Во втором случае происходит частичное исполнение ордера и снятие неисполненного остатка. Такое происходит потому что вы задали политику исполнения ордера - ORDER_FILLING_IOC:

Означает согласие совершить сделку по максимально доступному на рынке объему в пределах указанного в ордере. В случае невозможности полного исполнения ордер будет исполнен на доступный объем, а неисполненный объем ордера будет отменен.


В Вашем случае ордер был на 8 лотов по цене 1222.1. В момент выставления ордера на биржу, объем встречных ордеров по цене не хуже 1222.1 был 4 лота. В итоге 4 лота исполнились в виде одной сделки (потому что 4 лота были представлены одним встречным ордером). Остаток ордера снялся, т.е. ордер отменили.

По приведенным вами логам:

ордер частично исполнился:

далее остаток снялся, т.е. ордер отменился:

Тогда как же толковать ДОКУМЕНТАЦИЮ?

Дело всё в том, что в OnTradeTransaction не приходит сообщение о сделке (TRADE_TRANSACTION_DEAL_ADD) когда ORDER_STATE_CANCELED !

Но сделка БЫЛА! 

 
Mikalas:

Тогда как же толковать ДОКУМЕНТАЦИЮ?

Ордер снят. Клиента можно отпустить домой.
 
Renat:
Ордер снят. Клиента можно отпустить домой.

Дело всё в том, что в OnTradeTransaction не приходит сообщение о сделке (TRADE_TRANSACTION_DEAL_ADD) когда ORDER_STATE_CANCELED !

Но сделка БЫЛА! 

И где Вы увидели PARTIAL (это один из вариантов развития события)? Только CANCELED 

И в истории он хранится (см картинку) как CANCELED  

 

Добрый день, Ренат!

Вы считаете правильным, что частично исполненный ордер должен хранится в истории, как ордер ORDER_STATE_CANCELED

и в  OnTradeTransaction не должно приходить подтверждение о сделке частично исполненного ордера? 

Скажите, теперешняя логика работы платформы останется как есть или Вы готовы внести изменения в обозримом будущем?  

 
kond777:

Добрый день, Ренат!

Вы считаете правильным, что частично исполненный ордер должен хранится в истории, как ордер ORDER_STATE_CANCELED

и в  OnTradeTransaction не должно приходить подтверждение о сделке частично исполненного ордера? 

Скажите, теперешняя логика работы платформы останется как есть или Вы готовы внести изменения в обозримом будущем?  

А вы сами проверяли или просто среагировали на неполные описания от Mikalas? Приказ ведь был IOC.

Еще раз проверили поведение на своей стороне:

1. Установили эксперта из статьи "Рецепты MQL5 - обработка события TradeTransaction".

2. Выставили IOC ордер на низко ликвидном инструменте SILV-3.15. Ордер выставили на продажу 11 лотов по цене 16.48, при том, что по этой цене есть только 1 лот.

Получили следующее:

В терминале:


Помимо того, что ордер в состоянии "canceled" видим, что исполнился 1 лот из 11 запрошенных, это правильное поведение.

В журнале эксперта:

2015.03.03 16:32:56.022 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_ORDER_ADD
2015.03.03 16:32:56.173 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_ORDER_UPDATE
2015.03.03 16:32:56.325 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_REQUEST
2015.03.03 16:32:56.477 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_ORDER_UPDATE
2015.03.03 16:32:56.628 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_DEAL_ADD   <====== транзакция о сделке пришла
2015.03.03 16:32:56.779 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_ORDER_UPDATE
2015.03.03 16:32:56.930 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_ORDER_DELETE
2015.03.03 16:32:57.082 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_HISTORY_ADD

Т.е. транзакция о сделке пришла в OnTradeTransaction(). Если бы сделка не пришла, то вы бы ее в терминале вообще не увидели. Проверьте пожалуйста точно, что транзакция TRADE_TRANSACTION_DEAL_ADD действительно не приходит. Сравните поведение вашего эксперта с поведением предложенного выше экспертом.

 

Доброе утро, Ренат!

Вы же не гарантируете приход события OnTradeTransaction, вот оно и не пришло (TRADE_TRANSACTION_DEAL_ADD) 

А когда пришло событие TRADE_TRANSACTION_HISTORY_ADD, то статус ордера был  ORDER_STATE_CANCELED

Вот и "выросли ноги".

На мой взгляд, если ордер ( не важно с каким исполнением ) частично исполнился, то статус его

должен быть в истории как ORDER_STATE_PARTIAL 

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