private void HandleOrderEvent(OrderEvent fill) { // update the order status var order = GetOrderByIdInternal(fill.OrderId); if (order == null) { Log.Error("BrokerageTransactionHandler.HandleOrderEvent(): Unable to locate Order with id " + fill.OrderId); return; } // set the status of our order object based on the fill event order.Status = fill.Status; // save that the order event took place, we're initializing the list with a capacity of 2 to reduce number of mallocs //these hog memory //List<OrderEvent> orderEvents = _orderEvents.GetOrAdd(orderEvent.OrderId, i => new List<OrderEvent>(2)); //orderEvents.Add(orderEvent); //Apply the filled order to our portfolio: if (fill.Status == OrderStatus.Filled || fill.Status == OrderStatus.PartiallyFilled) { Log.Debug("BrokerageTransactionHandler.HandleOrderEvent(): " + fill); Interlocked.Exchange(ref _lastFillTimeTicks, DateTime.Now.Ticks); _algorithm.Portfolio.ProcessFill(fill); } // update the ticket after we've processed the fill, but before the event, this way everything is ready for user code OrderTicket ticket; if (_orderTickets.TryGetValue(fill.OrderId, out ticket)) { ticket.AddOrderEvent(fill); } else { Log.Error("BrokerageTransactionHandler.HandleOrderEvent(): Unable to resolve ticket: " + fill.OrderId); } //We have an event! :) Order filled, send it in to be handled by algorithm portfolio. if (fill.Status != OrderStatus.None) //order.Status != OrderStatus.Submitted { //Create new order event: _resultHandler.OrderEvent(fill); try { //Trigger our order event handler _algorithm.OnOrderEvent(fill); } catch (Exception err) { _algorithm.Error("Order Event Handler Error: " + err.Message); } } }
public void OrderEvent(OrderEvent newEvent) { _shadow.OrderEvent(newEvent); }
private void HandleOrderEvent(OrderEvent fill) { // update the order status var order = GetOrderByIdInternal(fill.OrderId); if (order == null) { Log.Error("BrokerageTransactionHandler.HandleOrderEvent(): Unable to locate Order with id " + fill.OrderId); return; } // set the status of our order object based on the fill event order.Status = fill.Status; // save that the order event took place, we're initializing the list with a capacity of 2 to reduce number of mallocs //these hog memory //List<OrderEvent> orderEvents = _orderEvents.GetOrAdd(orderEvent.OrderId, i => new List<OrderEvent>(2)); //orderEvents.Add(orderEvent); //Apply the filled order to our portfolio: if (fill.Status == OrderStatus.Filled || fill.Status == OrderStatus.PartiallyFilled) { Interlocked.Exchange(ref _lastFillTimeTicks, DateTime.Now.Ticks); // check if the fill currency and the order currency match the symbol currency var security = _algorithm.Securities[fill.Symbol]; // Bug in FXCM API flipping the currencies -- disabling for now. 5/17/16 RFB //if (fill.FillPriceCurrency != security.SymbolProperties.QuoteCurrency) //{ // Log.Error(string.Format("Currency mismatch: Fill currency: {0}, Symbol currency: {1}", fill.FillPriceCurrency, security.SymbolProperties.QuoteCurrency)); //} //if (order.PriceCurrency != security.SymbolProperties.QuoteCurrency) //{ // Log.Error(string.Format("Currency mismatch: Order currency: {0}, Symbol currency: {1}", order.PriceCurrency, security.SymbolProperties.QuoteCurrency)); //} try { _algorithm.Portfolio.ProcessFill(fill); var conversionRate = security.QuoteCurrency.ConversionRate; _algorithm.TradeBuilder.ProcessFill(fill, conversionRate); } catch (Exception err) { Log.Error(err); _algorithm.Error(string.Format("Order Error: id: {0}, Error in Portfolio.ProcessFill: {1}", order.Id, err.Message)); } } // update the ticket and order after we've processed the fill, but before the event, this way everything is ready for user code OrderTicket ticket; if (_orderTickets.TryGetValue(fill.OrderId, out ticket)) { ticket.AddOrderEvent(fill); order.Price = ticket.AverageFillPrice; } else { Log.Error("BrokerageTransactionHandler.HandleOrderEvent(): Unable to resolve ticket: " + fill.OrderId); } //We have an event! :) Order filled, send it in to be handled by algorithm portfolio. if (fill.Status != OrderStatus.None) //order.Status != OrderStatus.Submitted { //Create new order event: _resultHandler.OrderEvent(fill); try { //Trigger our order event handler _algorithm.OnOrderEvent(fill); } catch (Exception err) { _algorithm.Error("Order Event Handler Error: " + err.Message); // kill the algorithm _algorithm.RunTimeError = err; } } }
private void HandleOrderEvent(OrderEvent fill) { // update the order status var order = GetOrderByIdInternal(fill.OrderId); if (order == null) { Log.Error("BrokerageTransactionHandler.HandleOrderEvent(): Unable to locate Order with id " + fill.OrderId); return; } // set the status of our order object based on the fill event order.Status = fill.Status; // save that the order event took place, we're initializing the list with a capacity of 2 to reduce number of mallocs //these hog memory //List<OrderEvent> orderEvents = _orderEvents.GetOrAdd(orderEvent.OrderId, i => new List<OrderEvent>(2)); //orderEvents.Add(orderEvent); //Apply the filled order to our portfolio: if (fill.Status == OrderStatus.Filled || fill.Status == OrderStatus.PartiallyFilled) { Log.Debug("BrokerageTransactionHandler.HandleOrderEvent(): " + fill); Interlocked.Exchange(ref _lastFillTimeTicks, DateTime.Now.Ticks); try { _algorithm.Portfolio.ProcessFill(fill); var conversionRate = 1m; if (order.SecurityType == SecurityType.Forex) { string baseCurrency, quoteCurrency; Forex.DecomposeCurrencyPair(fill.Symbol, out baseCurrency, out quoteCurrency); conversionRate = _algorithm.Portfolio.CashBook[quoteCurrency].ConversionRate; } _algorithm.TradeBuilder.ProcessFill(fill, conversionRate); } catch (Exception err) { Log.Error(err); _algorithm.Error(string.Format("Order Error: id: {0}, Error in Portfolio.ProcessFill: {1}", order.Id, err.Message)); } } // update the ticket and order after we've processed the fill, but before the event, this way everything is ready for user code OrderTicket ticket; if (_orderTickets.TryGetValue(fill.OrderId, out ticket)) { ticket.AddOrderEvent(fill); order.Price = ticket.AverageFillPrice; } else { Log.Error("BrokerageTransactionHandler.HandleOrderEvent(): Unable to resolve ticket: " + fill.OrderId); } //We have an event! :) Order filled, send it in to be handled by algorithm portfolio. if (fill.Status != OrderStatus.None) //order.Status != OrderStatus.Submitted { //Create new order event: _resultHandler.OrderEvent(fill); try { //Trigger our order event handler _algorithm.OnOrderEvent(fill); } catch (Exception err) { _algorithm.Error("Order Event Handler Error: " + err.Message); // kill the algorithm _algorithm.RunTimeError = err; } } }