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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 4
0
 public FilterContainer(BinanceSymbolPriceFilter priceFilter, BinanceSymbolLotSizeFilter quantityFilter)
 {
     PriceFilter    = priceFilter;
     QuantityFilter = quantityFilter;
 }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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);
        }