/// <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); }
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); }