Событие при изменении Order.State

Событие при изменении Order.State
Atom
3/15/2012
maximv20


Можно ли отследить изменения конкретно Order.State (а не вообще какой-то информации по ордеру)? У меня например приходит 2 OnOrderChanged с изменяющися CancelTime. Я же хочу отслеживать только Order.State. Как правильно это делать?

14:01:05.577 | | PlazaTrader | RegisterOrder: TransactionId=50327216, Id=0, Price=174030, Balance=1, Security=RIH2@RTS, State=None
14:01:05.662 | | PlazaTrader | New order: TransactionId=50327216, Id=2722005545, Price=174030, Balance=1, Security=RIH2@RTS, State=Active
14:01:05.686 | | POStrategy | OnOrderChanged: TID=50327216; ID=2722005545; ST=Active/-; L=84; Buy 1/1@174030 RIH2@RTS;
14:01:05.687 | | POStrategy | OnOrderChanged: cancel
14:01:05.687 | | PlazaTrader | CancelOrder: TransactionId=50327216, Id=2722005545, Price=174030, Balance=1, Security=RIH2@RTS, State=Active
14:01:05.831 | | POStrategy | OnOrderChanged: TID=50327216; ID=2722005545; ST=Done/-; L=84; Buy 1/1@174030 RIH2@RTS; CT=2012-03-15 14:01:05.831;
14:01:05.909 | | POStrategy | OnOrderChanged: TID=50327216; ID=2722005545; ST=Done/-; L=84; Buy 1/1@174030 RIH2@RTS; CT=2012-03-15 14:01:05.788;

Tags:


Thanks:


Alexander

Avatar
Date: 3/15/2012
Reply


Code
((INotifyPropertyChanged)order).PropertyChanged


и искать изменения с "State"
Thanks: maximv20

maximv20

Avatar
Date: 3/15/2012
Reply


у меня приходит событие изменения хотя само свойство не меняеться:

_order = this.CreateOrder(OrderDirections.Buy, price);
_order.Type = OrderTypes.Limit;
((INotifyPropertyChanged) _order).PropertyChanged += OnOrderPropertyChanged;
RegisterOrder(_order);

void OnOrderPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) {
var sb = new StringBuilder("OnOrderPropertyChanged: ");
sb.Append(e.PropertyName).Append(": ");
if(sender==null)
sb.Append("sender==null");
else {
var order = sender as Order;
if(order==null) {
sb.Append("sender is not Order");
}else {
sb.Append(OrderToString(order));
}
}
this.AddInfoLog(sb.ToString);
}

очищено от ненужного:
16:34:21.401 | | PlazaTrader | CancelOrder: TransactionId=59303270, Id=2722330316, Price=169650, Balance=1, Security=RIM2@RTS, State=Active
16:34:21.490 | | POStrategy | OnOrderPropertyChanged: State: TID=59303270; ID=2722330316; ST=Done/-; L=92; Buy 1/1@169650 RIM2@RTS; CT=2012-03-15 16:34:21.490;
16:34:21.490 | | POStrategy | OnOrderChanged: TID=59303270; ID=2722330316; ST=Done/-; L=92; Buy 1/1@169650 RIM2@RTS; CT=2012-03-15 16:34:21.490;
16:34:21.555 | | POStrategy | OnOrderPropertyChanged: State: TID=59303270; ID=2722330316; ST=Done/-; L=92; Buy 1/1@169650 RIM2@RTS; CT=2012-03-15 16:34:21.472;
16:34:21.555 | | POStrategy | OnOrderChanged: TID=59303270; ID=2722330316; ST=Done/-; L=92; Buy 1/1@169650 RIM2@RTS; CT=2012-03-15 16:34:21.472;



полный лог:
16:34:21.401 | | PlazaTrader | CancelOrder: TransactionId=59303270, Id=2722330316, Price=169650, Balance=1, Security=RIM2@RTS, State=Active
16:34:21.490 | | POStrategy | OnOrderPropertyChanged: Balance: TID=59303270; ID=2722330316; ST=Done/-; L=92; Buy 1/1@169650 RIM2@RTS; CT=2012-03-15 16:34:21.490;
16:34:21.490 | | POStrategy | OnOrderPropertyChanged: CancelTime: TID=59303270; ID=2722330316; ST=Done/-; L=92; Buy 1/1@169650 RIM2@RTS; CT=2012-03-15 16:34:21.490;
16:34:21.490 | | POStrategy | OnOrderPropertyChanged: State: TID=59303270; ID=2722330316; ST=Done/-; L=92; Buy 1/1@169650 RIM2@RTS; CT=2012-03-15 16:34:21.490;
16:34:21.490 | | POStrategy | OnOrderChanged: TID=59303270; ID=2722330316; ST=Done/-; L=92; Buy 1/1@169650 RIM2@RTS; CT=2012-03-15 16:34:21.490;
16:34:21.555 | | PlazaTrader | OnOrdersLogInserted: orderId=2722330316; sessId=4002; moment=2012-03-15 16:34:21.472; status=2102273; action=0; isinId=159336; direction=True; price=169650; amountOperation=1; amountRest=0;
16:34:21.555 | | POStrategy | OnOrderPropertyChanged: CancelTime: TID=59303270; ID=2722330316; ST=Done/-; L=92; Buy 1/1@169650 RIM2@RTS; CT=2012-03-15 16:34:21.472;
16:34:21.555 | | POStrategy | OnOrderPropertyChanged: Balance: TID=59303270; ID=2722330316; ST=Done/-; L=92; Buy 1/1@169650 RIM2@RTS; CT=2012-03-15 16:34:21.472;
16:34:21.555 | | POStrategy | OnOrderPropertyChanged: State: TID=59303270; ID=2722330316; ST=Done/-; L=92; Buy 1/1@169650 RIM2@RTS; CT=2012-03-15 16:34:21.472;
16:34:21.555 | | POStrategy | OnOrderChanged: TID=59303270; ID=2722330316; ST=Done/-; L=92; Buy 1/1@169650 RIM2@RTS; CT=2012-03-15 16:34:21.472;
Thanks:

Alexander

Avatar
Date: 3/15/2012
Reply


Quote:
и искать изменения с "State"


я сразу написал выше
проверяйте ваш PropertyChangedEventArgs
Thanks:

maximv20

Avatar
Date: 3/15/2012
Reply


Извиняюсь, не понял как. Вот мне приходит (сократил из предыдущего):
16:34:21.490 | | POStrategy | OnOrderPropertyChanged: State: ST=Done/-;
16:34:21.555 | | POStrategy | OnOrderPropertyChanged: State: ST=Done/-;
Если состояние не меняеться (OrderState==Done) то почему приходят события об изменении?

Допустим я хочу сделать какое-то действие при переходе заявки в состояние Done. Если я буду получать вызовы как выше, то мое действие будет выполнено 2 раза, а мне надо только один.
Thanks:

Alexander

Avatar
Date: 3/15/2012
Reply


inotifypropertychanged в MSDN - будет понятно почему много раз событие приходит.

Далее смотрите PropertyChangedEventArgs в MSDN и обращаете внимание на замечательное свойство под названием PropertyName.

Осталось лишь сравнить это поле с "State" на равенство.
Thanks:

maximv20

Avatar
Date: 3/15/2012
Reply


Alexander Mukhanchikov
inotifypropertychanged в MSDN - будет понятно почему много раз событие приходит.

Далее смотрите PropertyChangedEventArgs в MSDN и обращаете внимание на замечательное свойство под названием PropertyName.

Осталось лишь сравнить это поле с "State" на равенство.


Не понятно почему. Если описать свойство Order.State в соответствии с документацией ("Происходит при изменении значения свойства.") и с примером получим следущее.
[DataMember]
public OrderStates State
{
get
{
return this._state;
}
set
{
if (value != this._state)
{
this._state = value;
this.Notify("State");
}
}
}

а в реале имеем в библиотеке

[DataMember]
public OrderStates State
{
get
{
return this._state;
}
set
{
this._state = value;
this.Notify("State");
}
}

что я пытаюсь сказать. т.е. намекаю на баг.
Thanks:

Alexander

Avatar
Date: 3/15/2012
Reply


Ок, в 4.1 пофикшу.
Не то чтобы это баг. По сути эти нотифаеры используются в основном лишь в гуе, при байндинге.
Thanks: maximv20

maximv20

Avatar
Date: 3/15/2012
Reply


спасибо! если уж на то пошло, то можно добавить уведомление OrderStateChange. Оч. нужно например для того чтобы сделать какие-то действия, после того как заявка исполнилась, зафейлилась или выставилась. Например, при реализации айсберга, или снять стазу, если стала активной. Сейчас это сделать штатно нельзя, а при предполагаемом фиксе 4.1 придеться сравнивать строчки, что не очень производительно. предлагаю обсудить.
Thanks:

Alexander

Avatar
Date: 3/15/2012
Reply


maximv20
спасибо! если уж на то пошло, то можно добавить уведомление OrderStateChange. Оч. нужно например для того чтобы сделать какие-то действия, после того как заявка исполнилась, зафейлилась или выставилась. Например, при реализации айсберга, или снять стазу, если стала активной. Сейчас это сделать штатно нельзя, а при предполагаемом фиксе 4.1 придеться сравнивать строчки, что не очень производительно. предлагаю обсудить.


Не вариант. Подобное событие может потребоваться для любого свойства что есть в объектах. Нецелесообразно.

Надо работать со State - заводите словарь <заявка, последний_обработанный_State> и работайте с событием OrdersChanged.
Это наиболее правильный вариант.


Тут надо понимать для чего вам изменение State. Для того чтоб понять исполнена заявка или отклонена? Для этого есть множество правил, которые изрядно покрывают все возможные состояния заявки.
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy