From 5426f1c2b4a9382e71c523822a8149489cac7e5a Mon Sep 17 00:00:00 2001 From: Vlad Dumitru Date: Thu, 3 Oct 2024 11:16:56 +0300 Subject: [PATCH 1/2] Adjust metadata logic --- .../API/Exchanges/Bybit/ExchangeBybitV5Base.cs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/ExchangeSharp/API/Exchanges/Bybit/ExchangeBybitV5Base.cs b/src/ExchangeSharp/API/Exchanges/Bybit/ExchangeBybitV5Base.cs index 6b1103da..c3c7cdc7 100644 --- a/src/ExchangeSharp/API/Exchanges/Bybit/ExchangeBybitV5Base.cs +++ b/src/ExchangeSharp/API/Exchanges/Bybit/ExchangeBybitV5Base.cs @@ -159,13 +159,12 @@ protected internal override async Task< { var priceFilter = marketJson["priceFilter"]; var sizeFilter = marketJson["lotSizeFilter"]; - bool isInverse = MarketCategory == MarketCategory.Inverse; + var market = new ExchangeMarket() { MarketSymbol = marketJson["symbol"].ToStringInvariant(), BaseCurrency = marketJson["baseCoin"].ToStringInvariant(), QuoteCurrency = marketJson["quoteCoin"].ToStringInvariant(), - QuantityStepSize = sizeFilter["qtyStep"].ConvertInvariant(), MinPrice = priceFilter["minPrice"].ConvertInvariant(), MaxPrice = priceFilter["maxPrice"].ConvertInvariant(), PriceStepSize = priceFilter["tickSize"].ConvertInvariant(), @@ -173,7 +172,8 @@ protected internal override async Task< marketJson["status"] == null || marketJson["status"].ToStringLowerInvariant() == "trading" }; - if (isInverse) + + if (MarketCategory == MarketCategory.Inverse) { market.MinTradeSizeInQuoteCurrency = sizeFilter[ "minOrderQty" @@ -187,6 +187,16 @@ protected internal override async Task< market.MinTradeSize = sizeFilter["minOrderQty"].ConvertInvariant(); market.MaxTradeSize = sizeFilter["maxOrderQty"].ConvertInvariant(); } + + if (MarketCategory == MarketCategory.Spot) + { + market.QuantityStepSize = sizeFilter["basePrecision"].ConvertInvariant(); + } + else + { + market.QuantityStepSize = sizeFilter["qtyStep"].ConvertInvariant(); + } + markets.Add(market); } return markets; From 190ac0df3e2fc9a2b5cf13f189d035030efb8e1f Mon Sep 17 00:00:00 2001 From: Vlad Dumitru Date: Fri, 4 Oct 2024 13:44:44 +0300 Subject: [PATCH 2/2] Update examples --- .../API/Exchanges/Bybit/ExchangeBybitAPI.cs | 182 ++++++++---------- 1 file changed, 80 insertions(+), 102 deletions(-) diff --git a/src/ExchangeSharp/API/Exchanges/Bybit/ExchangeBybitAPI.cs b/src/ExchangeSharp/API/Exchanges/Bybit/ExchangeBybitAPI.cs index 4a64cd6b..185dd92b 100644 --- a/src/ExchangeSharp/API/Exchanges/Bybit/ExchangeBybitAPI.cs +++ b/src/ExchangeSharp/API/Exchanges/Bybit/ExchangeBybitAPI.cs @@ -424,108 +424,86 @@ protected internal override async Task< > OnGetMarketSymbolsMetadataAsync() { /* - { - "ret_code": 0, - "ret_msg": "OK", - "ext_code": "", - "ext_info": "", - "result": [ - { - "name": "BTCUSD", - "base_currency": "BTC", - "quote_currency": "USD", - "price_scale": 2, - "taker_fee": "0.00075", - "maker_fee": "-0.00025", - "leverage_filter": { - "min_leverage": 1, - "max_leverage": 100, - "leverage_step": "0.01" - }, - "price_filter": { - "min_price": "0.5", - "max_price": "999999.5", - "tick_size": "0.5" - }, - "lot_size_filter": { - "max_trading_qty": 1000000, - "min_trading_qty": 1, - "qty_step": 1 - } - }, - { - "name": "ETHUSD", - "base_currency": "ETH", - "quote_currency": "USD", - "price_scale": 2, - "taker_fee": "0.00075", - "maker_fee": "-0.00025", - "leverage_filter": { - "min_leverage": 1, - "max_leverage": 50, - "leverage_step": "0.01" - }, - "price_filter": { - "min_price": "0.05", - "max_price": "99999.95", - "tick_size": "0.05" - }, - "lot_size_filter": { - "max_trading_qty": 1000000, - "min_trading_qty": 1, - "qty_step": 1 - } - }, - { - "name": "EOSUSD", - "base_currency": "EOS", - "quote_currency": "USD", - "price_scale": 3, - "taker_fee": "0.00075", - "maker_fee": "-0.00025", - "leverage_filter": { - "min_leverage": 1, - "max_leverage": 50, - "leverage_step": "0.01" - }, - "price_filter": { - "min_price": "0.001", - "max_price": "1999.999", - "tick_size": "0.001" - }, - "lot_size_filter": { - "max_trading_qty": 1000000, - "min_trading_qty": 1, - "qty_step": 1 - } - }, - { - "name": "XRPUSD", - "base_currency": "XRP", - "quote_currency": "USD", - "price_scale": 4, - "taker_fee": "0.00075", - "maker_fee": "-0.00025", - "leverage_filter": { - "min_leverage": 1, - "max_leverage": 50, - "leverage_step": "0.01" - }, - "price_filter": { - "min_price": "0.0001", - "max_price": "199.9999", - "tick_size": "0.0001" - }, - "lot_size_filter": { - "max_trading_qty": 1000000, - "min_trading_qty": 1, - "qty_step": 1 - } - } - ], - "time_now": "1581411225.414179" - }} - */ + * Spot: + { + "retCode": 0, + "retMsg": "OK", + "result": { + "category": "spot", + "list": [ + { + "symbol": "BTCUSDT", + "baseCoin": "BTC", + "quoteCoin": "USDT", + "innovation": "0", + "status": "Trading", + "marginTrading": "utaOnly", + "lotSizeFilter": { + "basePrecision": "0.000001", + "quotePrecision": "0.00000001", + "minOrderQty": "0.000048", + "maxOrderQty": "71.73956243", + "minOrderAmt": "1", + "maxOrderAmt": "4000000" + }, + "priceFilter": { + "tickSize": "0.01" + }, + "riskParameters": { + "limitParameter": "0.03", + "marketParameter": "0.03" + } + }, + ... + */ + + /* + * Linear: + { + "retCode": 0, + "retMsg": "OK", + "result": { + "category": "linear", + "list": [ + { + "symbol": "10000000AIDOGEUSDT", + "contractType": "LinearPerpetual", + "status": "Trading", + "baseCoin": "10000000AIDOGE", + "quoteCoin": "USDT", + "launchTime": "1709542899000", + "deliveryTime": "0", + "deliveryFeeRate": "", + "priceScale": "6", + "leverageFilter": { + "minLeverage": "1", + "maxLeverage": "12.50", + "leverageStep": "0.01" + }, + "priceFilter": { + "minPrice": "0.000001", + "maxPrice": "1.999998", + "tickSize": "0.000001" + }, + "lotSizeFilter": { + "maxOrderQty": "25000000", + "minOrderQty": "100", + "qtyStep": "100", + "postOnlyMaxOrderQty": "25000000", + "maxMktOrderQty": "5000000", + "minNotionalValue": "5" + }, + "unifiedMarginTrade": true, + "fundingInterval": 480, + "settleCoin": "USDT", + "copyTrading": "none", + "upperFundingRate": "0.03", + "lowerFundingRate": "-0.03", + "isPreListing": false, + "preListingInfo": null + }, + ... + */ List markets = new List(); JToken allSymbols = CheckRetCode(