/// <summary> /// Insert order before the specific offer. /// </summary> /// <param name="orderbook">Orderbook</param> /// <param name="orderWrapper">An order to insert</param> /// <param name="beforeWrapper"></param> public void InsertOrderBefore(OrderInfoWrapper orderWrapper, OrderInfoWrapper beforeWrapper) { if (beforeWrapper == null) { //append to the end if (Tail != null) { //insert after the tail Tail.Next = orderWrapper; orderWrapper.Prev = Tail; Tail = orderWrapper; } else { //it's the first order entry Head = Tail = orderWrapper; } } else { //insert order into the linked list before the cursor orderWrapper.Prev = beforeWrapper.Prev; orderWrapper.Next = beforeWrapper; beforeWrapper.Prev = orderWrapper; //update the reference if we are inserting before the head entry if (beforeWrapper == Head) { Head = orderWrapper; } } //increment count Count++; TotalAmount += orderWrapper.Order.Amount; Volume += (long)(orderWrapper.Order.Amount * orderWrapper.Order.Price); //add to the map orderMap.AddOrder(orderWrapper); }
/// <summary> /// Add new order to the orderbook. /// </summary> /// <param name="order">An order to add</param> public void InsertOrder(OrderInfoWrapper order) { var price = order.Order.Price; //just set Head reference if it's the first order if (Head == null) { InsertOrderBefore(order, null); return; } //find position to insert the order var cursor = Head; while ((Side == OrderSide.Sell && price >= cursor.Order.Price) || (Side == OrderSide.Buy && price <= cursor.Order.Price)) { cursor = cursor.Next; if (cursor == null) { break; //the last record } } //insert order InsertOrderBefore(order, cursor); }
/// <summary> /// Add new order to the orderbook. /// </summary> /// <param name="order">An order to add</param> public void InsertOrder(OrderInfoWrapper order) { var i = ~sortedOrders.BinarySearch(order, comparer); var cursor = default(OrderInfoWrapper); if (i == 0) { cursor = sortedOrders.FirstOrDefault(); } else if (sortedOrders.Count > i) { cursor = sortedOrders[i]; } sortedOrders.Insert(i, order); //insert order InsertOrderBefore(order, cursor); }
public void AddOrder(OrderInfoWrapper orderWrapper) { lock (this) map.Add(orderWrapper.Order.OrderId, orderWrapper); }