public void Update_Order_Quantity() { orderbook = new FullOrderbook(); decimal newQty = 10; var bid_orderId_1 = "bid_order_1"; var bid_isBid_1 = true; var bid_quantity_1 = 5; var bid_price_1 = 23; var bid_timestamp_1 = DateTimeOffset.Now; var bid_order_1 = new LimitOrder( bid_orderId_1, bid_isBid_1, bid_quantity_1, bid_price_1, bid_timestamp_1); var bid_orderId_2 = "bid_order_2"; var bid_isBid_2 = true; var bid_quantity_2 = 5; var bid_price_2 = 23; var bid_timestamp_2 = DateTimeOffset.Now; var bid_order_2 = new LimitOrder( bid_orderId_2, bid_isBid_2, bid_quantity_2, bid_price_2, bid_timestamp_2); var bid_orderId_3 = "bid_order_3"; var bid_isBid_3 = true; var bid_quantity_3 = 5; var bid_price_3 = 23; var bid_timestamp_3 = DateTimeOffset.Now; var bid_order_3 = new LimitOrder( bid_orderId_3, bid_isBid_3, bid_quantity_3, bid_price_3, bid_timestamp_3); orderbook.PlaceOrder(bid_order_1); orderbook.PlaceOrder(bid_order_2); orderbook.PlaceOrder(bid_order_3); var updated_bid_order_2 = bid_order_2.DeepCopyWithQtyChanged(newQty); orderbook.PlaceOrder(updated_bid_order_2); //<1>. Should have only one bid level. //<2>. At this level, the Quantities are 5, 10, 5. //Assert <1> Assert.IsNotNull(orderbook.BestBidLevel); var bestBidLevels = orderbook.GetBestBidLevels(3); Assert.AreSame(orderbook.BestBidLevel, bestBidLevels[0]); Assert.AreEqual(1, bestBidLevels.Count); Assert.AreEqual(23, bestBidLevels[0].LimitPrice); //Assert <2> Assert.AreEqual(3, orderbook.BestBidLevel.NumberOfOrders); var firstBidOrderNode = orderbook.BestBidLevel.Orders.List.First; Assert.IsNotNull(firstBidOrderNode); Assert.AreEqual(5, firstBidOrderNode.Value.Quantity); var secondBidOrderNode = firstBidOrderNode.Next; Assert.IsNotNull(secondBidOrderNode); Assert.AreEqual(newQty, secondBidOrderNode.Value.Quantity); var thirdBidOrderNode = secondBidOrderNode.Next; Assert.IsNotNull(thirdBidOrderNode); Assert.AreEqual(5, thirdBidOrderNode.Value.Quantity); Assert.AreEqual(20, orderbook.BestBidLevel.TotalLevelQuantity); }
public void Update_Order_Price() { orderbook = new FullOrderbook(); decimal newPrice = 22; var bid_orderId_1 = "bid_order_1"; var bid_isBid_1 = true; var bid_quantity_1 = 5; var bid_price_1 = 23; var bid_timestamp_1 = DateTimeOffset.Now; var bid_order_1 = new LimitOrder( bid_orderId_1, bid_isBid_1, bid_quantity_1, bid_price_1, bid_timestamp_1); var bid_orderId_2 = "bid_order_2"; var bid_isBid_2 = true; var bid_quantity_2 = 5; var bid_price_2 = 22; var bid_timestamp_2 = DateTimeOffset.Now; var bid_order_2 = new LimitOrder( bid_orderId_2, bid_isBid_2, bid_quantity_2, bid_price_2, bid_timestamp_2); var bid_orderId_3 = "bid_order_3"; var bid_isBid_3 = true; var bid_quantity_3 = 4; var bid_price_3 = 21; var bid_timestamp_3 = DateTimeOffset.Now; var bid_order_3 = new LimitOrder( bid_orderId_3, bid_isBid_3, bid_quantity_3, bid_price_3, bid_timestamp_3); var bid_orderId_4 = "bid_order_4"; var bid_isBid_4 = true; var bid_quantity_4 = 5; var bid_price_4 = 21; var bid_timestamp_4 = DateTimeOffset.Now; var bid_order_4 = new LimitOrder( bid_orderId_4, bid_isBid_4, bid_quantity_4, bid_price_4, bid_timestamp_4); var bid_orderId_5 = "bid_order_5"; var bid_isBid_5 = true; var bid_quantity_5 = 3; var bid_price_5 = 21; var bid_timestamp_5 = DateTimeOffset.Now; var bid_order_5 = new LimitOrder( bid_orderId_5, bid_isBid_5, bid_quantity_5, bid_price_5, bid_timestamp_5); orderbook.PlaceOrder(bid_order_1); orderbook.PlaceOrder(bid_order_2); orderbook.PlaceOrder(bid_order_3); orderbook.PlaceOrder(bid_order_4); orderbook.PlaceOrder(bid_order_5); var updated_bid_order_3 = new LimitOrder( bid_order_3.OrderId, bid_order_3.IsBid, bid_order_3.Quantity, newPrice, DateTimeOffset.Now ); orderbook.PlaceOrder(updated_bid_order_3); //<1>. Should have 3 level of Bids, $23, $22, $21 //<2>. At level $22, there are two orders left, with Quantity 5 and 4. //<3>. At level $21, there is two order left, with Quantity 5 and 3. //Assert <1> Assert.IsNotNull(orderbook.BestBidLevel); var bestBidLevels = orderbook.GetBestBidLevels(3); Assert.AreEqual(3, bestBidLevels.Count); Assert.AreEqual(23, bestBidLevels[0].LimitPrice); Assert.AreEqual(22, bestBidLevels[1].LimitPrice); Assert.AreEqual(21, bestBidLevels[2].LimitPrice); //Assert <2> var targetLevel_22 = bestBidLevels[1]; Assert.AreEqual(2, targetLevel_22.NumberOfOrders); var firstBidOrderNode_22 = targetLevel_22.Orders.List.First; Assert.IsNotNull(firstBidOrderNode_22); Assert.AreEqual(5, firstBidOrderNode_22.Value.Quantity); var secondBidOrderNode_22 = firstBidOrderNode_22.Next; Assert.IsNotNull(secondBidOrderNode_22); Assert.AreEqual(4, secondBidOrderNode_22.Value.Quantity); Assert.AreEqual(9, targetLevel_22.TotalLevelQuantity); //Assert <3> var targetLevel_21 = bestBidLevels[2]; Assert.AreEqual(2, targetLevel_21.NumberOfOrders); var firstBidOrderNode_21 = targetLevel_21.Orders.List.First; Assert.IsNotNull(firstBidOrderNode_21); Assert.AreEqual(5, firstBidOrderNode_21.Value.Quantity); var secondBidOrderNode_21 = firstBidOrderNode_21.Next; Assert.IsNotNull(secondBidOrderNode_21); Assert.AreEqual(3, secondBidOrderNode_21.Value.Quantity); Assert.AreEqual(8, targetLevel_21.TotalLevelQuantity); }
public void Place_New_Sell_Order_And_Match_Exist_Buy_Orders() { orderbook = new FullOrderbook(); var bid_orderId_1 = "bid_order_1"; var bid_isBid_1 = true; var bid_quantity_1 = 5; var bid_price_1 = 23; var bid_timestamp_1 = DateTimeOffset.Now; var bid_order_1 = new LimitOrder( bid_orderId_1, bid_isBid_1, bid_quantity_1, bid_price_1, bid_timestamp_1); var bid_orderId_2 = "bid_order_2"; var bid_isBid_2 = true; var bid_quantity_2 = 5; var bid_price_2 = 22; var bid_timestamp_2 = DateTimeOffset.Now; var bid_order_2 = new LimitOrder( bid_orderId_2, bid_isBid_2, bid_quantity_2, bid_price_2, bid_timestamp_2); var bid_orderId_3 = "bid_order_3"; var bid_isBid_3 = true; var bid_quantity_3 = 5; var bid_price_3 = 21; var bid_timestamp_3 = DateTimeOffset.Now; var bid_order_3 = new LimitOrder( bid_orderId_3, bid_isBid_3, bid_quantity_3, bid_price_3, bid_timestamp_3); var bid_orderId_4 = "bid_order_4"; var bid_isBid_4 = true; var bid_quantity_4 = 5; var bid_price_4 = 21; var bid_timestamp_4 = DateTimeOffset.Now; var bid_order_4 = new LimitOrder( bid_orderId_4, bid_isBid_4, bid_quantity_4, bid_price_4, bid_timestamp_4); var bid_orderId_5 = "bid_order_5"; var bid_isBid_5 = true; var bid_quantity_5 = 5; var bid_price_5 = 21; var bid_timestamp_5 = DateTimeOffset.Now; var bid_order_5 = new LimitOrder( bid_orderId_5, bid_isBid_5, bid_quantity_5, bid_price_5, bid_timestamp_5); var ask_orderId = "ask_order"; var ask_isBid = false; var ask_quantity = 16; var ask_price = 21; var ask_timestamp = DateTimeOffset.Now; var ask_order = new LimitOrder( ask_orderId, ask_isBid, ask_quantity, ask_price, ask_timestamp); orderbook.PlaceOrder(bid_order_1); orderbook.PlaceOrder(bid_order_2); orderbook.PlaceOrder(bid_order_3); orderbook.PlaceOrder(bid_order_4); orderbook.PlaceOrder(bid_order_5); orderbook.PlaceOrder(ask_order); //<1>. Should have only one bid level at $21 left. //<2>. Two orders at this level, with Quantity 4 and 5. //<3>. TotalLevelQuantity at this level should be 9. Assert.IsNull(orderbook.BestAskLevel); //Assert <1> Assert.IsNotNull(orderbook.BestBidLevel); var bestBidLevels = orderbook.GetBestBidLevels(3); Assert.AreEqual(1, bestBidLevels.Count); Assert.AreEqual(21, orderbook.BestBidLevel.LimitPrice); //Assert <2> Assert.AreEqual(2, orderbook.BestBidLevel.NumberOfOrders); var firstBidOrderNode = orderbook.BestBidLevel.Orders.List.First; Assert.IsNotNull(firstBidOrderNode); Assert.AreEqual(4, firstBidOrderNode.Value.Quantity); var secondBidOrderNode = firstBidOrderNode.Next; Assert.IsNotNull(secondBidOrderNode); Assert.AreEqual(5, secondBidOrderNode.Value.Quantity); //Assert <3> Assert.AreEqual(9, orderbook.BestBidLevel.TotalLevelQuantity); }
public void Remove_Order_By_OrderId() { orderbook = new FullOrderbook(); var bid_orderId_1 = "bid_order_1"; var bid_isBid_1 = true; var bid_quantity_1 = 5; var bid_price_1 = 23; var bid_timestamp_1 = DateTimeOffset.Now; var bid_order_1 = new LimitOrder( bid_orderId_1, bid_isBid_1, bid_quantity_1, bid_price_1, bid_timestamp_1); var bid_orderId_2 = "bid_order_2"; var bid_isBid_2 = true; var bid_quantity_2 = 5; var bid_price_2 = 22; var bid_timestamp_2 = DateTimeOffset.Now; var bid_order_2 = new LimitOrder( bid_orderId_2, bid_isBid_2, bid_quantity_2, bid_price_2, bid_timestamp_2); var bid_orderId_3 = "bid_order_3"; var bid_isBid_3 = true; var bid_quantity_3 = 5; var bid_price_3 = 21; var bid_timestamp_3 = DateTimeOffset.Now; var bid_order_3 = new LimitOrder( bid_orderId_3, bid_isBid_3, bid_quantity_3, bid_price_3, bid_timestamp_3); var bid_orderId_4 = "bid_order_4"; var bid_isBid_4 = true; var bid_quantity_4 = 5; var bid_price_4 = 21; var bid_timestamp_4 = DateTimeOffset.Now; var bid_order_4 = new LimitOrder( bid_orderId_4, bid_isBid_4, bid_quantity_4, bid_price_4, bid_timestamp_4); var bid_orderId_5 = "bid_order_5"; var bid_isBid_5 = true; var bid_quantity_5 = 5; var bid_price_5 = 21; var bid_timestamp_5 = DateTimeOffset.Now; var bid_order_5 = new LimitOrder( bid_orderId_5, bid_isBid_5, bid_quantity_5, bid_price_5, bid_timestamp_5); orderbook.PlaceOrder(bid_order_1); orderbook.PlaceOrder(bid_order_2); orderbook.PlaceOrder(bid_order_3); orderbook.PlaceOrder(bid_order_4); orderbook.PlaceOrder(bid_order_5); var orderToRemove = new LimitOrder(); orderToRemove.SetOrderId(bid_order_3.OrderId); orderbook.RemoveOrderByOrderId(orderToRemove); //<1>. Should have 3 level of Bids, $23, $22, $21 //<2>. At level $21, there are two orders left, with Quantity 5 and 5. //<3>. TotalLevelQuantity at this level should be 10. //Assert <1> Assert.IsNotNull(orderbook.BestBidLevel); var bestBidLevels = orderbook.GetBestBidLevels(3); Assert.AreEqual(3, bestBidLevels.Count); Assert.AreEqual(23, bestBidLevels[0].LimitPrice); Assert.AreEqual(22, bestBidLevels[1].LimitPrice); Assert.AreEqual(21, bestBidLevels[2].LimitPrice); //Assert <2> var targetLevel = bestBidLevels[2]; Assert.AreEqual(2, targetLevel.NumberOfOrders); var firstBidOrderNode = targetLevel.Orders.List.First; Assert.IsNotNull(firstBidOrderNode); Assert.AreEqual(5, firstBidOrderNode.Value.Quantity); var secondBidOrderNode = firstBidOrderNode.Next; Assert.IsNotNull(secondBidOrderNode); Assert.AreEqual(5, secondBidOrderNode.Value.Quantity); //Assert <3> Assert.AreEqual(10, targetLevel.TotalLevelQuantity); }
public void Place_Mutiple_Buy_Orders_With_Different_Prices() { orderbook = new FullOrderbook(); var isBid = true; var orderId_1 = "order1"; var isBid_1 = isBid; var quantity_1 = 30; var price_1 = 300; var timestamp_1 = DateTimeOffset.Now; var order_1 = new LimitOrder( orderId_1, isBid_1, quantity_1, price_1, timestamp_1); var orderId_2 = "order2"; var isBid_2 = isBid; var quantity_2 = 20; var price_2 = 200; var timestamp_2 = DateTimeOffset.Now; var order_2 = new LimitOrder( orderId_2, isBid_2, quantity_2, price_2, timestamp_2); var orderId_3 = "order3"; var isBid_3 = isBid; var quantity_3 = 10; var price_3 = 100; var timestamp_3 = DateTimeOffset.Now; var order_3 = new LimitOrder( orderId_3, isBid_3, quantity_3, price_3, timestamp_3); List <LimitOrder> testOrders = new List <LimitOrder>() { order_1, order_2, order_3 }; orderbook.PlaceOrder(order_1); orderbook.PlaceOrder(order_2); orderbook.PlaceOrder(order_3); Assert.IsNotNull(orderbook.BidLevels); Assert.IsNotNull(orderbook.BestBidLevel); var bestBidsFromGetBestBidLevels = orderbook.GetBestBidLevels(3); Assert.IsNotNull(bestBidsFromGetBestBidLevels); Assert.AreEqual(3, bestBidsFromGetBestBidLevels.Count); var bidLevelEnumerator = orderbook.BidLevels.GetEnumerator(); for (int i = 0; i < 3; i++) { Assert.IsTrue(bidLevelEnumerator.MoveNext()); var bidLevel = bidLevelEnumerator.Current; var testOrder = testOrders[i]; Assert.AreEqual(testOrder.Quantity, bidLevel.TotalLevelQuantity); Assert.AreEqual(testOrder.LimitPrice, bidLevel.LimitPrice); Assert.AreEqual(1, bidLevel.NumberOfOrders); Assert.IsNotNull(bidLevel.Orders); Assert.IsNotNull(bidLevel.Orders.List); Assert.AreEqual(1, bidLevel.Orders.List.Count); Assert.AreEqual(testOrder.OrderId, bidLevel.Orders.List.First.Value.OrderId); Assert.AreEqual(isBid, bidLevel.Orders.List.First.Value.IsBid); Assert.AreEqual(testOrder.Quantity, bidLevel.Orders.List.First.Value.Quantity); Assert.AreEqual(testOrder.LimitPrice, bidLevel.Orders.List.First.Value.LimitPrice); Assert.AreEqual(testOrder.ReceivedTimestamp, bidLevel.Orders.List.First.Value.ReceivedTimestamp); Assert.IsNotNull(bidLevel.Orders.Table); Assert.AreEqual(1, bidLevel.Orders.Table.Count); Assert.AreSame(bidLevel.Orders.Table[testOrder.OrderId], bidLevel.Orders.List.First); Assert.AreSame(bidLevel, bestBidsFromGetBestBidLevels[i]); } }