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)); } }
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)); } }
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); }
private static bool IsOrderChanged(ApiOrder existing, ApiOrder updated) { //? not sure if API updates quantity on partial fill return(existing == null || existing.Quantity != updated.Quantity); }