// // // ************************************* // **** ProcessFillConfirm **** // ************************************* private void ProcessFillConfirm(FillEventArgs fillEvent) { Order orderToModify; Order orderToReturn = null; if (m_OrdersById.TryGetValue(fillEvent.OrderId, out orderToModify)) { lock (m_Lock) { orderToModify.ExecutedQty += fillEvent.Fill.Qty; if (fillEvent.isComplete) { orderToModify.OrderStateConfirmed = OrderState.Dead; } } if (fillEvent.isComplete) { m_ParentOrderBook.TryDelete(fillEvent.OrderId); } // Trigger fill event fillEvent.OrderBookID = m_ParentOrderBook.BookID; // assign the correct id now that we know it. m_ParentOrderBook.OnOrderFilled(fillEvent); // fire fill event for my subscribers // Trigger order state change if (m_ParentOrderBook.TryGet(fillEvent.OrderId, out orderToReturn, true)) { OrderEventArgs orderEvent = new OrderEventArgs(); orderEvent.Order = orderToReturn; orderEvent.Fill = fillEvent.Fill; orderEvent.OrderBookID = m_ParentOrderBook.BookID; m_ParentOrderBook.OnOrderStateChanged(orderEvent); } } }
// /// <summary> /// After any order status updated and after we have already updated our quoting orders, /// this event is fired first before all others. /// </summary> public void OnOrderFilled(FillEventArgs fillEventArgs) { if (this.OrderFilled != null) { this.OrderFilled(this, fillEventArgs); } }
// // // // // // // ************************************* // **** OrderFilled() **** // ************************************* public bool OrderFilled(FillEventArgs fillEventArgs) { int bookId; if (m_OrderIDToBookMap.TryGetValue(fillEventArgs.OrderId, out bookId)) { OrderBook orderBook; if (m_OrderBooks.TryGetValue(bookId, out orderBook)) { // we have this order book if (orderBook.IsReady) { fillEventArgs.OrderBookID = bookId; orderBook.OnOrderFilled(fillEventArgs); } } } return(false); }
// // // ************************************************* // **** ProcessRequest() **** // ************************************************* // orderReq.Data[0] = InstrumentName // orderReq.Data[1] = orderId // orderReq.Data[2] = orderside // orderReq.Data[3] = Order/fill/other data? /// <summary> /// /// Threadsafe method to request manipulation of an internal order. /// </summary> /// <param name="orderId"></param> /// <param name="orderSide"></param> /// <param name="orderReq"></param> public void ProcessRequest(int orderId, int orderSide, RequestEventArg <OrderRequestType> orderReq) { Order order; switch (orderReq.RequestType) { case OrderRequestType.None: break; // // Add // case OrderRequestType.AddConfirm: order = (Order)orderReq.Data[3]; ProcessAddConfirm(order); break; case OrderRequestType.AddReject: ProcessAddReject(orderId); break; // // Delete // case OrderRequestType.DeleteConfirm: ProcessDeleteConfirm(orderId); break; case OrderRequestType.DeleteRequest: ProcessDeleteRequest(orderId); break; case OrderRequestType.DeleteReject: // TODO break; // // Fills // case OrderRequestType.FillConfirm: FillEventArgs fillEvent = (FillEventArgs)orderReq.Data[3]; ProcessFillConfirm(fillEvent); break; // // Change // case OrderRequestType.ChangeRequest: order = (Order)orderReq.Data[3]; ProcessChangeRequest(order); break; case OrderRequestType.ChangeConfirm: order = (Order)orderReq.Data[3]; ProcessChangeConfirm(order); break; case OrderRequestType.ChangeReject: ProcessChangeReject(orderId); break; // // Unknown // case OrderRequestType.Unknown: order = (Order)orderReq.Data[3]; ProcessUknownOrder(order); break; default: break; } }