← Назад

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

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

Комментарии (2)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Den
Den Автор

Нашел где надо пофиксить багу. 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
Den Автор

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

Пофиксите, пожалуйста, багу! Ведь даже 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);