/// <summary> /// Example using manager without DI framework (not recommended). /// </summary> // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedMember.Local private static void ExampleMainWithoutDI() { try { // Load configuration. var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", true, false) .Build(); // Get configuration settings. var symbols = configuration.GetSection("TradeHistory:Symbols").Get <string[]>() ?? new string[] { Symbol.BTC_USDT }; var limit = 25; try { limit = Convert.ToInt32(configuration.GetSection("TradeHistory")?["Limit"]); } catch { /* ignore */ } var loggerFactory = new LoggerFactory(); loggerFactory.AddFile(configuration.GetSection("Logging:File")); // Initialize all the things... a DI framework could instantiate for you... var api = new BinanceApi(BinanceHttpClient.Instance, logger: loggerFactory.CreateLogger <BinanceApi>()); var tradeClient = new AggregateTradeClient(loggerFactory.CreateLogger <AggregateTradeClient>()); var webSocket = new DefaultWebSocketClient(logger: loggerFactory.CreateLogger <DefaultWebSocketClient>()); var stream = new BinanceWebSocketStream(webSocket, loggerFactory.CreateLogger <BinanceWebSocketStream>()); var controller = new BinanceWebSocketStreamController(api, stream, loggerFactory.CreateLogger <BinanceWebSocketStreamController>()); var publisher = new BinanceWebSocketStreamPublisher(controller, loggerFactory.CreateLogger <BinanceWebSocketStreamPublisher>()); var client = new AggregateTradeWebSocketClient(tradeClient, publisher, loggerFactory.CreateLogger <AggregateTradeWebSocketClient>()); var cache = new AggregateTradeWebSocketCache(api, client, loggerFactory.CreateLogger <AggregateTradeWebSocketCache>()); // Add error event handler. controller.Error += (s, e) => HandleError(e.Exception); foreach (var symbol in symbols) { // Subscribe to symbol with callback. cache.Subscribe(symbol, limit, Display); lock (_sync) { _message = symbol == symbols.Last() ? $"Symbol: \"{symbol}\" ...press any key to exit." : $"Symbol: \"{symbol}\" ...press any key to continue."; } Console.ReadKey(true); // Unsubscribe from symbol. cache.Unsubscribe(); } } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(); Console.WriteLine(" ...press any key to close window."); Console.ReadKey(true); } }
protected virtual void Dispose(bool disposing) { if (_disposed) return; if (disposing) { AggregateTradeClient.Unsubscribe(); CandlestickClient.Unsubscribe(); DepthClient.Unsubscribe(); StatisticsClient.Unsubscribe(); TradeClient.Unsubscribe(); } _disposed = true; }
public void Subscribe() { var symbol1 = Symbol.BTC_USDT; var symbol2 = Symbol.LTC_BTC; Assert.Empty(_client.SubscribedStreams); // Subscribe to symbol. _client.Subscribe(symbol1); Assert.Equal(AggregateTradeClient.GetStreamName(symbol1), _client.SubscribedStreams.Single()); // Re-Subscribe to same symbol doesn't fail. _client.Subscribe(symbol1); Assert.Equal(AggregateTradeClient.GetStreamName(symbol1), _client.SubscribedStreams.Single()); // Subscribe to a different symbol. _client.Subscribe(symbol2); Assert.True(_client.SubscribedStreams.Count() == 2); Assert.Contains(AggregateTradeClient.GetStreamName(symbol1), _client.SubscribedStreams); Assert.Contains(AggregateTradeClient.GetStreamName(symbol2), _client.SubscribedStreams); }
public void LinkToClient() { var api = new Mock <IBinanceApi>().Object; var client1 = new Mock <IAggregateTradeClient>().Object; var client2 = new AggregateTradeClient(); var symbol1 = Symbol.BTC_USDT; var symbol2 = Symbol.LTC_BTC; client2.Subscribe(symbol1); var clientSubscribeStreams = client2.SubscribedStreams.ToArray(); Assert.Equal(AggregateTradeClient.GetStreamName(symbol1), clientSubscribeStreams.Single()); var cache = new AggregateTradeCache(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(AggregateTradeClient.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(AggregateTradeClient.GetStreamName(symbol2), client2.SubscribedStreams); }