public async Task EnqueueUpdateAndProcessSafeAsync(OrderBookUpdate update) { await Task.Run(() => { lock (queueLock) { UpdateList.Enqueue(update); } ProcessUpdatesSafe(); }); }
public OrderBookUpdate dequeueUpdateSafe() { OrderBookUpdate upd = null; lock (queueLock) { if (UpdateList.Count > 0) { upd = UpdateList.Dequeue(); } } return(upd); }
public void ReqMarketDepth(int reqId, Contract contract, double ratio) { var orderBookUpdate = new OrderBookUpdate { Ratio = ratio, OrderBookLines = new OrderBookLine[20] }; for (int iterator = 0; iterator < orderBookUpdate.OrderBookLines.Length; iterator++) { orderBookUpdate.OrderBookLines[iterator] = new OrderBookLine(); } _orderBookUpdates.Add(reqId, orderBookUpdate); ClientSocket.reqMarketDepth(reqId, contract, 10, false, null); Notify($"Subscribed to {contract.Symbol} marketDepth"); }
private void ProcessUpdate(OrderBookUpdate upd) { if (_previousUpdateEventTime < upd.EventTime) { foreach (var updAsk in upd.Asks) { if (updAsk.Value == 0) { AskBook.Remove(updAsk.Key); } else { AskBook[updAsk.Key] = updAsk.Value; } } foreach (var updBid in upd.Bids) { if (updBid.Value == 0) { BidBook.Remove(updBid.Key); } else { BidBook[updBid.Key] = updBid.Value; } } _previousUpdateEventTime = upd.EventTime; var handler = OnOrderbookUpdated;; if (handler != null) { var arg = new OrderBookUpdatedArgs { UpdateTime = upd.EventTime }; handler(this, arg); } } else { SetState(RealtimeOrderBookState.OutOfSync); throw new WebsocketStreamOutOfSyncException(string.Format("Websocket stream out of sync for {0}", Symbol)); } }
private void ApplyEventToOrderBook(OrderBookUpdate update) { if (update == null) { throw new ArgumentNullException(nameof(update)); } var newOrderbook = OrderBook.Clone(DateTime.UtcNow); foreach (var ask in update.Asks) { newOrderbook.UpdateAsk(ask[0], ask[1]); } foreach (var bid in update.Bids) { newOrderbook.UpdateBid(bid[0], bid[1]); } OrderBook = newOrderbook; }
internal OrderBookChangedEventArgs(CurrencyPair pair, OrderBookUpdate update) { Pair = pair; Update = update; }