Событие при изменении 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


((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(sendernull) sb.Append("sendernull"); 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


и искать изменения с "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