void HandleOnTradeUpdate(ITradeUpdate update) { Assert.NotNull(update); Assert.NotNull(update.Order); Assert.Equal(Symbol, update.Order.Symbol); waitObject.Set(); }
/// <summary> /// Event handler for streaming events /// </summary> /// <param name="trade">The event object</param> private void OnTradeUpdate(ITradeUpdate trade) { Log.Trace($"AlpacaBrokerage.OnTradeUpdate(): Event:{trade.Event} OrderId:{trade.Order.OrderId} OrderStatus:{trade.Order.OrderStatus} FillQuantity: {trade.Order.FilledQuantity} Price: {trade.Price}"); Order order; OrderTicket ticket = null; lock (_locker) { order = _orderProvider.GetOrderByBrokerageId(trade.Order.OrderId.ToString()); if (order != null) { ticket = _orderProvider.GetOrderTicket(order.Id); } } if (order != null && ticket != null) { if (trade.Event == TradeEvent.Fill || trade.Event == TradeEvent.PartialFill) { order.PriceCurrency = _securityProvider.GetSecurity(order.Symbol).SymbolProperties.QuoteCurrency; var status = trade.Event == TradeEvent.Fill ? OrderStatus.Filled : OrderStatus.PartiallyFilled; // The Alpaca API does not return the individual quantity for each partial fill, but the cumulative filled quantity var fillQuantity = trade.Order.FilledQuantity - Math.Abs(ticket.QuantityFilled); OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, OrderFee.Zero, "Alpaca Fill Event") { Status = status, FillPrice = trade.Price.Value, FillQuantity = fillQuantity * (order.Direction == OrderDirection.Buy ? 1 : -1) }); } else if (trade.Event == TradeEvent.Canceled) { OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, OrderFee.Zero, "Alpaca Cancel Order Event") { Status = OrderStatus.Canceled }); } else if (trade.Event == TradeEvent.OrderCancelRejected) { var message = $"Order cancellation rejected: OrderId: {order.Id}"; OnMessage(new BrokerageMessageEvent(BrokerageMessageType.Warning, -1, message)); } } else { Log.Error($"AlpacaBrokerage.OnTradeUpdate(): order id not found: {trade.Order.OrderId}"); } }
/// <summary> /// Event handler for streaming events /// </summary> /// <param name="trade">The event object</param> private void OnTradeUpdate(ITradeUpdate trade) { Log.Trace($"AlpacaBrokerage.OnTradeUpdate(): Event:{trade.Event} OrderId:{trade.Order.OrderId} OrderStatus:{trade.Order.OrderStatus} FillQuantity: {trade.Order.FilledQuantity} Price: {trade.Price}"); Order order; lock (_locker) { order = _orderProvider.GetOrderByBrokerageId(trade.Order.OrderId.ToString()); } if (order != null) { if (trade.Event == TradeUpdateEvent.OrderFilled || trade.Event == TradeUpdateEvent.OrderPartiallyFilled) { order.PriceCurrency = _securityProvider.GetSecurity(order.Symbol).SymbolProperties.QuoteCurrency; var status = trade.Event == TradeUpdateEvent.OrderFilled ? OrderStatus.Filled : OrderStatus.PartiallyFilled; OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, OrderFee.Zero, "Alpaca Fill Event") { Status = status, FillPrice = trade.Price.Value, FillQuantity = Convert.ToInt32(trade.Order.FilledQuantity) * (order.Direction == OrderDirection.Buy ? +1 : -1) }); } else if (trade.Event == TradeUpdateEvent.OrderCanceled) { OnOrderEvent(new OrderEvent(order, DateTime.UtcNow, OrderFee.Zero, "Alpaca Cancel Order Event") { Status = OrderStatus.Canceled }); } else if (trade.Event == TradeUpdateEvent.OrderCancelRejected) { var message = $"Order cancellation rejected: OrderId: {order.Id}"; OnMessage(new BrokerageMessageEvent(BrokerageMessageType.Warning, -1, message)); } } else { Log.Error($"AlpacaBrokerage.OnTradeUpdate(): order id not found: {trade.Order.OrderId}"); } }
// Update our information about the last order we placed. // This is done so that we know whether or not we need to submit a cancel for // that order before we place another. private void HandleTradeUpdate(ITradeUpdate trade) { if (trade.Order.OrderId == lastTradeId) { switch (trade.Event) { case TradeEvent.Fill: case TradeEvent.Rejected: case TradeEvent.Canceled: lastTradeOpen = false; break; } } }
// Update our information about the last order we placed. // This is done so that we know whether or not we need to submit a cancel for // that order before we place another. private void HandleTradeUpdate(ITradeUpdate trade) { if (trade.Order.OrderId == lastTradeId) { switch (trade.Event) { case TradeEvent.Fill: Console.WriteLine("Trade filled."); lastTradeOpen = false; break; case TradeEvent.Rejected: Console.WriteLine("Trade rejected."); lastTradeOpen = false; break; case TradeEvent.Canceled: Console.WriteLine("Trade canceled."); lastTradeOpen = false; break; } } }
private void HandleTradeUpdates(ITradeUpdate update) { OnTradeUpdate?.Invoke(update); }
private void AlpacaStreamingClient_OnTradeUpdate(ITradeUpdate update) { // throw new NotImplementedException(); lstTradeUpdates.Add(update); StatusChanged(); }
private static void AlpacaStreamingClient_OnTradeUpdate(ITradeUpdate obj) { // TODO: Implement trade updates for Securities objects throw new NotImplementedException(); }