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


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


С уважением.



Теги:


Спасибо:




11 Ответов
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);
}

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.03.2011
Ответить


Greene-nsk Перейти
S# 3.0.19

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

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

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


Проще сделать ручками. А виснет из-за того, что скорее всего неправильно модель взаимодействия потоков и ГУИ потока сделана.
Спасибо:


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

loading
clippy