예제 #1
0
        public void TestHuobiOrderbookDeserializer()
        {
            //Arrange:
            //sample websocket message from Huobi for an orderbook refresh:
            string sampleWebsocketMessage = "{\"ch\":\"market.btcusdt.mbp.refresh.10\",\"ts\":1611504245560,\"tick\":{\"seqNum\":119437040567,\"bids\":[[32115.28,0.02],[32115.13,0.15],[32114.05,0.072382],[32113.94,0.066716],[32113.61,0.02],[32113.52,2.521393],[32113.48,0.117404],[32109.42,0.139009],[32108.76,0.123],[32108.25,0.11175]],\"asks\":[[32115.29,0.005],[32115.69,0.03],[32116.2,0.01759],[32118.17,0.03],[32118.86,0.03],[32119.61,0.12],[32120.41,0.08],[32121.51,0.125775],[32121.64,0.03563],[32124.4,0.001]]}}";
            //expected deserialized orderbook:
            var expectedOrderbook = new HuobiOrderbook();

            expectedOrderbook.Sequence = 119437040567;
            expectedOrderbook.Symbol   = "BTCUSDT";

            expectedOrderbook.OfficialBids = new ConcurrentDictionary <decimal, decimal>();
            expectedOrderbook.OfficialBids.TryAdd(32115.28m, 0.02m);
            expectedOrderbook.OfficialBids.TryAdd(32115.13m, 0.15m);
            expectedOrderbook.OfficialBids.TryAdd(32114.05m, 0.072382m);
            expectedOrderbook.OfficialBids.TryAdd(32113.94m, 0.066716m);
            expectedOrderbook.OfficialBids.TryAdd(32113.61m, 0.02m);
            expectedOrderbook.OfficialBids.TryAdd(32113.52m, 2.521393m);
            expectedOrderbook.OfficialBids.TryAdd(32113.48m, 0.117404m);
            expectedOrderbook.OfficialBids.TryAdd(32109.42m, 0.139009m);
            expectedOrderbook.OfficialBids.TryAdd(32108.76m, 0.123m);
            expectedOrderbook.OfficialBids.TryAdd(32108.25m, 0.11175m);

            expectedOrderbook.OfficialAsks = new ConcurrentDictionary <decimal, decimal>();
            expectedOrderbook.OfficialAsks.TryAdd(32115.29m, 0.005m);
            expectedOrderbook.OfficialAsks.TryAdd(32115.69m, 0.03m);
            expectedOrderbook.OfficialAsks.TryAdd(32116.2m, 0.01759m);
            expectedOrderbook.OfficialAsks.TryAdd(32118.17m, 0.03m);
            expectedOrderbook.OfficialAsks.TryAdd(32118.86m, 0.03m);
            expectedOrderbook.OfficialAsks.TryAdd(32119.61m, 0.12m);
            expectedOrderbook.OfficialAsks.TryAdd(32120.41m, 0.08m);
            expectedOrderbook.OfficialAsks.TryAdd(32121.51m, 0.125775m);
            expectedOrderbook.OfficialAsks.TryAdd(32121.64m, 0.03563m);
            expectedOrderbook.OfficialAsks.TryAdd(32124.4m, 0.001m);

            //Act: run the sample websocket message through the Huobi OrderbookConverter
            IOrderbook testOrderbook = (IOrderbook)JsonSerializer.Deserialize(sampleWebsocketMessage, typeof(HuobiOrderbook));

            //Assert: test that the actual outcome matches the expected outcome
            Assert.AreEqual(expectedOrderbook.Symbol, testOrderbook.Symbol);
            Assert.AreEqual(expectedOrderbook.Sequence, testOrderbook.Sequence);
            Assert.IsTrue(expectedOrderbook.OfficialAsks.Count == testOrderbook.OfficialAsks.Count &&
                          expectedOrderbook.OfficialBids.Count == testOrderbook.OfficialBids.Count);

            Assert.IsTrue(CheckLayers(expectedOrderbook, testOrderbook));
        }
예제 #2
0
        public void TestHuobiOrderbookMerge()
        {
            //Arrange
            //Beginning Orderbooks: one empty, one with 10 values, one with 5 values
            var dummyExchange = new HuobiExchange("huobi");

            dummyExchange.ProfitableSymbolMapping.TryAdd("dummy", DateTime.UtcNow);

            var beginningEmptyOrderbook = new HuobiOrderbook();


            var beginningFullOrderbook = new HuobiOrderbook();

            beginningFullOrderbook.OfficialBids = new ConcurrentDictionary <decimal, decimal>();
            beginningFullOrderbook.OfficialBids.TryAdd(32115.28m, 0.02m);
            beginningFullOrderbook.OfficialBids.TryAdd(32115.13m, 0.15m);
            beginningFullOrderbook.OfficialBids.TryAdd(32114.05m, 0.072382m);
            beginningFullOrderbook.OfficialBids.TryAdd(32113.94m, 0.066716m);
            beginningFullOrderbook.OfficialBids.TryAdd(32113.61m, 0.02m);
            beginningFullOrderbook.OfficialBids.TryAdd(32113.52m, 2.521393m);
            beginningFullOrderbook.OfficialBids.TryAdd(32113.48m, 0.117404m);
            beginningFullOrderbook.OfficialBids.TryAdd(32109.42m, 0.139009m);
            beginningFullOrderbook.OfficialBids.TryAdd(32108.76m, 0.123m);
            beginningFullOrderbook.OfficialBids.TryAdd(32108.25m, 0.11175m);

            beginningFullOrderbook.OfficialAsks = new ConcurrentDictionary <decimal, decimal>();
            beginningFullOrderbook.OfficialAsks.TryAdd(32115.29m, 0.005m);
            beginningFullOrderbook.OfficialAsks.TryAdd(32115.69m, 0.03m);
            beginningFullOrderbook.OfficialAsks.TryAdd(32116.2m, 0.01759m);
            beginningFullOrderbook.OfficialAsks.TryAdd(32118.17m, 0.03m);
            beginningFullOrderbook.OfficialAsks.TryAdd(32118.86m, 0.03m);
            beginningFullOrderbook.OfficialAsks.TryAdd(32119.61m, 0.12m);
            beginningFullOrderbook.OfficialAsks.TryAdd(32120.41m, 0.08m);
            beginningFullOrderbook.OfficialAsks.TryAdd(32121.51m, 0.125775m);
            beginningFullOrderbook.OfficialAsks.TryAdd(32121.64m, 0.03563m);
            beginningFullOrderbook.OfficialAsks.TryAdd(32124.4m, 0.001m);

            var beginningHalfFullOrderbook = new HuobiOrderbook();

            beginningHalfFullOrderbook.OfficialBids = new ConcurrentDictionary <decimal, decimal>();
            beginningHalfFullOrderbook.OfficialBids.TryAdd(32115.28m, 0.02m);
            beginningHalfFullOrderbook.OfficialBids.TryAdd(32115.13m, 0.15m);
            beginningHalfFullOrderbook.OfficialBids.TryAdd(32114.05m, 0.072382m);
            beginningHalfFullOrderbook.OfficialBids.TryAdd(32113.94m, 0.066716m);
            beginningHalfFullOrderbook.OfficialBids.TryAdd(32113.61m, 0.02m);

            beginningHalfFullOrderbook.OfficialAsks = new ConcurrentDictionary <decimal, decimal>();
            beginningHalfFullOrderbook.OfficialAsks.TryAdd(32115.29m, 0.005m);
            beginningHalfFullOrderbook.OfficialAsks.TryAdd(32115.69m, 0.03m);
            beginningHalfFullOrderbook.OfficialAsks.TryAdd(32116.2m, 0.01759m);
            beginningHalfFullOrderbook.OfficialAsks.TryAdd(32118.17m, 0.03m);
            beginningHalfFullOrderbook.OfficialAsks.TryAdd(32118.86m, 0.03m);

            beginningEmptyOrderbook.Symbol    = "BTCUSDT";
            beginningHalfFullOrderbook.Symbol = "BTCUSDT";
            beginningFullOrderbook.Symbol     = "BTCUSDT";

            beginningEmptyOrderbook.Sequence    = 1;
            beginningHalfFullOrderbook.Sequence = 1;
            beginningFullOrderbook.Sequence     = 1;

            beginningEmptyOrderbook.Exchange    = dummyExchange;
            beginningHalfFullOrderbook.Exchange = dummyExchange;
            beginningFullOrderbook.Exchange     = dummyExchange;

            //arrange orderbook updates: one empty, one full, one with 6 values
            var updateFullOrderbook = new HuobiOrderbook();

            updateFullOrderbook.OfficialBids = new ConcurrentDictionary <decimal, decimal>();
            updateFullOrderbook.OfficialBids.TryAdd(1m, 0.02m);
            updateFullOrderbook.OfficialBids.TryAdd(2m, 0.15m);
            updateFullOrderbook.OfficialBids.TryAdd(3m, 0.072382m);
            updateFullOrderbook.OfficialBids.TryAdd(4m, 0.066716m);
            updateFullOrderbook.OfficialBids.TryAdd(5m, 0.02m);
            updateFullOrderbook.OfficialBids.TryAdd(6m, 2.521393m);
            updateFullOrderbook.OfficialBids.TryAdd(7m, 0.117404m);
            updateFullOrderbook.OfficialBids.TryAdd(8m, 0.139009m);
            updateFullOrderbook.OfficialBids.TryAdd(9m, 0.123m);
            updateFullOrderbook.OfficialBids.TryAdd(10m, 0.11175m);

            updateFullOrderbook.OfficialAsks = new ConcurrentDictionary <decimal, decimal>();
            updateFullOrderbook.OfficialAsks.TryAdd(11m, 0.005m);
            updateFullOrderbook.OfficialAsks.TryAdd(12m, 0.03m);
            updateFullOrderbook.OfficialAsks.TryAdd(13m, 0.01759m);
            updateFullOrderbook.OfficialAsks.TryAdd(14m, 0.03m);
            updateFullOrderbook.OfficialAsks.TryAdd(15m, 0.03m);
            updateFullOrderbook.OfficialAsks.TryAdd(16m, 0.12m);
            updateFullOrderbook.OfficialAsks.TryAdd(17m, 0.08m);
            updateFullOrderbook.OfficialAsks.TryAdd(18m, 0.125775m);
            updateFullOrderbook.OfficialAsks.TryAdd(19m, 0.03563m);
            updateFullOrderbook.OfficialAsks.TryAdd(20m, 0.001m);

            var updateHalfFullOrderbook = new HuobiOrderbook();

            updateHalfFullOrderbook.OfficialBids = new ConcurrentDictionary <decimal, decimal>();
            updateHalfFullOrderbook.OfficialBids.TryAdd(1m, 0.02m);
            updateHalfFullOrderbook.OfficialBids.TryAdd(2m, 0.15m);
            updateHalfFullOrderbook.OfficialBids.TryAdd(3m, 0.072382m);
            updateHalfFullOrderbook.OfficialBids.TryAdd(4m, 0.066716m);
            updateHalfFullOrderbook.OfficialBids.TryAdd(5m, 0.02m);

            updateHalfFullOrderbook.OfficialAsks = new ConcurrentDictionary <decimal, decimal>();
            updateHalfFullOrderbook.OfficialAsks.TryAdd(6m, 0.005m);
            updateHalfFullOrderbook.OfficialAsks.TryAdd(7m, 0.03m);
            updateHalfFullOrderbook.OfficialAsks.TryAdd(8m, 0.01759m);
            updateHalfFullOrderbook.OfficialAsks.TryAdd(9m, 0.03m);
            updateHalfFullOrderbook.OfficialAsks.TryAdd(10m, 0.03m);

            updateFullOrderbook.Sequence     = 2;
            updateHalfFullOrderbook.Sequence = 2;

            updateFullOrderbook.Exchange     = dummyExchange;
            updateHalfFullOrderbook.Exchange = dummyExchange;

            updateFullOrderbook.Symbol     = "BTCUSDT";
            updateHalfFullOrderbook.Symbol = "BTCUSDT";

            //Act: run the following merge combinations:
            // empty beginning orderbook -> full update | full beginning -> half-full update | half-full beginning to full update

            beginningEmptyOrderbook.Merge(updateFullOrderbook);
            beginningFullOrderbook.Merge(updateHalfFullOrderbook);
            beginningHalfFullOrderbook.Merge(updateFullOrderbook);

            //Assert: check that the beginning orderbooks now match the updates
            Assert.IsTrue(beginningEmptyOrderbook.OfficialAsks.Count == updateFullOrderbook.OfficialAsks.Count &&
                          beginningEmptyOrderbook.OfficialBids.Count == updateFullOrderbook.OfficialBids.Count);

            Assert.IsTrue(beginningFullOrderbook.OfficialAsks.Count == updateHalfFullOrderbook.OfficialAsks.Count &&
                          beginningFullOrderbook.OfficialBids.Count == updateHalfFullOrderbook.OfficialBids.Count);

            Assert.IsTrue(beginningHalfFullOrderbook.OfficialAsks.Count == updateFullOrderbook.OfficialAsks.Count &&
                          beginningHalfFullOrderbook.OfficialBids.Count == updateFullOrderbook.OfficialBids.Count);

            Assert.IsTrue(CheckLayers(updateFullOrderbook, beginningEmptyOrderbook));
            Assert.IsTrue(CheckLayers(updateHalfFullOrderbook, beginningFullOrderbook));
            Assert.IsTrue(CheckLayers(updateFullOrderbook, beginningHalfFullOrderbook));
        }