Событие при изменении Order.State
Atom Ответить
15.03.2012


Можно ли отследить изменения конкретно 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;

Теги:


Спасибо:




9 Ответов
Alexander

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


Код
((INotifyPropertyChanged)order).PropertyChanged


и искать изменения с "State"
Спасибо: maximv20

maximv20

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


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

_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;
Автор топика
Спасибо:

Alexander

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


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


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

maximv20

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


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

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

Alexander

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


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

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

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

maximv20

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


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");
}
}

что я пытаюсь сказать. т.е. намекаю на баг.
Автор топика
Спасибо:

Alexander

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


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

maximv20

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


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

Alexander

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


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


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

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


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


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

loading
clippy