示例#1
0
        /// <summary>Places the new order asynchronous.</summary>
        /// <param name="orderDB">The order database.</param>
        /// <param name="pair">The pair.</param>
        /// <param name="orderSide">The order side.</param>
        /// <param name="orderPrice">The order price.</param>
        /// <param name="stoppingToken">The stopping token.</param>
        /// <returns>Task of Order.</returns>
        public async Task <Order> PlaceNewOrderAsync(Order orderDB, Pair pair, OrderSide orderSide, decimal orderPrice, CancellationToken stoppingToken)
        {
            int placeOrderRequestMaxTry = 5;

            do
            {
                var placeOrderRequest = await _bitfinexClient.PlaceOrderAsync(pair.Name, orderSide, OrderTypeV1.ExchangeLimit, pair.OrderAmount, orderPrice);

                if (!placeOrderRequest.Success)
                {
                    placeOrderRequestMaxTry -= 1;

                    if (placeOrderRequestMaxTry == 0 || placeOrderRequest.Error.Message.Contains("not enough exchange balance for"))
                    {
                        await _loggerService.CreateLog(new Log(LogType.Error, $"AutoTrader v{_assemblyVersion}, PlaceNewOrderAsync()", placeOrderRequest.Error.Message));

                        return(null);
                    }

                    await Task.Delay(1000 * 20 * 1, stoppingToken);
                }
                else
                {
                    return(await _dbOrderService.AddDbOrder(placeOrderRequest.Data, orderDB));
                }
            }while (true);
        }
示例#2
0
        public bool PlaceOrder(UserTradeOrder aOrder, bool aUseProxy = true)
        {
            if (!IsCredentialsSet)
            {
                throw new Exception("No Credentials were set");
            }

            if (aOrder == null || aOrder.Market == null)
            {
                throw new ArgumentNullException(aOrder == null ? nameof(aOrder) : nameof(aOrder.Market), "Invalid argument: " + aOrder == null ? nameof(aOrder) : nameof(aOrder.Market));
            }

            if (aOrder.Status != OrderStatus.Waiting)
            {
                return(false);
            }

            BitfinexClientOptions lBitfinexClientOptions = new BitfinexClientOptions()
            {
                Proxy          = PandoraProxy.GetApiProxy(),
                ApiCredentials = new ApiCredentials(FUserCredentials.Item1, FUserCredentials.Item2)
            };

            using (BitfinexClient lClient = aUseProxy ? new BitfinexClient(lBitfinexClientOptions) : new BitfinexClient())
            {
                if (!aOrder.Market.TryCastToLocalMarket(out ExchangeMarket lExchangeMarket))
                {
                    throw new ArgumentException(nameof(aOrder.Market), "Invalid Market");
                }
                var lResponse = lClient.PlaceOrderAsync(lExchangeMarket.MarketPairID, lExchangeMarket.MarketDirection == MarketDirection.Sell ? OrderSide.Sell : OrderSide.Buy, OrderType.ExchangeLimit, lExchangeMarket.MarketDirection == MarketDirection.Sell ? aOrder.SentQuantity : aOrder.SentQuantity / aOrder.Rate, aOrder.Rate).Result;
                if (!lResponse.Success)
                {
                    throw new Exception($"Bitfinex Error. Message: {lResponse.Error.Message}");
                }
                long lUuid = lResponse.Data.Id;

                var lVerifyResponse = lClient.GetOrderAsync(lUuid).Result;
                if (!lResponse.Success)
                {
                    throw new Exception("Failed to verify order with exchange server");
                }
                aOrder.ID        = lUuid.ToString();
                aOrder.OpenTime  = lVerifyResponse.Data.Timestamp;
                aOrder.Cancelled = lVerifyResponse.Data.Canceled;
                aOrder.Completed = lVerifyResponse.Data.RemainingAmount == 0;
            }

            return(true);
        }