diff --git a/src/ExchangeSharp/API/Common/APIRequestMaker.cs b/src/ExchangeSharp/API/Common/APIRequestMaker.cs index 6f8463b41..d3e940301 100644 --- a/src/ExchangeSharp/API/Common/APIRequestMaker.cs +++ b/src/ExchangeSharp/API/Common/APIRequestMaker.cs @@ -216,7 +216,7 @@ public async Task MakeRequestAsync(string url, string? baseUrl = null, D using (StreamReader responseStreamReader = new StreamReader(responseStream)) responseString = responseStreamReader.ReadToEnd(); - if (response.StatusCode != HttpStatusCode.OK) + if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Created) { // 404 maybe return empty responseString if (string.IsNullOrWhiteSpace(responseString)) diff --git a/src/ExchangeSharp/API/Exchanges/Bittrex/ExchangeBittrexAPI.cs b/src/ExchangeSharp/API/Exchanges/Bittrex/ExchangeBittrexAPI.cs index 198796818..045c6274b 100644 --- a/src/ExchangeSharp/API/Exchanges/Bittrex/ExchangeBittrexAPI.cs +++ b/src/ExchangeSharp/API/Exchanges/Bittrex/ExchangeBittrexAPI.cs @@ -252,7 +252,25 @@ protected override async Task>> #region OrderBooks protected override async Task OnGetOrderBookAsync(string marketSymbol, int maxCount = 25) { - JToken token = await MakeJsonRequestAsync("/markets/" + marketSymbol + "/orderbook" + marketSymbol + "&depth=" + maxCount); + // Bittrex API allowed values are [1, 25, 500], default is 25. + if (maxCount > 100) + { + maxCount = 500; + } + else if (maxCount > 25 && maxCount <= 100) // ExchangeSharp default. + { + maxCount = 25; + } + else if (maxCount > 1 && maxCount <= 25) + { + maxCount = 25; + } + else + { + maxCount = 1; + } + + JToken token = await MakeJsonRequestAsync("/markets/" + marketSymbol + "/orderbook" + "?depth=" + maxCount); return ExchangeAPIExtensions.ParseOrderBookFromJTokenDictionaries(token, "ask", "bid", "rate", "quantity", maxCount: maxCount); } @@ -370,7 +388,7 @@ protected override async Task OnPlaceOrderAsync(ExchangeOrd if (order.OrderType == ExchangeSharp.OrderType.Limit) { orderParams.Add("limit", orderPrice); - //orderParams.Add("timeInForce", "GOOD_TIL_CANCELLED"); + orderParams.Add("timeInForce", "GOOD_TIL_CANCELLED"); } foreach (KeyValuePair kv in order.ExtraParameters) diff --git a/src/ExchangeSharp/API/Exchanges/Kraken/ExchangeKrakenAPI.cs b/src/ExchangeSharp/API/Exchanges/Kraken/ExchangeKrakenAPI.cs index 3a04e0e2d..d07175dc0 100644 --- a/src/ExchangeSharp/API/Exchanges/Kraken/ExchangeKrakenAPI.cs +++ b/src/ExchangeSharp/API/Exchanges/Kraken/ExchangeKrakenAPI.cs @@ -749,13 +749,17 @@ protected override async Task> OnGetAmountsAvailable protected override async Task OnPlaceOrderAsync(ExchangeOrderRequest order) { + IEnumerable markets = await OnGetMarketSymbolsMetadataAsync(); + ExchangeMarket market = markets.Where(m => m.MarketSymbol == order.MarketSymbol).First(); + object nonce = await GenerateNonceAsync(); Dictionary payload = new Dictionary(StringComparer.OrdinalIgnoreCase) { { "pair", order.MarketSymbol }, { "type", (order.IsBuy ? "buy" : "sell") }, { "ordertype", order.OrderType.ToString().ToLowerInvariant() }, { "volume", order.RoundAmount().ToStringInvariant() }, { "trading_agreement", "agree" }, { "nonce", nonce } }; if (order.OrderType != OrderType.Market) { - payload.Add("price", order.Price.ToStringInvariant()); + int precision = BitConverter.GetBytes(Decimal.GetBits((decimal)market.PriceStepSize)[3])[2]; + payload.Add("price", Math.Round(order.Price, precision).ToStringInvariant()); } order.ExtraParameters.CopyTo(payload);