示例#1
0
        public void SubscribeOrderBook(string symbol, int limit, Action <OrderBookEventArgs> callback, Action <Exception> exception, CancellationToken cancellationToken)
        {
            try
            {
                var orderBookCache = new OrderBookCache(binanceApi, new DepthWebSocketClient());
                orderBookCache.Subscribe(symbol, limit, e =>
                {
                    if (cancellationToken.IsCancellationRequested)
                    {
                        orderBookCache.Unsubscribe();
                        return;
                    }

                    try
                    {
                        var orderBook = NewOrderBook(e.OrderBook);
                        callback.Invoke(new OrderBookEventArgs {
                            OrderBook = orderBook
                        });
                    }
                    catch (Exception ex)
                    {
                        orderBookCache.Unsubscribe();
                        exception.Invoke(ex);
                    }
                });
            }
            catch (Exception ex)
            {
                exception.Invoke(ex);
            }
        }
示例#2
0
        public Task SubscribeOrderBook(string symbol, int limit, Action <OrderBookEventArgs> callback, Action <Exception> exception, CancellationToken cancellationToken)
        {
            var tcs = new TaskCompletionSource <object>();

            var binanceApi     = new BinanceApi();
            var orderBookCache = new OrderBookCache(binanceApi, new DepthWebSocketClient());

            orderBookCache.Subscribe(symbol, limit, e =>
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    orderBookCache.Unsubscribe();
                    return;
                }

                var orderBook = NewOrderBook(e.OrderBook);

                try
                {
                    callback.Invoke(new OrderBookEventArgs {
                        OrderBook = orderBook
                    });
                }
                catch (Exception ex)
                {
                    orderBookCache.Unsubscribe();
                    exception.Invoke(ex);
                    return;
                }
            });

            tcs.SetResult(null);

            return(tcs.Task);
        }
示例#3
0
        public void SubscribeThrows()
        {
            var api    = new Mock <IBinanceApi>().Object;
            var client = new Mock <IDepthWebSocketClient>().Object;

            var cache = new OrderBookCache(api, client);

            Assert.Throws <ArgumentNullException>("symbol", () => cache.Subscribe(null));
        }
示例#4
0
        public void Unsubscribe()
        {
            var api    = new Mock <IBinanceApi>().Object;
            var client = new Mock <IDepthClient>().Object;

            var cache = new OrderBookCache(api, client);

            // Can call unsubscribe before subscribe or multiple times without fail.
            cache.Unsubscribe();
            cache.Unsubscribe();
        }
示例#5
0
        public async Task SubscribeThrows()
        {
            var api    = new Mock <IBinanceApi>().Object;
            var client = new Mock <IDepthWebSocketClient>().Object;

            var cache = new OrderBookCache(api, client);

            await Assert.ThrowsAsync <ArgumentNullException>("symbol", () => cache.SubscribeAsync(null, new CancellationToken()));

            await Assert.ThrowsAsync <ArgumentException>("token", () => cache.SubscribeAsync(Symbol.BTC_USDT, CancellationToken.None));
        }
        public async Task StreamThrows()
        {
            var api    = new Mock <IBinanceApi>().Object;
            var client = new Mock <IDepthWebSocketClient>().Object;

            var cache = new OrderBookCache(api, client);

            using (var cts = new CancellationTokenSource())
            {
                await Assert.ThrowsAsync <ArgumentNullException>("symbol", () => cache.SubscribeAndStreamAsync(null, cts.Token));
            }
        }
示例#7
0
        public async Task CacheOrderbook(string symbol)
        {
            try
            {
                var depth = await _binance.OrderBook(symbol);

                cache = new OrderBookCache(depth);
            }
            catch (ApiException ae)
            {
                logger.Error(ae);
                cache = new OrderBookCache(new OrderBook(symbol));
            }
        }
示例#8
0
        public void SubscribeThrows()
        {
            var symbol = Symbol.BTC_USDT;
            var api    = new Mock <IBinanceApi>().Object;
            var client = new Mock <IDepthClient>().Object;

            var cache = new OrderBookCache(api, client);

            Assert.Throws <ArgumentNullException>("symbol", () => cache.Subscribe(null));
            Assert.Throws <ArgumentNullException>("symbol", () => cache.Subscribe(string.Empty));

            cache.Subscribe(symbol);

            Assert.Throws <InvalidOperationException>(() => cache.Subscribe(symbol));
        }
        private static void CheckNoSql()
        {
            var myNoSqlClient = new MyNoSqlTcpClient(() => "192.168.10.80:5125", "TestApp");
            var subs          = new MyNoSqlReadRepository <OrderBookNoSql>(myNoSqlClient, OrderBookNoSql.TableName);

            myNoSqlClient.Start();

            IOrderBookService client = new OrderBookCache(subs);

            Console.Write("Symbol: ");
            var cmd    = Console.ReadLine();
            var symbol = "";

            while (cmd != "exit")
            {
                Console.Clear();
                if (!string.IsNullOrEmpty(cmd))
                {
                    symbol = cmd;
                }

                Console.WriteLine($"Symbol: {symbol}");
                var book = client.GetOrderBook("jetwallet", symbol);

                if (book != null)
                {
                    foreach (var level in book.Where(e => e.Volume < 0).OrderByDescending(e => e.Price))
                    {
                        Console.WriteLine($"\t{level.Price}\t{level.Volume}");
                    }

                    Console.WriteLine();

                    foreach (var level in book.Where(e => e.Volume > 0).OrderByDescending(e => e.Price))
                    {
                        Console.WriteLine($"{level.Volume}\t{level.Price}");
                    }
                }


                Console.WriteLine();
                Console.WriteLine();
                Console.Write("Symbol: ");
                cmd = Console.ReadLine();
            }
        }
示例#10
0
        public void LinkToClient()
        {
            var api     = new Mock <IBinanceApi>().Object;
            var client1 = new Mock <IDepthClient>().Object;
            var client2 = new DepthClient();
            var symbol1 = Symbol.BTC_USDT;
            var symbol2 = Symbol.LTC_BTC;

            client2.Subscribe(symbol1);

            var clientSubscribeStreams = client2.SubscribedStreams.ToArray();

            Assert.Equal(DepthClient.GetStreamName(symbol1), clientSubscribeStreams.Single());

            var cache = new OrderBookCache(api, client1)
            {
                Client = client2 // link client.
            };

            // Client subscribed streams are unchanged after link to unsubscribed cache.
            Assert.Equal(clientSubscribeStreams, client2.SubscribedStreams);

            cache.Client = client1; // unlink client.

            // Subscribe cache to symbol.
            cache.Subscribe(symbol2);

            // Cache is subscribed to symbol.
            Assert.Equal(DepthClient.GetStreamName(symbol2), cache.SubscribedStreams.Single());

            cache.Client = client2; // link to client.

            // Client has second subscribed stream from cache.
            Assert.True(client2.SubscribedStreams.Count() == 2);
            Assert.Contains(DepthClient.GetStreamName(symbol2), client2.SubscribedStreams);
        }
示例#11
0
        public async Task CacheOrderbook(string symbol)
        {
            var depth = await _okex.OrderBook(symbol);

            cache = new OrderBookCache(depth);
        }