public void UpdateDelete_ShouldConstructCorrectOrderBook() { var pair1 = "BTC/USD"; var source = new OrderBookSourceMock(); source.BufferEnabled = false; ICryptoOrderBook orderBook = new CryptoOrderBook(pair1, source); orderBook.IgnoreDiffsBeforeSnapshot = false; source.StreamBulk( GetInsertBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 100.111, 0.123, CryptoOrderSide.Ask, null, "ASK1")) ); Assert.Equal(0, orderBook.BidPrice); Assert.Equal(0, orderBook.BidAmount); Assert.Equal(100.111, orderBook.AskPrice); Assert.Equal(0.123, orderBook.AskAmount); source.StreamBulk( GetInsertBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 100.111, 0.444, CryptoOrderSide.Ask, null, "ASK2")) ); source.StreamBulk( GetInsertBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 100.111, 0.555, CryptoOrderSide.Ask, null, "ASK3")) ); var asks = orderBook.FindAskLevelsByPrice(100.111); Assert.Equal(3, asks.Length); Assert.Equal(0, orderBook.BidPrice); Assert.Equal(0, orderBook.BidAmount); Assert.Equal(100.111, orderBook.AskPrice); Assert.Equal(0.123, orderBook.AskAmount); source.StreamBulk( GetDeleteBulk(CryptoOrderBookType.L3, CreateLevel(pair1, null, CryptoOrderSide.Ask, "ASK1")) ); asks = orderBook.FindAskLevelsByPrice(100.111); Assert.Equal(2, asks.Length); Assert.Equal(0, orderBook.BidPrice); Assert.Equal(0, orderBook.BidAmount); Assert.Equal(100.111, orderBook.AskPrice); Assert.Equal(0.444, orderBook.AskAmount); source.StreamBulk( GetUpdateBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 100.111, 0.888, CryptoOrderSide.Ask, null, "ASK2")) ); asks = orderBook.FindAskLevelsByPrice(100.111); Assert.Equal(2, asks.Length); Assert.Equal(0, orderBook.BidPrice); Assert.Equal(0, orderBook.BidAmount); Assert.Equal(100.111, orderBook.AskPrice); Assert.Equal(0.555, orderBook.AskAmount); }
public void FindLevel_ShouldReturnCorrectValue() { var pair1 = "BTC/USD"; var pair2 = "ETH/BTC"; var data1 = GetOrderBookSnapshotMockDataL3(pair1, 500); var data2 = GetOrderBookSnapshotMockDataL3(pair2, 200); var data = data2.Concat(data1).ToArray(); var snapshot = new OrderBookLevelBulk(OrderBookAction.Insert, data, CryptoOrderBookType.L3); var source = new OrderBookSourceMock(snapshot); ICryptoOrderBook orderBook = new CryptoOrderBook(pair1, source); source.StreamSnapshot(); var bids = orderBook.FindBidLevelsByPrice(0); var asks = orderBook.FindAskLevelsByPrice(99); Assert.Equal(1000, orderBook.FindBidLevelByPrice(0)?.Amount); Assert.Equal(10, bids.Length); Assert.Equal(3000, orderBook.FindAskLevelByPrice(100)?.Amount); Assert.Equal(10, asks.Length); }
public void UpdatePrice_ShouldConstructCorrectOrderBook() { var pair1 = "BTC/USD"; var source = new OrderBookSourceMock(); source.BufferEnabled = false; var orderBook = new CryptoOrderBook(pair1, source); orderBook.IgnoreDiffsBeforeSnapshot = false; source.StreamBulk( GetInsertBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 100.111, 0.123, CryptoOrderSide.Ask, null, "ASK1")) ); source.StreamBulk( GetInsertBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 100.111, 0.444, CryptoOrderSide.Ask, null, "ASK2")) ); source.StreamBulk( GetInsertBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 101, 0.555, CryptoOrderSide.Ask, null, "ASK3")) ); source.StreamBulk( GetInsertBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 101, 0.666, CryptoOrderSide.Ask, null, "ASK4")) ); var asks = orderBook.FindAskLevelsByPrice(100.111); Assert.Equal(2, asks.Length); Assert.Equal(0, orderBook.BidPrice); Assert.Equal(0, orderBook.BidAmount); Assert.Equal(100.111, orderBook.AskPrice); Assert.Equal(0.123, orderBook.AskAmount); source.StreamBulk( GetUpdateBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 100, 0.555, CryptoOrderSide.Ask, null, "ASK3")) ); source.StreamBulk( GetUpdateBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 101, 0.123, CryptoOrderSide.Ask, null, "ASK1")) ); source.StreamBulk( GetInsertBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 100.111, 0.111222, CryptoOrderSide.Bid, null, "BID1")) ); source.StreamBulk( GetInsertBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 99, 0.9, CryptoOrderSide.Bid, null, "BID2")) ); var allAsks = orderBook.AskLevelsPerPrice; Assert.Equal(100.111, orderBook.BidPrice); Assert.Equal(0.111222, orderBook.BidAmount); Assert.Equal(100, orderBook.AskPrice); Assert.Equal(0.555, orderBook.AskAmount); Assert.Equal(3, allAsks.Count); Assert.Single(allAsks[100]); Assert.Equal(2, allAsks[101].Length); Assert.Single(allAsks[100.111]); source.StreamBulk( GetUpdateBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 101, 0.123123, CryptoOrderSide.Bid, null, "BID1")) ); source.StreamBulk( GetInsertBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 101, 0.777, CryptoOrderSide.Ask, null, "ASK5")) ); var ask101 = orderBook.FindAskLevelsByPrice(101); Assert.Equal(3, ask101.Length); Assert.Equal("ASK4", ask101[0].Id); Assert.Equal("ASK1", ask101[1].Id); Assert.Equal("ASK5", ask101[2].Id); source.StreamBulk( GetDeleteBulk(CryptoOrderBookType.L3, CreateLevel(pair1, null, CryptoOrderSide.Ask, "ASK4")) ); source.StreamBulk( GetDeleteBulk(CryptoOrderBookType.L3, CreateLevel(pair1, null, CryptoOrderSide.Bid, "BID2")) ); source.StreamBulk( GetDeleteBulk(CryptoOrderBookType.L3, CreateLevel(pair1, null, CryptoOrderSide.Ask, "ASK3")) ); source.StreamBulk( GetUpdateBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 100.111, 0.123, CryptoOrderSide.Ask, null, "ASK1")) ); allAsks = orderBook.AskLevelsPerPrice; Assert.Equal(101, orderBook.BidPrice); Assert.Equal(0.123123, orderBook.BidAmount); Assert.Equal(100.111, orderBook.AskPrice); Assert.Equal(0.444, orderBook.AskAmount); Assert.Equal(2, allAsks.Count); Assert.Equal(2, allAsks[100.111].Length); Assert.Equal("ASK5", allAsks[101][0].Id); }
public void UpdateDeleteComplex_ShouldConstructCorrectOrderBook() { var pair1 = "BTC/USD"; var data = GetOrderBookSnapshotMockDataL3(pair1, 200); var snapshot = new OrderBookLevelBulk(OrderBookAction.Insert, data, CryptoOrderBookType.L3); var source = new OrderBookSourceMock(snapshot); source.BufferEnabled = false; var orderBook = new CryptoOrderBook(pair1, source); orderBook.IgnoreDiffsBeforeSnapshot = true; source.StreamBulk( GetInsertBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 100.111, 0.123, CryptoOrderSide.Ask, null, "ASK1")) ); Assert.Equal(0, orderBook.BidPrice); Assert.Equal(0, orderBook.BidAmount); Assert.Equal(0, orderBook.AskPrice); Assert.Equal(0, orderBook.AskAmount); source.StreamSnapshot(); Assert.Equal(19, orderBook.BidPrice); Assert.Equal(590, orderBook.BidAmount); Assert.Equal(20, orderBook.AskPrice); Assert.Equal(1009, orderBook.AskAmount); var asks = orderBook.FindAskLevelsByPrice(20); var levelsToDelete = asks .Select(x => CreateLevel(x.Pair, null, x.Side, x.Id)) .ToArray(); source.StreamBulk( GetDeleteBulk(CryptoOrderBookType.L3, levelsToDelete) ); source.StreamBulk( GetUpdateBulk(CryptoOrderBookType.L3, CreateLevel(pair1, 20, 0.123, CryptoOrderSide.Bid, null, "BID1")) ); Assert.Equal(20, orderBook.BidPrice); Assert.Equal(0.123, orderBook.BidAmount); Assert.Equal(21, orderBook.AskPrice); Assert.Equal(1019, orderBook.AskAmount); var bids = orderBook.BidLevelsPerPrice; foreach (var bidLevel in bids[19]) { source.StreamBulk( GetDeleteBulk(CryptoOrderBookType.L3, CreateLevel(pair1, bidLevel.Price, bidLevel.Amount, bidLevel.Side, null, bidLevel.Id)) ); } source.StreamBulk( GetDeleteBulk(CryptoOrderBookType.L3, CreateLevel(pair1, null, CryptoOrderSide.Bid, "BID1")) ); Assert.Equal(18, orderBook.BidPrice); Assert.Equal(580, orderBook.BidAmount); Assert.Equal(21, orderBook.AskPrice); Assert.Equal(1019, orderBook.AskAmount); }