public decimal GetFilteredSellQuantity(BinanceClient client, string symbol, decimal quantity) { decimal retQuantity = 0; try { BinanceExchangeInfo exchangeInfo = GetExchangeInfo(client); if (exchangeInfo != null) { var symbolData = exchangeInfo.Symbols.Where(s => s.SymbolName == symbol).FirstOrDefault(); if (symbolData != null) { BinanceSymbolLotSizeFilter lotSizeFilter = (BinanceSymbolLotSizeFilter)symbolData.Filters.Where(f => f.FilterType == SymbolFilterType.LotSize).FirstOrDefault(); retQuantity = quantity - (quantity % lotSizeFilter.StepSize); retQuantity = Math.Round(retQuantity, 20); var isValidQuantity = (retQuantity >= lotSizeFilter.MinQuantity && retQuantity <= lotSizeFilter.MaxQuantity); if (!isValidQuantity) { return(0); } } } } catch (Exception ex) { _logger.LogException(ex); } return(retQuantity); }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject obj = JObject.Load(reader); SymbolFilterType type = new SymbolFilterTypeConverter(false).ReadString(obj["filterType"].ToString()); BinanceSymbolFilter result = null; switch (type) { case SymbolFilterType.LotSize: result = new BinanceSymbolLotSizeFilter() { MaxQuantity = JsonConvert.DeserializeObject <decimal>(obj["maxQty"].ToString()), MinQuantity = JsonConvert.DeserializeObject <decimal>(obj["minQty"].ToString()), StepSize = JsonConvert.DeserializeObject <decimal>(obj["stepSize"].ToString()) }; break; case SymbolFilterType.MinNotional: result = new BinanceSymbolMinNotionalFilter() { MinNotional = JsonConvert.DeserializeObject <decimal>(obj["minNotional"].ToString()) }; break; case SymbolFilterType.PriceFilter: result = new BinanceSymbolPriceFilter() { MaxPrice = JsonConvert.DeserializeObject <decimal>(obj["maxPrice"].ToString()), MinPrice = JsonConvert.DeserializeObject <decimal>(obj["minPrice"].ToString()), TickSize = JsonConvert.DeserializeObject <decimal>(obj["tickSize"].ToString()), }; break; case SymbolFilterType.MaxNumberAlogitmicalOrders: result = new BinanceSymbolMaxAlgoritmicalOrdersFilter() { MaxNumberAlgoritmicalOrders = JsonConvert.DeserializeObject <int>(obj["maxNumAlgoOrders"].ToString()) }; break; case SymbolFilterType.IcebergParts: result = new BinanceSymbolIcebergPartsFilter() { Limit = JsonConvert.DeserializeObject <int>(obj["limit"].ToString()) }; break; } result.FilterType = type; return(result); }
//private Trades GetPairBySmartStrategy(BinanceClient client) { // Trades pairSmart = new Trades(); // decimal maxPercent = 25, minPercent = 1, minVolume = 125; //filter criteria // try { // List<Binance24HPrice> lstBinanceHistoricDetails = new List<Binance24HPrice>(); // var pairsList = GetSymbolsByBaseCurrency(client); // foreach (BinancePrice pair in pairsList) { // Binance24HPrice pairs24hr = Get24hrHistory(client, pair.Symbol); // if (pairs24hr != null) { // lstBinanceHistoricDetails.Add(pairs24hr); // } // } // var bestPair = lstBinanceHistoricDetails.OrderByDescending(d => d.PriceChangePercent); // if (bestPair != null) { // //check for smart stretegy criterias.. // if (pairs24hr.PriceChangePercent < maxPercent && pairs24hr.PriceChangePercent >= minPercent && pairs24hr.QuoteVolume > minVolume) { // //check if pair isn't already added or max limit exceeded for openTrades.. // if (!IsMaxPairExistsInOpenTrades(pairs24hr.Symbol)) { // //check for valid quantity filters for binance.. // decimal validQuantity = GetFilteredBuyQuantity(client, pair.Symbol, pair.Price); // var expectedBuyPrice = GetBuyPrice(pairs24hr.WeightedAveragePrice); // if (validQuantity > 0 && pairs24hr.AskPrice <= expectedBuyPrice) { //Bid/Buy price must be <= expected buy price // } // } // } // pairSmart.Symbol = bestPair.Symbol; // pairSmart.Quantity = validQuantity; // pairSmart.BuyPrice = expectedBuyPrice; // _logger.LogInfoMessage("Symbol: " + bestPair.Symbol + " ::> 24hr Change: " + pairs24hr.PriceChangePercent + " ::> Buy Price: " + expectedBuyPrice + " ::> Qty: " + validQuantity); // return pairSmart; // } // } catch (Exception ex) { // _logger.LogException(ex); // } // return pairSmart; //} public decimal GetFilteredBuyQuantity(BinanceClient client, string symbol, decimal price) { decimal retQuantity = 0; try { BinanceExchangeInfo exchangeInfo = GetExchangeInfo(client); if (exchangeInfo != null) { var symbolData = exchangeInfo.Symbols.Where(s => s.SymbolName == symbol).FirstOrDefault(); if (symbolData != null) { decimal tradeLimit = Convert.ToDecimal(dbHelper.GetSettingByKey("TradingLimitPerPair")); decimal originalQuantity = tradeLimit / price; BinanceSymbolPriceFilter priceFilter = (BinanceSymbolPriceFilter)symbolData.Filters.Where(f => f.FilterType == SymbolFilterType.PriceFilter).FirstOrDefault(); BinanceSymbolLotSizeFilter lotSizeFilter = (BinanceSymbolLotSizeFilter)symbolData.Filters.Where(f => f.FilterType == SymbolFilterType.LotSize).FirstOrDefault(); BinanceSymbolMinNotionalFilter minNotionalFilter = (BinanceSymbolMinNotionalFilter)symbolData.Filters.Where(f => f.FilterType == SymbolFilterType.MinNotional).FirstOrDefault(); retQuantity = originalQuantity - (originalQuantity % lotSizeFilter.StepSize); retQuantity = Math.Round(retQuantity, 20); var isValidQuantity = (retQuantity >= lotSizeFilter.MinQuantity && retQuantity <= lotSizeFilter.MaxQuantity); if (!isValidQuantity) { return(0); //quantity doesn't match for the min and max criteria for buy/sell } else { decimal totalPrice = retQuantity * price; totalPrice = totalPrice - (totalPrice % priceFilter.TickSize); var isValidMinNotional = (totalPrice >= minNotionalFilter.MinNotional); if (!isValidMinNotional) { return(0); //quantity total price doesn't match for the min notional } } } } } catch (Exception ex) { _logger.LogException(ex); } return(retQuantity); }
public FilterContainer(BinanceSymbolPriceFilter priceFilter, BinanceSymbolLotSizeFilter quantityFilter) { PriceFilter = priceFilter; QuantityFilter = quantityFilter; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var obj = JObject.Load(reader); var type = new SymbolFilterTypeConverter(false).ReadString(obj["filterType"].ToString()); BinanceSymbolFilter result; switch (type) { case SymbolFilterType.LotSize: result = new BinanceSymbolLotSizeFilter { MaxQuantity = (decimal)obj["maxQty"], MinQuantity = (decimal)obj["minQty"], StepSize = (decimal)obj["stepSize"] }; break; case SymbolFilterType.MarketLotSize: result = new BinanceSymbolMarketLotSizeFilter { MaxQuantity = (decimal)obj["maxQty"], MinQuantity = (decimal)obj["minQty"], StepSize = (decimal)obj["stepSize"] }; break; case SymbolFilterType.MinNotional: result = new BinanceSymbolMinNotionalFilter { MinNotional = (decimal)obj["minNotional"], ApplyToMarketOrders = (bool)obj["applyToMarket"], AveragePriceMinutes = (int)obj["avgPriceMins"] }; break; case SymbolFilterType.Price: result = new BinanceSymbolPriceFilter { MaxPrice = (decimal)obj["maxPrice"], MinPrice = (decimal)obj["minPrice"], TickSize = (decimal)obj["tickSize"] }; break; case SymbolFilterType.MaxNumberAlgorithmicOrders: result = new BinanceSymbolMaxAlgorithmicOrdersFilter { MaxNumberAlgorithmicOrders = (int)obj["maxNumAlgoOrders"] }; break; case SymbolFilterType.MaxNumberOrders: result = new BinanceSymbolMaxOrdersFilter { MaxNumberOrders = (int)obj["maxNumOrders"] }; break; case SymbolFilterType.IcebergParts: result = new BinanceSymbolIcebergPartsFilter { Limit = (int)obj["limit"] }; break; case SymbolFilterType.PricePercent: result = new BinanceSymbolPercentPriceFilter { MultiplierUp = (decimal)obj["multiplierUp"], MultiplierDown = (decimal)obj["multiplierDown"], AveragePriceMinutes = (int)obj["avgPriceMins"] }; break; default: Debug.WriteLine("Can't parse symbol filter of type: " + obj["filterType"]); result = new BinanceSymbolFilter(); break; } result.FilterType = type; return(result); }
public override object ReadJson(JsonReader reader, Type objectType, object?existingValue, JsonSerializer serializer) { var obj = JObject.Load(reader); #pragma warning disable 8604, 8602 var type = new SymbolFilterTypeConverter(false).ReadString(obj["filterType"].ToString()); BinanceFuturesSymbolFilter result; switch (type) { case SymbolFilterType.LotSize: result = new BinanceSymbolLotSizeFilter { MaxQuantity = (decimal)obj["maxQty"], MinQuantity = (decimal)obj["minQty"], StepSize = (decimal)obj["stepSize"] }; break; case SymbolFilterType.MarketLotSize: result = new BinanceSymbolMarketLotSizeFilter { MaxQuantity = (decimal)obj["maxQty"], MinQuantity = (decimal)obj["minQty"], StepSize = (decimal)obj["stepSize"] }; break; case SymbolFilterType.Price: result = new BinanceSymbolPriceFilter { MaxPrice = (decimal)obj["maxPrice"], MinPrice = (decimal)obj["minPrice"], TickSize = (decimal)obj["tickSize"] }; break; case SymbolFilterType.MaxNumberOrders: result = new BinanceSymbolMaxOrdersFilter { MaxNumberOrders = (int)obj["limit"] }; break; case SymbolFilterType.PricePercent: result = new BinanceSymbolPercentPriceFilter { MultiplierUp = (decimal)obj["multiplierUp"], MultiplierDown = (decimal)obj["multiplierDown"], MultiplierDecimal = (int)obj["multiplierDecimal"] }; break; case SymbolFilterType.MaxNumberAlgorithmicOrders: result = new BinanceSymbolMaxAlgorithmicOrdersFilter { MaxNumberAlgorithmicOrders = (int)obj["limit"] }; break; default: Debug.WriteLine("Can't parse symbol filter of type: " + obj["filterType"]); result = new BinanceFuturesSymbolFilter(); break; } #pragma warning restore 8604 result.FilterType = type; return(result); }