private static async Task<ICryptoOrderBook> StartBinance(string pair, bool optimized, bool l2Optimized) { var url = BinanceValues.ApiWebsocketUrl; var communicator = new BinanceWebsocketCommunicator(url) { Name = "Binance" }; var client = new BinanceWebsocketClient(communicator); client.SetSubscriptions( new OrderBookDiffSubscription(pair) ); var source = new BinanceOrderBookSource(client); var orderBook = l2Optimized ? new CryptoOrderBookL2(pair, source) : (ICryptoOrderBook)new CryptoOrderBook(pair, source); if (optimized) { ConfigureOptimized(source, orderBook); } _ = communicator.Start(); // Binance is special // We need to load snapshot in advance manually via REST call _ = source.LoadSnapshot(communicator, pair); return orderBook; }
public async Task AutoSnapshotReloading_ShouldWorkAfterTimeout() { var url = BinanceValues.ApiWebsocketUrl; using (var communicator = new BinanceWebsocketCommunicator(url)) { using (var client = new BinanceWebsocketClient(communicator)) { var pair = "BTCUSDT"; client.SetSubscriptions( new OrderBookDiffSubscription(pair) ); var source = new BinanceOrderBookSource(client) { LoadSnapshotEnabled = true }; var orderBook = new CryptoOrderBook(pair, source) { SnapshotReloadTimeout = TimeSpan.FromSeconds(5), SnapshotReloadEnabled = true }; await Task.Delay(TimeSpan.FromSeconds(13)); Assert.True(orderBook.BidPrice > 0); Assert.True(orderBook.AskPrice > 0); Assert.NotEmpty(orderBook.BidLevels); Assert.NotEmpty(orderBook.AskLevels); } } }
public async Task ConnectToSource_ShouldHandleOrderBookCorrectly() { var url = BinanceValues.ApiWebsocketUrl; using (var communicator = new BinanceWebsocketCommunicator(url)) { using (var client = new BinanceWebsocketClient(communicator)) { var pair = "BTCUSDT"; client.SetSubscriptions( new OrderBookDiffSubscription(pair) ); var source = new BinanceOrderBookSource(client); var orderBook = new CryptoOrderBook(pair, source); await communicator.Start(); // Binance is special // We need to load snapshot in advance manually via REST call await source.LoadSnapshot(pair); await Task.Delay(TimeSpan.FromSeconds(5)); Assert.True(orderBook.BidPrice > 0); Assert.True(orderBook.AskPrice > 0); Assert.NotEmpty(orderBook.BidLevels); Assert.NotEmpty(orderBook.AskLevels); } } }
public async Task Connect_ShouldWorkAndReceiveResponse() { var url = BinanceValues.ApiWebsocketUrl; using (var communicator = new BinanceWebsocketCommunicator(url)) { TradeResponse received = null; var receivedEvent = new ManualResetEvent(false); using (var client = new BinanceWebsocketClient(communicator)) { client.Streams.TradesStream.Subscribe(response => { received = response; receivedEvent.Set(); }); client.SetSubscriptions( new TradeSubscription("btcusdt") ); await communicator.Start(); receivedEvent.WaitOne(TimeSpan.FromSeconds(30)); Assert.NotNull(received); } } }
static void Main(string[] args) { InitLogging(); AppDomain.CurrentDomain.ProcessExit += CurrentDomainOnProcessExit; AssemblyLoadContext.Default.Unloading += DefaultOnUnloading; Console.CancelKeyPress += ConsoleOnCancelKeyPress; Console.WriteLine("|=======================|"); Console.WriteLine("| BINANCE CLIENT |"); Console.WriteLine("|=======================|"); Console.WriteLine(); Log.Debug("===================================="); Log.Debug(" STARTING "); Log.Debug("===================================="); var url = BinanceValues.ApiWebsocketUrl; using (var communicator = new BinanceWebsocketCommunicator(url)) { communicator.Name = "Binance-1"; communicator.ReconnectTimeout = TimeSpan.FromMinutes(10); communicator.ReconnectionHappened.Subscribe(type => Log.Information($"Reconnection happened, type: {type}")); using (var client = new BinanceWebsocketClient(communicator)) { SubscribeToStreams(client, communicator); client.SetSubscriptions( new TradeSubscription("btcusdt"), //new TradeSubscription("ethbtc"), //new TradeSubscription("bnbusdt"), new AggregateTradeSubscription("bnbusdt"), new OrderBookPartialSubscription("btcusdt", 5), //new OrderBookPartialSubscription("bnbusdt", 10), new OrderBookDiffSubscription("ltcusdt") ); communicator.Start().Wait(); ExitEvent.WaitOne(); } } Log.Debug("===================================="); Log.Debug(" STOPPING "); Log.Debug("===================================="); Log.CloseAndFlush(); }
/// <summary> /// Request a new order book snapshot, will be fakely streamed via communicator (WebsocketClient) /// Method doesn't throw exception, just logs it /// </summary> /// <param name="communicator">Target communicator</param> /// <param name="pair">Target pair</param> /// <param name="count">Max level count</param> public async Task LoadSnapshot(BinanceWebsocketCommunicator communicator, string pair, int count = 1000) { CryptoValidations.ValidateInput(communicator, nameof(communicator)); var snapshot = await LoadSnapshotRaw(pair, count); if (snapshot == null) { return; } OrderBookPartialResponse.StreamFakeSnapshot(snapshot, communicator); }
private static (ITradeSource, IWebsocketClient) GetBinance(string pair) { var url = BinanceValues.ApiWebsocketUrl; var communicator = new BinanceWebsocketCommunicator(url) { Name = "Binance" }; var client = new BinanceWebsocketClient(communicator); var source = new BinanceTradeSource(client); client.SetSubscriptions( new TradeSubscription(pair) ); return(source, communicator); }
public async Task OnStarting_ShouldGetInfoResponse() { var url = BinanceValues.ApiWebsocketUrl; using (var communicator = new BinanceWebsocketCommunicator(url)) { var receivedEvent = new ManualResetEvent(false); communicator.MessageReceived.Subscribe(msg => { receivedEvent.Set(); }); communicator.Url = new Uri(url + "stream?streams=btcusdt@trade"); await communicator.Start(); receivedEvent.WaitOne(TimeSpan.FromSeconds(30)); } }