protected async Task HandleOrdersEventsAsync(string pair,
                                                     OrderBookEventType orderEventType,
                                                     IReadOnlyCollection <OrderBookItem> orders)
        {
            var orderBookSnapshot = await GetOrderBookSnapshot(pair);

            switch (orderEventType)
            {
            case OrderBookEventType.Add:
            case OrderBookEventType.Update:
                orderBookSnapshot.AddOrUpdateOrders(orders);
                break;

            case OrderBookEventType.Delete:
                orderBookSnapshot.DeleteOrders(orders);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(orderEventType), orderEventType, null);
            }

            if (await orderBookSnapshot.DetectNegativeSpread())
            {
                ScheduleSnapshotRefresh();
            }
            else
            {
                CancelSnapshotRefresh();
                await PublishOrderBookSnapshotAsync(pair);
            }
        }
Пример #2
0
        private async Task HandleOrderEventAsync(string productId, long orderEventSequenceNumber,
                                                 OrderBookEventType eventType, OrderBookItem orderBookItem)
        {
            // Queue this item if the order book is not fully populated yet
            var orderBookExists =
                _symbolsLastSequenceNumbers.TryGetValue(productId, out long seqNumberInOrderBook) &&
                TryGetOrderBookSnapshot(productId, out var _);

            if (!orderBookExists)
            {
                QueueItem(productId, new GdaxQueueOrderItem(orderEventSequenceNumber,
                                                            eventType, orderBookItem));
                return;
            }

            // Dequeue all items in the order events queue
            foreach (var queuedItem in DequeuOrderItems(productId)
                     .Where(q => q.SequenceNumber > seqNumberInOrderBook))
            {
                await HandleOrdersEventsAsync(productId, queuedItem.OrderBookEventType,
                                              new[] { queuedItem.OrderBookItem });
            }

            // Handle the current item
            if (orderEventSequenceNumber > seqNumberInOrderBook)
            {
                await HandleOrdersEventsAsync(productId, eventType, new[] { orderBookItem });
            }
        }
Пример #3
0
 public GdaxQueueOrderItem(long sequenceNumber,
                           OrderBookEventType orderBookEventType, OrderBookItem orderBookItem)
 {
     SequenceNumber     = sequenceNumber;
     OrderBookItem      = orderBookItem;
     OrderBookEventType = orderBookEventType;
 }
Пример #4
0
        protected async Task HandleOrdersEventsAsync(string pair,
                                                     OrderBookEventType orderEventType,
                                                     IReadOnlyCollection <OrderBookItem> orders)
        {
            var orderBookSnapshot = await GetOrderBookSnapshot(pair);

            switch (orderEventType)
            {
            case OrderBookEventType.Add:
            case OrderBookEventType.Update:
                orderBookSnapshot.AddOrUpdateOrders(orders);
                break;

            case OrderBookEventType.Delete:
                orderBookSnapshot.DeleteOrders(orders);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(orderEventType), orderEventType, null);
            }

            if (ExchangeConfiguration.SaveOrderBooksToAzure)
            {
                await OrderBookEventsRepository.SaveAsync(new OrderBookEvent
                {
                    SnapshotId          = orderBookSnapshot.GeneratedId,
                    EventType           = orderEventType,
                    OrderEventTimestamp = DateTime.UtcNow,
                    OrderItems          = orders
                });
            }

            await PublishOrderBookSnapshotAsync(pair);
        }