public override void OnOrderEvent(Orders.OrderEvent orderEvent) { if ((orderEvent.Direction == Orders.OrderDirection.Sell) && (orderEvent.Status == Orders.OrderStatus.Filled)) { Log(string.Format("Trade {0} close at {1}", closeTradeCounter, Time)); closeTradeCounter++; } }
/// <summary> /// Order fill event handler. On an order fill update the resulting information is passed to this method. /// </summary> /// <param name="orderEvent">Order event details containing details of the events</param> /// <remarks> /// This method can be called asynchronously and so should only be used by seasoned C# experts. Ensure you use proper locks on thread-unsafe objects /// </remarks> public override void OnOrderEvent(Orders.OrderEvent orderEvent) { string symbol = orderEvent.Symbol; int portfolioPosition = Portfolio[symbol].Quantity; var senderStrategy = SenderStrategy[orderEvent.OrderId]; var actualOrder = Transactions.GetOrderById(orderEvent.OrderId); // Update the strategy object if the order status is filled. if (orderEvent.Status == OrderStatus.Filled) { switch (senderStrategy) { case MomersionState.Momentum: if (portfolioPosition > 0) { MomentumStrategy[symbol].Position = StockState.longPosition; } else if (portfolioPosition < 0) { MomentumStrategy[symbol].Position = StockState.shortPosition; } else { MomentumStrategy[symbol].Position = StockState.noInvested; } break; case MomersionState.MeanRevertion: if (portfolioPosition > 0) { MeanReversionStrategy[symbol].Position = StockState.longPosition; } else if (portfolioPosition < 0) { MeanReversionStrategy[symbol].Position = StockState.shortPosition; } else { MeanReversionStrategy[symbol].Position = StockState.noInvested; } break; default: break; } } // Logging. Log(string.Format("{0} sent from {1} strategy.", actualOrder.ToString(), senderStrategy.ToString())); }