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); } }
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); }
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)); }
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(); }
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)); } }
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)); } }
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(); } }
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); }
public async Task CacheOrderbook(string symbol) { var depth = await _okex.OrderBook(symbol); cache = new OrderBookCache(depth); }