示例#1
0
        public async Task <IActionResult> GetOpenOrders(int exchangeId, string baseCurrency = default(string), string quoteCurrency = default(string))
        {
            try
            {
                var openOrders = await _exchangeApiClient.GetOpenOrder(exchangeId.ToString(), baseCurrency, quoteCurrency);

                if (openOrders != null)
                {
                    return(Ok(openOrders));
                }


                throw new KeyNotFoundException();
            }
            catch (KeyNotFoundException)
            {
                return(NotFound());
            }
        }
示例#2
0
        public async Task Handle(ExchangeOrderCreatedIntegrationEvent @event)
        {
            var    orderClosed   = false;
            var    orderCanceled = false;
            string closeTime     = String.Empty;
            string canceledTime  = String.Empty;

            decimal quantityAlreadyExecuted = 0;
            decimal commisionAlreadyPaid    = 0;

            await Task.Run(async() =>
            {
                while (!orderClosed && !orderCanceled)
                {
                    var openOrderViewModel = await _exchangeApiClient.GetOpenOrder(@event.ExchangeId.ToString(), @event.BaseCurrency, @event.QuoteCurrency);

                    OrderViewModel matchingOrder = null;

                    foreach (var openOrder in openOrderViewModel.Result.orders)
                    {
                        if (openOrder.orderId == @event.ExchangeOrderId)
                        {
                            matchingOrder = openOrder;
                        }
                    }

                    if (matchingOrder == null)
                    {
                        orderClosed = true;
                        closeTime   = DateTime.UtcNow.ToLongDateString();
                    }

                    if (matchingOrder != null)
                    {
                        var quantity = Decimal.Parse(matchingOrder.quantityExecuted, NumberStyles.Float);
                        var paidFee  = Decimal.Parse(matchingOrder.commissionPaid, NumberStyles.Float);


                        //If quantity executed and total quantity are equal.
                        if (quantity == Decimal.Parse(matchingOrder.quantityTotal, NumberStyles.Float))
                        {
                            this._eventBus.Publish(new ExchangeOrderPartiallyExecutedIntegrationEvent(
                                                       @event.ExchangeId,
                                                       @event.ExchangeOrderId,
                                                       @event.BaseCurrency,
                                                       @event.QuoteCurrency,
                                                       quantity - quantityAlreadyExecuted,
                                                       @event.Price,
                                                       paidFee - commisionAlreadyPaid
                                                       ));

                            orderClosed = true;
                        }
                        // If order are canceled
                        else if (matchingOrder.canceled == "true")
                        {
                            if (quantity > quantityAlreadyExecuted)
                            {
                                this._eventBus.Publish(new ExchangeOrderPartiallyExecutedIntegrationEvent(
                                                           @event.ExchangeId,
                                                           @event.ExchangeOrderId,
                                                           @event.BaseCurrency,
                                                           @event.QuoteCurrency,
                                                           quantity - quantityAlreadyExecuted,
                                                           @event.Price,
                                                           paidFee - commisionAlreadyPaid
                                                           ));

                                quantityAlreadyExecuted = quantity;
                                commisionAlreadyPaid    = paidFee;
                            }

                            orderCanceled = true;
                        }
                        else
                        {
                            if (quantity > quantityAlreadyExecuted)
                            {
                                this._eventBus.Publish(new ExchangeOrderPartiallyExecutedIntegrationEvent(
                                                           @event.ExchangeId,
                                                           @event.ExchangeOrderId,
                                                           @event.BaseCurrency,
                                                           @event.QuoteCurrency,
                                                           quantity - quantityAlreadyExecuted,
                                                           @event.Price,
                                                           paidFee - commisionAlreadyPaid
                                                           ));

                                quantityAlreadyExecuted = quantity;
                                commisionAlreadyPaid    = paidFee;
                            }
                        }
                    }

                    //Keep detecting until order closed.
                    await Task.Delay(TimeSpan.FromSeconds(3));
                }
            });

            if (orderClosed)
            {
                this._eventBus.Publish(new ExchangeOrderFullExecutedIntegrationEvent(
                                           @event.ExchangeId,
                                           @event.ExchangeOrderId,
                                           @event.BaseCurrency,
                                           @event.QuoteCurrency,
                                           @event.Quantity,
                                           @event.Price,
                                           commisionAlreadyPaid,
                                           closeTime
                                           ));
            }
            else if (orderCanceled)
            {
                this._eventBus.Publish(new ExchangeOrderCanceledIntegrationEvent(
                                           @event.ExchangeId,
                                           @event.ExchangeOrderId,
                                           @event.BaseCurrency,
                                           @event.QuoteCurrency,
                                           quantityAlreadyExecuted,
                                           @event.Price,
                                           commisionAlreadyPaid,
                                           canceledTime
                                           ));
            }
        }