private async Task ProcessOrdersAsync(
            Order order,
            IReliableDictionary <OrderQueueKey, OrderQueue> storage,
            OrderQueueKey orderQueueKey,
            OrderQueueKey oppositeOrderQueueKey)
        {
            using (var tx = _stateManager.CreateTransaction())
            {
                var orderQueue = await storage.GetOrAddAsync(
                    tx,
                    orderQueueKey,
                    new OrderQueue(order.CurrencyPair, order.Side));

                var oppositeOrderQueue = await storage.GetOrAddAsync(
                    tx,
                    oppositeOrderQueueKey,
                    new OrderQueue(order.CurrencyPair, order.Side == Side.Buy ? Side.Sell : Side.Buy));

                while (true)
                {
                    var oppositeOrder = oppositeOrderQueue.Peek();
                    if (oppositeOrder == null)
                    {
                        break;
                    }

                    var matched = _ordersMatchingRule.IsMatched(order, oppositeOrder);

                    if (matched)
                    {
                        matched = _ordersMatchingRule.IsMatched(order, oppositeOrder);
                        if (matched)
                        {
                            ProcessOrders(order, orderQueue, oppositeOrder, oppositeOrderQueue);
                        }
                        else
                        {
                            // process further if some thread is here
                            continue;
                        }
                    }

                    if (order.IsClosed || !matched || oppositeOrderQueue.IsEmpty)
                    {
                        break;
                    }
                }

                await storage.AddOrUpdateAsync(tx, orderQueueKey, orderQueue, (key, old) => orderQueue);

                await storage.AddOrUpdateAsync(tx, oppositeOrderQueueKey, oppositeOrderQueue, (key, old) => orderQueue);

                await tx.CommitAsync();
            }
        }
Ejemplo n.º 2
0
        private void CloseOrders(Order order)
        {
            OrderQueue oppositeQueue;

            lock (_processOrdersSyncObject)
            {
                oppositeQueue = _orderQueueStorage.GetOrCreateOppositeQueue(order);
                if (oppositeQueue.IsEmpty)
                {
                    return;
                }
            }

            while (true)
            {
                Order oppositeOrder;
                lock (_processOrdersSyncObject)
                {
                    oppositeOrder = oppositeQueue.Peek();
                }
                if (oppositeOrder == null)
                {
                    break;
                }

                var matched = _ordersMatchingRule.IsMatched(order, oppositeOrder);

                if (matched)
                {
                    lock (_processOrdersSyncObject)
                    {
                        matched = _ordersMatchingRule.IsMatched(order, oppositeOrder);
                        if (matched)
                        {
                            ProcessOrders(order, oppositeOrder);
                        }
                        else
                        {
                            // process further if some thread is here
                            continue;
                        }
                    }
                }

                lock (_processOrdersSyncObject)
                {
                    if (order.IsClosed || !matched || oppositeQueue.IsEmpty)
                    {
                        break;
                    }
                }
            }
        }