Баг с событиями ордеров если выставлять их руками в квике

Баг с событиями ордеров если выставлять их руками в квике
Atom
8/22/2013
Den


S# 4.1.17
Quik 6.7.3.2
Настройки трейдера:
Code

// включаем асинхронный режим (не ждем Order.Id от биржи)
this.Trader.IsAsyncMode = true;

// включаем поддержку режима ручных заявок
this.Trader.SupportManualOrders = true;


Выставляю руками заявку в стакан (заведомо неисполнимую, остается висеть в стакане).
Корректно прилетает NewOrders. У ордера State: Active

Снимаю руками заявку.
Опять прилетает NewOrders. У ордера State: Done; Cancelled: True
Событие OrdersChanged не приходит...

Если ордер исполняется частично тоже прилетает NewOrders с Partially: True и правильным балансом

В случает когда ордер исполняется опять прилетает NewOrders с Matched: True Balance: 0 State: Done



P.S. для стоп-ордеров, выставленных руками в квике, все работает правильно...

Tags:


Thanks:


Den

Avatar
Date: 9/5/2013
Reply


Нашел где надо пофиксить багу.
BaseTrader, метод protected Order GetOrder(Security security, long id, Func<long, Order> createOrder, Func<Order, bool> changeOrder)


Всегда присваивается isNew = true:

Code
			var order = _cache.GetOrder(security, id, key =>
			{
				isNew = true;

				var o = createOrder(key);

				if (o == null)
					throw new InvalidOperationException("Заявка под номером {0} не была создана.".Put(id));

				o.LatencyRegistration = o.GetLatency(true);

				o.Trader = this;

				if (o.ExtensionInfo == null)
					o.ExtensionInfo = new Dictionary<object, object>();

				return o;
			});

			var isChanged = changeOrder(order);


Далее идет проверка, которая ВСЕГДА будет кидать NewOrder:

Code
			if (isNew)
			{
				if (order.TransactionId != 0)
				{
					AddOrderByTransactionId(order);
				}

				RaiseNewOrder(order);
			}
			else if (isChanged)
				RaiseOrderChanged(order);



Для фикса видимо нужно сначала поискать ордер в кэше, и только если его нет создавать...
Thanks:

Den

Avatar
Date: 9/12/2013
Reply


Уважаемые разработчики!

Пофиксите, пожалуйста, багу!
Ведь даже transactionId каждый раз новый получается и workaround не написать...

Фикс - это один if:

Code
			
var isNew = false;

Order order = _cache.TryGetOrder(security, id);
                        
if (order == null) 
{

			order = _cache.GetOrder(security, id, key =>
			{
				isNew = true;

				var o = createOrder(key);

				if (o == null)
					throw new InvalidOperationException("Заявка под номером {0} не была создана.".Put(id));

				o.LatencyRegistration = o.GetLatency(true);

				o.Trader = this;

				if (o.ExtensionInfo == null)
					o.ExtensionInfo = new Dictionary<object, object>();

				return o;
			});
}                        
var isChanged = changeOrder(order);

Thanks:


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

loading
clippy