Example #1
0
        private CryptoOrder ConvertOrder(Order order)
        {
            var id = order.Id.ToString();
            var existingCurrent = ExistingOrders.ContainsKey(id) ? ExistingOrders[id] : null;
            var existingPartial = _partiallyFilledOrders.ContainsKey(id) ? _partiallyFilledOrders[id] : null;
            var existing        = existingPartial ?? existingCurrent;

            var price = Math.Abs(FirstNonZero(order.Price, existing?.Price) ?? 0);

            var amount = Math.Abs(FirstNonZero(order.Amount, existing?.AmountOrig) ?? 0);

            var amountOrig = Math.Abs(order.AmountOrig ?? 0);

            var currentStatus = existing != null &&
                                existing.OrderStatus != CryptoOrderStatus.Undefined &&
                                existing.OrderStatus != CryptoOrderStatus.New &&
                                order.OrderStatus == OrderStatus.Undefined
                ? existing.OrderStatus
                : ConvertOrderStatus(order);

            var newOrder = new CryptoOrder
            {
                //ExchangeName = ExchangeName,

                Pair  = order.Symbol ?? existing?.Pair,
                Price = price,
                //Amount = amount,
                AmountOrig  = amountOrig,
                Side        = ConvertSide(Convert.ToDouble(order.Amount)),
                Id          = id,
                ClientId    = order.Cid.ToString(),
                OrderStatus = ConvertOrderStatus(order.OrderStatus),
                Type        = ConvertOrderType(order.Type.ToString()),
                Created     = order.MtsCreate,
                Updated     = order.MtsUpdate
            };

            if (currentStatus == CryptoOrderStatus.PartiallyFilled)
            {
                // save partially filled orders
                _partiallyFilledOrders[newOrder.Id] = newOrder;
            }

            return(newOrder);
        }
        private CryptoOrder ConvertOrder(OrderResponse order)
        {
            var id              = order?.Id.ToString() ?? "00000";
            var clientId        = order?.ProfileId;
            var existingCurrent = ExistingOrders.ContainsKey(id) ? ExistingOrders[id] : null;
            var existingPartial = _partiallyFilledOrders.ContainsKey(id) ? _partiallyFilledOrders[id] : null;
            var existing        = existingPartial ?? existingCurrent;

            var price = Math.Abs(FirstNonZero(order?.Price, existing?.Price) ?? 0);

            var amount = Math.Abs(FirstNonZero(order?.Amount, existing?.AmountOrig) ?? 0);

            var amountOrig = Math.Abs(order?.Size ?? 0);

            var currentStatus = existing != null &&
                                existing.OrderStatus != CryptoOrderStatus.Undefined &&
                                existing.OrderStatus != CryptoOrderStatus.New &&
                                order?.OrderStatus == OrderStatus.Undefined
                ? existing.OrderStatus
                : ConvertOrderStatus(order);

            var newOrder = new CryptoOrder

            {
                Id    = id,
                Pair  = CryptoPairsHelper.Clean(order?.Pair),
                Price = price,
                //Amount = amount,
                AmountOrig  = amountOrig,
                Side        = ConvertSide(order.Side),
                OrderStatus = ConvertOrderStatus(order),
                Type        = (CryptoOrderType)order.OrderType,
                Created     = ConvertToDatetime(order.MtsCreate),
                ClientId    = clientId
                              //Created = Convert.ToDateTime(order.MtsCreate)
            };

            if (currentStatus == CryptoOrderStatus.PartiallyFilled)
            {
                // save partially filled orders
                _partiallyFilledOrders[newOrder.Id] = newOrder;
            }

            return(newOrder);
        }
        private CryptoOrder ConvertOrder(OrderResponse order)
        {
            var id              = order.Data.Id.ToString();
            var clientId        = order.Data.Id;
            var existingCurrent = ExistingOrders.ContainsKey(id) ? ExistingOrders[id] : null;
            var existingPartial = _partiallyFilledOrders.ContainsKey(id) ? _partiallyFilledOrders[id] : null;
            var existing        = existingPartial ?? existingCurrent;

            var price = Math.Abs(FirstNonZero(order.Data.Price, existing?.Price) ?? 0);

            var amount = Math.Abs(FirstNonZero(order.Data.Amount, existing?.AmountOrig) ?? 0);

            var amountOrig = Math.Abs(order.Data.Amount);

            var currentStatus = existing != null &&
                                existing.OrderStatus != CryptoOrderStatus.Undefined &&
                                existing.OrderStatus != CryptoOrderStatus.New
                                //&&
                                //order.OrderStatus == OrderStatus.Undefined
                ? existing.OrderStatus
                : ConvertOrderStatus(order);

            var newOrder = new CryptoOrder

            {
                Id    = id,
                Pair  = CryptoPairsHelper.Clean(order.Symbol),
                Price = price,
                //Amount = amount,
                AmountOrig  = amountOrig,
                Side        = ConvertSide(order.Data.Amount),
                OrderStatus = ConvertOrderStatus(order),
                Type        = (CryptoOrderType)order.Data.OrderType,
                //TODO
                //Created = ConvertToDatetime(DateTimeOffset.Parse(order.Data.MicroTimeStamp, out dt))
            };

            if (currentStatus == CryptoOrderStatus.PartiallyFilled)
            {
                // save partially filled orders
                _partiallyFilledOrders[newOrder.Id] = newOrder;
            }

            return(newOrder);
        }
        /// <summary>
        /// Convert Bitmex order to crypto order
        /// </summary>
        public CryptoOrder ConvertOrder(Order order)
        {
            var id = order.OrderId;
            var existingCurrent = ExistingOrders.ContainsKey(id) ? ExistingOrders[id] : null;
            var existingPartial = _partiallyFilledOrders.ContainsKey(id) ? _partiallyFilledOrders[id] : null;
            var existing        = existingPartial ?? existingCurrent;

            var price    = Math.Abs(FirstNonZero(order.Price, order.AvgPx, existing?.Price) ?? 0);
            var priceAvg = Math.Abs(FirstNonZero(order.AvgPx, existing?.PriceAverage) ?? 0);

            var isPartial = order.OrdStatus == OrderStatus.Undefined ?
                            existing?.OrderStatus == CryptoOrderStatus.PartiallyFilled :
                            order.OrdStatus == OrderStatus.PartiallyFilled;

            var beforePartialFilledAmount =
                existing?.OrderStatus == CryptoOrderStatus.PartiallyFilled ? Abs(existing.AmountFilledCumulative) : 0;

            var beforePartialFilledAmountQuote =
                existing?.OrderStatus == CryptoOrderStatus.PartiallyFilled ? Abs(existing.AmountFilledCumulativeQuote) : 0;

            var orderQtyQuote  = Abs(order.OrderQty ?? existing?.AmountOrigQuote);
            var cumQtyQuote    = Abs(order.CumQty ?? existing?.AmountFilledCumulativeQuote);
            var leavesQtyQuote = Abs(order.LeavesQty);

            var orderQtyBase  = Abs(ConvertFromContracts(orderQtyQuote, price));
            var cumQtyBase    = Abs(ConvertFromContracts(cumQtyQuote, price));
            var leavesQtyBase = Abs(ConvertFromContracts(order.LeavesQty, price));

            var amountFilledCumulative = FirstNonZero(
                cumQtyBase,
                existing?.AmountFilledCumulative);

            var amountFilledCumulativeQuote = FirstNonZero(
                cumQtyQuote,
                existing?.AmountFilledCumulativeQuote);

            var amountFilled = FirstNonZero(
                cumQtyBase - beforePartialFilledAmount,     // Bitmex doesn't send partial difference when filled
                existing?.AmountFilled);

            var amountFilledQuote = FirstNonZero(
                cumQtyQuote - beforePartialFilledAmountQuote, // Bitmex doesn't send partial difference when filled
                existing?.AmountFilledQuote);

            var amountOrig = isPartial
                ? (cumQtyBase ?? 0) + (leavesQtyBase ?? 0)
                : FirstNonZero(
                orderQtyBase,
                existing?.AmountOrig);

            var amountOrigQuote = isPartial
                ? (cumQtyQuote ?? 0) + (leavesQtyQuote ?? 0)
                : FirstNonZero(
                orderQtyQuote,
                existing?.AmountOrigQuote);

            if (order.Side == BitmexSide.Undefined && existing != null)
            {
                order.Side = existing.AmountGrouped < 0 ? BitmexSide.Sell : BitmexSide.Buy;
            }

            var currentStatus = existing != null &&
                                existing.OrderStatus != CryptoOrderStatus.Undefined &&
                                existing.OrderStatus != CryptoOrderStatus.New &&
                                order.OrdStatus == OrderStatus.Undefined ?
                                existing.OrderStatus :
                                ConvertOrderStatus(order);

            var newOrder = new CryptoOrder
            {
                Id       = id,
                GroupId  = existing?.GroupId ?? null,
                ClientId = !string.IsNullOrWhiteSpace(order.ClOrdId) ?
                           order.ClOrdId :
                           existing?.ClientId,
                Pair                        = order.Symbol ?? existing?.Pair,
                Side                        = order.Side == BitmexSide.Sell ? CryptoOrderSide.Ask : CryptoOrderSide.Bid,
                AmountFilled                = amountFilled,
                AmountFilledCumulative      = amountFilledCumulative,
                AmountOrig                  = amountOrig,
                AmountFilledQuote           = amountFilledQuote,
                AmountFilledCumulativeQuote = amountFilledCumulativeQuote,
                AmountOrigQuote             = amountOrigQuote,
                Created                     = order.TransactTime ?? existing?.Created,
                Updated                     = order.Timestamp ?? existing?.Updated,
                Price                       = price,
                PriceAverage                = priceAvg,
                OrderStatus                 = currentStatus,
                Type                        = existing?.Type ?? ConvertOrderType(order.OrdType),
                TypePrev                    = existing?.TypePrev ?? ConvertOrderType(order.OrdType),
                OnMargin                    = existing?.OnMargin ?? false
            };


            if (currentStatus == CryptoOrderStatus.PartiallyFilled)
            {
                // save partially filled orders
                _partiallyFilledOrders[newOrder.Id] = newOrder;
            }

            return(newOrder);
        }