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); } }
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 }); } }
public GdaxQueueOrderItem(long sequenceNumber, OrderBookEventType orderBookEventType, OrderBookItem orderBookItem) { SequenceNumber = sequenceNumber; OrderBookItem = orderBookItem; OrderBookEventType = orderBookEventType; }
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); }