Ejemplo n.º 1
0
 private async Task ProcessClosedOrder(ApiOrder order)
 {
     if (order != null && order.Id > 0)
     {
         _orders.Remove(order.Id);
         var trades = new List <OrderTrade>();
         try { trades = await _api.Trading.GetOrderTrades(order.Id); }
         catch { }
         ProcessOrderUpdate(ToCommonOrder(order, true, trades));
     }
 }
Ejemplo n.º 2
0
 private async Task ProcessOpenOrder(ApiOrder order)
 {
     if (order != null && order.Id > 0)
     {
         var trades = new List <OrderTrade>();
         try { trades = await _api.Trading.GetOrderTrades(order.Id); }
         catch { }
         _orders[order.Id] = order;
         ProcessOrderUpdate(ToCommonOrder(order, false, trades));
     }
 }
Ejemplo n.º 3
0
        private Order ToCommonOrder(ApiOrder order, bool isClosed, List <OrderTrade> trades = null)
        {
            var result = new Order
            {
                AccountId    = AccountInfo.ID,
                UserID       = order.Id.ToString(),
                BrokerID     = order.Id.ToString(),
                BrokerName   = Name,
                DataFeedName = Name,
                Symbol       = order.CurrencyPair.ToString(),
                OrderType    = OrderType.Limit,
                OrderSide    = ToCommonOrderSide(order.Side),
                Price        = order.PricePerCoin,
                Quantity     = order.Quantity,
                PlacedDate   = DateTime.UtcNow,
                FilledDate   = DateTime.UtcNow
                               //OpenQuantity = unknown
                               //CancelledQuantity = unknown
                               //AvgFillPrice = unknown
                               //FilledQuantity = unknown
                               //OpeningQty = unknown
                               //ClosingQty = unknown
            };

            if (trades != null && trades.Count > 0)
            {
                result.FilledDate     = trades[0].Time;//not sure
                result.FilledQuantity = trades.Sum(t => t.Quantity);
                if (result.FilledQuantity > 0)
                {
                    result.AvgFillPrice = trades.Sum(t => t.Value) / result.FilledQuantity;
                }
            }

            if (result.Quantity < result.FilledQuantity)
            {
                result.Quantity = result.FilledQuantity;
            }
            if (result.Quantity < result.FilledQuantity + result.CancelledQuantity + result.OpenQuantity)
            {
                result.Quantity = result.FilledQuantity + result.CancelledQuantity + result.OpenQuantity;
            }

            if (isClosed)
            {
                result.OpenQuantity = 0;
                if (result.FilledQuantity < result.Quantity)
                {
                    result.CancelledQuantity = result.Quantity - result.FilledQuantity;
                }
            }
            else
            {
                if (result.OpenQuantity == 0)
                {
                    result.OpenQuantity = result.Quantity - result.FilledQuantity - result.CancelledQuantity;
                }
            }

            return(result);
        }
Ejemplo n.º 4
0
 private static bool IsOrderChanged(ApiOrder existing, ApiOrder updated)
 {
     //? not sure if API updates quantity on partial fill
     return(existing == null || existing.Quantity != updated.Quantity);
 }