[3.0.14]
При перерегистрации новый Order может остаться в состоянии None навечно.
Сценарий 1
- 29.24 Послал регистрацию заявки sell 194620@1 TransactionID=71653170
- 29.32 Пришел OrdersChanged на Active
- 29.43 Пришел NewOrder (уже странно, сначала статус потом что ордер зарегистрирован)
- 29.98 Пришел OrdersChanged на Active
- 30.40 Посылаем ReRegisterOrder на sell 194620@2. Т.е. меняется только объем. Получаем TransID=71653170
После этого 10 секунд никаких событий. А ожидается что 71653170 придет Done V=1,B=1, а 71653170 придет OrdersChanged=Active.
Отправляет ли S# MoveOrder для только измененного объема?
В качестве дополнения еще один формат лога;) Легенда: A=REG call RegisterOrder A=MYTRADE event NewMyTrade A=STATE event OrdersChanged A=POSCHG event PositionsChanged TID=TransactionID, ID = Order.ID (или Trade.ID), V=Volume, B=Balance. POS=позиция возвращаема PositionManager. PrevID=ID перерегистрируемого ордера.
T=2011031020012924,A=REG,ID=0,TID=71653170,DIR=Sell,P=194620,V=1,B=1,STATE=None,STATUS=,POS=0
T=2011031020012932,A=MYTRADE,ID=13313305,OID=378434295,TID=71653169,DIR=Buy,P=194580,V=1,OP=194580,OV=1,OB=0,STATE=Done
T=2011031020012932,A=STATE,ID=0,TID=71653170,DIR=Sell,P=194620,V=1,B=1,STATE=Active,STATUS=ReceiveByServer
T=2011031020012943,A=ORD,ID=378434509,TID=71653170,DIR=Sell,P=194620,V=1,B=1,STATE=Active,STATUS=Accepted
T=2011031020012946,A=POSCHG,ID=2011031020012946,P=RIH1,V=1
T=2011031020012990,A=POSCHG,ID=2011031020012990,P=RIH1,V=1
T=2011031020012998,A=STATE,ID=378434509,TID=71653170,DIR=Sell,P=194620,V=1,B=1,STATE=Active,STATUS=Accepted
T=2011031020013040,A=REREG,ID=0,TID=71653171,PrevID=378434509,DIR=Sell,P=194620,V=2,B=2,STATE=None,STATUS=,POS=1
Сценарий 2. Лога нет, но суть такая.
Пусть перерегистрируем заявку1. Актуальная информация о ней - что она Active. Запрос на перереристрацию уходит. Новая заявка Заявка2. За то время пока он идет по перерегистрируемой заявке1 случается полный филл. К нам приходит Done по заявке1. А вот по заявке2 никакого Fail не придет в этом случае. Она так и останется в состоянии None.
Плюс такой вопрос. точнее несколько.
- Правильно ли я понимаю, что OrdersChanged, NewMyTrade и PositionsChanged все асинхронные и могут прийти в любом порядке?
- Из этого следует проблема, что к моменту OrderChanged на Done информация в PositionManager.Position может еще не обновится. Правильно ли я понимаю что она обновляется по NewMyTrade?
- Правильно ли что PositionsChanged берет инфу о позиции напрямую из Смарта а не из пересчета по NewMyTrade?
С уважением.
Comments (11)
Login or Create account, Log in or register to leave a comment
В СмартКом нужно такие вещи проверять с купе с событиями SmartComWrapper. Он четко сможет показать, ошибка в S# или в SmartCom. Данные нужны такие: точное время, номер заявки, номер транзакции, номер смарта (только в SmartComWrapper), номер куки (только в SmartComWrapper).
А как это проверяете?
В SmartTrader MoveOrder вызывается всегда в методе ReRegisterOrder.
Не проверял.
Багу нашел.
Изменил поведение. Теперь только для тех, у кого Security.Exchange == RTS.
[3.0.16] Подписался на SmartComWrapper.OrderReRegisterFailed, .OrderReRegistered, .OrderCancelled, .OrderCancelFailed, .OrderFailed и .OrderChanged
При тестировании на демосчете приходит ТОЛЬКО OrderChanged! Судя по сигнатуре OrderChanged мэпит SmartCOM2.UpdateOrder(), хотя параметры в SmartComWrapper и не документированы.
Чтобы разобраться со своей проблемой (После ReRegisterOrder заявка остается в состоянии None) я хотел бы писать лог событий SmartCOM. Например, есть надежда что возможно приходит SmartCOM2.OrderMoveFailed.
Однако это нельзя сейчас сделать.
Во-первых, в SmartCOMWrapper нет однозначного соответствия между public-событиями и событиями SmartCOM2, а cсылка на StServer - private. и напрямую не подпишешься.
Во-вторых, кроме OrderChanged ничего не приходит. Это или баг в S#, или SmartCOM ничего не шлет.
Возможно ли или вывести в public StServer в SmartComWrapper?
Хорошее замечание. Сейчас исправим.
И это добавлю.
Ок, укажу в документации, из какого SmartCOM2 события вызывается данное S# событие.
Баг, это мое 6-ое чувство. Но все равно выше написанное исправлю на будущее. upd: Событие OrderReRegisterFailed
Если я вынесу, то тогда придется во всех роботах ссылку делать на Interop.StXXX.dll, что не очень красивый дизайн. Если так сильно нужно, просто сделайте через Reflection. Код нужен?
С рефлекшн это идея. Попробовал вот так
и вроде получил что-то;). Попробую потрейсить.
В целом же конечно лучше сделать мэппинг 1-в-1 всех событий смарта со всеми параметрами во враппере.
Так а он и есть 1 в 1. Только названия чуть другие.
Есть некие отличия. Если предположить что мэппинг таков:
SmartCOM S# OrderFailed(cookie,id,reason) OrderFailed(cookie,id,reason) OrderSucceded(сookie,ordid) NewOrder(cookie,ordid) OrderMoveFailed(cookie,ordId,reason) OrderReRegisterFailed(id) - нет cookie и reason OrderMoveSucceded(cookie,ordId) OrderReRegistered(id) - нет cookie OrderCancelFailed(id) OrderCancelFailed(id) OrderCancelSucceded(id) OrderCancelled(id) UpdateOrder(portf,symb,StOrder_State,...) OrderChanged(portf,symb,StOrder_State,...)
То в некоторых методах нет cookie плюс нет reason в OrderReRegisterFailed
Новая версия СмартКом? У меня не такая сигнатура.
снимается. я смотрел по документации на СмартКом, она не совпадает с реальностью
S# 3.0.19
А можно ITrader.ReRegisterOrder сделать асинхронным? Перерегистрирую заявку для forts:
В момент вызова функция жутко подвисает на несколько секунд. Причем, по какой-то причине виснет весь интерфейс, хотя я вроде в отдельном потоке запускаю.
Проще сделать ручками. А виснет из-за того, что скорее всего неправильно модель взаимодействия потоков и ГУИ потока сделана.