← Zurück

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

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (2)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Den
Den Autor

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

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

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