Ejemplo n.º 1
0
        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);
                }
            }
        }
Ejemplo n.º 4
0
        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();
        }
Ejemplo n.º 6
0
        /// <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));
            }
        }