Beispiel #1
0
        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));
        }
Beispiel #2
0
        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();
        }