/// <summary> /// Called when order execution is receievd /// </summary> /// <param name="execution">Contains execution details</param> private void OnExecutionArrived(Execution execution) { OrderExecutionProvider provider; // Get Order Execution Provider if (_providersMap.TryGetValue(execution.OrderExecutionProvider, out provider)) { OrderDetails orderDetails = null; // Find 'Order Details' object foreach (OrderDetails tempOrderDetails in provider.OrdersCollection) { if (tempOrderDetails.ID.Equals(execution.Order.OrderID)) { orderDetails = tempOrderDetails; break; } } // Update order parameters if (orderDetails != null) { orderDetails.Status = execution.Order.OrderStatus; // Create fill information var fillDetail = new FillDetail(); fillDetail.FillId = execution.Fill.ExecutionId; fillDetail.FillPrice = execution.Fill.ExecutionPrice; fillDetail.FillQuantity = execution.Fill.ExecutionSize; fillDetail.FillDatetime = execution.Fill.ExecutionDateTime; fillDetail.FillType = execution.Fill.ExecutionType; // Add to order details object provider.AddFill(orderDetails, fillDetail); // Use incoming information to update position statistics provider.UpdatePosition(orderDetails); } } }
private FillDetail[] GetOrderFills( OrderType type, OrderDirection direction, Stock stock, int quantity, decimal?price = null) { var totalFilled = 0; var filledOrders = new List <FillDetail>(); var orders = type == OrderType.Market ? GetMarketOrders(direction, stock) : GetLimitOrders(direction, stock, price.Value); foreach (var o in orders) { var fill = new FillDetail { OrderId = o.OrderId, Owner = o.Owner, Stock = o.Stock, Quantity = 0, Price = o.Price ?? _sharesProvider.GetLastPrice(stock) }; filledOrders.Add(fill); for (int i = 0; i < o.Quantity; i++) { if (totalFilled >= quantity) { return(filledOrders.ToArray()); } fill.Quantity++; totalFilled++; } } return(filledOrders.ToArray()); }