public void SubscribeOrderbook(string symbol) { InitWebSocket(); CacheOrderbook(symbol).Wait(); socket.OnMessage += async(sender, e) => { try { var payload = GetResponseData <OrderBookResponse>(e); if (payload != null && payload.timestamp.HasValue) { const decimal defaultIgnoreValue = 0.00000000M; if (payload.bids != null) { payload.bids.ForEach(b => { decimal price = Convert.ToDecimal(b[0]); decimal size = Convert.ToDecimal(b[1]); if (cache.Bids.ContainsKey(price)) { if (size == defaultIgnoreValue) { OrderBookEntry o; cache.Bids.Remove(price, out o); } else { cache.Bids[price] = new OrderBookEntry() { price = price, quantity = size }; } } else { if (size != defaultIgnoreValue) { cache.Bids[price] = new OrderBookEntry() { price = price, quantity = size }; } } }); } if (payload.asks != null) { payload.asks.ForEach(b => { decimal price = Convert.ToDecimal(b[0]); decimal size = Convert.ToDecimal(b[1]); if (cache.Asks.ContainsKey(price)) { if (size == defaultIgnoreValue) { OrderBookEntry o; cache.Asks.Remove(price, out o); } else { cache.Asks[price] = new OrderBookEntry() { price = price, quantity = size }; } } else { if (size != defaultIgnoreValue) { cache.Asks[price] = new OrderBookEntry() { price = price, quantity = size }; } } }); } var book = cache.ToOrderBook(); book.asks = Helper.SumOrderEntries(book.asks); book.bids = Helper.SumOrderEntries(book.bids); DispatchBook(book); } } catch (Exception ex) { logger.Trace(JsonConvert.SerializeObject(ex, Formatting.Indented)); } finally { await Task.FromResult(true); } }; socket.Connect(); var request = new SocketRequest() { Event = "addChannel", Channel = string.Format("ok_sub_spot_{0}_depth", Okex.GetMarketNameFromSymbol(symbol)) }; socket.Send(JsonConvert.SerializeObject(request)); }
public void SubscribeOrderbook(string symbol) { CacheOrderbook(symbol).Wait(); InitWebSocket(string.Format("wss://stream.binance.com:9443/ws/{0}@depth", symbol.ToLowerInvariant())); socket.OnMessage += async(sender, e) => { var payload = JsonConvert.DeserializeObject <OrderBookSocketResponse>(e.Data); const decimal defaultIgnoreValue = 0.00000000M; payload.bids.ForEach(b => { decimal price = Convert.ToDecimal(b[0]); decimal size = Convert.ToDecimal(b[1]); if (cache.Bids.ContainsKey(price)) { if (size == defaultIgnoreValue) { OrderBookEntry o; cache.Bids.Remove(price, out o); } else { cache.Bids[price] = new OrderBookEntry() { price = price, quantity = size }; } } else { if (size != defaultIgnoreValue) { cache.Bids[price] = new OrderBookEntry() { price = price, quantity = size }; } } }); payload.asks.ForEach(b => { decimal price = Convert.ToDecimal(b[0]); decimal size = Convert.ToDecimal(b[1]); if (cache.Asks.ContainsKey(price)) { if (size == defaultIgnoreValue) { OrderBookEntry o; cache.Asks.Remove(price, out o); } else { cache.Asks[price] = new OrderBookEntry() { price = price, quantity = size }; } } else { if (size != defaultIgnoreValue) { cache.Asks[price] = new OrderBookEntry() { price = price, quantity = size }; } } }); // Console.WriteLine(JsonConvert.SerializeObject(cache, Formatting.Indented)); var book = cache.ToOrderBook(); book.asks = Helper.SumOrderEntries(book.asks); book.bids = Helper.SumOrderEntries(book.bids); book.updateId = payload.updateId; DispatchBook(book); await Task.FromResult(true); }; socket.Connect(); }