[3.0.14] Перерегистрация заявок Smart

[3.0.14] Перерегистрация заявок Smart
Atom
10.03.2011
pyhta4og


[3.0.14]

При перерегистрации новый Order может остаться в состоянии None навечно.

Сценарий 1

  1. 29.24 Послал регистрацию заявки sell 194620@1 TransactionID=71653170
  2. 29.32 Пришел OrdersChanged на Active
  3. 29.43 Пришел NewOrder (уже странно, сначала статус потом что ордер зарегистрирован)
  4. 29.98 Пришел OrdersChanged на Active
  5. 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.

Плюс такой вопрос. точнее несколько.

  1. Правильно ли я понимаю, что OrdersChanged, NewMyTrade и PositionsChanged все асинхронные и могут прийти в любом порядке?
  2. Из этого следует проблема, что к моменту OrderChanged на Done информация в PositionManager.Position может еще не обновится. Правильно ли я понимаю что она обновляется по NewMyTrade?
  3. Правильно ли что PositionsChanged берет инфу о позиции напрямую из Смарта а не из пересчета по NewMyTrade?

С уважением.


Теги:


Спасибо:


1 2  >
Mikhail Sukhov

Фотография
Дата: 11.03.2011
Ответить


pyhta4og: [3.0.14] При перерегистрации новый Order может остаться в состоянии None навечно.

В СмартКом нужно такие вещи проверять с купе с событиями SmartComWrapper. Он четко сможет показать, ошибка в S# или в SmartCom. Данные нужны такие: точное время, номер заявки, номер транзакции, номер смарта (только в SmartComWrapper), номер куки (только в SmartComWrapper).

pyhta4og: Сценарий 1

  1. 29.24 Послал регистрацию заявки sell 194620@1 TransactionID=71653170
  2. 29.32 Пришел OrdersChanged на Active
  3. 29.43 Пришел NewOrder (уже странно, сначала статус потом что ордер зарегистрирован)

А как это проверяете?

pyhta4og: Отправляет ли S# MoveOrder для только измененного объема?

В SmartTrader MoveOrder вызывается всегда в методе ReRegisterOrder.

pyhta4og: Пусть перерегистрируем заявку1. Актуальная информация о ней - что она Active. Запрос на перереристрацию уходит. Новая заявка Заявка2. За то время пока он идет по перерегистрируемой заявке1 случается полный филл. К нам приходит Done по заявке1. А вот по заявке2 никакого Fail не придет в этом случае. Она так и останется в состоянии None.

Не проверял.

pyhta4og: Плюс такой вопрос. точнее несколько.

  1. Правильно ли я понимаю, что OrdersChanged, NewMyTrade и PositionsChanged все асинхронные и могут прийти в любом порядке?
  2. Из этого следует проблема, что к моменту OrderChanged на Done информация в PositionManager.Position может еще не обновится. Правильно ли я понимаю что она обновляется по NewMyTrade?
  3. Правильно ли что PositionsChanged берет инфу о позиции напрямую из Смарта а не из пересчета по NewMyTrade?
  1. OrdersChanged + NewMyTrade синхронизируются между собой (сделки обновляют Order.Balance и Order.State если баланс стал равен 0). PositionsChanged - полностью независим (могу наврать, но это вроде от биржи тянется).
  2. Да, обновляется по NewMyTrade.
  3. Правильно.
Спасибо:

Mikhail Sukhov

Фотография
Дата: 11.03.2011
Ответить


Mikhail Sukhov:

pyhta4og: Сценарий 1

  1. 29.24 Послал регистрацию заявки sell 194620@1 TransactionID=71653170
  2. 29.32 Пришел OrdersChanged на Active
  3. 29.43 Пришел NewOrder (уже странно, сначала статус потом что ордер зарегистрирован)

А как это проверяете?

Багу нашел.

Mikhail Sukhov:

pyhta4og: Отправляет ли S# MoveOrder для только измененного объема?

В SmartTrader MoveOrder вызывается всегда в методе ReRegisterOrder.

Изменил поведение. Теперь только для тех, у кого Security.Exchange == RTS.

Спасибо:

pyhta4og

Фотография
Дата: 15.03.2011
Ответить


Автор: pyhta4og Перейти к цитате [3.0.14] При перерегистрации новый Order может остаться в состоянии None навечно.

В СмартКом нужно такие вещи проверять с купе с событиями SmartComWrapper. Он четко сможет показать, ошибка в S# или в SmartCom. Данные нужны такие: точное время, номер заявки, номер транзакции, номер смарта (только в SmartComWrapper), номер куки (только в SmartComWrapper).

[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?

Спасибо:

Mikhail Sukhov

Фотография
Дата: 15.03.2011
Ответить


pyhta4og: При тестировании на демосчете приходит ТОЛЬКО OrderChanged! Судя по сигнатуре OrderChanged мэпит SmartCOM2.UpdateOrder(), хотя параметры в SmartComWrapper и не документированы.

Хорошее замечание. Сейчас исправим.

pyhta4og: Чтобы разобраться со своей проблемой (После ReRegisterOrder заявка остается в состоянии None) я хотел бы писать лог событий SmartCOM. Например, есть надежда что возможно приходит SmartCOM2.OrderMoveFailed.

И это добавлю.

pyhta4og: Во-первых, в SmartCOMWrapper нет однозначного соответствия между public-событиями и событиями SmartCOM2

Ок, укажу в документации, из какого SmartCOM2 события вызывается данное S# событие.

pyhta4og: Во-вторых, кроме OrderChanged ничего не приходит. Это или баг в S#, или SmartCOM ничего не шлет.

Баг, это мое 6-ое чувство. Но все равно выше написанное исправлю на будущее. upd: Событие OrderReRegisterFailed

pyhta4og: Возможно ли или вывести в public StServer в SmartComWrapper?

Если я вынесу, то тогда придется во всех роботах ссылку делать на Interop.StXXX.dll, что не очень красивый дизайн. Если так сильно нужно, просто сделайте через Reflection. Код нужен?

Спасибо:

pyhta4og

Фотография
Дата: 15.03.2011
Ответить


С рефлекшн это идея. Попробовал вот так


StServer srv = typeof(SmartComWrapper).GetField("#=qjxaeJ7mH$ELRDDBxcDAGzw==", System.Reflection.BindingFlags.Instance|System.Reflection.BindingFlags.NonPublic).GetValue(st.Wrapper) as StServer;

и вроде получил что-то;). Попробую потрейсить.

В целом же конечно лучше сделать мэппинг 1-в-1 всех событий смарта со всеми параметрами во враппере.

Спасибо:

Mikhail Sukhov

Фотография
Дата: 15.03.2011
Ответить


pyhta4og: В целом же конечно лучше сделать мэппинг 1-в-1 всех событий смарта со всеми параметрами во враппере.

Так а он и есть 1 в 1. Только названия чуть другие.

Спасибо:

pyhta4og

Фотография
Дата: 15.03.2011
Ответить


Есть некие отличия. Если предположить что мэппинг таков:

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

Спасибо:

Mikhail Sukhov

Фотография
Дата: 15.03.2011
Ответить


pyhta4og: 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

Новая версия СмартКом? У меня не такая сигнатура.

Спасибо:

pyhta4og

Фотография
Дата: 16.03.2011
Ответить


Mikhail Sukhov:

pyhta4og: 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

Новая версия СмартКом? У меня не такая сигнатура.

снимается. я смотрел по документации на СмартКом, она не совпадает с реальностью

Спасибо:

Greene-nsk

Фотография
Дата: 18.03.2011
Ответить


S# 3.0.19

А можно ITrader.ReRegisterOrder сделать асинхронным? Перерегистрирую заявку для forts:

        if (_Order.State == OrderStates.Active)
        {
        _Order = base.ReRegisterOrder(_Order, GetBestPrice, GetNewVolume, _Order.Security.Exchange == Exchange.Rts);
        }

В момент вызова функция жутко подвисает на несколько секунд. Причем, по какой-то причине виснет весь интерфейс, хотя я вроде в отдельном потоке запускаю.

Спасибо:
1 2  >

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy