void HandleOnTradeUpdate(ITradeUpdate update)
 {
     Assert.NotNull(update);
     Assert.NotNull(update.Order);
     Assert.Equal(Symbol, update.Order.Symbol);
     waitObject.Set();
 }
Esempio n. 2
0
        /// <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}");
            }
        }
Esempio n. 3
0
        /// <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}");
            }
        }
Esempio n. 4
0
 // 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;
         }
     }
 }
Esempio n. 5
0
        // 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;
                }
            }
        }
Esempio n. 6
0
 private void HandleTradeUpdates(ITradeUpdate update)
 {
     OnTradeUpdate?.Invoke(update);
 }
Esempio n. 7
0
 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();
 }