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

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


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


// включаем асинхронный режим (не ждем 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. для стоп-ордеров, выставленных руками в квике, все работает правильно...


Теги:


Спасибо:


Den

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


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

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

			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:

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

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


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

Спасибо:

Den

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


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

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

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

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


Спасибо:


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

loading
clippy