From a5aba4813dceed6cc74ec35e28ab21deb62cb2d5 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Sat, 5 Feb 2022 19:32:46 -0600 Subject: [PATCH 01/70] moved get_maintenance_ratio_and_amt to base.exchange. Wrote get_leverage_tiers. Added mmr_key to exchange._ft_has --- freqtrade/exchange/binance.py | 32 +------ freqtrade/exchange/exchange.py | 68 ++++++++++++--- freqtrade/exchange/gateio.py | 14 +-- freqtrade/exchange/okx.py | 5 +- tests/exchange/test_binance.py | 150 ++++++++++++++++++--------------- tests/exchange/test_gateio.py | 1 + tests/test_freqtradebot.py | 8 +- 7 files changed, 150 insertions(+), 128 deletions(-) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 6a2251d65..93a123708 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -169,11 +169,11 @@ class Binance(Exchange): + amt ) if old_ratio else 0.0 old_ratio = mm_ratio - brackets.append([ + brackets.append(( float(notional_floor), float(mm_ratio), amt, - ]) + )) self._leverage_brackets[pair] = brackets except ccxt.DDoSProtection as e: raise DDosProtection(e) from e @@ -272,34 +272,6 @@ class Binance(Exchange): """ return open_date.minute > 0 or (open_date.minute == 0 and open_date.second > 15) - def get_maintenance_ratio_and_amt( - self, - pair: str, - nominal_value: Optional[float] = 0.0, - ) -> Tuple[float, Optional[float]]: - """ - Formula: https://www.binance.com/en/support/faq/b3c689c1f50a44cabb3a84e663b81d93 - - Maintenance amt = Floor of Position Bracket on Level n * - difference between - Maintenance Margin Rate on Level n and - Maintenance Margin Rate on Level n-1) - + Maintenance Amount on Level n-1 - :return: The maintenance margin ratio and maintenance amount - """ - if nominal_value is None: - raise OperationalException( - "nominal value is required for binance.get_maintenance_ratio_and_amt") - if pair not in self._leverage_brackets: - raise InvalidOrderException(f"Cannot calculate liquidation price for {pair}") - pair_brackets = self._leverage_brackets[pair] - for [notional_floor, mm_ratio, amt] in reversed(pair_brackets): - if nominal_value >= notional_floor: - return (mm_ratio, amt) - raise OperationalException("nominal value can not be lower than 0") - # The lowest notional_floor for any pair in loadLeverageBrackets is always 0 because it - # describes the min amount for a bracket, and the lowest bracket will always go down to 0 - def dry_run_liquidation_price( self, pair: str, diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 90b63b57b..581221b49 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -73,7 +73,8 @@ class Exchange: "l2_limit_range_required": True, # Allow Empty L2 limit (kucoin) "mark_ohlcv_price": "mark", "mark_ohlcv_timeframe": "8h", - "ccxt_futures_name": "swap" + "ccxt_futures_name": "swap", + "mmr_key": None, } _ft_has: Dict = {} @@ -90,7 +91,7 @@ class Exchange: self._api: ccxt.Exchange = None self._api_async: ccxt_async.Exchange = None self._markets: Dict = {} - self._leverage_brackets: Dict[str, List[List[float]]] = {} + self._leverage_brackets: Dict[str, List[Tuple[float, float, Optional(float)]]] = {} self.loop = asyncio.new_event_loop() asyncio.set_event_loop(self.loop) @@ -2099,16 +2100,6 @@ class Exchange: else: return None - def get_maintenance_ratio_and_amt( - self, - pair: str, - nominal_value: Optional[float] = 0.0, - ) -> Tuple[float, Optional[float]]: - """ - :return: The maintenance margin ratio and maintenance amount - """ - raise OperationalException(self.name + ' does not support leverage futures trading') - def dry_run_liquidation_price( self, pair: str, @@ -2161,6 +2152,59 @@ class Exchange: raise OperationalException( "Freqtrade only supports isolated futures for leverage trading") + def get_leverage_tiers(self, pair: str): + # When exchanges can load all their leverage brackets at once in the constructor + # then this method does nothing, it should only be implemented when the leverage + # brackets requires per symbol fetching to avoid excess api calls + return None + + def get_maintenance_ratio_and_amt( + self, + pair: str, + nominal_value: Optional[float] = 0.0, + ) -> Tuple[float, Optional[float]]: + """ + :param pair: Market symbol + :param nominal_value: The total trade amount in quote currency including leverage + maintenance amount only on Binance + :return: (maintenance margin ratio, maintenance amount) + """ + if nominal_value is None: + raise OperationalException( + f"nominal value is required for {self.name}.get_maintenance_ratio_and_amt" + ) + if self._api.has['fetchLeverageTiers']: + if pair not in self._leverage_brackets: + # Used when fetchLeverageTiers cannot fetch all symbols at once + tiers = self.get_leverage_tiers(pair) + if not bool(tiers): + raise InvalidOrderException(f"Cannot calculate liquidation price for {pair}") + else: + self._leverage_brackets[pair] = [] + for tier in tiers[pair]: + self._leverage_brackets[pair].append(( + tier['notionalFloor'], + tier['maintenanceMarginRatio'], + None, + )) + pair_brackets = self._leverage_brackets[pair] + for (notional_floor, mm_ratio, amt) in reversed(pair_brackets): + if nominal_value >= notional_floor: + return (mm_ratio, amt) + raise OperationalException("nominal value can not be lower than 0") + # The lowest notional_floor for any pair in loadLeverageBrackets is always 0 because it + # describes the min amt for a bracket, and the lowest bracket will always go down to 0 + else: + info = self.markets[pair]['info'] + mmr_key = self._ft_has['mmr_key'] + if mmr_key and mmr_key in info: + return (float(info[mmr_key]), None) + else: + raise OperationalException( + f"Cannot fetch maintenance margin. Dry-run for freqtrade {self.trading_mode}" + f"is not available for {self.name}" + ) + def is_exchange_known_ccxt(exchange_name: str, ccxt_module: CcxtModuleType = None) -> bool: return exchange_name in ccxt_exchanges(ccxt_module) diff --git a/freqtrade/exchange/gateio.py b/freqtrade/exchange/gateio.py index bcb4cce33..57ff29924 100644 --- a/freqtrade/exchange/gateio.py +++ b/freqtrade/exchange/gateio.py @@ -1,6 +1,6 @@ """ Gate.io exchange subclass """ import logging -from typing import Dict, List, Optional, Tuple +from typing import Dict, List, Tuple from freqtrade.enums import MarginMode, TradingMode from freqtrade.exceptions import OperationalException @@ -23,6 +23,7 @@ class Gateio(Exchange): _ft_has: Dict = { "ohlcv_candle_limit": 1000, "ohlcv_volume_currency": "quote", + "mmr_key": "maintenance_rate", } _headers = {'X-Gate-Channel-Id': 'freqtrade'} @@ -40,14 +41,3 @@ class Gateio(Exchange): if any(v == 'market' for k, v in order_types.items()): raise OperationalException( f'Exchange {self.name} does not support market orders.') - - def get_maintenance_ratio_and_amt( - self, - pair: str, - nominal_value: Optional[float] = 0.0, - ) -> Tuple[float, Optional[float]]: - """ - :return: The maintenance margin ratio and maintenance amount - """ - info = self.markets[pair]['info'] - return (float(info['maintenance_rate']), None) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index e74a06dc0..051aebb1a 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -25,7 +25,7 @@ class Okx(Exchange): # TradingMode.SPOT always supported and not required in this list # (TradingMode.MARGIN, MarginMode.CROSS), # (TradingMode.FUTURES, MarginMode.CROSS), - # (TradingMode.FUTURES, MarginMode.ISOLATED) + (TradingMode.FUTURES, MarginMode.ISOLATED), ] def _lev_prep( @@ -46,3 +46,6 @@ class Okx(Exchange): "mgnMode": self.margin_mode.value, "posSide": "long" if side == "buy" else "short", }) + + def get_leverage_tiers(self, pair: str): + return self._api.fetch_leverage_tiers(pair) diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index 5bd383d6e..cc5410e26 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -210,28 +210,34 @@ def test_get_max_leverage_binance(default_conf, mocker, pair, stake_amount, max_ def test_fill_leverage_brackets_binance(default_conf, mocker): api_mock = MagicMock() api_mock.load_leverage_brackets = MagicMock(return_value={ - 'ADA/BUSD': [[0.0, 0.025], - [100000.0, 0.05], - [500000.0, 0.1], - [1000000.0, 0.15], - [2000000.0, 0.25], - [5000000.0, 0.5]], - 'BTC/USDT': [[0.0, 0.004], - [50000.0, 0.005], - [250000.0, 0.01], - [1000000.0, 0.025], - [5000000.0, 0.05], - [20000000.0, 0.1], - [50000000.0, 0.125], - [100000000.0, 0.15], - [200000000.0, 0.25], - [300000000.0, 0.5]], - "ZEC/USDT": [[0.0, 0.01], - [5000.0, 0.025], - [25000.0, 0.05], - [100000.0, 0.1], - [250000.0, 0.125], - [1000000.0, 0.5]], + 'ADA/BUSD': [ + [0.0, 0.025], + [100000.0, 0.05], + [500000.0, 0.1], + [1000000.0, 0.15], + [2000000.0, 0.25], + [5000000.0, 0.5], + ], + 'BTC/USDT': [ + [0.0, 0.004], + [50000.0, 0.005], + [250000.0, 0.01], + [1000000.0, 0.025], + [5000000.0, 0.05], + [20000000.0, 0.1], + [50000000.0, 0.125], + [100000000.0, 0.15], + [200000000.0, 0.25], + [300000000.0, 0.5], + ], + "ZEC/USDT": [ + [0.0, 0.01], + [5000.0, 0.025], + [25000.0, 0.05], + [100000.0, 0.1], + [250000.0, 0.125], + [1000000.0, 0.5], + ], }) default_conf['dry_run'] = False @@ -241,28 +247,34 @@ def test_fill_leverage_brackets_binance(default_conf, mocker): exchange.fill_leverage_brackets() assert exchange._leverage_brackets == { - 'ADA/BUSD': [[0.0, 0.025, 0.0], - [100000.0, 0.05, 2500.0], - [500000.0, 0.1, 27500.0], - [1000000.0, 0.15, 77499.99999999999], - [2000000.0, 0.25, 277500.0], - [5000000.0, 0.5, 1527500.0]], - 'BTC/USDT': [[0.0, 0.004, 0.0], - [50000.0, 0.005, 50.0], - [250000.0, 0.01, 1300.0], - [1000000.0, 0.025, 16300.000000000002], - [5000000.0, 0.05, 141300.0], - [20000000.0, 0.1, 1141300.0], - [50000000.0, 0.125, 2391300.0], - [100000000.0, 0.15, 4891300.0], - [200000000.0, 0.25, 24891300.0], - [300000000.0, 0.5, 99891300.0]], - "ZEC/USDT": [[0.0, 0.01, 0.0], - [5000.0, 0.025, 75.0], - [25000.0, 0.05, 700.0], - [100000.0, 0.1, 5700.0], - [250000.0, 0.125, 11949.999999999998], - [1000000.0, 0.5, 386950.0]] + 'ADA/BUSD': [ + (0.0, 0.025, 0.0), + (100000.0, 0.05, 2500.0), + (500000.0, 0.1, 27500.0), + (1000000.0, 0.15, 77499.99999999999), + (2000000.0, 0.25, 277500.0), + (5000000.0, 0.5, 1527500.0), + ], + 'BTC/USDT': [ + (0.0, 0.004, 0.0), + (50000.0, 0.005, 50.0), + (250000.0, 0.01, 1300.0), + (1000000.0, 0.025, 16300.000000000002), + (5000000.0, 0.05, 141300.0), + (20000000.0, 0.1, 1141300.0), + (50000000.0, 0.125, 2391300.0), + (100000000.0, 0.15, 4891300.0), + (200000000.0, 0.25, 24891300.0), + (300000000.0, 0.5, 99891300.0), + ], + "ZEC/USDT": [ + (0.0, 0.01, 0.0), + (5000.0, 0.025, 75.0), + (25000.0, 0.05, 700.0), + (100000.0, 0.1, 5700.0), + (250000.0, 0.125, 11949.999999999998), + (1000000.0, 0.5, 386950.0), + ] } api_mock = MagicMock() @@ -288,37 +300,37 @@ def test_fill_leverage_brackets_binance_dryrun(default_conf, mocker): leverage_brackets = { "1000SHIB/USDT": [ - [0.0, 0.01, 0.0], - [5000.0, 0.025, 75.0], - [25000.0, 0.05, 700.0], - [100000.0, 0.1, 5700.0], - [250000.0, 0.125, 11949.999999999998], - [1000000.0, 0.5, 386950.0], + (0.0, 0.01, 0.0), + (5000.0, 0.025, 75.0), + (25000.0, 0.05, 700.0), + (100000.0, 0.1, 5700.0), + (250000.0, 0.125, 11949.999999999998), + (1000000.0, 0.5, 386950.0), ], "1INCH/USDT": [ - [0.0, 0.012, 0.0], - [5000.0, 0.025, 65.0], - [25000.0, 0.05, 690.0], - [100000.0, 0.1, 5690.0], - [250000.0, 0.125, 11939.999999999998], - [1000000.0, 0.5, 386940.0], + (0.0, 0.012, 0.0), + (5000.0, 0.025, 65.0), + (25000.0, 0.05, 690.0), + (100000.0, 0.1, 5690.0), + (250000.0, 0.125, 11939.999999999998), + (1000000.0, 0.5, 386940.0), ], "AAVE/USDT": [ - [0.0, 0.01, 0.0], - [50000.0, 0.02, 500.0], - [250000.0, 0.05, 8000.000000000001], - [1000000.0, 0.1, 58000.0], - [2000000.0, 0.125, 107999.99999999999], - [5000000.0, 0.1665, 315500.00000000006], - [10000000.0, 0.25, 1150500.0], + (0.0, 0.01, 0.0), + (50000.0, 0.02, 500.0), + (250000.0, 0.05, 8000.000000000001), + (1000000.0, 0.1, 58000.0), + (2000000.0, 0.125, 107999.99999999999), + (5000000.0, 0.1665, 315500.00000000006), + (10000000.0, 0.25, 1150500.0), ], "ADA/BUSD": [ - [0.0, 0.025, 0.0], - [100000.0, 0.05, 2500.0], - [500000.0, 0.1, 27500.0], - [1000000.0, 0.15, 77499.99999999999], - [2000000.0, 0.25, 277500.0], - [5000000.0, 0.5, 1527500.0], + (0.0, 0.025, 0.0), + (100000.0, 0.05, 2500.0), + (500000.0, 0.1, 27500.0), + (1000000.0, 0.15, 77499.99999999999), + (2000000.0, 0.25, 277500.0), + (5000000.0, 0.5, 1527500.0), ] } diff --git a/tests/exchange/test_gateio.py b/tests/exchange/test_gateio.py index a4d91c35c..f344ee7cb 100644 --- a/tests/exchange/test_gateio.py +++ b/tests/exchange/test_gateio.py @@ -37,6 +37,7 @@ def test_validate_order_types_gateio(default_conf, mocker): ]) def test_get_maintenance_ratio_and_amt_gateio(default_conf, mocker, pair, mm_ratio): api_mock = MagicMock() + type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': False}) exchange = get_patched_exchange(mocker, default_conf, api_mock, id="gateio") mocker.patch( 'freqtrade.exchange.Exchange.markets', diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 1442186ea..8226266b7 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -722,8 +722,8 @@ def test_process_informative_pairs_added(default_conf_usdt, ticker_usdt, mocker) (False, 'futures', 'binance', 'isolated', 0.05, 8.167171717171717), (True, 'futures', 'gateio', 'isolated', 0.05, 11.7804274688304), (False, 'futures', 'gateio', 'isolated', 0.05, 8.181423084697796), - # (True, 'futures', 'okex', 'isolated', 11.87413417771621), - # (False, 'futures', 'okex', 'isolated', 8.085708510208207), + (True, 'futures', 'okex', 'isolated', 11.87413417771621), + (False, 'futures', 'okex', 'isolated', 8.085708510208207), ]) def test_execute_entry(mocker, default_conf_usdt, fee, limit_order, limit_order_open, is_short, trading_mode, @@ -778,7 +778,8 @@ def test_execute_entry(mocker, default_conf_usdt, fee, limit_order, get_min_pair_stake_amount=MagicMock(return_value=1), get_fee=fee, get_funding_fees=MagicMock(return_value=0), - name=exchange_name + name=exchange_name, + get_maintenance_ratio_and_amt=MagicMock(return_value=(0.01, 0.01)), ) pair = 'ETH/USDT' @@ -922,7 +923,6 @@ def test_execute_entry(mocker, default_conf_usdt, fee, limit_order, assert trade.open_rate_requested == 10 # In case of custom entry price not float type - freqtrade.exchange.get_maintenance_ratio_and_amt = MagicMock(return_value=(0.01, 0.01)) freqtrade.exchange.name = exchange_name order['status'] = 'open' order['id'] = '5568' From ff915b241c2de194b064a4c3cac74faa38a3507e Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Sat, 5 Feb 2022 20:54:58 -0600 Subject: [PATCH 02/70] test_okex test_get_maintenance_ratio_and_amt_okex --- tests/exchange/test_okex.py | 148 ++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 tests/exchange/test_okex.py diff --git a/tests/exchange/test_okex.py b/tests/exchange/test_okex.py new file mode 100644 index 000000000..26551a9eb --- /dev/null +++ b/tests/exchange/test_okex.py @@ -0,0 +1,148 @@ +from unittest.mock import MagicMock # , PropertyMock + +from tests.conftest import get_patched_exchange + + +def test_get_maintenance_ratio_and_amt_okex( + default_conf, + mocker, +): + api_mock = MagicMock() + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + default_conf['dry_run'] = True + api_mock.fetch_leverage_tiers = MagicMock(return_value={ + 'SHIB/USDT:USDT': [ + { + 'tier': 1, + 'notionalFloor': 0, + 'notionalCap': 2000, + 'maintenanceMarginRatio': 0.01, + 'maxLeverage': 75, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.013', + 'instId': '', + 'maxLever': '75', + 'maxSz': '2000', + 'minSz': '0', + 'mmr': '0.01', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '1', + 'uly': 'SHIB-USDT' + } + }, + { + 'tier': 2, + # TODO-lev: What about a value between 2000 and 2001? + 'notionalFloor': 2001, + 'notionalCap': 4000, + 'maintenanceMarginRatio': 0.015, + 'maxLeverage': 50, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.02', + 'instId': '', + 'maxLever': '50', + 'maxSz': '4000', + 'minSz': '2001', + 'mmr': '0.015', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '2', + 'uly': 'SHIB-USDT' + } + }, + { + 'tier': 3, + 'notionalFloor': 4001, + 'notionalCap': 8000, + 'maintenanceMarginRatio': 0.02, + 'maxLeverage': 20, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.05', + 'instId': '', + 'maxLever': '20', + 'maxSz': '8000', + 'minSz': '4001', + 'mmr': '0.02', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '3', + 'uly': 'SHIB-USDT' + } + }, + ], + 'DOGE/USDT:USDT': [ + { + 'tier': 1, + 'notionalFloor': 0, + 'notionalCap': 500, + 'maintenanceMarginRatio': 0.02, + 'maxLeverage': 75, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.013', + 'instId': '', + 'maxLever': '75', + 'maxSz': '500', + 'minSz': '0', + 'mmr': '0.01', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '1', + 'uly': 'DOGE-USDT' + } + }, + { + 'tier': 2, + 'notionalFloor': 501, + 'notionalCap': 1000, + 'maintenanceMarginRatio': 0.025, + 'maxLeverage': 50, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.02', + 'instId': '', + 'maxLever': '50', + 'maxSz': '1000', + 'minSz': '501', + 'mmr': '0.015', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '2', + 'uly': 'DOGE-USDT' + } + }, + { + 'tier': 3, + 'notionalFloor': 1001, + 'notionalCap': 2000, + 'maintenanceMarginRatio': 0.03, + 'maxLeverage': 20, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.05', + 'instId': '', + 'maxLever': '20', + 'maxSz': '2000', + 'minSz': '1001', + 'mmr': '0.02', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '3', + 'uly': 'DOGE-USDT' + } + }, + ] + }) + exchange = get_patched_exchange(mocker, default_conf, api_mock, id="okex") + assert exchange.get_maintenance_ratio_and_amt('SHIB/USDT:USDT', 2000) == (0.01, None) + assert exchange.get_maintenance_ratio_and_amt('SHIB/USDT:USDT', 2001) == (0.015, None) + assert exchange.get_maintenance_ratio_and_amt('SHIB/USDT:USDT', 4001) == (0.02, None) + assert exchange.get_maintenance_ratio_and_amt('SHIB/USDT:USDT', 8000) == (0.02, None) + + assert exchange.get_maintenance_ratio_and_amt('DOGE/USDT:USDT', 1) == (0.02, None) + assert exchange.get_maintenance_ratio_and_amt('DOGE/USDT:USDT', 2000) == (0.03, None) From 720a86778e4b3e32cd35d629046e92fbbf7f5957 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 7 Feb 2022 03:44:37 -0600 Subject: [PATCH 03/70] okex.get_max_pair_stake_amount --- freqtrade/exchange/exchange.py | 3 +- freqtrade/exchange/okx.py | 20 ++++ tests/exchange/test_okex.py | 201 +++++++++++++++++++++++++++++++++ 3 files changed, 223 insertions(+), 1 deletion(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 581221b49..5bd2728d7 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -692,13 +692,14 @@ class Exchange: self, pair: str, price: float, + leverage: float = 1.0 ) -> float: max_stake_amount = self._get_stake_amount_limit(pair, price, 0.0, 'max') if max_stake_amount is None: # * Should never be executed raise OperationalException(f'{self.name}.get_max_pair_stake_amount should' 'never set max_stake_amount to None') - return max_stake_amount + return max_stake_amount / leverage def _get_stake_amount_limit( self, diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 051aebb1a..a769ce9eb 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -49,3 +49,23 @@ class Okx(Exchange): def get_leverage_tiers(self, pair: str): return self._api.fetch_leverage_tiers(pair) + + def get_max_pair_stake_amount( + self, + pair: str, + price: float, + leverage: float = 1.0 + ) -> float: + + if self.trading_mode == TradingMode.SPOT: + return float('inf') # Not actually inf, but this probably won't matter for SPOT + + if pair not in self._leverage_tiers: + tiers = self.get_leverage_tiers_for_pair(pair) + if not tiers: # Not a leveraged market + return float('inf') + else: + self._leverage_tiers[pair] = tiers + + pair_tiers = self._leverage_tiers[pair] + return pair_tiers[-1]['max'] / leverage diff --git a/tests/exchange/test_okex.py b/tests/exchange/test_okex.py index 26551a9eb..5519d832a 100644 --- a/tests/exchange/test_okex.py +++ b/tests/exchange/test_okex.py @@ -146,3 +146,204 @@ def test_get_maintenance_ratio_and_amt_okex( assert exchange.get_maintenance_ratio_and_amt('DOGE/USDT:USDT', 1) == (0.02, None) assert exchange.get_maintenance_ratio_and_amt('DOGE/USDT:USDT', 2000) == (0.03, None) + + +def test_get_max_pair_stake_amount_okex(default_conf, mocker): + + exchange = get_patched_exchange(mocker, default_conf, id="okex") + assert exchange.get_max_pair_stake_amount('BNB/BUSD', 1.0) == float('inf') + + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, id="okex") + exchange._leverage_tiers = { + 'BNB/BUSD': [ + { + "min": 0, # stake(before leverage) = 0 + "max": 100000, # max stake(before leverage) = 5000 + "mmr": 0.025, + "lev": 20, + "maintAmt": 0.0 + }, + { + "min": 100000, # stake = 10000.0 + "max": 500000, # max_stake = 50000.0 + "mmr": 0.05, + "lev": 10, + "maintAmt": 2500.0 + }, + { + "min": 500000, # stake = 100000.0 + "max": 1000000, # max_stake = 200000.0 + "mmr": 0.1, + "lev": 5, + "maintAmt": 27500.0 + }, + { + "min": 1000000, # stake = 333333.3333333333 + "max": 2000000, # max_stake = 666666.6666666666 + "mmr": 0.15, + "lev": 3, + "maintAmt": 77500.0 + }, + { + "min": 2000000, # stake = 1000000.0 + "max": 5000000, # max_stake = 2500000.0 + "mmr": 0.25, + "lev": 2, + "maintAmt": 277500.0 + }, + { + "min": 5000000, # stake = 5000000.0 + "max": 30000000, # max_stake = 30000000.0 + "mmr": 0.5, + "lev": 1, + "maintAmt": 1527500.0 + } + ], + 'BNB/USDT': [ + { + "min": 0, # stake = 0.0 + "max": 10000, # max_stake = 133.33333333333334 + "mmr": 0.0065, + "lev": 75, + "maintAmt": 0.0 + }, + { + "min": 10000, # stake = 200.0 + "max": 50000, # max_stake = 1000.0 + "mmr": 0.01, + "lev": 50, + "maintAmt": 35.0 + }, + { + "min": 50000, # stake = 2000.0 + "max": 250000, # max_stake = 10000.0 + "mmr": 0.02, + "lev": 25, + "maintAmt": 535.0 + }, + { + "min": 250000, # stake = 25000.0 + "max": 1000000, # max_stake = 100000.0 + "mmr": 0.05, + "lev": 10, + "maintAmt": 8035.0 + }, + { + "min": 1000000, # stake = 200000.0 + "max": 2000000, # max_stake = 400000.0 + "mmr": 0.1, + "lev": 5, + "maintAmt": 58035.0 + }, + { + "min": 2000000, # stake = 500000.0 + "max": 5000000, # max_stake = 1250000.0 + "mmr": 0.125, + "lev": 4, + "maintAmt": 108035.0 + }, + { + "min": 5000000, # stake = 1666666.6666666667 + "max": 10000000, # max_stake = 3333333.3333333335 + "mmr": 0.15, + "lev": 3, + "maintAmt": 233035.0 + }, + { + "min": 10000000, # stake = 5000000.0 + "max": 20000000, # max_stake = 10000000.0 + "mmr": 0.25, + "lev": 2, + "maintAmt": 1233035.0 + }, + { + "min": 20000000, # stake = 20000000.0 + "max": 50000000, # max_stake = 50000000.0 + "mmr": 0.5, + "lev": 1, + "maintAmt": 6233035.0 + }, + ], + 'BTC/USDT': [ + { + "min": 0, # stake = 0.0 + "max": 50000, # max_stake = 400.0 + "mmr": 0.004, + "lev": 125, + "maintAmt": 0.0 + }, + { + "min": 50000, # stake = 500.0 + "max": 250000, # max_stake = 2500.0 + "mmr": 0.005, + "lev": 100, + "maintAmt": 50.0 + }, + { + "min": 250000, # stake = 5000.0 + "max": 1000000, # max_stake = 20000.0 + "mmr": 0.01, + "lev": 50, + "maintAmt": 1300.0 + }, + { + "min": 1000000, # stake = 50000.0 + "max": 7500000, # max_stake = 375000.0 + "mmr": 0.025, + "lev": 20, + "maintAmt": 16300.0 + }, + { + "min": 7500000, # stake = 750000.0 + "max": 40000000, # max_stake = 4000000.0 + "mmr": 0.05, + "lev": 10, + "maintAmt": 203800.0 + }, + { + "min": 40000000, # stake = 8000000.0 + "max": 100000000, # max_stake = 20000000.0 + "mmr": 0.1, + "lev": 5, + "maintAmt": 2203800.0 + }, + { + "min": 100000000, # stake = 25000000.0 + "max": 200000000, # max_stake = 50000000.0 + "mmr": 0.125, + "lev": 4, + "maintAmt": 4703800.0 + }, + { + "min": 200000000, # stake = 66666666.666666664 + "max": 400000000, # max_stake = 133333333.33333333 + "mmr": 0.15, + "lev": 3, + "maintAmt": 9703800.0 + }, + { + "min": 400000000, # stake = 200000000.0 + "max": 600000000, # max_stake = 300000000.0 + "mmr": 0.25, + "lev": 2, + "maintAmt": 4.97038E7 + }, + { + "min": 600000000, # stake = 600000000.0 + "max": 1000000000, # max_stake = 1000000000.0 + "mmr": 0.5, + "lev": 1, + "maintAmt": 1.997038E8 + }, + ] + } + + assert exchange.get_max_pair_stake_amount('BNB/BUSD', 1.0) == 30000000 + assert exchange.get_max_pair_stake_amount('BNB/USDT', 1.0) == 50000000 + assert exchange.get_max_pair_stake_amount('BTC/USDT', 1.0) == 1000000000 + assert exchange.get_max_pair_stake_amount('BTC/USDT', 1.0, 10.0) == 100000000 + + exchange.get_leverage_tiers_for_pair = MagicMock(return_value=None) + assert exchange.get_max_pair_stake_amount('TTT/USDT', 1.0) == float('inf') # Not in tiers From a99cf2eeedfdae5750e0998beb2df32dc8caeb03 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Sat, 5 Feb 2022 22:36:28 -0600 Subject: [PATCH 04/70] redid get_max_leverage --- freqtrade/exchange/binance.py | 109 +- .../exchange/binance_leverage_brackets.json | 1214 -- .../exchange/binance_leverage_tiers.json | 16481 ++++++++++++++++ freqtrade/exchange/exchange.py | 4 +- tests/exchange/test_binance.py | 998 +- tests/exchange/test_exchange.py | 3 +- tests/optimize/test_hyperopt.py | 39 +- tests/test_freqtradebot.py | 1 + 8 files changed, 17440 insertions(+), 1409 deletions(-) delete mode 100644 freqtrade/exchange/binance_leverage_brackets.json create mode 100644 freqtrade/exchange/binance_leverage_tiers.json diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 93a123708..cc562530b 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -153,27 +153,24 @@ class Binance(Exchange): try: if self._config['dry_run']: leverage_brackets_path = ( - Path(__file__).parent / 'binance_leverage_brackets.json' + Path(__file__).parent / 'binance_leverage_tiers.json' ) with open(leverage_brackets_path) as json_file: leverage_brackets = json.load(json_file) else: - leverage_brackets = self._api.load_leverage_brackets() + leverage_brackets = self._api.fetch_leverage_tiers() - for pair, brkts in leverage_brackets.items(): - [amt, old_ratio] = [0.0, 0.0] + for pair, tiers in leverage_brackets.items(): brackets = [] - for [notional_floor, mm_ratio] in brkts: - amt = ( - (float(notional_floor) * (float(mm_ratio) - float(old_ratio))) - + amt - ) if old_ratio else 0.0 - old_ratio = mm_ratio - brackets.append(( - float(notional_floor), - float(mm_ratio), - amt, - )) + for tier in tiers: + info = tier['info'] + brackets.append({ + 'min': tier['notionalFloor'], + 'max': tier['notionalCap'], + 'mmr': tier['maintenanceMarginRatio'], + 'lev': tier['maxLeverage'], + 'maintAmt': float(info['cum']) if 'cum' in info else None, + }) self._leverage_brackets[pair] = brackets except ccxt.DDoSProtection as e: raise DDosProtection(e) from e @@ -189,29 +186,69 @@ class Binance(Exchange): :param pair: The base/quote currency pair being traded :stake_amount: The total value of the traders margin_mode in quote currency """ - if stake_amount is None: - raise OperationalException('binance.get_max_leverage requires argument stake_amount') - if pair not in self._leverage_brackets: + + if self.trading_mode == TradingMode.SPOT: return 1.0 - pair_brackets = self._leverage_brackets[pair] - num_brackets = len(pair_brackets) - min_amount = 0.0 - for bracket_num in range(num_brackets): - [notional_floor, mm_ratio, _] = pair_brackets[bracket_num] - lev = 1.0 - if mm_ratio != 0: - lev = 1.0/mm_ratio + + if self._api.has['fetchLeverageTiers']: + + # Checks and edge cases + if stake_amount is None: + raise OperationalException( + 'binance.get_max_leverage requires argument stake_amount') + if pair not in self._leverage_brackets: # Not a leveraged market + return 1.0 + if stake_amount == 0: + return self._leverage_brackets[pair][0]['lev'] # Max lev for lowest amount + + pair_brackets = self._leverage_brackets[pair] + num_brackets = len(pair_brackets) + + for bracket_index in range(num_brackets): + + bracket = pair_brackets[bracket_index] + lev = bracket['lev'] + + if bracket_index < num_brackets - 1: + next_bracket = pair_brackets[bracket_index+1] + next_floor = next_bracket['min'] / next_bracket['lev'] + if next_floor > stake_amount: # Next bracket min too high for stake amount + return min((bracket['max'] / stake_amount), lev) + # + # With the two leverage brackets below, + # - a stake amount of 150 would mean a max leverage of (10000 / 150) = 66.66 + # - stakes below 133.33 = max_lev of 75 + # - stakes between 133.33-200 = max_lev of 10000/stake = 50.01-74.99 + # - stakes from 200 + 1000 = max_lev of 50 + # + # { + # "min": 0, # stake = 0.0 + # "max": 10000, # max_stake@75 = 10000/75 = 133.33333333333334 + # "lev": 75, + # }, + # { + # "min": 10000, # stake = 200.0 + # "max": 50000, # max_stake@50 = 50000/50 = 1000.0 + # "lev": 50, + # } + # + + else: # if on the last bracket + if stake_amount > bracket['max']: # If stake is > than max tradeable amount + raise InvalidOrderException(f'Amount {stake_amount} too high for {pair}') + else: + return bracket['lev'] + + raise OperationalException( + 'Looped through all tiers without finding a max leverage. Should never be reached' + ) + + else: # Search markets.limits for max lev + market = self.markets[pair] + if market['limits']['leverage']['max'] is not None: + return market['limits']['leverage']['max'] else: - logger.warning(f"mm_ratio for {pair} with notional floor {notional_floor} is 0") - if bracket_num+1 != num_brackets: # If not on last bracket - [min_amount, _, __] = pair_brackets[bracket_num+1] # Get min_amount of next bracket - else: - return lev - nominal_value = stake_amount * lev - # Bracket is good if the leveraged trade value doesnt exceed min_amount of next bracket - if nominal_value < min_amount: - return lev - return 1.0 # default leverage + return 1.0 # Default if max leverage cannot be found @retrier def _set_leverage( diff --git a/freqtrade/exchange/binance_leverage_brackets.json b/freqtrade/exchange/binance_leverage_brackets.json deleted file mode 100644 index 4450b015e..000000000 --- a/freqtrade/exchange/binance_leverage_brackets.json +++ /dev/null @@ -1,1214 +0,0 @@ -{ - "1000SHIB/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "1INCH/USDT": [ - [0.0, "0.012"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "AAVE/USDT": [ - [0.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.1665"], - [10000000.0, "0.25"] - ], - "ADA/BUSD": [ - [0.0, "0.025"], - [100000.0, "0.05"], - [500000.0, "0.1"], - [1000000.0, "0.15"], - [2000000.0, "0.25"], - [5000000.0, "0.5"] - ], - "ADA/USDT": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "AKRO/USDT": [ - [0.0, "0.012"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "ALGO/USDT": [ - [0.0, "0.01"], - [50000.0, "0.025"], - [150000.0, "0.05"], - [250000.0, "0.1"], - [500000.0, "0.125"], - [1000000.0, "0.25"], - [2000000.0, "0.5"] - ], - "ALICE/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "ALPHA/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "ANKR/USDT": [ - [0.0, "0.012"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "ATA/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "ATOM/USDT": [ - [0.0, "0.01"], - [50000.0, "0.025"], - [150000.0, "0.05"], - [250000.0, "0.1"], - [500000.0, "0.125"], - [1000000.0, "0.25"], - [2000000.0, "0.5"] - ], - "AUDIO/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "AVAX/USDT": [ - [0.0, "0.01"], - [50000.0, "0.025"], - [150000.0, "0.05"], - [250000.0, "0.1"], - [500000.0, "0.125"], - [750000.0, "0.25"], - [1000000.0, "0.5"] - ], - "AXS/USDT": [ - [0.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.1665"], - [10000000.0, "0.25"], - [15000000.0, "0.5"] - ], - "BAKE/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "BAL/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "BAND/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "BAT/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "BCH/USDT": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "BEL/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "BLZ/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "BNB/BUSD": [ - [0.0, "0.025"], - [100000.0, "0.05"], - [500000.0, "0.1"], - [1000000.0, "0.15"], - [2000000.0, "0.25"], - [5000000.0, "0.5"] - ], - "BNB/USDT": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "BTC/BUSD": [ - [0.0, "0.004"], - [25000.0, "0.005"], - [100000.0, "0.01"], - [500000.0, "0.025"], - [1000000.0, "0.05"], - [2000000.0, "0.1"], - [5000000.0, "0.125"], - [10000000.0, "0.15"], - [20000000.0, "0.25"], - [30000000.0, "0.5"] - ], - "BTC/USDT": [ - [0.0, "0.004"], - [50000.0, "0.005"], - [250000.0, "0.01"], - [1000000.0, "0.025"], - [5000000.0, "0.05"], - [20000000.0, "0.1"], - [50000000.0, "0.125"], - [100000000.0, "0.15"], - [200000000.0, "0.25"], - [300000000.0, "0.5"] - ], - "BTCBUSD_210129": [ - [0.0, "0.004"], - [5000.0, "0.005"], - [25000.0, "0.01"], - [100000.0, "0.025"], - [500000.0, "0.05"], - [2000000.0, "0.1"], - [5000000.0, "0.125"], - [10000000.0, "0.15"], - [20000000.0, "0.25"] - ], - "BTCBUSD_210226": [ - [0.0, "0.004"], - [5000.0, "0.005"], - [25000.0, "0.01"], - [100000.0, "0.025"], - [500000.0, "0.05"], - [2000000.0, "0.1"], - [5000000.0, "0.125"], - [10000000.0, "0.15"], - [20000000.0, "0.25"] - ], - "BTCDOM/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "BTCSTUSDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "BTCUSDT_210326": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "BTCUSDT_210625": [ - [0.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "BTCUSDT_210924": [ - [0.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"], - [20000000.0, "0.5"] - ], - "BTS/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "BTT/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "BZRX/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "C98/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "CELR/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "CHR/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "CHZ/USDT": [ - [0.0, "0.012"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "COMP/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "COTI/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "CRV/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "CTK/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "CVC/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "DASH/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "DEFI/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "DENT/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "DGB/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "DODO/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "DOGE/BUSD": [ - [0.0, "0.025"], - [100000.0, "0.05"], - [500000.0, "0.1"], - [1000000.0, "0.15"], - [2000000.0, "0.25"], - [5000000.0, "0.5"] - ], - "DOGE/USDT": [ - [0.0, "0.01"], - [50000.0, "0.025"], - [150000.0, "0.05"], - [250000.0, "0.1"], - [500000.0, "0.125"], - [750000.0, "0.25"], - [1000000.0, "0.5"] - ], - "DOT/USDT": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "DOTECOUSDT": [ - [0.0, "0.012"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "DYDX/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "EGLD/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "ENJ/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "EOS/USDT": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "ETC/USDT": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "ETH/BUSD": [ - [0.0, "0.004"], - [25000.0, "0.005"], - [100000.0, "0.01"], - [500000.0, "0.025"], - [1000000.0, "0.05"], - [2000000.0, "0.1"], - [5000000.0, "0.125"], - [10000000.0, "0.15"], - [20000000.0, "0.25"], - [30000000.0, "0.5"] - ], - "ETH/USDT": [ - [0.0, "0.005"], - [10000.0, "0.0065"], - [100000.0, "0.01"], - [500000.0, "0.02"], - [1000000.0, "0.05"], - [2000000.0, "0.1"], - [5000000.0, "0.125"], - [10000000.0, "0.15"], - [20000000.0, "0.25"] - ], - "ETHUSDT_210326": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "ETHUSDT_210625": [ - [0.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "ETHUSDT_210924": [ - [0.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"], - [20000000.0, "0.5"] - ], - "FIL/USDT": [ - [0.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.1665"], - [10000000.0, "0.25"] - ], - "FLM/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "FTM/USDT": [ - [0.0, "0.01"], - [50000.0, "0.025"], - [150000.0, "0.05"], - [250000.0, "0.1"], - [500000.0, "0.125"], - [750000.0, "0.25"], - [1000000.0, "0.5"] - ], - "FTT/BUSD": [ - [0.0, "0.025"], - [100000.0, "0.05"], - [500000.0, "0.1"], - [1000000.0, "0.15"], - [2000000.0, "0.25"], - [5000000.0, "0.5"] - ], - "GRT/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "GTC/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "HBAR/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "HNT/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "HOT/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "ICP/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "ICX/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "IOST/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "IOTA/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "IOTX/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "KAVA/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "KEEP/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "KNC/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "KSM/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "LENDUSDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "LINA/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "LINK/USDT": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "LIT/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "LRC/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "LTC/USDT": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "LUNA/USDT": [ - [0.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.1665"], - [10000000.0, "0.25"], - [15000000.0, "0.5"] - ], - "MANA/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "MASK/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "MATIC/USDT": [ - [0.0, "0.01"], - [50000.0, "0.025"], - [150000.0, "0.05"], - [250000.0, "0.1"], - [500000.0, "0.125"], - [750000.0, "0.25"], - [1000000.0, "0.5"] - ], - "MKR/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "MTL/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "NEAR/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "NEO/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "NKN/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "OCEAN/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "OGN/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "OMG/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "ONE/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "ONT/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "QTUM/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "RAY/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "REEF/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "REN/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "RLC/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "RSR/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "RUNE/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "RVN/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "SAND/USDT": [ - [0.0, "0.012"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "SC/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "SFP/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "SKL/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "SNX/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "SOL/BUSD": [ - [0.0, "0.025"], - [100000.0, "0.05"], - [500000.0, "0.1"], - [1000000.0, "0.15"], - [2000000.0, "0.25"], - [5000000.0, "0.5"] - ], - "SOL/USDT": [ - [0.0, "0.01"], - [50000.0, "0.025"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.25"], - [10000000.0, "0.5"] - ], - "SRM/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "STMX/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "STORJ/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "SUSHI/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "SXP/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "THETA/USDT": [ - [0.0, "0.01"], - [50000.0, "0.025"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.1665"], - [10000000.0, "0.25"] - ], - "TLM/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "TOMO/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "TRB/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "TRX/USDT": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "UNFI/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "UNI/USDT": [ - [0.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.1665"], - [10000000.0, "0.25"] - ], - "VET/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "WAVES/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "XEM/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "XLM/USDT": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "XMR/USDT": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "XRP/BUSD": [ - [0.0, "0.025"], - [100000.0, "0.05"], - [500000.0, "0.1"], - [1000000.0, "0.15"], - [2000000.0, "0.25"], - [5000000.0, "0.5"] - ], - "XRP/USDT": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "XTZ/USDT": [ - [0.0, "0.0065"], - [10000.0, "0.01"], - [50000.0, "0.02"], - [250000.0, "0.05"], - [1000000.0, "0.1"], - [2000000.0, "0.125"], - [5000000.0, "0.15"], - [10000000.0, "0.25"] - ], - "YFI/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "YFII/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "ZEC/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "ZEN/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "ZIL/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ], - "ZRX/USDT": [ - [0.0, "0.01"], - [5000.0, "0.025"], - [25000.0, "0.05"], - [100000.0, "0.1"], - [250000.0, "0.125"], - [1000000.0, "0.5"] - ] -} diff --git a/freqtrade/exchange/binance_leverage_tiers.json b/freqtrade/exchange/binance_leverage_tiers.json new file mode 100644 index 000000000..048edfe41 --- /dev/null +++ b/freqtrade/exchange/binance_leverage_tiers.json @@ -0,0 +1,16481 @@ +{ + "RAY/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "SUSHI/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "CVC/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "BTS/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "HOT/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ZRX/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "QTUM/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "IOTA/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "BTC/BUSD": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.004, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.004", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.005, + "maxLeverage": 25, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.005", + "cum": "50.0" + } + }, + { + "tier": 3, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 20, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.01", + "cum": "1300.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 7500000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "7500000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.025", + "cum": "16300.0" + } + }, + { + "tier": 5, + "notionalFloor": 7500000, + "notionalCap": 40000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 6, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "40000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.05", + "cum": "203800.0" + } + }, + { + "tier": 6, + "notionalFloor": 40000000, + "notionalCap": 100000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "100000000", + "notionalFloor": "40000000", + "maintMarginRatio": "0.1", + "cum": "2203800.0" + } + }, + { + "tier": 7, + "notionalFloor": 100000000, + "notionalCap": 200000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "200000000", + "notionalFloor": "100000000", + "maintMarginRatio": "0.125", + "cum": "4703800.0" + } + }, + { + "tier": 8, + "notionalFloor": 200000000, + "notionalCap": 400000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "400000000", + "notionalFloor": "200000000", + "maintMarginRatio": "0.15", + "cum": "9703800.0" + } + }, + { + "tier": 9, + "notionalFloor": 400000000, + "notionalCap": 600000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "600000000", + "notionalFloor": "400000000", + "maintMarginRatio": "0.25", + "cum": "4.97038E7" + } + }, + { + "tier": 10, + "notionalFloor": 600000000, + "notionalCap": 1000000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "1000000000", + "notionalFloor": "600000000", + "maintMarginRatio": "0.5", + "cum": "1.997038E8" + } + } + ], + "WAVES/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ADA/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + }, + { + "tier": 9, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6233035.0" + } + } + ], + "LIT/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "NU/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "XTZ/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + }, + { + "tier": 9, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6233035.0" + } + } + ], + "BNB/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + }, + { + "tier": 9, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6233035.0" + } + } + ], + "AKRO/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.012, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.012", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "65.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "690.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5690.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11940.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386940.0" + } + } + ], + "HNT/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ETC/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + }, + { + "tier": 9, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6233035.0" + } + } + ], + "XMR/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + }, + { + "tier": 9, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6233035.0" + } + } + ], + "YFI/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "FTT/BUSD": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 100000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.05", + "cum": "2500.0" + } + }, + { + "tier": 3, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1", + "cum": "27500.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "4", + "initialLeverage": "3", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.15", + "cum": "77500.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.25", + "cum": "277500.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.5", + "cum": "1527500.0" + } + } + ], + "BTCUSDT_210326": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 9223372036854776000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "9223372036854775807", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + } + ], + "ETH/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.005, + "maxLeverage": 100, + "info": { + "bracket": "1", + "initialLeverage": "100", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.005", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "2", + "initialLeverage": "75", + "notionalCap": "100000", + "notionalFloor": "10000", + "maintMarginRatio": "0.0065", + "cum": "15.0" + } + }, + { + "tier": 3, + "notionalFloor": 100000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "3", + "initialLeverage": "50", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.01", + "cum": "365.0" + } + }, + { + "tier": 4, + "notionalFloor": 500000, + "notionalCap": 1500000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "4", + "initialLeverage": "25", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.02", + "cum": "5365.0" + } + }, + { + "tier": 5, + "notionalFloor": 1500000, + "notionalCap": 4000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "4000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.05", + "cum": "50365.0" + } + }, + { + "tier": 6, + "notionalFloor": 4000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "10000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.1", + "cum": "250365.0" + } + }, + { + "tier": 7, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.125", + "cum": "500365.0" + } + }, + { + "tier": 8, + "notionalFloor": 20000000, + "notionalCap": 40000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "40000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.15", + "cum": "1000365.0" + } + }, + { + "tier": 9, + "notionalFloor": 40000000, + "notionalCap": 150000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "150000000", + "notionalFloor": "40000000", + "maintMarginRatio": "0.25", + "cum": "5000365.0" + } + }, + { + "tier": 10, + "notionalFloor": 150000000, + "notionalCap": 500000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "500000000", + "notionalFloor": "150000000", + "maintMarginRatio": "0.5", + "cum": "4.2500365E7" + } + } + ], + "ALICE/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "ALPHA/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "SFP/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "REEF/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "BAT/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "DOGE/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "7000.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "57000.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "107000.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.25", + "cum": "732000.0" + } + }, + { + "tier": 7, + "notionalFloor": 10000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.5", + "cum": "3232000.0" + } + } + ], + "TRX/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + }, + { + "tier": 9, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6233035.0" + } + } + ], + "RLC/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "DOTECOUSDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.012, + "maxLeverage": 20, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.012", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "65.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "690.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 4, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5690.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11940.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 9223372036854776000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "9223372036854775807", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386940.0" + } + } + ], + "BTCSTUSDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 9223372036854776000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "9223372036854775807", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "STORJ/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "SNX/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ETHUSDT_210625": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "7500.0" + } + }, + { + "tier": 3, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "57500.0" + } + }, + { + "tier": 4, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "107500.0" + } + }, + { + "tier": 5, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "232500.0" + } + }, + { + "tier": 6, + "notionalFloor": 10000000, + "notionalCap": 9223372036854776000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "9223372036854775807", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1232500.0" + } + } + ], + "1000XEC/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "AUDIO/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "XLM/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + }, + { + "tier": 9, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6233035.0" + } + } + ], + "BTCBUSD_210129": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.004, + "maxLeverage": 20, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.004", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.005, + "maxLeverage": 15, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.005", + "cum": "5.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.01", + "cum": "130.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 7, + "info": { + "bracket": "4", + "initialLeverage": "7", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.025", + "cum": "1630.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 6, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "2000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.05", + "cum": "14130.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1", + "cum": "114130.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.125", + "cum": "239130.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.15", + "cum": "489130.0" + } + }, + { + "tier": 9, + "notionalFloor": 20000000, + "notionalCap": 9223372036854776000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "9223372036854775807", + "notionalFloor": "20000000", + "maintMarginRatio": "0.25", + "cum": "2489130.0" + } + } + ], + "IOTX/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "NEO/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "UNFI/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "SAND/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "DASH/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "KAVA/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "RUNE/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "CTK/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "LINK/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + }, + { + "tier": 9, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6233035.0" + } + } + ], + "CELR/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "RSR/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ADA/BUSD": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 100000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.05", + "cum": "2500.0" + } + }, + { + "tier": 3, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1", + "cum": "27500.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "4", + "initialLeverage": "3", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.15", + "cum": "77500.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.25", + "cum": "277500.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.5", + "cum": "1527500.0" + } + } + ], + "DGB/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "SKL/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "REN/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "LPT/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "TOMO/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "MTL/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "LTC/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + }, + { + "tier": 9, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6233035.0" + } + } + ], + "DODO/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "EGLD/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "KSM/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "BNB/BUSD": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 100000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.05", + "cum": "2500.0" + } + }, + { + "tier": 3, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1", + "cum": "27500.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "4", + "initialLeverage": "3", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.15", + "cum": "77500.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.25", + "cum": "277500.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.5", + "cum": "1527500.0" + } + } + ], + "BTCUSDT_210625": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "7500.0" + } + }, + { + "tier": 3, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "57500.0" + } + }, + { + "tier": 4, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "107500.0" + } + }, + { + "tier": 5, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "232500.0" + } + }, + { + "tier": 6, + "notionalFloor": 10000000, + "notionalCap": 9223372036854776000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "9223372036854775807", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1232500.0" + } + } + ], + "ONT/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "VET/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "TRB/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "MANA/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "COTI/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "CHR/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ETHUSDT_210924": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "7500.0" + } + }, + { + "tier": 3, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "57500.0" + } + }, + { + "tier": 4, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "107500.0" + } + }, + { + "tier": 5, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "232500.0" + } + }, + { + "tier": 6, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1232500.0" + } + }, + { + "tier": 7, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6232500.0" + } + } + ], + "BAKE/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "GRT/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ETHUSDT_220325": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 375000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "375000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 375000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "2000000", + "notionalFloor": "375000", + "maintMarginRatio": "0.05", + "cum": "11250.0" + } + }, + { + "tier": 3, + "notionalFloor": 2000000, + "notionalCap": 4000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "4000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1", + "cum": "111250.0" + } + }, + { + "tier": 4, + "notionalFloor": 4000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.125", + "cum": "211250.0" + } + }, + { + "tier": 5, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.15", + "cum": "461250.0" + } + }, + { + "tier": 6, + "notionalFloor": 20000000, + "notionalCap": 40000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "40000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.25", + "cum": "2461250.0" + } + }, + { + "tier": 7, + "notionalFloor": 40000000, + "notionalCap": 400000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "400000000", + "notionalFloor": "40000000", + "maintMarginRatio": "0.5", + "cum": "1.246125E7" + } + } + ], + "FLM/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "MASK/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "EOS/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + }, + { + "tier": 9, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6233035.0" + } + } + ], + "ETHUSDT_211231": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 375000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "375000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 375000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "2000000", + "notionalFloor": "375000", + "maintMarginRatio": "0.05", + "cum": "11250.0" + } + }, + { + "tier": 3, + "notionalFloor": 2000000, + "notionalCap": 4000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "4000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1", + "cum": "111250.0" + } + }, + { + "tier": 4, + "notionalFloor": 4000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.125", + "cum": "211250.0" + } + }, + { + "tier": 5, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.15", + "cum": "461250.0" + } + }, + { + "tier": 6, + "notionalFloor": 20000000, + "notionalCap": 40000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "40000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.25", + "cum": "2461250.0" + } + }, + { + "tier": 7, + "notionalFloor": 40000000, + "notionalCap": 400000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "400000000", + "notionalFloor": "40000000", + "maintMarginRatio": "0.5", + "cum": "1.246125E7" + } + } + ], + "OGN/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "SC/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "BAL/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "STMX/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "BTTUSDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "LUNA/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "500.0" + } + }, + { + "tier": 3, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8000.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58000.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108000.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.1665, + "maxLeverage": 3, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1665", + "cum": "315500.0" + } + }, + { + "tier": 7, + "notionalFloor": 10000000, + "notionalCap": 15000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "15000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1150500.0" + } + }, + { + "tier": 8, + "notionalFloor": 15000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "15000000", + "maintMarginRatio": "0.5", + "cum": "4900500.0" + } + } + ], + "DENT/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "1000BTTC/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "KNC/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "SRM/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ENJ/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "C98/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ZEN/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ATOM/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "NEAR/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "SOL/BUSD": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 100000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.05", + "cum": "2500.0" + } + }, + { + "tier": 3, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1", + "cum": "27500.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "4", + "initialLeverage": "3", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.15", + "cum": "77500.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.25", + "cum": "277500.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.5", + "cum": "1527500.0" + } + } + ], + "ENS/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "BCH/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + }, + { + "tier": 9, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6233035.0" + } + } + ], + "ATA/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "IOST/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "HBAR/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ZEC/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "1000SHIB/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "TLM/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ANT/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "BZRXUSDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ETH/BUSD": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.004, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "25000", + "notionalFloor": "0", + "maintMarginRatio": "0.004", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.005, + "maxLeverage": 25, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.005", + "cum": "25.0" + } + }, + { + "tier": 3, + "notionalFloor": 100000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 20, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.01", + "cum": "525.0" + } + }, + { + "tier": 4, + "notionalFloor": 500000, + "notionalCap": 1500000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.025", + "cum": "8025.0" + } + }, + { + "tier": 5, + "notionalFloor": 1500000, + "notionalCap": 4000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 6, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "4000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.05", + "cum": "45525.0" + } + }, + { + "tier": 6, + "notionalFloor": 4000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "10000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.1", + "cum": "245525.0" + } + }, + { + "tier": 7, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.125", + "cum": "495525.0" + } + }, + { + "tier": 8, + "notionalFloor": 20000000, + "notionalCap": 40000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "40000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.15", + "cum": "995525.0" + } + }, + { + "tier": 9, + "notionalFloor": 40000000, + "notionalCap": 150000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "150000000", + "notionalFloor": "40000000", + "maintMarginRatio": "0.25", + "cum": "4995525.0" + } + }, + { + "tier": 10, + "notionalFloor": 150000000, + "notionalCap": 500000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "500000000", + "notionalFloor": "150000000", + "maintMarginRatio": "0.5", + "cum": "4.2495525E7" + } + } + ], + "GALA/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "AAVE/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "500.0" + } + }, + { + "tier": 3, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8000.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58000.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108000.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.1665, + "maxLeverage": 3, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1665", + "cum": "315500.0" + } + }, + { + "tier": 7, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1150500.0" + } + }, + { + "tier": 8, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6150500.0" + } + } + ], + "GTC/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ALGO/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "ICP/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "BTCUSDT_210924": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "7500.0" + } + }, + { + "tier": 3, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "57500.0" + } + }, + { + "tier": 4, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "107500.0" + } + }, + { + "tier": 5, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "232500.0" + } + }, + { + "tier": 6, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1232500.0" + } + }, + { + "tier": 7, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6232500.0" + } + } + ], + "LRC/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "AVAX/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 750000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 750000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "123250.0" + } + }, + { + "tier": 7, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "373250.0" + } + } + ], + "BTCUSDT_220325": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 375000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "375000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 375000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "2000000", + "notionalFloor": "375000", + "maintMarginRatio": "0.05", + "cum": "11250.0" + } + }, + { + "tier": 3, + "notionalFloor": 2000000, + "notionalCap": 4000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "4000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1", + "cum": "111250.0" + } + }, + { + "tier": 4, + "notionalFloor": 4000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.125", + "cum": "211250.0" + } + }, + { + "tier": 5, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.15", + "cum": "461250.0" + } + }, + { + "tier": 6, + "notionalFloor": 20000000, + "notionalCap": 40000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "40000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.25", + "cum": "2461250.0" + } + }, + { + "tier": 7, + "notionalFloor": 40000000, + "notionalCap": 400000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "400000000", + "notionalFloor": "40000000", + "maintMarginRatio": "0.5", + "cum": "1.246125E7" + } + } + ], + "ARPA/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "CELO/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ROSE/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "MATIC/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 750000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 750000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "123250.0" + } + }, + { + "tier": 7, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "373250.0" + } + } + ], + "1INCH/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.012, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.012", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "65.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "690.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5690.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11940.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 100000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "100000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386940.0" + } + } + ], + "MKR/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "PEOPLE/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "THETA/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "500.0" + } + }, + { + "tier": 3, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8000.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58000.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108000.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.1665, + "maxLeverage": 3, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1665", + "cum": "315500.0" + } + }, + { + "tier": 7, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1150500.0" + } + }, + { + "tier": 8, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6150500.0" + } + } + ], + "UNI/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "500.0" + } + }, + { + "tier": 3, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8000.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58000.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108000.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.1665, + "maxLeverage": 3, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1665", + "cum": "315500.0" + } + }, + { + "tier": 7, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1150500.0" + } + }, + { + "tier": 8, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6150500.0" + } + } + ], + "ETHUSDT_210326": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 9223372036854776000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "9223372036854775807", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + } + ], + "LINA/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "AR/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "RVN/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "FIL/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "500.0" + } + }, + { + "tier": 3, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8000.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58000.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108000.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.1665, + "maxLeverage": 3, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1665", + "cum": "315500.0" + } + }, + { + "tier": 7, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1150500.0" + } + }, + { + "tier": 8, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6150500.0" + } + } + ], + "NKN/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "KLAY/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "DEFI/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "COMP/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "BTCDOM/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "SOL/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "7000.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "57000.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "107000.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.25", + "cum": "732000.0" + } + }, + { + "tier": 7, + "notionalFloor": 10000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.5", + "cum": "3232000.0" + } + } + ], + "BTC/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.004, + "maxLeverage": 125, + "info": { + "bracket": "1", + "initialLeverage": "125", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.004", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.005, + "maxLeverage": 100, + "info": { + "bracket": "2", + "initialLeverage": "100", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.005", + "cum": "50.0" + } + }, + { + "tier": 3, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "3", + "initialLeverage": "50", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.01", + "cum": "1300.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 7500000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "7500000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.025", + "cum": "16300.0" + } + }, + { + "tier": 5, + "notionalFloor": 7500000, + "notionalCap": 40000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "40000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.05", + "cum": "203800.0" + } + }, + { + "tier": 6, + "notionalFloor": 40000000, + "notionalCap": 100000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "100000000", + "notionalFloor": "40000000", + "maintMarginRatio": "0.1", + "cum": "2203800.0" + } + }, + { + "tier": 7, + "notionalFloor": 100000000, + "notionalCap": 200000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "200000000", + "notionalFloor": "100000000", + "maintMarginRatio": "0.125", + "cum": "4703800.0" + } + }, + { + "tier": 8, + "notionalFloor": 200000000, + "notionalCap": 400000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "400000000", + "notionalFloor": "200000000", + "maintMarginRatio": "0.15", + "cum": "9703800.0" + } + }, + { + "tier": 9, + "notionalFloor": 400000000, + "notionalCap": 600000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "600000000", + "notionalFloor": "400000000", + "maintMarginRatio": "0.25", + "cum": "4.97038E7" + } + }, + { + "tier": 10, + "notionalFloor": 600000000, + "notionalCap": 1000000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "1000000000", + "notionalFloor": "600000000", + "maintMarginRatio": "0.5", + "cum": "1.997038E8" + } + } + ], + "OMG/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.024, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.024", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "5.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "630.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5630.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11880.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "10000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386880.0" + } + } + ], + "ICX/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "BLZ/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "BTCUSDT_211231": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 375000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "375000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 375000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "2000000", + "notionalFloor": "375000", + "maintMarginRatio": "0.05", + "cum": "11250.0" + } + }, + { + "tier": 3, + "notionalFloor": 2000000, + "notionalCap": 4000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "4000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1", + "cum": "111250.0" + } + }, + { + "tier": 4, + "notionalFloor": 4000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.125", + "cum": "211250.0" + } + }, + { + "tier": 5, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.15", + "cum": "461250.0" + } + }, + { + "tier": 6, + "notionalFloor": 20000000, + "notionalCap": 40000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "40000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.25", + "cum": "2461250.0" + } + }, + { + "tier": 7, + "notionalFloor": 40000000, + "notionalCap": 400000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "400000000", + "notionalFloor": "40000000", + "maintMarginRatio": "0.5", + "cum": "1.246125E7" + } + } + ], + "FTM/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 750000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 750000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "123250.0" + } + }, + { + "tier": 7, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "373250.0" + } + } + ], + "YFII/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "KEEP/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "BAND/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "BTCBUSD_210226": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.004, + "maxLeverage": 20, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.004", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.005, + "maxLeverage": 15, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.005", + "cum": "5.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.01", + "cum": "130.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 7, + "info": { + "bracket": "4", + "initialLeverage": "7", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.025", + "cum": "1630.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 6, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "2000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.05", + "cum": "14130.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1", + "cum": "114130.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.125", + "cum": "239130.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.15", + "cum": "489130.0" + } + }, + { + "tier": 9, + "notionalFloor": 20000000, + "notionalCap": 9223372036854776000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "9223372036854775807", + "notionalFloor": "20000000", + "maintMarginRatio": "0.25", + "cum": "2489130.0" + } + } + ], + "XRP/BUSD": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 100000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.05", + "cum": "2500.0" + } + }, + { + "tier": 3, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1", + "cum": "27500.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "4", + "initialLeverage": "3", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.15", + "cum": "77500.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.25", + "cum": "277500.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.5", + "cum": "1527500.0" + } + } + ], + "DOGE/BUSD": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 100000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.05", + "cum": "2500.0" + } + }, + { + "tier": 3, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1", + "cum": "27500.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "4", + "initialLeverage": "3", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.15", + "cum": "77500.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.25", + "cum": "277500.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.5", + "cum": "1527500.0" + } + } + ], + "XRP/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 20000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + }, + { + "tier": 9, + "notionalFloor": 20000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6233035.0" + } + } + ], + "SXP/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "CRV/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "BEL/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "DOT/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 10000, + "maintenanceMarginRatio": 0.0065, + "maxLeverage": 75, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.0065", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 10000, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" + } + }, + { + "tier": 3, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "535.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8035.0" + } + }, + { + "tier": 5, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58035.0" + } + }, + { + "tier": 6, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108035.0" + } + }, + { + "tier": 7, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.15", + "cum": "233035.0" + } + }, + { + "tier": 8, + "notionalFloor": 10000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "50000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1233035.0" + } + }, + { + "tier": 9, + "notionalFloor": 50000000, + "notionalCap": 100000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "100000000", + "notionalFloor": "50000000", + "maintMarginRatio": "0.5", + "cum": "1.3733035E7" + } + } + ], + "XEM/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ONE/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } + ], + "ZIL/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "AXS/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.02, + "maxLeverage": 25, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "500.0" + } + }, + { + "tier": 3, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.05", + "cum": "8000.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "58000.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "108000.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 10000000, + "maintenanceMarginRatio": 0.1665, + "maxLeverage": 3, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1665", + "cum": "315500.0" + } + }, + { + "tier": 7, + "notionalFloor": 10000000, + "notionalCap": 15000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "15000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1150500.0" + } + }, + { + "tier": 8, + "notionalFloor": 15000000, + "notionalCap": 50000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "15000000", + "maintMarginRatio": "0.5", + "cum": "4900500.0" + } + } + ], + "DYDX/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 4000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "4000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 4000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.5", + "cum": "1154500.0" + } + } + ], + "OCEAN/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "CHZ/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.012, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.012", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "65.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "690.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5690.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11940.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386940.0" + } + } + ], + "LENDUSDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 9223372036854776000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "9223372036854775807", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "ANKR/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.012, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.012", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "65.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "690.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5690.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11940.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386940.0" + } + } + ], + "DUSK/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "CTSI/USDT": [ + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 5000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 25, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 5000, + "notionalCap": 25000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 3, + "notionalFloor": 25000, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 4, + "notionalFloor": 100000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5700.0" + } + }, + { + "tier": 5, + "notionalFloor": 250000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ] +} diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 5bd2728d7..ac94c9f9e 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -91,7 +91,7 @@ class Exchange: self._api: ccxt.Exchange = None self._api_async: ccxt_async.Exchange = None self._markets: Dict = {} - self._leverage_brackets: Dict[str, List[Tuple[float, float, Optional(float)]]] = {} + self._leverage_brackets: Dict[str, List[Dict]] = {} self.loop = asyncio.new_event_loop() asyncio.set_event_loop(self.loop) @@ -2193,7 +2193,7 @@ class Exchange: if nominal_value >= notional_floor: return (mm_ratio, amt) raise OperationalException("nominal value can not be lower than 0") - # The lowest notional_floor for any pair in loadLeverageBrackets is always 0 because it + # The lowest notional_floor for any pair in fetch_leverage_tiers is always 0 because it # describes the min amt for a bracket, and the lowest bracket will always go down to 0 else: info = self.markets[pair]['info'] diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index cc5410e26..d0d9bdf2c 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -1,4 +1,5 @@ from datetime import datetime, timezone +from math import isclose from random import randint from unittest.mock import MagicMock, PropertyMock @@ -162,81 +163,419 @@ def test_stoploss_adjust_binance(mocker, default_conf, sl1, sl2, sl3, side): assert not exchange.stoploss_adjust(sl3, order, side=side) -@pytest.mark.parametrize('pair,stake_amount,max_lev', [ - ("BNB/BUSD", 0.0, 40.0), - ("BNB/USDT", 100.0, 100.0), - ("BTC/USDT", 170.30, 250.0), - ("BNB/BUSD", 99999.9, 10.0), - ("BNB/USDT", 750000, 6.666666666666667), - ("BTC/USDT", 150000000.1, 2.0), -]) -def test_get_max_leverage_binance(default_conf, mocker, pair, stake_amount, max_lev): +def test_get_max_leverage_binance(default_conf, mocker): + + # Test Spot exchange = get_patched_exchange(mocker, default_conf, id="binance") + assert exchange.get_max_leverage("BNB/USDT", 100.0) == 1.0 + + # Test Futures + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, id="binance") + exchange._leverage_brackets = { 'BNB/BUSD': [ - [0.0, 0.025, 0.0], # lev = 40.0 - [100000.0, 0.05, 2500.0], # lev = 20.0 - [500000.0, 0.1, 27500.0], # lev = 10.0 - [1000000.0, 0.15, 77500.0], # lev = 6.666666666666667 - [2000000.0, 0.25, 277500.0], # lev = 4.0 - [5000000.0, 0.5, 1527500.0], # lev = 2.0 + { + "min": 0, # stake(before leverage) = 0 + "max": 100000, # max stake(before leverage) = 5000 + "mmr": 0.025, + "lev": 20, + "maintAmt": 0.0 + }, + { + "min": 100000, # stake = 10000.0 + "max": 500000, # max_stake = 50000.0 + "mmr": 0.05, + "lev": 10, + "maintAmt": 2500.0 + }, + { + "min": 500000, # stake = 100000.0 + "max": 1000000, # max_stake = 200000.0 + "mmr": 0.1, + "lev": 5, + "maintAmt": 27500.0 + }, + { + "min": 1000000, # stake = 333333.3333333333 + "max": 2000000, # max_stake = 666666.6666666666 + "mmr": 0.15, + "lev": 3, + "maintAmt": 77500.0 + }, + { + "min": 2000000, # stake = 1000000.0 + "max": 5000000, # max_stake = 2500000.0 + "mmr": 0.25, + "lev": 2, + "maintAmt": 277500.0 + }, + { + "min": 5000000, # stake = 5000000.0 + "max": 30000000, # max_stake = 30000000.0 + "mmr": 0.5, + "lev": 1, + "maintAmt": 1527500.0 + } ], 'BNB/USDT': [ - [0.0, 0.0065, 0.0], # lev = 153.84615384615384 - [10000.0, 0.01, 35.0], # lev = 100.0 - [50000.0, 0.02, 535.0], # lev = 50.0 - [250000.0, 0.05, 8035.0], # lev = 20.0 - [1000000.0, 0.1, 58035.0], # lev = 10.0 - [2000000.0, 0.125, 108035.0], # lev = 8.0 - [5000000.0, 0.15, 233035.0], # lev = 6.666666666666667 - [10000000.0, 0.25, 1233035.0], # lev = 4.0 + { + "min": 0, # stake = 0.0 + "max": 10000, # max_stake = 133.33333333333334 + "mmr": 0.0065, + "lev": 75, + "maintAmt": 0.0 + }, + { + "min": 10000, # stake = 200.0 + "max": 50000, # max_stake = 1000.0 + "mmr": 0.01, + "lev": 50, + "maintAmt": 35.0 + }, + { + "min": 50000, # stake = 2000.0 + "max": 250000, # max_stake = 10000.0 + "mmr": 0.02, + "lev": 25, + "maintAmt": 535.0 + }, + { + "min": 250000, # stake = 25000.0 + "max": 1000000, # max_stake = 100000.0 + "mmr": 0.05, + "lev": 10, + "maintAmt": 8035.0 + }, + { + "min": 1000000, # stake = 200000.0 + "max": 2000000, # max_stake = 400000.0 + "mmr": 0.1, + "lev": 5, + "maintAmt": 58035.0 + }, + { + "min": 2000000, # stake = 500000.0 + "max": 5000000, # max_stake = 1250000.0 + "mmr": 0.125, + "lev": 4, + "maintAmt": 108035.0 + }, + { + "min": 5000000, # stake = 1666666.6666666667 + "max": 10000000, # max_stake = 3333333.3333333335 + "mmr": 0.15, + "lev": 3, + "maintAmt": 233035.0 + }, + { + "min": 10000000, # stake = 5000000.0 + "max": 20000000, # max_stake = 10000000.0 + "mmr": 0.25, + "lev": 2, + "maintAmt": 1233035.0 + }, + { + "min": 20000000, # stake = 20000000.0 + "max": 50000000, # max_stake = 50000000.0 + "mmr": 0.5, + "lev": 1, + "maintAmt": 6233035.0 + }, ], 'BTC/USDT': [ - [0.0, 0.004, 0.0], # lev = 250.0 - [50000.0, 0.005, 50.0], # lev = 200.0 - [250000.0, 0.01, 1300.0], # lev = 100.0 - [1000000.0, 0.025, 16300.0], # lev = 40.0 - [5000000.0, 0.05, 141300.0], # lev = 20.0 - [20000000.0, 0.1, 1141300.0], # lev = 10.0 - [50000000.0, 0.125, 2391300.0], # lev = 8.0 - [100000000.0, 0.15, 4891300.0], # lev = 6.666666666666667 - [200000000.0, 0.25, 24891300.0], # lev = 4.0 - [300000000.0, 0.5, 99891300.0], # lev = 2.0 + { + "min": 0, # stake = 0.0 + "max": 50000, # max_stake = 400.0 + "mmr": 0.004, + "lev": 125, + "maintAmt": 0.0 + }, + { + "min": 50000, # stake = 500.0 + "max": 250000, # max_stake = 2500.0 + "mmr": 0.005, + "lev": 100, + "maintAmt": 50.0 + }, + { + "min": 250000, # stake = 5000.0 + "max": 1000000, # max_stake = 20000.0 + "mmr": 0.01, + "lev": 50, + "maintAmt": 1300.0 + }, + { + "min": 1000000, # stake = 50000.0 + "max": 7500000, # max_stake = 375000.0 + "mmr": 0.025, + "lev": 20, + "maintAmt": 16300.0 + }, + { + "min": 7500000, # stake = 750000.0 + "max": 40000000, # max_stake = 4000000.0 + "mmr": 0.05, + "lev": 10, + "maintAmt": 203800.0 + }, + { + "min": 40000000, # stake = 8000000.0 + "max": 100000000, # max_stake = 20000000.0 + "mmr": 0.1, + "lev": 5, + "maintAmt": 2203800.0 + }, + { + "min": 100000000, # stake = 25000000.0 + "max": 200000000, # max_stake = 50000000.0 + "mmr": 0.125, + "lev": 4, + "maintAmt": 4703800.0 + }, + { + "min": 200000000, # stake = 66666666.666666664 + "max": 400000000, # max_stake = 133333333.33333333 + "mmr": 0.15, + "lev": 3, + "maintAmt": 9703800.0 + }, + { + "min": 400000000, # stake = 200000000.0 + "max": 600000000, # max_stake = 300000000.0 + "mmr": 0.25, + "lev": 2, + "maintAmt": 4.97038E7 + }, + { + "min": 600000000, # stake = 600000000.0 + "max": 1000000000, # max_stake = 1000000000.0 + "mmr": 0.5, + "lev": 1, + "maintAmt": 1.997038E8 + }, ] } - assert exchange.get_max_leverage(pair, stake_amount) == max_lev + + assert exchange.get_max_leverage("BNB/BUSD", 1.0) == 20.0 + assert exchange.get_max_leverage("BNB/USDT", 100.0) == 75.0 + assert exchange.get_max_leverage("BTC/USDT", 170.30) == 125.0 + assert isclose(exchange.get_max_leverage("BNB/BUSD", 99999.9), 5.000005) + assert isclose(exchange.get_max_leverage("BNB/USDT", 1500), 33.333333333333333) + assert exchange.get_max_leverage("BTC/USDT", 300000000) == 2.0 + assert exchange.get_max_leverage("BTC/USDT", 600000000) == 1.0 # Last bracket + + assert exchange.get_max_leverage("ETC/USDT", 200) == 1.0 # Pair not in leverage_brackets + assert exchange.get_max_leverage("BTC/USDT", 0.0) == 125.0 # No stake amount + with pytest.raises( + InvalidOrderException, + match=r'Amount 1000000000.01 too high for BTC/USDT' + ): + exchange.get_max_leverage("BTC/USDT", 1000000000.01) def test_fill_leverage_brackets_binance(default_conf, mocker): api_mock = MagicMock() - api_mock.load_leverage_brackets = MagicMock(return_value={ + api_mock.fetch_leverage_tiers = MagicMock(return_value={ 'ADA/BUSD': [ - [0.0, 0.025], - [100000.0, 0.05], - [500000.0, 0.1], - [1000000.0, 0.15], - [2000000.0, 0.25], - [5000000.0, 0.5], - ], - 'BTC/USDT': [ - [0.0, 0.004], - [50000.0, 0.005], - [250000.0, 0.01], - [1000000.0, 0.025], - [5000000.0, 0.05], - [20000000.0, 0.1], - [50000000.0, 0.125], - [100000000.0, 0.15], - [200000000.0, 0.25], - [300000000.0, 0.5], + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 100000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.05", + "cum": "2500.0" + } + }, + { + "tier": 3, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1", + "cum": "27500.0" + } + }, + { + "tier": 4, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.15, + "maxLeverage": 3, + "info": { + "bracket": "4", + "initialLeverage": "3", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.15", + "cum": "77500.0" + } + }, + { + "tier": 5, + "notionalFloor": 2000000, + "notionalCap": 5000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.25", + "cum": "277500.0" + } + }, + { + "tier": 6, + "notionalFloor": 5000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.5", + "cum": "1527500.0" + } + } ], "ZEC/USDT": [ - [0.0, 0.01], - [5000.0, 0.025], - [25000.0, 0.05], - [100000.0, 0.1], - [250000.0, 0.125], - [1000000.0, 0.5], + { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 50000, + "maintenanceMarginRatio": 0.01, + "maxLeverage": 50, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2, + "notionalFloor": 50000, + "notionalCap": 150000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" + } + }, + { + "tier": 3, + "notionalFloor": 150000, + "notionalCap": 250000, + "maintenanceMarginRatio": 0.05, + "maxLeverage": 10, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" + } + }, + { + "tier": 4, + "notionalFloor": 250000, + "notionalCap": 500000, + "maintenanceMarginRatio": 0.1, + "maxLeverage": 5, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5, + "notionalFloor": 500000, + "notionalCap": 1000000, + "maintenanceMarginRatio": 0.125, + "maxLeverage": 4, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29500.0" + } + }, + { + "tier": 6, + "notionalFloor": 1000000, + "notionalCap": 2000000, + "maintenanceMarginRatio": 0.25, + "maxLeverage": 2, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7, + "notionalFloor": 2000000, + "notionalCap": 30000000, + "maintenanceMarginRatio": 0.5, + "maxLeverage": 1, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "654500.0" + } + } ], }) @@ -248,38 +587,105 @@ def test_fill_leverage_brackets_binance(default_conf, mocker): assert exchange._leverage_brackets == { 'ADA/BUSD': [ - (0.0, 0.025, 0.0), - (100000.0, 0.05, 2500.0), - (500000.0, 0.1, 27500.0), - (1000000.0, 0.15, 77499.99999999999), - (2000000.0, 0.25, 277500.0), - (5000000.0, 0.5, 1527500.0), - ], - 'BTC/USDT': [ - (0.0, 0.004, 0.0), - (50000.0, 0.005, 50.0), - (250000.0, 0.01, 1300.0), - (1000000.0, 0.025, 16300.000000000002), - (5000000.0, 0.05, 141300.0), - (20000000.0, 0.1, 1141300.0), - (50000000.0, 0.125, 2391300.0), - (100000000.0, 0.15, 4891300.0), - (200000000.0, 0.25, 24891300.0), - (300000000.0, 0.5, 99891300.0), + { + "min": 0, + "max": 100000, + "mmr": 0.025, + "lev": 20, + "maintAmt": 0.0 + }, + { + "min": 100000, + "max": 500000, + "mmr": 0.05, + "lev": 10, + "maintAmt": 2500.0 + }, + { + "min": 500000, + "max": 1000000, + "mmr": 0.1, + "lev": 5, + "maintAmt": 27500.0 + }, + { + "min": 1000000, + "max": 2000000, + "mmr": 0.15, + "lev": 3, + "maintAmt": 77500.0 + }, + { + "min": 2000000, + "max": 5000000, + "mmr": 0.25, + "lev": 2, + "maintAmt": 277500.0 + }, + { + "min": 5000000, + "max": 30000000, + "mmr": 0.5, + "lev": 1, + "maintAmt": 1527500.0 + } ], "ZEC/USDT": [ - (0.0, 0.01, 0.0), - (5000.0, 0.025, 75.0), - (25000.0, 0.05, 700.0), - (100000.0, 0.1, 5700.0), - (250000.0, 0.125, 11949.999999999998), - (1000000.0, 0.5, 386950.0), + { + 'min': 0, + 'max': 50000, + 'mmr': 0.01, + 'lev': 50, + 'maintAmt': 0.0 + }, + { + 'min': 50000, + 'max': 150000, + 'mmr': 0.025, + 'lev': 20, + 'maintAmt': 750.0 + }, + { + 'min': 150000, + 'max': 250000, + 'mmr': 0.05, + 'lev': 10, + 'maintAmt': 4500.0 + }, + { + 'min': 250000, + 'max': 500000, + 'mmr': 0.1, + 'lev': 5, + 'maintAmt': 17000.0 + }, + { + 'min': 500000, + 'max': 1000000, + 'mmr': 0.125, + 'lev': 4, + 'maintAmt': 29500.0 + }, + { + 'min': 1000000, + 'max': 2000000, + 'mmr': 0.25, + 'lev': 2, + 'maintAmt': 154500.0 + }, + { + 'min': 2000000, + 'max': 30000000, + 'mmr': 0.5, + 'lev': 1, + 'maintAmt': 654500.0 + }, ] } api_mock = MagicMock() api_mock.load_leverage_brackets = MagicMock() - type(api_mock).has = PropertyMock(return_value={'loadLeverageBrackets': True}) + type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) ccxt_exceptionhandlers( mocker, @@ -287,7 +693,7 @@ def test_fill_leverage_brackets_binance(default_conf, mocker): api_mock, "binance", "fill_leverage_brackets", - "load_leverage_brackets" + "fetch_leverage_tiers" ) @@ -300,37 +706,201 @@ def test_fill_leverage_brackets_binance_dryrun(default_conf, mocker): leverage_brackets = { "1000SHIB/USDT": [ - (0.0, 0.01, 0.0), - (5000.0, 0.025, 75.0), - (25000.0, 0.05, 700.0), - (100000.0, 0.1, 5700.0), - (250000.0, 0.125, 11949.999999999998), - (1000000.0, 0.5, 386950.0), + { + 'min': 0, + 'max': 50000, + 'mmr': 0.01, + 'lev': 50, + 'maintAmt': 0.0 + }, + { + 'min': 50000, + 'max': 150000, + 'mmr': 0.025, + 'lev': 20, + 'maintAmt': 750.0 + }, + { + 'min': 150000, + 'max': 250000, + 'mmr': 0.05, + 'lev': 10, + 'maintAmt': 4500.0 + }, + { + 'min': 250000, + 'max': 500000, + 'mmr': 0.1, + 'lev': 5, + 'maintAmt': 17000.0 + }, + { + 'min': 500000, + 'max': 1000000, + 'mmr': 0.125, + 'lev': 4, + 'maintAmt': 29500.0 + }, + { + 'min': 1000000, + 'max': 2000000, + 'mmr': 0.25, + 'lev': 2, + 'maintAmt': 154500.0 + }, + { + 'min': 2000000, + 'max': 30000000, + 'mmr': 0.5, + 'lev': 1, + 'maintAmt': 654500.0 + }, ], "1INCH/USDT": [ - (0.0, 0.012, 0.0), - (5000.0, 0.025, 65.0), - (25000.0, 0.05, 690.0), - (100000.0, 0.1, 5690.0), - (250000.0, 0.125, 11939.999999999998), - (1000000.0, 0.5, 386940.0), + { + 'min': 0, + 'max': 5000, + 'mmr': 0.012, + 'lev': 50, + 'maintAmt': 0.0 + }, + { + 'min': 5000, + 'max': 25000, + 'mmr': 0.025, + 'lev': 20, + 'maintAmt': 65.0 + }, + { + 'min': 25000, + 'max': 100000, + 'mmr': 0.05, + 'lev': 10, + 'maintAmt': 690.0 + }, + { + 'min': 100000, + 'max': 250000, + 'mmr': 0.1, + 'lev': 5, + 'maintAmt': 5690.0 + }, + { + 'min': 250000, + 'max': 1000000, + 'mmr': 0.125, + 'lev': 2, + 'maintAmt': 11940.0 + }, + { + 'min': 1000000, + 'max': 100000000, + 'mmr': 0.5, + 'lev': 1, + 'maintAmt': 386940.0 + }, ], "AAVE/USDT": [ - (0.0, 0.01, 0.0), - (50000.0, 0.02, 500.0), - (250000.0, 0.05, 8000.000000000001), - (1000000.0, 0.1, 58000.0), - (2000000.0, 0.125, 107999.99999999999), - (5000000.0, 0.1665, 315500.00000000006), - (10000000.0, 0.25, 1150500.0), + { + 'min': 0, + 'max': 50000, + 'mmr': 0.01, + 'lev': 50, + 'maintAmt': 0.0 + }, + { + 'min': 50000, + 'max': 250000, + 'mmr': 0.02, + 'lev': 25, + 'maintAmt': 500.0 + }, + { + 'min': 250000, + 'max': 1000000, + 'mmr': 0.05, + 'lev': 10, + 'maintAmt': 8000.0 + }, + { + 'min': 1000000, + 'max': 2000000, + 'mmr': 0.1, + 'lev': 5, + 'maintAmt': 58000.0 + }, + { + 'min': 2000000, + 'max': 5000000, + 'mmr': 0.125, + 'lev': 4, + 'maintAmt': 108000.0 + }, + { + 'min': 5000000, + 'max': 10000000, + 'mmr': 0.1665, + 'lev': 3, + 'maintAmt': 315500.0 + }, + { + 'min': 10000000, + 'max': 20000000, + 'mmr': 0.25, + 'lev': 2, + 'maintAmt': 1150500.0 + }, + { + "min": 20000000, + "max": 50000000, + "mmr": 0.5, + "lev": 1, + "maintAmt": 6150500.0 + } ], "ADA/BUSD": [ - (0.0, 0.025, 0.0), - (100000.0, 0.05, 2500.0), - (500000.0, 0.1, 27500.0), - (1000000.0, 0.15, 77499.99999999999), - (2000000.0, 0.25, 277500.0), - (5000000.0, 0.5, 1527500.0), + { + "min": 0, + "max": 100000, + "mmr": 0.025, + "lev": 20, + "maintAmt": 0.0 + }, + { + "min": 100000, + "max": 500000, + "mmr": 0.05, + "lev": 10, + "maintAmt": 2500.0 + }, + { + "min": 500000, + "max": 1000000, + "mmr": 0.1, + "lev": 5, + "maintAmt": 27500.0 + }, + { + "min": 1000000, + "max": 2000000, + "mmr": 0.15, + "lev": 3, + "maintAmt": 77500.0 + }, + { + "min": 2000000, + "max": 5000000, + "mmr": 0.25, + "lev": 2, + "maintAmt": 277500.0 + }, + { + "min": 5000000, + "max": 30000000, + "mmr": 0.5, + "lev": 1, + "maintAmt": 1527500.0 + }, ] } @@ -415,7 +985,7 @@ def test__ccxt_config(default_conf, mocker, trading_mode, margin_mode, config): ("BTC/USDT", 170.30, 0.004, 0), ("BNB/BUSD", 999999.9, 0.1, 27500.0), ("BNB/USDT", 5000000.0, 0.15, 233035.0), - ("BTC/USDT", 300000000.1, 0.5, 99891300.0), + ("BTC/USDT", 600000000, 0.5, 1.997038E8), ]) def test_get_maintenance_ratio_and_amt_binance( default_conf, @@ -427,31 +997,187 @@ def test_get_maintenance_ratio_and_amt_binance( ): exchange = get_patched_exchange(mocker, default_conf, id="binance") exchange._leverage_brackets = { - 'BNB/BUSD': [[0.0, 0.025, 0.0], - [100000.0, 0.05, 2500.0], - [500000.0, 0.1, 27500.0], - [1000000.0, 0.15, 77500.0], - [2000000.0, 0.25, 277500.0], - [5000000.0, 0.5, 1527500.0]], - 'BNB/USDT': [[0.0, 0.0065, 0.0], - [10000.0, 0.01, 35.0], - [50000.0, 0.02, 535.0], - [250000.0, 0.05, 8035.0], - [1000000.0, 0.1, 58035.0], - [2000000.0, 0.125, 108035.0], - [5000000.0, 0.15, 233035.0], - [10000000.0, 0.25, 1233035.0]], - 'BTC/USDT': [[0.0, 0.004, 0.0], - [50000.0, 0.005, 50.0], - [250000.0, 0.01, 1300.0], - [1000000.0, 0.025, 16300.0], - [5000000.0, 0.05, 141300.0], - [20000000.0, 0.1, 1141300.0], - [50000000.0, 0.125, 2391300.0], - [100000000.0, 0.15, 4891300.0], - [200000000.0, 0.25, 24891300.0], - [300000000.0, 0.5, 99891300.0] - ] + 'BNB/BUSD': [ + { + "min": 0, # stake(before leverage) = 0 + "max": 100000, # max stake(before leverage) = 5000 + "mmr": 0.025, + "lev": 20, + "maintAmt": 0.0 + }, + { + "min": 100000, # stake = 10000.0 + "max": 500000, # max_stake = 50000.0 + "mmr": 0.05, + "lev": 10, + "maintAmt": 2500.0 + }, + { + "min": 500000, # stake = 100000.0 + "max": 1000000, # max_stake = 200000.0 + "mmr": 0.1, + "lev": 5, + "maintAmt": 27500.0 + }, + { + "min": 1000000, # stake = 333333.3333333333 + "max": 2000000, # max_stake = 666666.6666666666 + "mmr": 0.15, + "lev": 3, + "maintAmt": 77500.0 + }, + { + "min": 2000000, # stake = 1000000.0 + "max": 5000000, # max_stake = 2500000.0 + "mmr": 0.25, + "lev": 2, + "maintAmt": 277500.0 + }, + { + "min": 5000000, # stake = 5000000.0 + "max": 30000000, # max_stake = 30000000.0 + "mmr": 0.5, + "lev": 1, + "maintAmt": 1527500.0 + } + ], + 'BNB/USDT': [ + { + "min": 0, # stake = 0.0 + "max": 10000, # max_stake = 133.33333333333334 + "mmr": 0.0065, + "lev": 75, + "maintAmt": 0.0 + }, + { + "min": 10000, # stake = 200.0 + "max": 50000, # max_stake = 1000.0 + "mmr": 0.01, + "lev": 50, + "maintAmt": 35.0 + }, + { + "min": 50000, # stake = 2000.0 + "max": 250000, # max_stake = 10000.0 + "mmr": 0.02, + "lev": 25, + "maintAmt": 535.0 + }, + { + "min": 250000, # stake = 25000.0 + "max": 1000000, # max_stake = 100000.0 + "mmr": 0.05, + "lev": 10, + "maintAmt": 8035.0 + }, + { + "min": 1000000, # stake = 200000.0 + "max": 2000000, # max_stake = 400000.0 + "mmr": 0.1, + "lev": 5, + "maintAmt": 58035.0 + }, + { + "min": 2000000, # stake = 500000.0 + "max": 5000000, # max_stake = 1250000.0 + "mmr": 0.125, + "lev": 4, + "maintAmt": 108035.0 + }, + { + "min": 5000000, # stake = 1666666.6666666667 + "max": 10000000, # max_stake = 3333333.3333333335 + "mmr": 0.15, + "lev": 3, + "maintAmt": 233035.0 + }, + { + "min": 10000000, # stake = 5000000.0 + "max": 20000000, # max_stake = 10000000.0 + "mmr": 0.25, + "lev": 2, + "maintAmt": 1233035.0 + }, + { + "min": 20000000, # stake = 20000000.0 + "max": 50000000, # max_stake = 50000000.0 + "mmr": 0.5, + "lev": 1, + "maintAmt": 6233035.0 + }, + ], + 'BTC/USDT': [ + { + "min": 0, # stake = 0.0 + "max": 50000, # max_stake = 400.0 + "mmr": 0.004, + "lev": 125, + "maintAmt": 0.0 + }, + { + "min": 50000, # stake = 500.0 + "max": 250000, # max_stake = 2500.0 + "mmr": 0.005, + "lev": 100, + "maintAmt": 50.0 + }, + { + "min": 250000, # stake = 5000.0 + "max": 1000000, # max_stake = 20000.0 + "mmr": 0.01, + "lev": 50, + "maintAmt": 1300.0 + }, + { + "min": 1000000, # stake = 50000.0 + "max": 7500000, # max_stake = 375000.0 + "mmr": 0.025, + "lev": 20, + "maintAmt": 16300.0 + }, + { + "min": 7500000, # stake = 750000.0 + "max": 40000000, # max_stake = 4000000.0 + "mmr": 0.05, + "lev": 10, + "maintAmt": 203800.0 + }, + { + "min": 40000000, # stake = 8000000.0 + "max": 100000000, # max_stake = 20000000.0 + "mmr": 0.1, + "lev": 5, + "maintAmt": 2203800.0 + }, + { + "min": 100000000, # stake = 25000000.0 + "max": 200000000, # max_stake = 50000000.0 + "mmr": 0.125, + "lev": 4, + "maintAmt": 4703800.0 + }, + { + "min": 200000000, # stake = 66666666.666666664 + "max": 400000000, # max_stake = 133333333.33333333 + "mmr": 0.15, + "lev": 3, + "maintAmt": 9703800.0 + }, + { + "min": 400000000, # stake = 200000000.0 + "max": 600000000, # max_stake = 300000000.0 + "mmr": 0.25, + "lev": 2, + "maintAmt": 4.97038E7 + }, + { + "min": 600000000, # stake = 600000000.0 + "max": 1000000000, # max_stake = 1000000000.0 + "mmr": 0.5, + "lev": 1, + "maintAmt": 1.997038E8 + }, + ] } (result_ratio, result_amt) = exchange.get_maintenance_ratio_and_amt(pair, nominal_value) assert (round(result_ratio, 8), round(result_amt, 8)) == (mm_ratio, amt) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 5366bbf0c..8457055db 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -3486,9 +3486,9 @@ def test_set_margin_mode(mocker, default_conf, margin_mode): ("binance", TradingMode.FUTURES, MarginMode.ISOLATED, False), ("gateio", TradingMode.FUTURES, MarginMode.ISOLATED, False), + ("okex", TradingMode.FUTURES, MarginMode.ISOLATED, False), # * Remove once implemented - ("okx", TradingMode.FUTURES, MarginMode.ISOLATED, True), ("binance", TradingMode.MARGIN, MarginMode.CROSS, True), ("binance", TradingMode.FUTURES, MarginMode.CROSS, True), ("kraken", TradingMode.MARGIN, MarginMode.CROSS, True), @@ -3499,7 +3499,6 @@ def test_set_margin_mode(mocker, default_conf, margin_mode): ("gateio", TradingMode.FUTURES, MarginMode.CROSS, True), # * Uncomment once implemented - # ("okx", TradingMode.FUTURES, MarginMode.ISOLATED, False), # ("binance", TradingMode.MARGIN, MarginMode.CROSS, False), # ("binance", TradingMode.FUTURES, MarginMode.CROSS, False), # ("kraken", TradingMode.MARGIN, MarginMode.CROSS, False), diff --git a/tests/optimize/test_hyperopt.py b/tests/optimize/test_hyperopt.py index cbaacc9c5..4fd095ffd 100644 --- a/tests/optimize/test_hyperopt.py +++ b/tests/optimize/test_hyperopt.py @@ -24,25 +24,25 @@ from tests.conftest import (CURRENT_TEST_STRATEGY, get_args, log_has, log_has_re def generate_result_metrics(): return { - 'trade_count': 1, - 'total_trades': 1, - 'avg_profit': 0.1, - 'total_profit': 0.001, - 'profit': 0.01, - 'duration': 20.0, - 'wins': 1, - 'draws': 0, - 'losses': 0, - 'profit_mean': 0.01, - 'profit_total_abs': 0.001, - 'profit_total': 0.01, - 'holding_avg': timedelta(minutes=20), - 'max_drawdown': 0.001, - 'max_drawdown_abs': 0.001, - 'loss': 0.001, - 'is_initial_point': 0.001, - 'is_best': 1, - } + 'trade_count': 1, + 'total_trades': 1, + 'avg_profit': 0.1, + 'total_profit': 0.001, + 'profit': 0.01, + 'duration': 20.0, + 'wins': 1, + 'draws': 0, + 'losses': 0, + 'profit_mean': 0.01, + 'profit_total_abs': 0.001, + 'profit_total': 0.01, + 'holding_avg': timedelta(minutes=20), + 'max_drawdown': 0.001, + 'max_drawdown_abs': 0.001, + 'loss': 0.001, + 'is_initial_point': 0.001, + 'is_best': 1, + } def test_setup_hyperopt_configuration_without_arguments(mocker, default_conf, caplog) -> None: @@ -852,6 +852,7 @@ def test_in_strategy_auto_hyperopt(mocker, hyperopt_conf, tmpdir, fee) -> None: 'spaces': ['all'] }) hyperopt = Hyperopt(hyperopt_conf) + hyperopt.backtesting.exchange.get_max_leverage = MagicMock(return_value=1.0) assert isinstance(hyperopt.custom_hyperopt, HyperOptAuto) assert isinstance(hyperopt.backtesting.strategy.buy_rsi, IntParameter) diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 8226266b7..4f05535af 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -5085,6 +5085,7 @@ def test_update_funding_fees( create_order=enter_mm, get_min_pair_stake_amount=MagicMock(return_value=1), get_fee=fee, + get_maintenance_ratio_and_amt=MagicMock(return_value=(0.01, 0.01)), ) freqtrade = get_patched_freqtradebot(mocker, default_conf) From 6b9915bc73bea6d08217b451a3720f9c8ae8db44 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 7 Feb 2022 01:33:42 -0600 Subject: [PATCH 05/70] moved fill_leverage_brackets and get_max_leverage to base exchange class, wrote parse_leverage_tier and load_leverage_brackets --- freqtrade/exchange/binance.py | 135 +++-------------------------- freqtrade/exchange/exchange.py | 146 +++++++++++++++++++++++++++----- freqtrade/exchange/okx.py | 4 +- tests/exchange/test_exchange.py | 6 +- 4 files changed, 145 insertions(+), 146 deletions(-) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index cc562530b..8ed791cfe 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -128,128 +128,6 @@ class Binance(Exchange): except ccxt.BaseError as e: raise OperationalException(e) from e - @retrier - def fill_leverage_brackets(self) -> None: - """ - Assigns property _leverage_brackets to a dictionary of information about the leverage - allowed on each pair - After exectution, self._leverage_brackets = { - "pair_name": [ - [notional_floor, maintenenace_margin_ratio, maintenance_amt], - ... - ], - ... - } - e.g. { - "ETH/USDT:USDT": [ - [0.0, 0.01, 0.0], - [10000, 0.02, 0.01], - ... - ], - ... - } - """ - if self.trading_mode == TradingMode.FUTURES: - try: - if self._config['dry_run']: - leverage_brackets_path = ( - Path(__file__).parent / 'binance_leverage_tiers.json' - ) - with open(leverage_brackets_path) as json_file: - leverage_brackets = json.load(json_file) - else: - leverage_brackets = self._api.fetch_leverage_tiers() - - for pair, tiers in leverage_brackets.items(): - brackets = [] - for tier in tiers: - info = tier['info'] - brackets.append({ - 'min': tier['notionalFloor'], - 'max': tier['notionalCap'], - 'mmr': tier['maintenanceMarginRatio'], - 'lev': tier['maxLeverage'], - 'maintAmt': float(info['cum']) if 'cum' in info else None, - }) - self._leverage_brackets[pair] = brackets - except ccxt.DDoSProtection as e: - raise DDosProtection(e) from e - except (ccxt.NetworkError, ccxt.ExchangeError) as e: - raise TemporaryError(f'Could not fetch leverage amounts due to' - f'{e.__class__.__name__}. Message: {e}') from e - except ccxt.BaseError as e: - raise OperationalException(e) from e - - def get_max_leverage(self, pair: str, stake_amount: Optional[float]) -> float: - """ - Returns the maximum leverage that a pair can be traded at - :param pair: The base/quote currency pair being traded - :stake_amount: The total value of the traders margin_mode in quote currency - """ - - if self.trading_mode == TradingMode.SPOT: - return 1.0 - - if self._api.has['fetchLeverageTiers']: - - # Checks and edge cases - if stake_amount is None: - raise OperationalException( - 'binance.get_max_leverage requires argument stake_amount') - if pair not in self._leverage_brackets: # Not a leveraged market - return 1.0 - if stake_amount == 0: - return self._leverage_brackets[pair][0]['lev'] # Max lev for lowest amount - - pair_brackets = self._leverage_brackets[pair] - num_brackets = len(pair_brackets) - - for bracket_index in range(num_brackets): - - bracket = pair_brackets[bracket_index] - lev = bracket['lev'] - - if bracket_index < num_brackets - 1: - next_bracket = pair_brackets[bracket_index+1] - next_floor = next_bracket['min'] / next_bracket['lev'] - if next_floor > stake_amount: # Next bracket min too high for stake amount - return min((bracket['max'] / stake_amount), lev) - # - # With the two leverage brackets below, - # - a stake amount of 150 would mean a max leverage of (10000 / 150) = 66.66 - # - stakes below 133.33 = max_lev of 75 - # - stakes between 133.33-200 = max_lev of 10000/stake = 50.01-74.99 - # - stakes from 200 + 1000 = max_lev of 50 - # - # { - # "min": 0, # stake = 0.0 - # "max": 10000, # max_stake@75 = 10000/75 = 133.33333333333334 - # "lev": 75, - # }, - # { - # "min": 10000, # stake = 200.0 - # "max": 50000, # max_stake@50 = 50000/50 = 1000.0 - # "lev": 50, - # } - # - - else: # if on the last bracket - if stake_amount > bracket['max']: # If stake is > than max tradeable amount - raise InvalidOrderException(f'Amount {stake_amount} too high for {pair}') - else: - return bracket['lev'] - - raise OperationalException( - 'Looped through all tiers without finding a max leverage. Should never be reached' - ) - - else: # Search markets.limits for max lev - market = self.markets[pair] - if market['limits']['leverage']['max'] is not None: - return market['limits']['leverage']['max'] - else: - return 1.0 # Default if max leverage cannot be found - @retrier def _set_leverage( self, @@ -367,3 +245,16 @@ class Binance(Exchange): else: raise OperationalException( "Freqtrade only supports isolated futures for leverage trading") + + def load_leverage_brackets(self) -> Dict[str, List[Dict]]: + if self._config['dry_run']: + leverage_brackets_path = ( + Path(__file__).parent / 'binance_leverage_tiers.json' + ) + leverage_brackets = {} + with open(leverage_brackets_path) as json_file: + leverage_brackets = json.load(json_file) + return leverage_brackets + else: + leverage_brackets = self._api.fetch_leverage_tiers() + return leverage_brackets diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index ac94c9f9e..2be931dc9 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -75,6 +75,7 @@ class Exchange: "mark_ohlcv_timeframe": "8h", "ccxt_futures_name": "swap", "mmr_key": None, + "can_fetch_multiple_tiers": True, } _ft_has: Dict = {} @@ -1855,26 +1856,131 @@ class Exchange: except ccxt.BaseError as e: raise OperationalException(e) from e - def fill_leverage_brackets(self): + def load_leverage_brackets(self) -> Dict[str, List[Dict]]: + return self._api.fetch_leverage_tiers() + + @retrier + def fill_leverage_brackets(self) -> None: """ Assigns property _leverage_brackets to a dictionary of information about the leverage allowed on each pair - Not used if the exchange has a static max leverage value for the account or each pair + After exectution, self._leverage_brackets = { + "pair_name": [ + [notional_floor, maintenenace_margin_ratio, maintenance_amt], + ... + ], + ... + } + e.g. { + "ETH/USDT:USDT": [ + [0.0, 0.01, 0.0], + [10000, 0.02, 0.01], + ... + ], + ... + } """ - return + if self._api.has['fetchLeverageTiers']: + if self.trading_mode == TradingMode.FUTURES: + leverage_brackets = self.load_leverage_brackets() + try: + for pair, tiers in leverage_brackets.items(): + brackets = [] + for tier in tiers: + brackets.append(self.parse_leverage_tier(tier)) + self._leverage_brackets[pair] = brackets + except ccxt.DDoSProtection as e: + raise DDosProtection(e) from e + except (ccxt.NetworkError, ccxt.ExchangeError) as e: + raise TemporaryError(f'Could not fetch leverage amounts due to' + f'{e.__class__.__name__}. Message: {e}') from e + except ccxt.BaseError as e: + raise OperationalException(e) from e + + def parse_leverage_tier(self, tier) -> Dict: + info = tier['info'] + return { + 'min': tier['notionalFloor'], + 'max': tier['notionalCap'], + 'mmr': tier['maintenanceMarginRatio'], + 'lev': tier['maxLeverage'], + 'maintAmt': float(info['cum']) if 'cum' in info else None, + } def get_max_leverage(self, pair: str, stake_amount: Optional[float]) -> float: """ Returns the maximum leverage that a pair can be traded at :param pair: The base/quote currency pair being traded - :param nominal_value: The total value of the trade in quote currency (margin_mode + debt) + :stake_amount: The total value of the traders margin_mode in quote currency """ - market = self.markets[pair] - if market['limits']['leverage']['max'] is not None: - return market['limits']['leverage']['max'] - else: + + if self.trading_mode == TradingMode.SPOT: return 1.0 + if self._api.has['fetchLeverageTiers']: + + # Checks and edge cases + if stake_amount is None: + raise OperationalException( + 'binance.get_max_leverage requires argument stake_amount') + if pair not in self._leverage_brackets: + brackets = self.get_leverage_tiers_for_pair(pair) + if not brackets: # Not a leveraged market + return 1.0 + else: + self._leverage_brackets[pair] = brackets + if stake_amount == 0: + return self._leverage_brackets[pair][0]['lev'] # Max lev for lowest amount + + pair_brackets = self._leverage_brackets[pair] + num_brackets = len(pair_brackets) + + for bracket_index in range(num_brackets): + + bracket = pair_brackets[bracket_index] + lev = bracket['lev'] + + if bracket_index < num_brackets - 1: + next_bracket = pair_brackets[bracket_index+1] + next_floor = next_bracket['min'] / next_bracket['lev'] + if next_floor > stake_amount: # Next bracket min too high for stake amount + return min((bracket['max'] / stake_amount), lev) + # + # With the two leverage brackets below, + # - a stake amount of 150 would mean a max leverage of (10000 / 150) = 66.66 + # - stakes below 133.33 = max_lev of 75 + # - stakes between 133.33-200 = max_lev of 10000/stake = 50.01-74.99 + # - stakes from 200 + 1000 = max_lev of 50 + # + # { + # "min": 0, # stake = 0.0 + # "max": 10000, # max_stake@75 = 10000/75 = 133.33333333333334 + # "lev": 75, + # }, + # { + # "min": 10000, # stake = 200.0 + # "max": 50000, # max_stake@50 = 50000/50 = 1000.0 + # "lev": 50, + # } + # + + else: # if on the last bracket + if stake_amount > bracket['max']: # If stake is > than max tradeable amount + raise InvalidOrderException(f'Amount {stake_amount} too high for {pair}') + else: + return bracket['lev'] + + raise OperationalException( + 'Looped through all tiers without finding a max leverage. Should never be reached' + ) + + else: # Search markets.limits for max lev + market = self.markets[pair] + if market['limits']['leverage']['max'] is not None: + return market['limits']['leverage']['max'] + else: + return 1.0 # Default if max leverage cannot be found + @retrier def _set_leverage( self, @@ -2153,11 +2259,17 @@ class Exchange: raise OperationalException( "Freqtrade only supports isolated futures for leverage trading") - def get_leverage_tiers(self, pair: str): + def get_leverage_tiers_for_pair(self, pair: str): # When exchanges can load all their leverage brackets at once in the constructor # then this method does nothing, it should only be implemented when the leverage # brackets requires per symbol fetching to avoid excess api calls - return None + if not self._ft_has['can_fetch_multiple_tiers']: + try: + return self._api.fetch_leverage_tiers(pair) + except ccxt.BadRequest: + return None + else: + return None def get_maintenance_ratio_and_amt( self, @@ -2177,21 +2289,17 @@ class Exchange: if self._api.has['fetchLeverageTiers']: if pair not in self._leverage_brackets: # Used when fetchLeverageTiers cannot fetch all symbols at once - tiers = self.get_leverage_tiers(pair) + tiers = self.get_leverage_tiers_for_pair(pair) if not bool(tiers): raise InvalidOrderException(f"Cannot calculate liquidation price for {pair}") else: self._leverage_brackets[pair] = [] for tier in tiers[pair]: - self._leverage_brackets[pair].append(( - tier['notionalFloor'], - tier['maintenanceMarginRatio'], - None, - )) + self._leverage_brackets[pair].append(self.parse_leverage_tier(tier)) pair_brackets = self._leverage_brackets[pair] - for (notional_floor, mm_ratio, amt) in reversed(pair_brackets): - if nominal_value >= notional_floor: - return (mm_ratio, amt) + for bracket in reversed(pair_brackets): + if nominal_value >= bracket['min']: + return (bracket['mmr'], bracket['maintAmt']) raise OperationalException("nominal value can not be lower than 0") # The lowest notional_floor for any pair in fetch_leverage_tiers is always 0 because it # describes the min amt for a bracket, and the lowest bracket will always go down to 0 diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index a769ce9eb..8a1c693a1 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -19,6 +19,7 @@ class Okx(Exchange): "ohlcv_candle_limit": 300, "mark_ohlcv_timeframe": "4h", "funding_fee_timeframe": "8h", + "can_fetch_multiple_tiers": False, } _supported_trading_mode_margin_pairs: List[Tuple[TradingMode, MarginMode]] = [ @@ -47,9 +48,6 @@ class Okx(Exchange): "posSide": "long" if side == "buy" else "short", }) - def get_leverage_tiers(self, pair: str): - return self._api.fetch_leverage_tiers(pair) - def get_max_pair_stake_amount( self, pair: str, diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 8457055db..322be3e02 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -3561,8 +3561,10 @@ def test__ccxt_config( ("TKN/USDT", 210.30, 1.0), ]) def test_get_max_leverage(default_conf, mocker, pair, nominal_value, max_lev): - # Binance has a different method of getting the max leverage - exchange = get_patched_exchange(mocker, default_conf, id="kraken") + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, id="gateio") + exchange._api.has['fetchLeverageTiers'] = False assert exchange.get_max_leverage(pair, nominal_value) == max_lev From 42e36f44f8a91a79a8ffa14698542f38df39cb50 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 7 Feb 2022 02:01:00 -0600 Subject: [PATCH 06/70] replaced "leverage" with "tiers" --- freqtrade/exchange/binance.py | 23 +++++--- freqtrade/exchange/exchange.py | 92 ++++++++++++++---------------- tests/exchange/test_binance.py | 28 ++++----- tests/exchange/test_ccxt_compat.py | 2 +- 4 files changed, 72 insertions(+), 73 deletions(-) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 8ed791cfe..97a2fc574 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -246,15 +246,22 @@ class Binance(Exchange): raise OperationalException( "Freqtrade only supports isolated futures for leverage trading") - def load_leverage_brackets(self) -> Dict[str, List[Dict]]: + def load_leverage_tiers(self) -> Dict[str, List[Dict]]: if self._config['dry_run']: - leverage_brackets_path = ( + leverage_tiers_path = ( Path(__file__).parent / 'binance_leverage_tiers.json' ) - leverage_brackets = {} - with open(leverage_brackets_path) as json_file: - leverage_brackets = json.load(json_file) - return leverage_brackets + with open(leverage_tiers_path) as json_file: + leverage_tiers = json.load(json_file) + return leverage_tiers else: - leverage_brackets = self._api.fetch_leverage_tiers() - return leverage_brackets + try: + leverage_tiers = self._api.fetch_leverage_tiers() + return leverage_tiers + except ccxt.DDoSProtection as e: + raise DDosProtection(e) from e + except (ccxt.NetworkError, ccxt.ExchangeError) as e: + raise TemporaryError(f'Could not fetch leverage amounts due to' + f'{e.__class__.__name__}. Message: {e}') from e + except ccxt.BaseError as e: + raise OperationalException(e) from e diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 2be931dc9..b264a2fcd 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -92,7 +92,7 @@ class Exchange: self._api: ccxt.Exchange = None self._api_async: ccxt_async.Exchange = None self._markets: Dict = {} - self._leverage_brackets: Dict[str, List[Dict]] = {} + self._leverage_tiers: Dict[str, List[Dict]] = {} self.loop = asyncio.new_event_loop() asyncio.set_event_loop(self.loop) @@ -185,7 +185,7 @@ class Exchange: "markets_refresh_interval", 60) * 60 if self.trading_mode != TradingMode.SPOT: - self.fill_leverage_brackets() + self.fill_leverage_tiers() def __del__(self): """ @@ -461,7 +461,7 @@ class Exchange: # Also reload async markets to avoid issues with newly listed pairs self._load_async_markets(reload=True) self._last_markets_refresh = arrow.utcnow().int_timestamp - self.fill_leverage_brackets() + self.fill_leverage_tiers() except ccxt.BaseError: logger.exception("Could not reload markets.") @@ -1856,15 +1856,15 @@ class Exchange: except ccxt.BaseError as e: raise OperationalException(e) from e - def load_leverage_brackets(self) -> Dict[str, List[Dict]]: + def load_leverage_tiers(self) -> Dict[str, List[Dict]]: return self._api.fetch_leverage_tiers() @retrier - def fill_leverage_brackets(self) -> None: + def fill_leverage_tiers(self) -> None: """ - Assigns property _leverage_brackets to a dictionary of information about the leverage + Assigns property _leverage_tiers to a dictionary of information about the leverage allowed on each pair - After exectution, self._leverage_brackets = { + After exectution, self._leverage_tiers = { "pair_name": [ [notional_floor, maintenenace_margin_ratio, maintenance_amt], ... @@ -1882,20 +1882,12 @@ class Exchange: """ if self._api.has['fetchLeverageTiers']: if self.trading_mode == TradingMode.FUTURES: - leverage_brackets = self.load_leverage_brackets() - try: - for pair, tiers in leverage_brackets.items(): - brackets = [] - for tier in tiers: - brackets.append(self.parse_leverage_tier(tier)) - self._leverage_brackets[pair] = brackets - except ccxt.DDoSProtection as e: - raise DDosProtection(e) from e - except (ccxt.NetworkError, ccxt.ExchangeError) as e: - raise TemporaryError(f'Could not fetch leverage amounts due to' - f'{e.__class__.__name__}. Message: {e}') from e - except ccxt.BaseError as e: - raise OperationalException(e) from e + leverage_tiers = self.load_leverage_tiers() + for pair, tiers in leverage_tiers.items(): + tiers = [] + for tier in tiers: + tiers.append(self.parse_leverage_tier(tier)) + self._leverage_tiers[pair] = tiers def parse_leverage_tier(self, tier) -> Dict: info = tier['info'] @@ -1923,30 +1915,30 @@ class Exchange: if stake_amount is None: raise OperationalException( 'binance.get_max_leverage requires argument stake_amount') - if pair not in self._leverage_brackets: - brackets = self.get_leverage_tiers_for_pair(pair) - if not brackets: # Not a leveraged market + if pair not in self._leverage_tiers: + tiers = self.get_leverage_tiers_for_pair(pair) + if not tiers: # Not a leveraged market return 1.0 else: - self._leverage_brackets[pair] = brackets + self._leverage_tiers[pair] = tiers if stake_amount == 0: - return self._leverage_brackets[pair][0]['lev'] # Max lev for lowest amount + return self._leverage_tiers[pair][0]['lev'] # Max lev for lowest amount - pair_brackets = self._leverage_brackets[pair] - num_brackets = len(pair_brackets) + pair_tiers = self._leverage_tiers[pair] + num_tiers = len(pair_tiers) - for bracket_index in range(num_brackets): + for tier_index in range(num_tiers): - bracket = pair_brackets[bracket_index] - lev = bracket['lev'] + tier = pair_tiers[tier_index] + lev = tier['lev'] - if bracket_index < num_brackets - 1: - next_bracket = pair_brackets[bracket_index+1] - next_floor = next_bracket['min'] / next_bracket['lev'] - if next_floor > stake_amount: # Next bracket min too high for stake amount - return min((bracket['max'] / stake_amount), lev) + if tier_index < num_tiers - 1: + next_tier = pair_tiers[tier_index+1] + next_floor = next_tier['min'] / next_tier['lev'] + if next_floor > stake_amount: # Next tier min too high for stake amount + return min((tier['max'] / stake_amount), lev) # - # With the two leverage brackets below, + # With the two leverage tiers below, # - a stake amount of 150 would mean a max leverage of (10000 / 150) = 66.66 # - stakes below 133.33 = max_lev of 75 # - stakes between 133.33-200 = max_lev of 10000/stake = 50.01-74.99 @@ -1964,11 +1956,11 @@ class Exchange: # } # - else: # if on the last bracket - if stake_amount > bracket['max']: # If stake is > than max tradeable amount + else: # if on the last tier + if stake_amount > tier['max']: # If stake is > than max tradeable amount raise InvalidOrderException(f'Amount {stake_amount} too high for {pair}') else: - return bracket['lev'] + return tier['lev'] raise OperationalException( 'Looped through all tiers without finding a max leverage. Should never be reached' @@ -2260,9 +2252,9 @@ class Exchange: "Freqtrade only supports isolated futures for leverage trading") def get_leverage_tiers_for_pair(self, pair: str): - # When exchanges can load all their leverage brackets at once in the constructor + # When exchanges can load all their leverage tiers at once in the constructor # then this method does nothing, it should only be implemented when the leverage - # brackets requires per symbol fetching to avoid excess api calls + # tiers requires per symbol fetching to avoid excess api calls if not self._ft_has['can_fetch_multiple_tiers']: try: return self._api.fetch_leverage_tiers(pair) @@ -2287,22 +2279,22 @@ class Exchange: f"nominal value is required for {self.name}.get_maintenance_ratio_and_amt" ) if self._api.has['fetchLeverageTiers']: - if pair not in self._leverage_brackets: + if pair not in self._leverage_tiers: # Used when fetchLeverageTiers cannot fetch all symbols at once tiers = self.get_leverage_tiers_for_pair(pair) if not bool(tiers): raise InvalidOrderException(f"Cannot calculate liquidation price for {pair}") else: - self._leverage_brackets[pair] = [] + self._leverage_tiers[pair] = [] for tier in tiers[pair]: - self._leverage_brackets[pair].append(self.parse_leverage_tier(tier)) - pair_brackets = self._leverage_brackets[pair] - for bracket in reversed(pair_brackets): - if nominal_value >= bracket['min']: - return (bracket['mmr'], bracket['maintAmt']) + self._leverage_tiers[pair].append(self.parse_leverage_tier(tier)) + pair_tiers = self._leverage_tiers[pair] + for tier in reversed(pair_tiers): + if nominal_value >= tier['min']: + return (tier['mmr'], tier['maintAmt']) raise OperationalException("nominal value can not be lower than 0") # The lowest notional_floor for any pair in fetch_leverage_tiers is always 0 because it - # describes the min amt for a bracket, and the lowest bracket will always go down to 0 + # describes the min amt for a tier, and the lowest tier will always go down to 0 else: info = self.markets[pair]['info'] mmr_key = self._ft_has['mmr_key'] diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index d0d9bdf2c..a3035e99d 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -174,7 +174,7 @@ def test_get_max_leverage_binance(default_conf, mocker): default_conf['margin_mode'] = 'isolated' exchange = get_patched_exchange(mocker, default_conf, id="binance") - exchange._leverage_brackets = { + exchange._leverage_tiers = { 'BNB/BUSD': [ { "min": 0, # stake(before leverage) = 0 @@ -364,9 +364,9 @@ def test_get_max_leverage_binance(default_conf, mocker): assert isclose(exchange.get_max_leverage("BNB/BUSD", 99999.9), 5.000005) assert isclose(exchange.get_max_leverage("BNB/USDT", 1500), 33.333333333333333) assert exchange.get_max_leverage("BTC/USDT", 300000000) == 2.0 - assert exchange.get_max_leverage("BTC/USDT", 600000000) == 1.0 # Last bracket + assert exchange.get_max_leverage("BTC/USDT", 600000000) == 1.0 # Last tier - assert exchange.get_max_leverage("ETC/USDT", 200) == 1.0 # Pair not in leverage_brackets + assert exchange.get_max_leverage("ETC/USDT", 200) == 1.0 # Pair not in leverage_tiers assert exchange.get_max_leverage("BTC/USDT", 0.0) == 125.0 # No stake amount with pytest.raises( InvalidOrderException, @@ -375,7 +375,7 @@ def test_get_max_leverage_binance(default_conf, mocker): exchange.get_max_leverage("BTC/USDT", 1000000000.01) -def test_fill_leverage_brackets_binance(default_conf, mocker): +def test_fill_leverage_tiers_binance(default_conf, mocker): api_mock = MagicMock() api_mock.fetch_leverage_tiers = MagicMock(return_value={ 'ADA/BUSD': [ @@ -583,9 +583,9 @@ def test_fill_leverage_brackets_binance(default_conf, mocker): default_conf['trading_mode'] = TradingMode.FUTURES default_conf['margin_mode'] = MarginMode.ISOLATED exchange = get_patched_exchange(mocker, default_conf, api_mock, id="binance") - exchange.fill_leverage_brackets() + exchange.fill_leverage_tiers() - assert exchange._leverage_brackets == { + assert exchange._leverage_tiers == { 'ADA/BUSD': [ { "min": 0, @@ -684,7 +684,7 @@ def test_fill_leverage_brackets_binance(default_conf, mocker): } api_mock = MagicMock() - api_mock.load_leverage_brackets = MagicMock() + api_mock.load_leverage_tiers = MagicMock() type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) ccxt_exceptionhandlers( @@ -692,19 +692,19 @@ def test_fill_leverage_brackets_binance(default_conf, mocker): default_conf, api_mock, "binance", - "fill_leverage_brackets", + "fill_leverage_tiers", "fetch_leverage_tiers" ) -def test_fill_leverage_brackets_binance_dryrun(default_conf, mocker): +def test_fill_leverage_tiers_binance_dryrun(default_conf, mocker): api_mock = MagicMock() default_conf['trading_mode'] = TradingMode.FUTURES default_conf['margin_mode'] = MarginMode.ISOLATED exchange = get_patched_exchange(mocker, default_conf, api_mock, id="binance") - exchange.fill_leverage_brackets() + exchange.fill_leverage_tiers() - leverage_brackets = { + leverage_tiers = { "1000SHIB/USDT": [ { 'min': 0, @@ -904,8 +904,8 @@ def test_fill_leverage_brackets_binance_dryrun(default_conf, mocker): ] } - for key, value in leverage_brackets.items(): - assert exchange._leverage_brackets[key] == value + for key, value in leverage_tiers.items(): + assert exchange._leverage_tiers[key] == value def test__set_leverage_binance(mocker, default_conf): @@ -996,7 +996,7 @@ def test_get_maintenance_ratio_and_amt_binance( amt, ): exchange = get_patched_exchange(mocker, default_conf, id="binance") - exchange._leverage_brackets = { + exchange._leverage_tiers = { 'BNB/BUSD': [ { "min": 0, # stake(before leverage) = 0 diff --git a/tests/exchange/test_ccxt_compat.py b/tests/exchange/test_ccxt_compat.py index 3bf9f5b6d..0e78a9133 100644 --- a/tests/exchange/test_ccxt_compat.py +++ b/tests/exchange/test_ccxt_compat.py @@ -143,7 +143,7 @@ def exchange_futures(request, exchange_conf, class_mocker): class_mocker.patch( 'freqtrade.exchange.exchange.Exchange.validate_trading_mode_and_margin_mode') class_mocker.patch( - 'freqtrade.exchange.binance.Binance.fill_leverage_brackets') + 'freqtrade.exchange.binance.Binance.fill_leverage_tiers') exchange = ExchangeResolver.load_exchange(request.param, exchange_conf, validate=True) From 68a778a983cdeedf9edd07fb368efb485e0929d8 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 7 Feb 2022 04:08:30 -0600 Subject: [PATCH 07/70] moved leverage_tiers to a fixture --- tests/conftest.py | 435 ++++++++++++++++++++++++ tests/exchange/test_binance.py | 583 +-------------------------------- tests/exchange/test_okex.py | 187 +---------- 3 files changed, 452 insertions(+), 753 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index e6754a6a1..f87dcf83d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2841,3 +2841,438 @@ def funding_rate_history_octohourly(): "datetime": "2021-09-01T08:00:00.000Z" } ] + + +@pytest.fixture(scope='function') +def leverage_tiers(): + return { + "1000SHIB/USDT": [ + { + 'min': 0, + 'max': 50000, + 'mmr': 0.01, + 'lev': 50, + 'maintAmt': 0.0 + }, + { + 'min': 50000, + 'max': 150000, + 'mmr': 0.025, + 'lev': 20, + 'maintAmt': 750.0 + }, + { + 'min': 150000, + 'max': 250000, + 'mmr': 0.05, + 'lev': 10, + 'maintAmt': 4500.0 + }, + { + 'min': 250000, + 'max': 500000, + 'mmr': 0.1, + 'lev': 5, + 'maintAmt': 17000.0 + }, + { + 'min': 500000, + 'max': 1000000, + 'mmr': 0.125, + 'lev': 4, + 'maintAmt': 29500.0 + }, + { + 'min': 1000000, + 'max': 2000000, + 'mmr': 0.25, + 'lev': 2, + 'maintAmt': 154500.0 + }, + { + 'min': 2000000, + 'max': 30000000, + 'mmr': 0.5, + 'lev': 1, + 'maintAmt': 654500.0 + }, + ], + "1INCH/USDT": [ + { + 'min': 0, + 'max': 5000, + 'mmr': 0.012, + 'lev': 50, + 'maintAmt': 0.0 + }, + { + 'min': 5000, + 'max': 25000, + 'mmr': 0.025, + 'lev': 20, + 'maintAmt': 65.0 + }, + { + 'min': 25000, + 'max': 100000, + 'mmr': 0.05, + 'lev': 10, + 'maintAmt': 690.0 + }, + { + 'min': 100000, + 'max': 250000, + 'mmr': 0.1, + 'lev': 5, + 'maintAmt': 5690.0 + }, + { + 'min': 250000, + 'max': 1000000, + 'mmr': 0.125, + 'lev': 2, + 'maintAmt': 11940.0 + }, + { + 'min': 1000000, + 'max': 100000000, + 'mmr': 0.5, + 'lev': 1, + 'maintAmt': 386940.0 + }, + ], + "AAVE/USDT": [ + { + 'min': 0, + 'max': 50000, + 'mmr': 0.01, + 'lev': 50, + 'maintAmt': 0.0 + }, + { + 'min': 50000, + 'max': 250000, + 'mmr': 0.02, + 'lev': 25, + 'maintAmt': 500.0 + }, + { + 'min': 250000, + 'max': 1000000, + 'mmr': 0.05, + 'lev': 10, + 'maintAmt': 8000.0 + }, + { + 'min': 1000000, + 'max': 2000000, + 'mmr': 0.1, + 'lev': 5, + 'maintAmt': 58000.0 + }, + { + 'min': 2000000, + 'max': 5000000, + 'mmr': 0.125, + 'lev': 4, + 'maintAmt': 108000.0 + }, + { + 'min': 5000000, + 'max': 10000000, + 'mmr': 0.1665, + 'lev': 3, + 'maintAmt': 315500.0 + }, + { + 'min': 10000000, + 'max': 20000000, + 'mmr': 0.25, + 'lev': 2, + 'maintAmt': 1150500.0 + }, + { + "min": 20000000, + "max": 50000000, + "mmr": 0.5, + "lev": 1, + "maintAmt": 6150500.0 + } + ], + "ADA/BUSD": [ + { + "min": 0, + "max": 100000, + "mmr": 0.025, + "lev": 20, + "maintAmt": 0.0 + }, + { + "min": 100000, + "max": 500000, + "mmr": 0.05, + "lev": 10, + "maintAmt": 2500.0 + }, + { + "min": 500000, + "max": 1000000, + "mmr": 0.1, + "lev": 5, + "maintAmt": 27500.0 + }, + { + "min": 1000000, + "max": 2000000, + "mmr": 0.15, + "lev": 3, + "maintAmt": 77500.0 + }, + { + "min": 2000000, + "max": 5000000, + "mmr": 0.25, + "lev": 2, + "maintAmt": 277500.0 + }, + { + "min": 5000000, + "max": 30000000, + "mmr": 0.5, + "lev": 1, + "maintAmt": 1527500.0 + }, + ], + 'BNB/BUSD': [ + { + "min": 0, # stake(before leverage) = 0 + "max": 100000, # max stake(before leverage) = 5000 + "mmr": 0.025, + "lev": 20, + "maintAmt": 0.0 + }, + { + "min": 100000, # stake = 10000.0 + "max": 500000, # max_stake = 50000.0 + "mmr": 0.05, + "lev": 10, + "maintAmt": 2500.0 + }, + { + "min": 500000, # stake = 100000.0 + "max": 1000000, # max_stake = 200000.0 + "mmr": 0.1, + "lev": 5, + "maintAmt": 27500.0 + }, + { + "min": 1000000, # stake = 333333.3333333333 + "max": 2000000, # max_stake = 666666.6666666666 + "mmr": 0.15, + "lev": 3, + "maintAmt": 77500.0 + }, + { + "min": 2000000, # stake = 1000000.0 + "max": 5000000, # max_stake = 2500000.0 + "mmr": 0.25, + "lev": 2, + "maintAmt": 277500.0 + }, + { + "min": 5000000, # stake = 5000000.0 + "max": 30000000, # max_stake = 30000000.0 + "mmr": 0.5, + "lev": 1, + "maintAmt": 1527500.0 + } + ], + 'BNB/USDT': [ + { + "min": 0, # stake = 0.0 + "max": 10000, # max_stake = 133.33333333333334 + "mmr": 0.0065, + "lev": 75, + "maintAmt": 0.0 + }, + { + "min": 10000, # stake = 200.0 + "max": 50000, # max_stake = 1000.0 + "mmr": 0.01, + "lev": 50, + "maintAmt": 35.0 + }, + { + "min": 50000, # stake = 2000.0 + "max": 250000, # max_stake = 10000.0 + "mmr": 0.02, + "lev": 25, + "maintAmt": 535.0 + }, + { + "min": 250000, # stake = 25000.0 + "max": 1000000, # max_stake = 100000.0 + "mmr": 0.05, + "lev": 10, + "maintAmt": 8035.0 + }, + { + "min": 1000000, # stake = 200000.0 + "max": 2000000, # max_stake = 400000.0 + "mmr": 0.1, + "lev": 5, + "maintAmt": 58035.0 + }, + { + "min": 2000000, # stake = 500000.0 + "max": 5000000, # max_stake = 1250000.0 + "mmr": 0.125, + "lev": 4, + "maintAmt": 108035.0 + }, + { + "min": 5000000, # stake = 1666666.6666666667 + "max": 10000000, # max_stake = 3333333.3333333335 + "mmr": 0.15, + "lev": 3, + "maintAmt": 233035.0 + }, + { + "min": 10000000, # stake = 5000000.0 + "max": 20000000, # max_stake = 10000000.0 + "mmr": 0.25, + "lev": 2, + "maintAmt": 1233035.0 + }, + { + "min": 20000000, # stake = 20000000.0 + "max": 50000000, # max_stake = 50000000.0 + "mmr": 0.5, + "lev": 1, + "maintAmt": 6233035.0 + }, + ], + 'BTC/USDT': [ + { + "min": 0, # stake = 0.0 + "max": 50000, # max_stake = 400.0 + "mmr": 0.004, + "lev": 125, + "maintAmt": 0.0 + }, + { + "min": 50000, # stake = 500.0 + "max": 250000, # max_stake = 2500.0 + "mmr": 0.005, + "lev": 100, + "maintAmt": 50.0 + }, + { + "min": 250000, # stake = 5000.0 + "max": 1000000, # max_stake = 20000.0 + "mmr": 0.01, + "lev": 50, + "maintAmt": 1300.0 + }, + { + "min": 1000000, # stake = 50000.0 + "max": 7500000, # max_stake = 375000.0 + "mmr": 0.025, + "lev": 20, + "maintAmt": 16300.0 + }, + { + "min": 7500000, # stake = 750000.0 + "max": 40000000, # max_stake = 4000000.0 + "mmr": 0.05, + "lev": 10, + "maintAmt": 203800.0 + }, + { + "min": 40000000, # stake = 8000000.0 + "max": 100000000, # max_stake = 20000000.0 + "mmr": 0.1, + "lev": 5, + "maintAmt": 2203800.0 + }, + { + "min": 100000000, # stake = 25000000.0 + "max": 200000000, # max_stake = 50000000.0 + "mmr": 0.125, + "lev": 4, + "maintAmt": 4703800.0 + }, + { + "min": 200000000, # stake = 66666666.666666664 + "max": 400000000, # max_stake = 133333333.33333333 + "mmr": 0.15, + "lev": 3, + "maintAmt": 9703800.0 + }, + { + "min": 400000000, # stake = 200000000.0 + "max": 600000000, # max_stake = 300000000.0 + "mmr": 0.25, + "lev": 2, + "maintAmt": 4.97038E7 + }, + { + "min": 600000000, # stake = 600000000.0 + "max": 1000000000, # max_stake = 1000000000.0 + "mmr": 0.5, + "lev": 1, + "maintAmt": 1.997038E8 + }, + ], + "ZEC/USDT": [ + { + 'min': 0, + 'max': 50000, + 'mmr': 0.01, + 'lev': 50, + 'maintAmt': 0.0 + }, + { + 'min': 50000, + 'max': 150000, + 'mmr': 0.025, + 'lev': 20, + 'maintAmt': 750.0 + }, + { + 'min': 150000, + 'max': 250000, + 'mmr': 0.05, + 'lev': 10, + 'maintAmt': 4500.0 + }, + { + 'min': 250000, + 'max': 500000, + 'mmr': 0.1, + 'lev': 5, + 'maintAmt': 17000.0 + }, + { + 'min': 500000, + 'max': 1000000, + 'mmr': 0.125, + 'lev': 4, + 'maintAmt': 29500.0 + }, + { + 'min': 1000000, + 'max': 2000000, + 'mmr': 0.25, + 'lev': 2, + 'maintAmt': 154500.0 + }, + { + 'min': 2000000, + 'max': 30000000, + 'mmr': 0.5, + 'lev': 1, + 'maintAmt': 654500.0 + }, + ] + } diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index a3035e99d..d4c98fd63 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -149,7 +149,15 @@ def test_stoploss_order_dry_run_binance(default_conf, mocker): (1501, 1499, 1501, "sell"), (1499, 1501, 1499, "buy") ]) -def test_stoploss_adjust_binance(mocker, default_conf, sl1, sl2, sl3, side): +def test_stoploss_adjust_binance( + mocker, + default_conf, + leverage_tiers, + sl1, + sl2, + sl3, + side +): exchange = get_patched_exchange(mocker, default_conf, id='binance') order = { 'type': 'stop_loss_limit', @@ -163,7 +171,7 @@ def test_stoploss_adjust_binance(mocker, default_conf, sl1, sl2, sl3, side): assert not exchange.stoploss_adjust(sl3, order, side=side) -def test_get_max_leverage_binance(default_conf, mocker): +def test_get_max_leverage_binance(default_conf, mocker, leverage_tiers): # Test Spot exchange = get_patched_exchange(mocker, default_conf, id="binance") @@ -174,189 +182,7 @@ def test_get_max_leverage_binance(default_conf, mocker): default_conf['margin_mode'] = 'isolated' exchange = get_patched_exchange(mocker, default_conf, id="binance") - exchange._leverage_tiers = { - 'BNB/BUSD': [ - { - "min": 0, # stake(before leverage) = 0 - "max": 100000, # max stake(before leverage) = 5000 - "mmr": 0.025, - "lev": 20, - "maintAmt": 0.0 - }, - { - "min": 100000, # stake = 10000.0 - "max": 500000, # max_stake = 50000.0 - "mmr": 0.05, - "lev": 10, - "maintAmt": 2500.0 - }, - { - "min": 500000, # stake = 100000.0 - "max": 1000000, # max_stake = 200000.0 - "mmr": 0.1, - "lev": 5, - "maintAmt": 27500.0 - }, - { - "min": 1000000, # stake = 333333.3333333333 - "max": 2000000, # max_stake = 666666.6666666666 - "mmr": 0.15, - "lev": 3, - "maintAmt": 77500.0 - }, - { - "min": 2000000, # stake = 1000000.0 - "max": 5000000, # max_stake = 2500000.0 - "mmr": 0.25, - "lev": 2, - "maintAmt": 277500.0 - }, - { - "min": 5000000, # stake = 5000000.0 - "max": 30000000, # max_stake = 30000000.0 - "mmr": 0.5, - "lev": 1, - "maintAmt": 1527500.0 - } - ], - 'BNB/USDT': [ - { - "min": 0, # stake = 0.0 - "max": 10000, # max_stake = 133.33333333333334 - "mmr": 0.0065, - "lev": 75, - "maintAmt": 0.0 - }, - { - "min": 10000, # stake = 200.0 - "max": 50000, # max_stake = 1000.0 - "mmr": 0.01, - "lev": 50, - "maintAmt": 35.0 - }, - { - "min": 50000, # stake = 2000.0 - "max": 250000, # max_stake = 10000.0 - "mmr": 0.02, - "lev": 25, - "maintAmt": 535.0 - }, - { - "min": 250000, # stake = 25000.0 - "max": 1000000, # max_stake = 100000.0 - "mmr": 0.05, - "lev": 10, - "maintAmt": 8035.0 - }, - { - "min": 1000000, # stake = 200000.0 - "max": 2000000, # max_stake = 400000.0 - "mmr": 0.1, - "lev": 5, - "maintAmt": 58035.0 - }, - { - "min": 2000000, # stake = 500000.0 - "max": 5000000, # max_stake = 1250000.0 - "mmr": 0.125, - "lev": 4, - "maintAmt": 108035.0 - }, - { - "min": 5000000, # stake = 1666666.6666666667 - "max": 10000000, # max_stake = 3333333.3333333335 - "mmr": 0.15, - "lev": 3, - "maintAmt": 233035.0 - }, - { - "min": 10000000, # stake = 5000000.0 - "max": 20000000, # max_stake = 10000000.0 - "mmr": 0.25, - "lev": 2, - "maintAmt": 1233035.0 - }, - { - "min": 20000000, # stake = 20000000.0 - "max": 50000000, # max_stake = 50000000.0 - "mmr": 0.5, - "lev": 1, - "maintAmt": 6233035.0 - }, - ], - 'BTC/USDT': [ - { - "min": 0, # stake = 0.0 - "max": 50000, # max_stake = 400.0 - "mmr": 0.004, - "lev": 125, - "maintAmt": 0.0 - }, - { - "min": 50000, # stake = 500.0 - "max": 250000, # max_stake = 2500.0 - "mmr": 0.005, - "lev": 100, - "maintAmt": 50.0 - }, - { - "min": 250000, # stake = 5000.0 - "max": 1000000, # max_stake = 20000.0 - "mmr": 0.01, - "lev": 50, - "maintAmt": 1300.0 - }, - { - "min": 1000000, # stake = 50000.0 - "max": 7500000, # max_stake = 375000.0 - "mmr": 0.025, - "lev": 20, - "maintAmt": 16300.0 - }, - { - "min": 7500000, # stake = 750000.0 - "max": 40000000, # max_stake = 4000000.0 - "mmr": 0.05, - "lev": 10, - "maintAmt": 203800.0 - }, - { - "min": 40000000, # stake = 8000000.0 - "max": 100000000, # max_stake = 20000000.0 - "mmr": 0.1, - "lev": 5, - "maintAmt": 2203800.0 - }, - { - "min": 100000000, # stake = 25000000.0 - "max": 200000000, # max_stake = 50000000.0 - "mmr": 0.125, - "lev": 4, - "maintAmt": 4703800.0 - }, - { - "min": 200000000, # stake = 66666666.666666664 - "max": 400000000, # max_stake = 133333333.33333333 - "mmr": 0.15, - "lev": 3, - "maintAmt": 9703800.0 - }, - { - "min": 400000000, # stake = 200000000.0 - "max": 600000000, # max_stake = 300000000.0 - "mmr": 0.25, - "lev": 2, - "maintAmt": 4.97038E7 - }, - { - "min": 600000000, # stake = 600000000.0 - "max": 1000000000, # max_stake = 1000000000.0 - "mmr": 0.5, - "lev": 1, - "maintAmt": 1.997038E8 - }, - ] - } + exchange._leverage_tiers = leverage_tiers assert exchange.get_max_leverage("BNB/BUSD", 1.0) == 20.0 assert exchange.get_max_leverage("BNB/USDT", 100.0) == 75.0 @@ -697,212 +523,14 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): ) -def test_fill_leverage_tiers_binance_dryrun(default_conf, mocker): +def test_fill_leverage_tiers_binance_dryrun(default_conf, mocker, leverage_tiers): api_mock = MagicMock() default_conf['trading_mode'] = TradingMode.FUTURES default_conf['margin_mode'] = MarginMode.ISOLATED exchange = get_patched_exchange(mocker, default_conf, api_mock, id="binance") exchange.fill_leverage_tiers() - leverage_tiers = { - "1000SHIB/USDT": [ - { - 'min': 0, - 'max': 50000, - 'mmr': 0.01, - 'lev': 50, - 'maintAmt': 0.0 - }, - { - 'min': 50000, - 'max': 150000, - 'mmr': 0.025, - 'lev': 20, - 'maintAmt': 750.0 - }, - { - 'min': 150000, - 'max': 250000, - 'mmr': 0.05, - 'lev': 10, - 'maintAmt': 4500.0 - }, - { - 'min': 250000, - 'max': 500000, - 'mmr': 0.1, - 'lev': 5, - 'maintAmt': 17000.0 - }, - { - 'min': 500000, - 'max': 1000000, - 'mmr': 0.125, - 'lev': 4, - 'maintAmt': 29500.0 - }, - { - 'min': 1000000, - 'max': 2000000, - 'mmr': 0.25, - 'lev': 2, - 'maintAmt': 154500.0 - }, - { - 'min': 2000000, - 'max': 30000000, - 'mmr': 0.5, - 'lev': 1, - 'maintAmt': 654500.0 - }, - ], - "1INCH/USDT": [ - { - 'min': 0, - 'max': 5000, - 'mmr': 0.012, - 'lev': 50, - 'maintAmt': 0.0 - }, - { - 'min': 5000, - 'max': 25000, - 'mmr': 0.025, - 'lev': 20, - 'maintAmt': 65.0 - }, - { - 'min': 25000, - 'max': 100000, - 'mmr': 0.05, - 'lev': 10, - 'maintAmt': 690.0 - }, - { - 'min': 100000, - 'max': 250000, - 'mmr': 0.1, - 'lev': 5, - 'maintAmt': 5690.0 - }, - { - 'min': 250000, - 'max': 1000000, - 'mmr': 0.125, - 'lev': 2, - 'maintAmt': 11940.0 - }, - { - 'min': 1000000, - 'max': 100000000, - 'mmr': 0.5, - 'lev': 1, - 'maintAmt': 386940.0 - }, - ], - "AAVE/USDT": [ - { - 'min': 0, - 'max': 50000, - 'mmr': 0.01, - 'lev': 50, - 'maintAmt': 0.0 - }, - { - 'min': 50000, - 'max': 250000, - 'mmr': 0.02, - 'lev': 25, - 'maintAmt': 500.0 - }, - { - 'min': 250000, - 'max': 1000000, - 'mmr': 0.05, - 'lev': 10, - 'maintAmt': 8000.0 - }, - { - 'min': 1000000, - 'max': 2000000, - 'mmr': 0.1, - 'lev': 5, - 'maintAmt': 58000.0 - }, - { - 'min': 2000000, - 'max': 5000000, - 'mmr': 0.125, - 'lev': 4, - 'maintAmt': 108000.0 - }, - { - 'min': 5000000, - 'max': 10000000, - 'mmr': 0.1665, - 'lev': 3, - 'maintAmt': 315500.0 - }, - { - 'min': 10000000, - 'max': 20000000, - 'mmr': 0.25, - 'lev': 2, - 'maintAmt': 1150500.0 - }, - { - "min": 20000000, - "max": 50000000, - "mmr": 0.5, - "lev": 1, - "maintAmt": 6150500.0 - } - ], - "ADA/BUSD": [ - { - "min": 0, - "max": 100000, - "mmr": 0.025, - "lev": 20, - "maintAmt": 0.0 - }, - { - "min": 100000, - "max": 500000, - "mmr": 0.05, - "lev": 10, - "maintAmt": 2500.0 - }, - { - "min": 500000, - "max": 1000000, - "mmr": 0.1, - "lev": 5, - "maintAmt": 27500.0 - }, - { - "min": 1000000, - "max": 2000000, - "mmr": 0.15, - "lev": 3, - "maintAmt": 77500.0 - }, - { - "min": 2000000, - "max": 5000000, - "mmr": 0.25, - "lev": 2, - "maintAmt": 277500.0 - }, - { - "min": 5000000, - "max": 30000000, - "mmr": 0.5, - "lev": 1, - "maintAmt": 1527500.0 - }, - ] - } + leverage_tiers = leverage_tiers for key, value in leverage_tiers.items(): assert exchange._leverage_tiers[key] == value @@ -990,194 +618,13 @@ def test__ccxt_config(default_conf, mocker, trading_mode, margin_mode, config): def test_get_maintenance_ratio_and_amt_binance( default_conf, mocker, + leverage_tiers, pair, nominal_value, mm_ratio, amt, ): exchange = get_patched_exchange(mocker, default_conf, id="binance") - exchange._leverage_tiers = { - 'BNB/BUSD': [ - { - "min": 0, # stake(before leverage) = 0 - "max": 100000, # max stake(before leverage) = 5000 - "mmr": 0.025, - "lev": 20, - "maintAmt": 0.0 - }, - { - "min": 100000, # stake = 10000.0 - "max": 500000, # max_stake = 50000.0 - "mmr": 0.05, - "lev": 10, - "maintAmt": 2500.0 - }, - { - "min": 500000, # stake = 100000.0 - "max": 1000000, # max_stake = 200000.0 - "mmr": 0.1, - "lev": 5, - "maintAmt": 27500.0 - }, - { - "min": 1000000, # stake = 333333.3333333333 - "max": 2000000, # max_stake = 666666.6666666666 - "mmr": 0.15, - "lev": 3, - "maintAmt": 77500.0 - }, - { - "min": 2000000, # stake = 1000000.0 - "max": 5000000, # max_stake = 2500000.0 - "mmr": 0.25, - "lev": 2, - "maintAmt": 277500.0 - }, - { - "min": 5000000, # stake = 5000000.0 - "max": 30000000, # max_stake = 30000000.0 - "mmr": 0.5, - "lev": 1, - "maintAmt": 1527500.0 - } - ], - 'BNB/USDT': [ - { - "min": 0, # stake = 0.0 - "max": 10000, # max_stake = 133.33333333333334 - "mmr": 0.0065, - "lev": 75, - "maintAmt": 0.0 - }, - { - "min": 10000, # stake = 200.0 - "max": 50000, # max_stake = 1000.0 - "mmr": 0.01, - "lev": 50, - "maintAmt": 35.0 - }, - { - "min": 50000, # stake = 2000.0 - "max": 250000, # max_stake = 10000.0 - "mmr": 0.02, - "lev": 25, - "maintAmt": 535.0 - }, - { - "min": 250000, # stake = 25000.0 - "max": 1000000, # max_stake = 100000.0 - "mmr": 0.05, - "lev": 10, - "maintAmt": 8035.0 - }, - { - "min": 1000000, # stake = 200000.0 - "max": 2000000, # max_stake = 400000.0 - "mmr": 0.1, - "lev": 5, - "maintAmt": 58035.0 - }, - { - "min": 2000000, # stake = 500000.0 - "max": 5000000, # max_stake = 1250000.0 - "mmr": 0.125, - "lev": 4, - "maintAmt": 108035.0 - }, - { - "min": 5000000, # stake = 1666666.6666666667 - "max": 10000000, # max_stake = 3333333.3333333335 - "mmr": 0.15, - "lev": 3, - "maintAmt": 233035.0 - }, - { - "min": 10000000, # stake = 5000000.0 - "max": 20000000, # max_stake = 10000000.0 - "mmr": 0.25, - "lev": 2, - "maintAmt": 1233035.0 - }, - { - "min": 20000000, # stake = 20000000.0 - "max": 50000000, # max_stake = 50000000.0 - "mmr": 0.5, - "lev": 1, - "maintAmt": 6233035.0 - }, - ], - 'BTC/USDT': [ - { - "min": 0, # stake = 0.0 - "max": 50000, # max_stake = 400.0 - "mmr": 0.004, - "lev": 125, - "maintAmt": 0.0 - }, - { - "min": 50000, # stake = 500.0 - "max": 250000, # max_stake = 2500.0 - "mmr": 0.005, - "lev": 100, - "maintAmt": 50.0 - }, - { - "min": 250000, # stake = 5000.0 - "max": 1000000, # max_stake = 20000.0 - "mmr": 0.01, - "lev": 50, - "maintAmt": 1300.0 - }, - { - "min": 1000000, # stake = 50000.0 - "max": 7500000, # max_stake = 375000.0 - "mmr": 0.025, - "lev": 20, - "maintAmt": 16300.0 - }, - { - "min": 7500000, # stake = 750000.0 - "max": 40000000, # max_stake = 4000000.0 - "mmr": 0.05, - "lev": 10, - "maintAmt": 203800.0 - }, - { - "min": 40000000, # stake = 8000000.0 - "max": 100000000, # max_stake = 20000000.0 - "mmr": 0.1, - "lev": 5, - "maintAmt": 2203800.0 - }, - { - "min": 100000000, # stake = 25000000.0 - "max": 200000000, # max_stake = 50000000.0 - "mmr": 0.125, - "lev": 4, - "maintAmt": 4703800.0 - }, - { - "min": 200000000, # stake = 66666666.666666664 - "max": 400000000, # max_stake = 133333333.33333333 - "mmr": 0.15, - "lev": 3, - "maintAmt": 9703800.0 - }, - { - "min": 400000000, # stake = 200000000.0 - "max": 600000000, # max_stake = 300000000.0 - "mmr": 0.25, - "lev": 2, - "maintAmt": 4.97038E7 - }, - { - "min": 600000000, # stake = 600000000.0 - "max": 1000000000, # max_stake = 1000000000.0 - "mmr": 0.5, - "lev": 1, - "maintAmt": 1.997038E8 - }, - ] - } + exchange._leverage_tiers = leverage_tiers (result_ratio, result_amt) = exchange.get_maintenance_ratio_and_amt(pair, nominal_value) assert (round(result_ratio, 8), round(result_amt, 8)) == (mm_ratio, amt) diff --git a/tests/exchange/test_okex.py b/tests/exchange/test_okex.py index 5519d832a..997f65d27 100644 --- a/tests/exchange/test_okex.py +++ b/tests/exchange/test_okex.py @@ -35,7 +35,6 @@ def test_get_maintenance_ratio_and_amt_okex( }, { 'tier': 2, - # TODO-lev: What about a value between 2000 and 2001? 'notionalFloor': 2001, 'notionalCap': 4000, 'maintenanceMarginRatio': 0.015, @@ -148,7 +147,7 @@ def test_get_maintenance_ratio_and_amt_okex( assert exchange.get_maintenance_ratio_and_amt('DOGE/USDT:USDT', 2000) == (0.03, None) -def test_get_max_pair_stake_amount_okex(default_conf, mocker): +def test_get_max_pair_stake_amount_okex(default_conf, mocker, leverage_tiers): exchange = get_patched_exchange(mocker, default_conf, id="okex") assert exchange.get_max_pair_stake_amount('BNB/BUSD', 1.0) == float('inf') @@ -156,189 +155,7 @@ def test_get_max_pair_stake_amount_okex(default_conf, mocker): default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' exchange = get_patched_exchange(mocker, default_conf, id="okex") - exchange._leverage_tiers = { - 'BNB/BUSD': [ - { - "min": 0, # stake(before leverage) = 0 - "max": 100000, # max stake(before leverage) = 5000 - "mmr": 0.025, - "lev": 20, - "maintAmt": 0.0 - }, - { - "min": 100000, # stake = 10000.0 - "max": 500000, # max_stake = 50000.0 - "mmr": 0.05, - "lev": 10, - "maintAmt": 2500.0 - }, - { - "min": 500000, # stake = 100000.0 - "max": 1000000, # max_stake = 200000.0 - "mmr": 0.1, - "lev": 5, - "maintAmt": 27500.0 - }, - { - "min": 1000000, # stake = 333333.3333333333 - "max": 2000000, # max_stake = 666666.6666666666 - "mmr": 0.15, - "lev": 3, - "maintAmt": 77500.0 - }, - { - "min": 2000000, # stake = 1000000.0 - "max": 5000000, # max_stake = 2500000.0 - "mmr": 0.25, - "lev": 2, - "maintAmt": 277500.0 - }, - { - "min": 5000000, # stake = 5000000.0 - "max": 30000000, # max_stake = 30000000.0 - "mmr": 0.5, - "lev": 1, - "maintAmt": 1527500.0 - } - ], - 'BNB/USDT': [ - { - "min": 0, # stake = 0.0 - "max": 10000, # max_stake = 133.33333333333334 - "mmr": 0.0065, - "lev": 75, - "maintAmt": 0.0 - }, - { - "min": 10000, # stake = 200.0 - "max": 50000, # max_stake = 1000.0 - "mmr": 0.01, - "lev": 50, - "maintAmt": 35.0 - }, - { - "min": 50000, # stake = 2000.0 - "max": 250000, # max_stake = 10000.0 - "mmr": 0.02, - "lev": 25, - "maintAmt": 535.0 - }, - { - "min": 250000, # stake = 25000.0 - "max": 1000000, # max_stake = 100000.0 - "mmr": 0.05, - "lev": 10, - "maintAmt": 8035.0 - }, - { - "min": 1000000, # stake = 200000.0 - "max": 2000000, # max_stake = 400000.0 - "mmr": 0.1, - "lev": 5, - "maintAmt": 58035.0 - }, - { - "min": 2000000, # stake = 500000.0 - "max": 5000000, # max_stake = 1250000.0 - "mmr": 0.125, - "lev": 4, - "maintAmt": 108035.0 - }, - { - "min": 5000000, # stake = 1666666.6666666667 - "max": 10000000, # max_stake = 3333333.3333333335 - "mmr": 0.15, - "lev": 3, - "maintAmt": 233035.0 - }, - { - "min": 10000000, # stake = 5000000.0 - "max": 20000000, # max_stake = 10000000.0 - "mmr": 0.25, - "lev": 2, - "maintAmt": 1233035.0 - }, - { - "min": 20000000, # stake = 20000000.0 - "max": 50000000, # max_stake = 50000000.0 - "mmr": 0.5, - "lev": 1, - "maintAmt": 6233035.0 - }, - ], - 'BTC/USDT': [ - { - "min": 0, # stake = 0.0 - "max": 50000, # max_stake = 400.0 - "mmr": 0.004, - "lev": 125, - "maintAmt": 0.0 - }, - { - "min": 50000, # stake = 500.0 - "max": 250000, # max_stake = 2500.0 - "mmr": 0.005, - "lev": 100, - "maintAmt": 50.0 - }, - { - "min": 250000, # stake = 5000.0 - "max": 1000000, # max_stake = 20000.0 - "mmr": 0.01, - "lev": 50, - "maintAmt": 1300.0 - }, - { - "min": 1000000, # stake = 50000.0 - "max": 7500000, # max_stake = 375000.0 - "mmr": 0.025, - "lev": 20, - "maintAmt": 16300.0 - }, - { - "min": 7500000, # stake = 750000.0 - "max": 40000000, # max_stake = 4000000.0 - "mmr": 0.05, - "lev": 10, - "maintAmt": 203800.0 - }, - { - "min": 40000000, # stake = 8000000.0 - "max": 100000000, # max_stake = 20000000.0 - "mmr": 0.1, - "lev": 5, - "maintAmt": 2203800.0 - }, - { - "min": 100000000, # stake = 25000000.0 - "max": 200000000, # max_stake = 50000000.0 - "mmr": 0.125, - "lev": 4, - "maintAmt": 4703800.0 - }, - { - "min": 200000000, # stake = 66666666.666666664 - "max": 400000000, # max_stake = 133333333.33333333 - "mmr": 0.15, - "lev": 3, - "maintAmt": 9703800.0 - }, - { - "min": 400000000, # stake = 200000000.0 - "max": 600000000, # max_stake = 300000000.0 - "mmr": 0.25, - "lev": 2, - "maintAmt": 4.97038E7 - }, - { - "min": 600000000, # stake = 600000000.0 - "max": 1000000000, # max_stake = 1000000000.0 - "mmr": 0.5, - "lev": 1, - "maintAmt": 1.997038E8 - }, - ] - } + exchange._leverage_tiers = leverage_tiers assert exchange.get_max_pair_stake_amount('BNB/BUSD', 1.0) == 30000000 assert exchange.get_max_pair_stake_amount('BNB/USDT', 1.0) == 50000000 From 0b717fbace60529b4118604a109746854635546a Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 7 Feb 2022 04:18:02 -0600 Subject: [PATCH 08/70] okex.load_leverage_tiers --- freqtrade/exchange/okx.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 8a1c693a1..e1293fdfe 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -67,3 +67,6 @@ class Okx(Exchange): pair_tiers = self._leverage_tiers[pair] return pair_tiers[-1]['max'] / leverage + + def load_leverage_tiers(self) -> Dict[str, List[Dict]]: + return {} From 41d8330fbc95224020a046bd46eea6252374ee15 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 7 Feb 2022 04:19:18 -0600 Subject: [PATCH 09/70] freqtrade.exchange edited load_leverage_tiers --- freqtrade/exchange/exchange.py | 44 ++++++++++++++++------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index b264a2fcd..2608b45a6 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1857,37 +1857,33 @@ class Exchange: raise OperationalException(e) from e def load_leverage_tiers(self) -> Dict[str, List[Dict]]: - return self._api.fetch_leverage_tiers() + if self.trading_mode == TradingMode.FUTURES and self._api.has['fetchLeverageTiers']: + try: + return self._api.fetch_leverage_tiers() + except ccxt.DDoSProtection as e: + raise DDosProtection(e) from e + except (ccxt.NetworkError, ccxt.ExchangeError) as e: + raise TemporaryError( + f'Could not load leverage tiers due to {e.__class__.__name__}.' + f'Message: {e}' + ) from e + except ccxt.BaseError as e: + raise OperationalException(e) from e + else: + return {} @retrier def fill_leverage_tiers(self) -> None: """ Assigns property _leverage_tiers to a dictionary of information about the leverage allowed on each pair - After exectution, self._leverage_tiers = { - "pair_name": [ - [notional_floor, maintenenace_margin_ratio, maintenance_amt], - ... - ], - ... - } - e.g. { - "ETH/USDT:USDT": [ - [0.0, 0.01, 0.0], - [10000, 0.02, 0.01], - ... - ], - ... - } """ - if self._api.has['fetchLeverageTiers']: - if self.trading_mode == TradingMode.FUTURES: - leverage_tiers = self.load_leverage_tiers() - for pair, tiers in leverage_tiers.items(): - tiers = [] - for tier in tiers: - tiers.append(self.parse_leverage_tier(tier)) - self._leverage_tiers[pair] = tiers + leverage_tiers = self.load_leverage_tiers() + for pair, tiers in leverage_tiers.items(): + tiers = [] + for tier in tiers: + tiers.append(self.parse_leverage_tier(tier)) + self._leverage_tiers[pair] = tiers def parse_leverage_tier(self, tier) -> Dict: info = tier['info'] From 18b4d0be955e291ac862d7ac44b72d7858b70e79 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 7 Feb 2022 04:43:19 -0600 Subject: [PATCH 10/70] fixed error with exchange.fill_leverage_tiers --- freqtrade/exchange/binance.py | 6 ++---- freqtrade/exchange/exchange.py | 6 +++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 97a2fc574..d25a6a38f 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -252,12 +252,10 @@ class Binance(Exchange): Path(__file__).parent / 'binance_leverage_tiers.json' ) with open(leverage_tiers_path) as json_file: - leverage_tiers = json.load(json_file) - return leverage_tiers + return json.load(json_file) else: try: - leverage_tiers = self._api.fetch_leverage_tiers() - return leverage_tiers + return self._api.fetch_leverage_tiers() except ccxt.DDoSProtection as e: raise DDosProtection(e) from e except (ccxt.NetworkError, ccxt.ExchangeError) as e: diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 2608b45a6..8c584e177 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1880,10 +1880,10 @@ class Exchange: """ leverage_tiers = self.load_leverage_tiers() for pair, tiers in leverage_tiers.items(): - tiers = [] + pair_tiers = [] for tier in tiers: - tiers.append(self.parse_leverage_tier(tier)) - self._leverage_tiers[pair] = tiers + pair_tiers.append(self.parse_leverage_tier(tier)) + self._leverage_tiers[pair] = pair_tiers def parse_leverage_tier(self, tier) -> Dict: info = tier['info'] From fe56c8c91e11f72a1c7abadf0943e8d7baa843cd Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 7 Feb 2022 04:54:22 -0600 Subject: [PATCH 11/70] mock get_max_pair_stake_amount in test_execute_entry --- tests/test_freqtradebot.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 4f05535af..649e5bce3 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -776,6 +776,7 @@ def test_execute_entry(mocker, default_conf_usdt, fee, limit_order, }), create_order=enter_mm, get_min_pair_stake_amount=MagicMock(return_value=1), + get_max_pair_stake_amount=MagicMock(return_value=500000), get_fee=fee, get_funding_fees=MagicMock(return_value=0), name=exchange_name, From a0264f065156d25bfa97437e0eff5489b6d6ebdb Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 7 Feb 2022 04:57:39 -0600 Subject: [PATCH 12/70] test_get_max_pair_stake_amount with leverage --- tests/exchange/test_exchange.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 322be3e02..9730a9fb4 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4211,6 +4211,7 @@ def test_get_max_pair_stake_amount( mocker.patch('freqtrade.exchange.Exchange.markets', markets) assert exchange.get_max_pair_stake_amount('XRP/USDT:USDT', 2.0) == 20000 + assert exchange.get_max_pair_stake_amount('XRP/USDT:USDT', 2.0, 5) == 4000 assert exchange.get_max_pair_stake_amount('LTC/USDT:USDT', 2.0) == float('inf') assert exchange.get_max_pair_stake_amount('ETH/USDT:USDT', 2.0) == 200 assert exchange.get_max_pair_stake_amount('DOGE/USDT:USDT', 2.0) == 500 From 3ebda1d29d386c483f25a5b2ffc1d65b12cf064d Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 7 Feb 2022 05:03:10 -0600 Subject: [PATCH 13/70] Added test templated --- tests/exchange/test_binance.py | 9 ++++++++ tests/exchange/test_ccxt_compat.py | 16 +++++++++++++ tests/exchange/test_exchange.py | 37 ++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index d4c98fd63..98e19616d 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -628,3 +628,12 @@ def test_get_maintenance_ratio_and_amt_binance( exchange._leverage_tiers = leverage_tiers (result_ratio, result_amt) = exchange.get_maintenance_ratio_and_amt(pair, nominal_value) assert (round(result_ratio, 8), round(result_amt, 8)) == (mm_ratio, amt) + + +def test_load_leverage_tiers_binance(mocker, default_conf, leverage_tiers): + # TODO-lev + api_mock = MagicMock() + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, api_mock) + assert exchange diff --git a/tests/exchange/test_ccxt_compat.py b/tests/exchange/test_ccxt_compat.py index 0e78a9133..1e3f9972b 100644 --- a/tests/exchange/test_ccxt_compat.py +++ b/tests/exchange/test_ccxt_compat.py @@ -341,6 +341,7 @@ class TestCCXTExchange(): def test_get_max_leverage_futures(self, exchange_futures): futures, futures_name = exchange_futures + # TODO-lev: binance, gateio, and okex test if futures: leverage_in_market_futures = EXCHANGES[futures_name]['leverage_in_market']['futures'] if leverage_in_market_futures: @@ -362,3 +363,18 @@ class TestCCXTExchange(): contract_size = futures._get_contract_size(futures_pair) assert (isinstance(contract_size, float) or isinstance(contract_size, int)) assert contract_size >= 0.0 + + def test_get_liquidation_price_compat(): + return # TODO-lev + + def test_liquidation_price_compat(): + return # TODO-lev + + def test_get_max_pair_stake_amount_compat(): + return # TODO-lev + + def test_load_leverage_tiers_compat(): + return # TODO-lev + + def test_get_maintenance_ratio_and_amt_compat(): + return # TODO-lev diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 9730a9fb4..b447704b3 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -3561,6 +3561,7 @@ def test__ccxt_config( ("TKN/USDT", 210.30, 1.0), ]) def test_get_max_leverage(default_conf, mocker, pair, nominal_value, max_lev): + # TODO-lev: Branch coverage default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' exchange = get_patched_exchange(mocker, default_conf, id="gateio") @@ -4222,3 +4223,39 @@ def test_get_max_pair_stake_amount( mocker.patch('freqtrade.exchange.Exchange.markets', markets) assert exchange.get_max_pair_stake_amount('BTC/USDT', 2.0) == 20000 assert exchange.get_max_pair_stake_amount('ADA/USDT', 2.0) == 500 + + +def test_load_leverage_tiers(mocker, default_conf, leverage_tiers): + # TODO-lev + api_mock = MagicMock() + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, api_mock) + assert exchange + + +def test_parse_leverage_tier(mocker, default_conf, leverage_tiers): + # TODO-lev + api_mock = MagicMock() + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, api_mock) + assert exchange + + +def test_get_leverage_tiers_for_pair(mocker, default_conf, leverage_tiers): + # TODO-lev + api_mock = MagicMock() + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, api_mock) + assert exchange + + +def test_get_maintenance_ratio_and_amt(mocker, default_conf, leverage_tiers): + # TODO-lev + api_mock = MagicMock() + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, api_mock) + assert exchange From 98f32e89647d0f9eeea44a9151685296008b079e Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 7 Feb 2022 06:27:20 -0600 Subject: [PATCH 14/70] fixed failing test_get_max_leverage --- tests/exchange/test_exchange.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index b447704b3..ab792e675 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -3564,8 +3564,9 @@ def test_get_max_leverage(default_conf, mocker, pair, nominal_value, max_lev): # TODO-lev: Branch coverage default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' - exchange = get_patched_exchange(mocker, default_conf, id="gateio") - exchange._api.has['fetchLeverageTiers'] = False + api_mock = MagicMock() + type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': False}) + exchange = get_patched_exchange(mocker, default_conf, api_mock, id="gateio") assert exchange.get_max_leverage(pair, nominal_value) == max_lev @@ -4231,7 +4232,22 @@ def test_load_leverage_tiers(mocker, default_conf, leverage_tiers): default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' exchange = get_patched_exchange(mocker, default_conf, api_mock) - assert exchange + + api_mock = MagicMock() + api_mock.set_margin_mode = MagicMock() + type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) + default_conf['dry_run'] = False + + ccxt_exceptionhandlers( + mocker, + default_conf, + api_mock, + "binance", + "set_margin_mode", + "set_margin_mode", + pair="XRP/USDT", + margin_mode=margin_mode + ) def test_parse_leverage_tier(mocker, default_conf, leverage_tiers): From eb72e5cc42a9706fea445c671746791d5f652b2f Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 7 Feb 2022 07:09:29 -0600 Subject: [PATCH 15/70] Added some exchange leverage tier tests --- freqtrade/exchange/exchange.py | 7 +- tests/exchange/test_binance.py | 9 --- tests/exchange/test_exchange.py | 126 ++++++++++++++++++++++++++------ 3 files changed, 110 insertions(+), 32 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 8c584e177..b677e7bd1 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2247,11 +2247,16 @@ class Exchange: raise OperationalException( "Freqtrade only supports isolated futures for leverage trading") + @retrier def get_leverage_tiers_for_pair(self, pair: str): # When exchanges can load all their leverage tiers at once in the constructor # then this method does nothing, it should only be implemented when the leverage # tiers requires per symbol fetching to avoid excess api calls - if not self._ft_has['can_fetch_multiple_tiers']: + if ( + self._api.has['fetchLeverageTiers'] and + not self._ft_has['can_fetch_multiple_tiers'] and + self.trading_mode == TradingMode.FUTURES + ): try: return self._api.fetch_leverage_tiers(pair) except ccxt.BadRequest: diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index 98e19616d..d4c98fd63 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -628,12 +628,3 @@ def test_get_maintenance_ratio_and_amt_binance( exchange._leverage_tiers = leverage_tiers (result_ratio, result_amt) = exchange.get_maintenance_ratio_and_amt(pair, nominal_value) assert (round(result_ratio, 8), round(result_amt, 8)) == (mm_ratio, amt) - - -def test_load_leverage_tiers_binance(mocker, default_conf, leverage_tiers): - # TODO-lev - api_mock = MagicMock() - default_conf['trading_mode'] = 'futures' - default_conf['margin_mode'] = 'isolated' - exchange = get_patched_exchange(mocker, default_conf, api_mock) - assert exchange diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index ab792e675..2fb1c85ad 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -3560,8 +3560,7 @@ def test__ccxt_config( ("LTC/BTC", 0.0, 1.0), ("TKN/USDT", 210.30, 1.0), ]) -def test_get_max_leverage(default_conf, mocker, pair, nominal_value, max_lev): - # TODO-lev: Branch coverage +def test_get_max_leverage_from_markets(default_conf, mocker, pair, nominal_value, max_lev): default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' api_mock = MagicMock() @@ -3570,6 +3569,11 @@ def test_get_max_leverage(default_conf, mocker, pair, nominal_value, max_lev): assert exchange.get_max_leverage(pair, nominal_value) == max_lev +def test_get_max_leverage_from_tiers(default_conf, mocker): + # TODO-lev: + return + + @pytest.mark.parametrize( 'size,funding_rate,mark_price,time_in_ratio,funding_fee,kraken_fee', [ (10, 0.0001, 2.0, 1.0, 0.002, 0.002), @@ -4227,45 +4231,123 @@ def test_get_max_pair_stake_amount( def test_load_leverage_tiers(mocker, default_conf, leverage_tiers): - # TODO-lev api_mock = MagicMock() - default_conf['trading_mode'] = 'futures' - default_conf['margin_mode'] = 'isolated' - exchange = get_patched_exchange(mocker, default_conf, api_mock) - - api_mock = MagicMock() - api_mock.set_margin_mode = MagicMock() + api_mock.fetch_leverage_tiers = MagicMock() type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) default_conf['dry_run'] = False + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' ccxt_exceptionhandlers( mocker, default_conf, api_mock, "binance", - "set_margin_mode", - "set_margin_mode", - pair="XRP/USDT", - margin_mode=margin_mode + "load_leverage_tiers", + "fetch_leverage_tiers", ) -def test_parse_leverage_tier(mocker, default_conf, leverage_tiers): - # TODO-lev - api_mock = MagicMock() - default_conf['trading_mode'] = 'futures' - default_conf['margin_mode'] = 'isolated' - exchange = get_patched_exchange(mocker, default_conf, api_mock) - assert exchange +def test_parse_leverage_tier(mocker, default_conf): + exchange = get_patched_exchange(mocker, default_conf) + + tier = { + "tier": 1, + "notionalFloor": 0, + "notionalCap": 100000, + "maintenanceMarginRatio": 0.025, + "maxLeverage": 20, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + } + + assert exchange.parse_leverage_tier(tier) == { + "min": 0, + "max": 100000, + "mmr": 0.025, + "lev": 20, + "maintAmt": 0.0, + } + + tier2 = { + 'tier': 1, + 'notionalFloor': 0, + 'notionalCap': 2000, + 'maintenanceMarginRatio': 0.01, + 'maxLeverage': 75, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.013', + 'instId': '', + 'maxLever': '75', + 'maxSz': '2000', + 'minSz': '0', + 'mmr': '0.01', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '1', + 'uly': 'SHIB-USDT' + } + } + + assert exchange.parse_leverage_tier(tier2) == { + 'min': 0, + 'max': 2000, + 'mmr': 0.01, + 'lev': 75, + "maintAmt": None, + } def test_get_leverage_tiers_for_pair(mocker, default_conf, leverage_tiers): - # TODO-lev + api_mock = MagicMock() + api_mock.fetch_leverage_tiers = MagicMock() + # Spot + type(api_mock)._ft_has = PropertyMock(return_value={'fetchLeverageTiers': True}) + exchange = get_patched_exchange(mocker, default_conf, api_mock) + exchange._ft_has['can_fetch_multiple_tiers'] = False + assert exchange.get_leverage_tiers_for_pair('ADA/USDT') is None + + # 'can_fetch_multiple_tiers': True default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' + type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) exchange = get_patched_exchange(mocker, default_conf, api_mock) - assert exchange + exchange._ft_has['can_fetch_multiple_tiers'] = True + assert exchange.get_leverage_tiers_for_pair('ADA/USDT:USDT') is None + + # 'fetchLeverageTiers': False + type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': False}) + exchange = get_patched_exchange(mocker, default_conf, api_mock) + exchange._ft_has['can_fetch_multiple_tiers'] = False + assert exchange.get_leverage_tiers_for_pair('ADA/USDT:USDT') is None + + # 'fetchLeverageTiers': False + type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) + exchange = get_patched_exchange(mocker, default_conf, api_mock) + exchange._ft_has['can_fetch_multiple_tiers'] = False + assert exchange.get_leverage_tiers_for_pair('ADA/USDT:USDT') is not None + + type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) + default_conf['dry_run'] = False + exchange = get_patched_exchange(mocker, default_conf, api_mock) + + ccxt_exceptionhandlers( + mocker, + default_conf, + api_mock, + "binance", + "get_leverage_tiers_for_pair", + "fetch_leverage_tiers", + pair='ETH/USDT:USDT', + ) def test_get_maintenance_ratio_and_amt(mocker, default_conf, leverage_tiers): From 5f07546b8655c23af90b07229d88b99ddd71b900 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 9 Feb 2022 03:18:32 -0600 Subject: [PATCH 16/70] moved leverage_tier caching to get_leverage_tiers_for_pair --- freqtrade/exchange/exchange.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index b677e7bd1..210f7d7e7 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1911,12 +1911,12 @@ class Exchange: if stake_amount is None: raise OperationalException( 'binance.get_max_leverage requires argument stake_amount') + if pair not in self._leverage_tiers: tiers = self.get_leverage_tiers_for_pair(pair) if not tiers: # Not a leveraged market return 1.0 - else: - self._leverage_tiers[pair] = tiers + if stake_amount == 0: return self._leverage_tiers[pair][0]['lev'] # Max lev for lowest amount @@ -2248,7 +2248,7 @@ class Exchange: "Freqtrade only supports isolated futures for leverage trading") @retrier - def get_leverage_tiers_for_pair(self, pair: str): + def get_leverage_tiers_for_pair(self, pair: str) -> List: # When exchanges can load all their leverage tiers at once in the constructor # then this method does nothing, it should only be implemented when the leverage # tiers requires per symbol fetching to avoid excess api calls @@ -2257,12 +2257,17 @@ class Exchange: not self._ft_has['can_fetch_multiple_tiers'] and self.trading_mode == TradingMode.FUTURES ): + self._leverage_tiers[pair] = [] try: - return self._api.fetch_leverage_tiers(pair) + tiers = self._api.fetch_leverage_tiers(pair) + for tier in tiers[pair]: + self._leverage_tiers[pair].append(self.parse_leverage_tier(tier)) + + return tiers except ccxt.BadRequest: - return None + return [] else: - return None + return [] def get_maintenance_ratio_and_amt( self, @@ -2285,10 +2290,6 @@ class Exchange: tiers = self.get_leverage_tiers_for_pair(pair) if not bool(tiers): raise InvalidOrderException(f"Cannot calculate liquidation price for {pair}") - else: - self._leverage_tiers[pair] = [] - for tier in tiers[pair]: - self._leverage_tiers[pair].append(self.parse_leverage_tier(tier)) pair_tiers = self._leverage_tiers[pair] for tier in reversed(pair_tiers): if nominal_value >= tier['min']: From f3cb7e90e093b197b3e26ca1b62598075823f983 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 9 Feb 2022 03:20:27 -0600 Subject: [PATCH 17/70] moved get_leverage_tiers_for_pair to be with other leverage_tier methods --- freqtrade/exchange/exchange.py | 54 +++++++++++++++++----------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 210f7d7e7..4c01ec8b5 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1895,6 +1895,28 @@ class Exchange: 'maintAmt': float(info['cum']) if 'cum' in info else None, } + @retrier + def get_leverage_tiers_for_pair(self, pair: str) -> List: + # When exchanges can load all their leverage tiers at once in the constructor + # then this method does nothing, it should only be implemented when the leverage + # tiers requires per symbol fetching to avoid excess api calls + if ( + self._api.has['fetchLeverageTiers'] and + not self._ft_has['can_fetch_multiple_tiers'] and + self.trading_mode == TradingMode.FUTURES + ): + self._leverage_tiers[pair] = [] + try: + tiers = self._api.fetch_leverage_tiers(pair) + for tier in tiers[pair]: + self._leverage_tiers[pair].append(self.parse_leverage_tier(tier)) + + return tiers + except ccxt.BadRequest: + return [] + else: + return [] + def get_max_leverage(self, pair: str, stake_amount: Optional[float]) -> float: """ Returns the maximum leverage that a pair can be traded at @@ -2247,33 +2269,11 @@ class Exchange: raise OperationalException( "Freqtrade only supports isolated futures for leverage trading") - @retrier - def get_leverage_tiers_for_pair(self, pair: str) -> List: - # When exchanges can load all their leverage tiers at once in the constructor - # then this method does nothing, it should only be implemented when the leverage - # tiers requires per symbol fetching to avoid excess api calls - if ( - self._api.has['fetchLeverageTiers'] and - not self._ft_has['can_fetch_multiple_tiers'] and - self.trading_mode == TradingMode.FUTURES - ): - self._leverage_tiers[pair] = [] - try: - tiers = self._api.fetch_leverage_tiers(pair) - for tier in tiers[pair]: - self._leverage_tiers[pair].append(self.parse_leverage_tier(tier)) - - return tiers - except ccxt.BadRequest: - return [] - else: - return [] - - def get_maintenance_ratio_and_amt( - self, - pair: str, - nominal_value: Optional[float] = 0.0, - ) -> Tuple[float, Optional[float]]: + def get_maintenance_ratio_and_amt( + self, + pair: str, + nominal_value: Optional[float] = 0.0, + ) -> Tuple[float, Optional[float]]: """ :param pair: Market symbol :param nominal_value: The total trade amount in quote currency including leverage From e987e0e2a945d8926b07a605caa3d90c77a85392 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 9 Feb 2022 03:38:25 -0600 Subject: [PATCH 18/70] exchange minor fixes --- freqtrade/exchange/exchange.py | 10 +++++----- tests/test_freqtradebot.py | 4 ++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 4c01ec8b5..14b2da4df 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2269,11 +2269,11 @@ class Exchange: raise OperationalException( "Freqtrade only supports isolated futures for leverage trading") - def get_maintenance_ratio_and_amt( - self, - pair: str, - nominal_value: Optional[float] = 0.0, - ) -> Tuple[float, Optional[float]]: + def get_maintenance_ratio_and_amt( + self, + pair: str, + nominal_value: Optional[float] = 0.0, + ) -> Tuple[float, Optional[float]]: """ :param pair: Market symbol :param nominal_value: The total trade amount in quote currency including leverage diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 649e5bce3..84916622a 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -782,6 +782,10 @@ def test_execute_entry(mocker, default_conf_usdt, fee, limit_order, name=exchange_name, get_maintenance_ratio_and_amt=MagicMock(return_value=(0.01, 0.01)), ) + mocker.patch.multiple( + 'freqtrade.exchange.Okex', + get_max_pair_stake_amount=MagicMock(return_value=500000), + ) pair = 'ETH/USDT' assert not freqtrade.execute_entry(pair, stake_amount, is_short=is_short) From fa2c9fc51fe57627a29797fdc05e3ee32e0f0bda Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 9 Feb 2022 04:57:43 -0600 Subject: [PATCH 19/70] replaced mmr_key with unified maintenanceMarginRate --- freqtrade/exchange/exchange.py | 13 +++++-------- freqtrade/exchange/gateio.py | 1 - 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 14b2da4df..d46c141df 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -74,7 +74,6 @@ class Exchange: "mark_ohlcv_price": "mark", "mark_ohlcv_timeframe": "8h", "ccxt_futures_name": "swap", - "mmr_key": None, "can_fetch_multiple_tiers": True, } _ft_has: Dict = {} @@ -2284,6 +2283,7 @@ class Exchange: raise OperationalException( f"nominal value is required for {self.name}.get_maintenance_ratio_and_amt" ) + if self._api.has['fetchLeverageTiers']: if pair not in self._leverage_tiers: # Used when fetchLeverageTiers cannot fetch all symbols at once @@ -2298,15 +2298,12 @@ class Exchange: # The lowest notional_floor for any pair in fetch_leverage_tiers is always 0 because it # describes the min amt for a tier, and the lowest tier will always go down to 0 else: - info = self.markets[pair]['info'] - mmr_key = self._ft_has['mmr_key'] - if mmr_key and mmr_key in info: - return (float(info[mmr_key]), None) - else: + mmr = self.markets[pair]['maintenanceMarginRate'] + if mmr is None: raise OperationalException( - f"Cannot fetch maintenance margin. Dry-run for freqtrade {self.trading_mode}" - f"is not available for {self.name}" + f"Maintenance margin rate is unavailable for {self.name}" ) + return (mmr, None) def is_exchange_known_ccxt(exchange_name: str, ccxt_module: CcxtModuleType = None) -> bool: diff --git a/freqtrade/exchange/gateio.py b/freqtrade/exchange/gateio.py index 57ff29924..1c5b43cb7 100644 --- a/freqtrade/exchange/gateio.py +++ b/freqtrade/exchange/gateio.py @@ -23,7 +23,6 @@ class Gateio(Exchange): _ft_has: Dict = { "ohlcv_candle_limit": 1000, "ohlcv_volume_currency": "quote", - "mmr_key": "maintenance_rate", } _headers = {'X-Gate-Channel-Id': 'freqtrade'} From 3b43d42eaa3d8e11ee4041ab4c9acde67e70806a Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Thu, 10 Feb 2022 03:31:16 -0600 Subject: [PATCH 20/70] Updated exchange tests --- tests/conftest.py | 1 + tests/exchange/test_exchange.py | 8 ++++---- tests/exchange/test_gateio.py | 10 ++++------ tests/exchange/test_okex.py | 2 +- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index f87dcf83d..346d8fb8c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1135,6 +1135,7 @@ def get_markets(): 'taker': 0.0006, 'maker': 0.0002, 'contractSize': 10, + 'maintenanceMarginRate': 0.02, 'active': True, 'expiry': None, 'expiryDatetime': None, diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 2fb1c85ad..dca9ee994 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4313,7 +4313,7 @@ def test_get_leverage_tiers_for_pair(mocker, default_conf, leverage_tiers): type(api_mock)._ft_has = PropertyMock(return_value={'fetchLeverageTiers': True}) exchange = get_patched_exchange(mocker, default_conf, api_mock) exchange._ft_has['can_fetch_multiple_tiers'] = False - assert exchange.get_leverage_tiers_for_pair('ADA/USDT') is None + assert exchange.get_leverage_tiers_for_pair('ADA/USDT') == [] # 'can_fetch_multiple_tiers': True default_conf['trading_mode'] = 'futures' @@ -4321,19 +4321,19 @@ def test_get_leverage_tiers_for_pair(mocker, default_conf, leverage_tiers): type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) exchange = get_patched_exchange(mocker, default_conf, api_mock) exchange._ft_has['can_fetch_multiple_tiers'] = True - assert exchange.get_leverage_tiers_for_pair('ADA/USDT:USDT') is None + assert exchange.get_leverage_tiers_for_pair('ADA/USDT:USDT') == [] # 'fetchLeverageTiers': False type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': False}) exchange = get_patched_exchange(mocker, default_conf, api_mock) exchange._ft_has['can_fetch_multiple_tiers'] = False - assert exchange.get_leverage_tiers_for_pair('ADA/USDT:USDT') is None + assert exchange.get_leverage_tiers_for_pair('ADA/USDT:USDT') == [] # 'fetchLeverageTiers': False type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) exchange = get_patched_exchange(mocker, default_conf, api_mock) exchange._ft_has['can_fetch_multiple_tiers'] = False - assert exchange.get_leverage_tiers_for_pair('ADA/USDT:USDT') is not None + assert exchange.get_leverage_tiers_for_pair('ADA/USDT:USDT') != [] type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) default_conf['dry_run'] = False diff --git a/tests/exchange/test_gateio.py b/tests/exchange/test_gateio.py index f344ee7cb..d8c9d12b6 100644 --- a/tests/exchange/test_gateio.py +++ b/tests/exchange/test_gateio.py @@ -46,18 +46,16 @@ def test_get_maintenance_ratio_and_amt_gateio(default_conf, mocker, pair, mm_rat 'ETH/USDT:USDT': { 'taker': 0.0000075, 'maker': -0.0000025, - 'info': { - 'maintenance_rate': '0.005', - }, + 'maintenanceMarginRate': 0.005, + 'info': {}, 'id': 'ETH_USDT', 'symbol': 'ETH/USDT:USDT', }, 'ADA/USDT:USDT': { 'taker': 0.0000075, 'maker': -0.0000025, - 'info': { - 'maintenance_rate': '0.003', - }, + 'maintenanceMarginRate': 0.003, + 'info': {}, 'id': 'ADA_USDT', 'symbol': 'ADA/USDT:USDT', }, diff --git a/tests/exchange/test_okex.py b/tests/exchange/test_okex.py index 997f65d27..9f9d02d09 100644 --- a/tests/exchange/test_okex.py +++ b/tests/exchange/test_okex.py @@ -10,7 +10,7 @@ def test_get_maintenance_ratio_and_amt_okex( api_mock = MagicMock() default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' - default_conf['dry_run'] = True + default_conf['dry_run'] = False api_mock.fetch_leverage_tiers = MagicMock(return_value={ 'SHIB/USDT:USDT': [ { From 41ab20d9495251041651f232cad553a6c2fd1a28 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Thu, 10 Feb 2022 03:44:22 -0600 Subject: [PATCH 21/70] get_max_leverage checks if the number of tiers is < 1 --- freqtrade/exchange/exchange.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index d46c141df..018182502 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1931,7 +1931,8 @@ class Exchange: # Checks and edge cases if stake_amount is None: raise OperationalException( - 'binance.get_max_leverage requires argument stake_amount') + f'{self.name}.get_max_leverage requires argument stake_amount' + ) if pair not in self._leverage_tiers: tiers = self.get_leverage_tiers_for_pair(pair) @@ -1944,6 +1945,9 @@ class Exchange: pair_tiers = self._leverage_tiers[pair] num_tiers = len(pair_tiers) + if num_tiers < 1: + return 1.0 + for tier_index in range(num_tiers): tier = pair_tiers[tier_index] From 9e599455e7400a6bf67a02eb88c1c3dea5a20688 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Thu, 10 Feb 2022 03:44:37 -0600 Subject: [PATCH 22/70] test_execute_entry mocks get_max_leverage --- tests/test_freqtradebot.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 84916622a..0cb2d46f5 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -781,6 +781,7 @@ def test_execute_entry(mocker, default_conf_usdt, fee, limit_order, get_funding_fees=MagicMock(return_value=0), name=exchange_name, get_maintenance_ratio_and_amt=MagicMock(return_value=(0.01, 0.01)), + get_max_leverage=MagicMock(return_value=10), ) mocker.patch.multiple( 'freqtrade.exchange.Okex', From 60a45ff394a8184356934767b6afff03959d456b Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Thu, 10 Feb 2022 04:06:02 -0600 Subject: [PATCH 23/70] exchange.get_max_leverage de-complex --- freqtrade/exchange/exchange.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 018182502..a99a161b6 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1935,19 +1935,16 @@ class Exchange: ) if pair not in self._leverage_tiers: - tiers = self.get_leverage_tiers_for_pair(pair) - if not tiers: # Not a leveraged market - return 1.0 - - if stake_amount == 0: - return self._leverage_tiers[pair][0]['lev'] # Max lev for lowest amount + self.get_leverage_tiers_for_pair(pair) pair_tiers = self._leverage_tiers[pair] num_tiers = len(pair_tiers) - if num_tiers < 1: return 1.0 + if stake_amount == 0: + return self._leverage_tiers[pair][0]['lev'] # Max lev for lowest amount + for tier_index in range(num_tiers): tier = pair_tiers[tier_index] From 4a1ed017085960b3be71d86ce484e0ca61f8cc58 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Thu, 10 Feb 2022 05:04:29 -0600 Subject: [PATCH 24/70] get_maintenance_ratio_and_amt tests --- freqtrade/exchange/exchange.py | 6 +---- tests/exchange/test_exchange.py | 43 ++++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index a99a161b6..04967b532 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2272,7 +2272,7 @@ class Exchange: def get_maintenance_ratio_and_amt( self, pair: str, - nominal_value: Optional[float] = 0.0, + nominal_value: float = 0.0, ) -> Tuple[float, Optional[float]]: """ :param pair: Market symbol @@ -2280,10 +2280,6 @@ class Exchange: maintenance amount only on Binance :return: (maintenance margin ratio, maintenance amount) """ - if nominal_value is None: - raise OperationalException( - f"nominal value is required for {self.name}.get_maintenance_ratio_and_amt" - ) if self._api.has['fetchLeverageTiers']: if pair not in self._leverage_tiers: diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index dca9ee994..ce9d467c9 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4350,10 +4350,47 @@ def test_get_leverage_tiers_for_pair(mocker, default_conf, leverage_tiers): ) -def test_get_maintenance_ratio_and_amt(mocker, default_conf, leverage_tiers): - # TODO-lev +def test_get_maintenance_ratio_and_amt_exceptions(mocker, default_conf, leverage_tiers): api_mock = MagicMock() default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' exchange = get_patched_exchange(mocker, default_conf, api_mock) - assert exchange + pair = '1000SHIB/USDT' + + exchange._leverage_tiers = {} + exchange.get_leverage_tiers_for_pair = MagicMock(return_value=[]) + + with pytest.raises( + InvalidOrderException, + match=f"Cannot calculate liquidation price for {pair}", + ): + exchange.get_maintenance_ratio_and_amt(pair, 10000) + + exchange._leverage_tiers = leverage_tiers + with pytest.raises( + OperationalException, + match='nominal value can not be lower than 0', + ): + exchange.get_maintenance_ratio_and_amt(pair, -1) + + +@pytest.mark.parametrize('pair,value,mmr,maintAmt', [ + ('ADA/BUSD', 500, 0.025, 0.0), + ('ADA/BUSD', 20000000, 0.5, 1527500.0), + ('ZEC/USDT', 500, 0.01, 0.0), + ('ZEC/USDT', 20000000, 0.5, 654500.0), +]) +def test_get_maintenance_ratio_and_amt( + mocker, + default_conf, + leverage_tiers, + pair, + value, + mmr, + maintAmt +): + api_mock = MagicMock() + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, api_mock) + exchange.get_maintenance_ratio_and_amt(pair, value) == (mmr, maintAmt) From a6043e6a856b1a7f75f111ecc64c7c15e501c37f Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Thu, 10 Feb 2022 05:12:41 -0600 Subject: [PATCH 25/70] get_max_leverage test clean up --- tests/exchange/test_binance.py | 2 +- tests/exchange/test_exchange.py | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index d4c98fd63..a5116920c 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -192,7 +192,7 @@ def test_get_max_leverage_binance(default_conf, mocker, leverage_tiers): assert exchange.get_max_leverage("BTC/USDT", 300000000) == 2.0 assert exchange.get_max_leverage("BTC/USDT", 600000000) == 1.0 # Last tier - assert exchange.get_max_leverage("ETC/USDT", 200) == 1.0 # Pair not in leverage_tiers + assert exchange.get_max_leverage("SPONGE/USDT", 200) == 1.0 # Pair not in leverage_tiers assert exchange.get_max_leverage("BTC/USDT", 0.0) == 125.0 # No stake amount with pytest.raises( InvalidOrderException, diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index ce9d467c9..d692baceb 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -3569,11 +3569,6 @@ def test_get_max_leverage_from_markets(default_conf, mocker, pair, nominal_value assert exchange.get_max_leverage(pair, nominal_value) == max_lev -def test_get_max_leverage_from_tiers(default_conf, mocker): - # TODO-lev: - return - - @pytest.mark.parametrize( 'size,funding_rate,mark_price,time_in_ratio,funding_fee,kraken_fee', [ (10, 0.0001, 2.0, 1.0, 0.002, 0.002), From 03b3756e4b09892dcb2d489c001d81c8c7fcd844 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Thu, 10 Feb 2022 06:10:15 -0600 Subject: [PATCH 26/70] strengthened and fixed leverage_tier tests --- freqtrade/exchange/exchange.py | 56 +++++++++-------- tests/exchange/test_binance.py | 1 - tests/exchange/test_exchange.py | 103 +++++++++++++++++++++++++------- tests/exchange/test_gateio.py | 34 ++++++++--- 4 files changed, 140 insertions(+), 54 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 04967b532..86da18017 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1899,22 +1899,22 @@ class Exchange: # When exchanges can load all their leverage tiers at once in the constructor # then this method does nothing, it should only be implemented when the leverage # tiers requires per symbol fetching to avoid excess api calls - if ( - self._api.has['fetchLeverageTiers'] and - not self._ft_has['can_fetch_multiple_tiers'] and - self.trading_mode == TradingMode.FUTURES - ): + if pair not in self._leverage_tiers: self._leverage_tiers[pair] = [] - try: - tiers = self._api.fetch_leverage_tiers(pair) - for tier in tiers[pair]: - self._leverage_tiers[pair].append(self.parse_leverage_tier(tier)) + if ( + self._api.has['fetchLeverageTiers'] and + not self._ft_has['can_fetch_multiple_tiers'] and + self.trading_mode == TradingMode.FUTURES + ): + try: + tiers = self._api.fetch_leverage_tiers(pair) + for tier in tiers[pair]: + self._leverage_tiers[pair].append(self.parse_leverage_tier(tier)) - return tiers - except ccxt.BadRequest: - return [] - else: - return [] + except ccxt.BadRequest: + return [] + + return self._leverage_tiers[pair] def get_max_leverage(self, pair: str, stake_amount: Optional[float]) -> float: """ @@ -1934,10 +1934,7 @@ class Exchange: f'{self.name}.get_max_leverage requires argument stake_amount' ) - if pair not in self._leverage_tiers: - self.get_leverage_tiers_for_pair(pair) - - pair_tiers = self._leverage_tiers[pair] + pair_tiers = self.get_leverage_tiers_for_pair(pair) num_tiers = len(pair_tiers) if num_tiers < 1: return 1.0 @@ -2282,23 +2279,30 @@ class Exchange: """ if self._api.has['fetchLeverageTiers']: - if pair not in self._leverage_tiers: - # Used when fetchLeverageTiers cannot fetch all symbols at once - tiers = self.get_leverage_tiers_for_pair(pair) - if not bool(tiers): - raise InvalidOrderException(f"Cannot calculate liquidation price for {pair}") - pair_tiers = self._leverage_tiers[pair] + + pair_tiers = self.get_leverage_tiers_for_pair(pair) + + if len(pair_tiers) < 1: + raise InvalidOrderException( + f"Maintenance margin rate for {pair} is unavailable for {self.name}" + ) + for tier in reversed(pair_tiers): if nominal_value >= tier['min']: return (tier['mmr'], tier['maintAmt']) + raise OperationalException("nominal value can not be lower than 0") # The lowest notional_floor for any pair in fetch_leverage_tiers is always 0 because it # describes the min amt for a tier, and the lowest tier will always go down to 0 else: + if pair not in self.markets: + raise InvalidOrderException( + f"{pair} is not tradeable on {self.name} {self.trading_mode.value}" + ) mmr = self.markets[pair]['maintenanceMarginRate'] if mmr is None: - raise OperationalException( - f"Maintenance margin rate is unavailable for {self.name}" + raise InvalidOrderException( + f"Maintenance margin rate for {pair} is unavailable for {self.name}" ) return (mmr, None) diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index a5116920c..cfe3cde89 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -403,7 +403,6 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): } } ], - }) default_conf['dry_run'] = False default_conf['trading_mode'] = TradingMode.FUTURES diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index d692baceb..d1fd357a8 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4300,15 +4300,63 @@ def test_parse_leverage_tier(mocker, default_conf): } -def test_get_leverage_tiers_for_pair(mocker, default_conf, leverage_tiers): +def test_get_leverage_tiers_for_pair( + mocker, + default_conf, + leverage_tiers, +): api_mock = MagicMock() - api_mock.fetch_leverage_tiers = MagicMock() + api_mock.fetch_leverage_tiers = MagicMock(return_value={ + 'DOGE/USDT:USDT': [ + { + 'tier': 1, + 'notionalFloor': 0, + 'notionalCap': 500, + 'maintenanceMarginRatio': 0.02, + 'maxLeverage': 75, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.013', + 'instId': '', + 'maxLever': '75', + 'maxSz': '500', + 'minSz': '0', + 'mmr': '0.01', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '1', + 'uly': 'DOGE-USDT' + } + }, + { + 'tier': 2, + 'notionalFloor': 501, + 'notionalCap': 1000, + 'maintenanceMarginRatio': 0.025, + 'maxLeverage': 50, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.02', + 'instId': '', + 'maxLever': '50', + 'maxSz': '1000', + 'minSz': '501', + 'mmr': '0.015', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '2', + 'uly': 'DOGE-USDT' + } + } + ], + }) + # Spot type(api_mock)._ft_has = PropertyMock(return_value={'fetchLeverageTiers': True}) exchange = get_patched_exchange(mocker, default_conf, api_mock) exchange._ft_has['can_fetch_multiple_tiers'] = False - assert exchange.get_leverage_tiers_for_pair('ADA/USDT') == [] + assert exchange.get_leverage_tiers_for_pair('DOGE/USDT:USDT') == [] # 'can_fetch_multiple_tiers': True default_conf['trading_mode'] = 'futures' @@ -4316,20 +4364,36 @@ def test_get_leverage_tiers_for_pair(mocker, default_conf, leverage_tiers): type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) exchange = get_patched_exchange(mocker, default_conf, api_mock) exchange._ft_has['can_fetch_multiple_tiers'] = True - assert exchange.get_leverage_tiers_for_pair('ADA/USDT:USDT') == [] + assert exchange.get_leverage_tiers_for_pair('DOGE/USDT:USDT') == [] # 'fetchLeverageTiers': False type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': False}) exchange = get_patched_exchange(mocker, default_conf, api_mock) exchange._ft_has['can_fetch_multiple_tiers'] = False - assert exchange.get_leverage_tiers_for_pair('ADA/USDT:USDT') == [] + assert exchange.get_leverage_tiers_for_pair('DOGE/USDT:USDT') == [] - # 'fetchLeverageTiers': False + # 'fetchLeverageTiers': True type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) exchange = get_patched_exchange(mocker, default_conf, api_mock) exchange._ft_has['can_fetch_multiple_tiers'] = False - assert exchange.get_leverage_tiers_for_pair('ADA/USDT:USDT') != [] + assert exchange.get_leverage_tiers_for_pair('DOGE/USDT:USDT') == [ + { + 'min': 0, + 'max': 500, + 'mmr': 0.02, + 'lev': 75, + 'maintAmt': None + }, + { + 'min': 501, + 'max': 1000, + 'mmr': 0.025, + 'lev': 50, + 'maintAmt': None + } + ] + # exception_handlers type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) default_conf['dry_run'] = False exchange = get_patched_exchange(mocker, default_conf, api_mock) @@ -4341,7 +4405,7 @@ def test_get_leverage_tiers_for_pair(mocker, default_conf, leverage_tiers): "binance", "get_leverage_tiers_for_pair", "fetch_leverage_tiers", - pair='ETH/USDT:USDT', + pair='DOGE/USDT:USDT', ) @@ -4350,26 +4414,25 @@ def test_get_maintenance_ratio_and_amt_exceptions(mocker, default_conf, leverage default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' exchange = get_patched_exchange(mocker, default_conf, api_mock) - pair = '1000SHIB/USDT' - - exchange._leverage_tiers = {} - exchange.get_leverage_tiers_for_pair = MagicMock(return_value=[]) - - with pytest.raises( - InvalidOrderException, - match=f"Cannot calculate liquidation price for {pair}", - ): - exchange.get_maintenance_ratio_and_amt(pair, 10000) exchange._leverage_tiers = leverage_tiers with pytest.raises( OperationalException, match='nominal value can not be lower than 0', ): - exchange.get_maintenance_ratio_and_amt(pair, -1) + exchange.get_maintenance_ratio_and_amt('1000SHIB/USDT', -1) + + exchange._leverage_tiers = {} + exchange.get_leverage_tiers_for_pair = MagicMock(return_value=[]) + + with pytest.raises( + InvalidOrderException, + match="Maintenance margin rate for 1000SHIB/USDT is unavailable for", + ): + exchange.get_maintenance_ratio_and_amt('1000SHIB/USDT', 10000) -@pytest.mark.parametrize('pair,value,mmr,maintAmt', [ +@ pytest.mark.parametrize('pair,value,mmr,maintAmt', [ ('ADA/BUSD', 500, 0.025, 0.0), ('ADA/BUSD', 20000000, 0.5, 1527500.0), ('ZEC/USDT', 500, 0.01, 0.0), diff --git a/tests/exchange/test_gateio.py b/tests/exchange/test_gateio.py index d8c9d12b6..dc6089788 100644 --- a/tests/exchange/test_gateio.py +++ b/tests/exchange/test_gateio.py @@ -2,7 +2,7 @@ from unittest.mock import MagicMock, PropertyMock import pytest -from freqtrade.exceptions import OperationalException +from freqtrade.exceptions import InvalidOrderException, OperationalException from freqtrade.exchange import Gateio from freqtrade.resolvers.exchange_resolver import ExchangeResolver from tests.conftest import get_patched_exchange @@ -31,12 +31,10 @@ def test_validate_order_types_gateio(default_conf, mocker): ExchangeResolver.load_exchange('gateio', default_conf, True) -@pytest.mark.parametrize('pair,mm_ratio', [ - ("ETH/USDT:USDT", 0.005), - ("ADA/USDT:USDT", 0.003), -]) -def test_get_maintenance_ratio_and_amt_gateio(default_conf, mocker, pair, mm_ratio): +def test_get_maintenance_ratio_and_amt_gateio(default_conf, mocker): api_mock = MagicMock() + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': False}) exchange = get_patched_exchange(mocker, default_conf, api_mock, id="gateio") mocker.patch( @@ -59,7 +57,29 @@ def test_get_maintenance_ratio_and_amt_gateio(default_conf, mocker, pair, mm_rat 'id': 'ADA_USDT', 'symbol': 'ADA/USDT:USDT', }, + 'DOGE/USDT:USDT': { + 'taker': 0.0000075, + 'maker': -0.0000025, + 'maintenanceMarginRate': None, + 'info': {}, + 'id': 'ADA_USDT', + 'symbol': 'ADA/USDT:USDT', + }, } ) ) - assert exchange.get_maintenance_ratio_and_amt(pair) == (mm_ratio, None) + + assert exchange.get_maintenance_ratio_and_amt("ETH/USDT:USDT") == (0.005, None) + assert exchange.get_maintenance_ratio_and_amt("ADA/USDT:USDT") == (0.003, None) + + with pytest.raises( + InvalidOrderException, + match="Maintenance margin rate for DOGE/USDT:USDT is unavailable for Gateio", + ): + exchange.get_maintenance_ratio_and_amt('DOGE/USDT:USDT') + + with pytest.raises( + InvalidOrderException, + match="SHIB/USDT:USDT is not tradeable on Gateio futures", + ): + exchange.get_maintenance_ratio_and_amt('SHIB/USDT:USDT') From e7430da5d7a4f66f06f644d8330baa2fa34699c4 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Thu, 10 Feb 2022 10:39:25 -0600 Subject: [PATCH 27/70] test_ccxt_compat commented out unfinished tests --- tests/exchange/test_ccxt_compat.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/exchange/test_ccxt_compat.py b/tests/exchange/test_ccxt_compat.py index 1e3f9972b..30ba061fa 100644 --- a/tests/exchange/test_ccxt_compat.py +++ b/tests/exchange/test_ccxt_compat.py @@ -364,17 +364,17 @@ class TestCCXTExchange(): assert (isinstance(contract_size, float) or isinstance(contract_size, int)) assert contract_size >= 0.0 - def test_get_liquidation_price_compat(): - return # TODO-lev + # def test_get_liquidation_price_compat(): + # return # TODO-lev - def test_liquidation_price_compat(): - return # TODO-lev + # def test_liquidation_price_compat(): + # return # TODO-lev - def test_get_max_pair_stake_amount_compat(): - return # TODO-lev + # def test_get_max_pair_stake_amount_compat(): + # return # TODO-lev - def test_load_leverage_tiers_compat(): - return # TODO-lev + # def test_load_leverage_tiers_compat(): + # return # TODO-lev - def test_get_maintenance_ratio_and_amt_compat(): - return # TODO-lev + # def test_get_maintenance_ratio_and_amt_compat(): + # return # TODO-lev From 8657e99c269e45198480dec46f39d0c5c596482e Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Fri, 11 Feb 2022 06:38:57 -0600 Subject: [PATCH 28/70] trimmed down get_maintenance_ratio_and_amt, now requires fetchLeverageTiers --- freqtrade/exchange/exchange.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 86da18017..650df12d0 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2295,16 +2295,7 @@ class Exchange: # The lowest notional_floor for any pair in fetch_leverage_tiers is always 0 because it # describes the min amt for a tier, and the lowest tier will always go down to 0 else: - if pair not in self.markets: - raise InvalidOrderException( - f"{pair} is not tradeable on {self.name} {self.trading_mode.value}" - ) - mmr = self.markets[pair]['maintenanceMarginRate'] - if mmr is None: - raise InvalidOrderException( - f"Maintenance margin rate for {pair} is unavailable for {self.name}" - ) - return (mmr, None) + raise OperationalException(f"Cannot get maintenance ratio using {self.name}") def is_exchange_known_ccxt(exchange_name: str, ccxt_module: CcxtModuleType = None) -> bool: From 7a0f7da128109bb5c3d0c7a1b95bb042af0ef061 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Fri, 11 Feb 2022 06:50:23 -0600 Subject: [PATCH 29/70] okex loads all leverage tiers at beginning, removed get tiers for pair --- freqtrade/exchange/exchange.py | 41 +++--------- freqtrade/exchange/okx.py | 23 +++++-- tests/exchange/test_exchange.py | 110 -------------------------------- tests/exchange/test_okex.py | 1 - 4 files changed, 27 insertions(+), 148 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 650df12d0..940b0312b 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1894,28 +1894,6 @@ class Exchange: 'maintAmt': float(info['cum']) if 'cum' in info else None, } - @retrier - def get_leverage_tiers_for_pair(self, pair: str) -> List: - # When exchanges can load all their leverage tiers at once in the constructor - # then this method does nothing, it should only be implemented when the leverage - # tiers requires per symbol fetching to avoid excess api calls - if pair not in self._leverage_tiers: - self._leverage_tiers[pair] = [] - if ( - self._api.has['fetchLeverageTiers'] and - not self._ft_has['can_fetch_multiple_tiers'] and - self.trading_mode == TradingMode.FUTURES - ): - try: - tiers = self._api.fetch_leverage_tiers(pair) - for tier in tiers[pair]: - self._leverage_tiers[pair].append(self.parse_leverage_tier(tier)) - - except ccxt.BadRequest: - return [] - - return self._leverage_tiers[pair] - def get_max_leverage(self, pair: str, stake_amount: Optional[float]) -> float: """ Returns the maximum leverage that a pair can be traded at @@ -1926,7 +1904,7 @@ class Exchange: if self.trading_mode == TradingMode.SPOT: return 1.0 - if self._api.has['fetchLeverageTiers']: + if self.trading_mode == TradingMode.FUTURES: # Checks and edge cases if stake_amount is None: @@ -1934,20 +1912,21 @@ class Exchange: f'{self.name}.get_max_leverage requires argument stake_amount' ) - pair_tiers = self.get_leverage_tiers_for_pair(pair) - num_tiers = len(pair_tiers) - if num_tiers < 1: + if pair not in self._leverage_tiers: + # Maybe raise exception because it can't be traded on futures? return 1.0 + pair_tiers = self._leverage_tiers[pair] + if stake_amount == 0: return self._leverage_tiers[pair][0]['lev'] # Max lev for lowest amount - for tier_index in range(num_tiers): + for tier_index in range(len(pair_tiers)): tier = pair_tiers[tier_index] lev = tier['lev'] - if tier_index < num_tiers - 1: + if tier_index < len(pair_tiers) - 1: next_tier = pair_tiers[tier_index+1] next_floor = next_tier['min'] / next_tier['lev'] if next_floor > stake_amount: # Next tier min too high for stake amount @@ -2280,13 +2259,13 @@ class Exchange: if self._api.has['fetchLeverageTiers']: - pair_tiers = self.get_leverage_tiers_for_pair(pair) - - if len(pair_tiers) < 1: + if pair not in self._leverage_tiers: raise InvalidOrderException( f"Maintenance margin rate for {pair} is unavailable for {self.name}" ) + pair_tiers = self._leverage_tiers[pair] + for tier in reversed(pair_tiers): if nominal_value >= tier['min']: return (tier['mmr'], tier['maintAmt']) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index e1293fdfe..b11627bb1 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -59,14 +59,25 @@ class Okx(Exchange): return float('inf') # Not actually inf, but this probably won't matter for SPOT if pair not in self._leverage_tiers: - tiers = self.get_leverage_tiers_for_pair(pair) - if not tiers: # Not a leveraged market - return float('inf') - else: - self._leverage_tiers[pair] = tiers + return float('inf') pair_tiers = self._leverage_tiers[pair] return pair_tiers[-1]['max'] / leverage def load_leverage_tiers(self) -> Dict[str, List[Dict]]: - return {} + if self.trading_mode == TradingMode.FUTURES: + markets = self.markets + symbols = [] + + for symbol, market in markets.items(): + if (market["swap"] and market["linear"]): + symbols.append(market["symbol"]) + + tiers = {} + for symbol in symbols: + res = self._api.fetchLeverageTiers(symbol) + tiers[symbol] = res[symbol] + + return tiers + else: + return {} diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index d1fd357a8..211f15d0a 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4300,115 +4300,6 @@ def test_parse_leverage_tier(mocker, default_conf): } -def test_get_leverage_tiers_for_pair( - mocker, - default_conf, - leverage_tiers, -): - - api_mock = MagicMock() - api_mock.fetch_leverage_tiers = MagicMock(return_value={ - 'DOGE/USDT:USDT': [ - { - 'tier': 1, - 'notionalFloor': 0, - 'notionalCap': 500, - 'maintenanceMarginRatio': 0.02, - 'maxLeverage': 75, - 'info': { - 'baseMaxLoan': '', - 'imr': '0.013', - 'instId': '', - 'maxLever': '75', - 'maxSz': '500', - 'minSz': '0', - 'mmr': '0.01', - 'optMgnFactor': '0', - 'quoteMaxLoan': '', - 'tier': '1', - 'uly': 'DOGE-USDT' - } - }, - { - 'tier': 2, - 'notionalFloor': 501, - 'notionalCap': 1000, - 'maintenanceMarginRatio': 0.025, - 'maxLeverage': 50, - 'info': { - 'baseMaxLoan': '', - 'imr': '0.02', - 'instId': '', - 'maxLever': '50', - 'maxSz': '1000', - 'minSz': '501', - 'mmr': '0.015', - 'optMgnFactor': '0', - 'quoteMaxLoan': '', - 'tier': '2', - 'uly': 'DOGE-USDT' - } - } - ], - }) - - # Spot - type(api_mock)._ft_has = PropertyMock(return_value={'fetchLeverageTiers': True}) - exchange = get_patched_exchange(mocker, default_conf, api_mock) - exchange._ft_has['can_fetch_multiple_tiers'] = False - assert exchange.get_leverage_tiers_for_pair('DOGE/USDT:USDT') == [] - - # 'can_fetch_multiple_tiers': True - default_conf['trading_mode'] = 'futures' - default_conf['margin_mode'] = 'isolated' - type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) - exchange = get_patched_exchange(mocker, default_conf, api_mock) - exchange._ft_has['can_fetch_multiple_tiers'] = True - assert exchange.get_leverage_tiers_for_pair('DOGE/USDT:USDT') == [] - - # 'fetchLeverageTiers': False - type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': False}) - exchange = get_patched_exchange(mocker, default_conf, api_mock) - exchange._ft_has['can_fetch_multiple_tiers'] = False - assert exchange.get_leverage_tiers_for_pair('DOGE/USDT:USDT') == [] - - # 'fetchLeverageTiers': True - type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) - exchange = get_patched_exchange(mocker, default_conf, api_mock) - exchange._ft_has['can_fetch_multiple_tiers'] = False - assert exchange.get_leverage_tiers_for_pair('DOGE/USDT:USDT') == [ - { - 'min': 0, - 'max': 500, - 'mmr': 0.02, - 'lev': 75, - 'maintAmt': None - }, - { - 'min': 501, - 'max': 1000, - 'mmr': 0.025, - 'lev': 50, - 'maintAmt': None - } - ] - - # exception_handlers - type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) - default_conf['dry_run'] = False - exchange = get_patched_exchange(mocker, default_conf, api_mock) - - ccxt_exceptionhandlers( - mocker, - default_conf, - api_mock, - "binance", - "get_leverage_tiers_for_pair", - "fetch_leverage_tiers", - pair='DOGE/USDT:USDT', - ) - - def test_get_maintenance_ratio_and_amt_exceptions(mocker, default_conf, leverage_tiers): api_mock = MagicMock() default_conf['trading_mode'] = 'futures' @@ -4423,7 +4314,6 @@ def test_get_maintenance_ratio_and_amt_exceptions(mocker, default_conf, leverage exchange.get_maintenance_ratio_and_amt('1000SHIB/USDT', -1) exchange._leverage_tiers = {} - exchange.get_leverage_tiers_for_pair = MagicMock(return_value=[]) with pytest.raises( InvalidOrderException, diff --git a/tests/exchange/test_okex.py b/tests/exchange/test_okex.py index 9f9d02d09..b97b90c27 100644 --- a/tests/exchange/test_okex.py +++ b/tests/exchange/test_okex.py @@ -162,5 +162,4 @@ def test_get_max_pair_stake_amount_okex(default_conf, mocker, leverage_tiers): assert exchange.get_max_pair_stake_amount('BTC/USDT', 1.0) == 1000000000 assert exchange.get_max_pair_stake_amount('BTC/USDT', 1.0, 10.0) == 100000000 - exchange.get_leverage_tiers_for_pair = MagicMock(return_value=None) assert exchange.get_max_pair_stake_amount('TTT/USDT', 1.0) == float('inf') # Not in tiers From e3bd40c3c7519261497390ea13a9977eb4a344ff Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Fri, 11 Feb 2022 07:01:50 -0600 Subject: [PATCH 30/70] added swap and linear to conftest markets --- tests/conftest.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 346d8fb8c..2b0480da8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -579,6 +579,8 @@ def get_markets(): 'quote': 'BTC', 'active': True, 'spot': True, + 'swap': False, + 'linear': None, 'type': 'spot', 'precision': { 'price': 8, @@ -614,6 +616,8 @@ def get_markets(): # According to ccxt, markets without active item set are also active # 'active': True, 'spot': True, + 'swap': False, + 'linear': None, 'type': 'spot', 'precision': { 'price': 8, @@ -648,6 +652,8 @@ def get_markets(): 'quote': 'BTC', 'active': True, 'spot': True, + 'swap': False, + 'linear': None, 'type': 'spot', 'precision': { 'price': 8, @@ -682,6 +688,8 @@ def get_markets(): 'quote': 'BTC', 'active': True, 'spot': True, + 'swap': False, + 'linear': None, 'type': 'spot', 'precision': { 'price': 8, @@ -717,6 +725,8 @@ def get_markets(): 'quote': 'BTC', 'active': True, 'spot': True, + 'swap': False, + 'linear': None, 'type': 'spot', 'precision': { 'price': 8, @@ -752,6 +762,8 @@ def get_markets(): 'quote': 'BTC', 'active': True, 'spot': True, + 'swap': False, + 'linear': None, 'type': 'spot', 'precision': { 'price': 8, @@ -787,6 +799,8 @@ def get_markets(): 'quote': 'BTC', 'active': False, 'spot': True, + 'swap': False, + 'linear': None, 'type': 'spot', 'contractSize': None, 'precision': { @@ -877,6 +891,7 @@ def get_markets(): 'future': True, 'swap': True, 'margin': True, + 'linear': True, 'type': 'spot', 'contractSize': None, 'taker': 0.0006, @@ -912,6 +927,8 @@ def get_markets(): 'quote': 'USDT', 'active': True, 'spot': True, + 'swap': False, + 'linear': None, 'type': 'spot', 'taker': 0.0006, 'maker': 0.0002, @@ -945,6 +962,8 @@ def get_markets(): 'quote': 'USDT', 'active': True, 'spot': True, + 'swap': False, + 'linear': None, 'type': 'spot', 'taker': 0.0006, 'maker': 0.0002, @@ -978,6 +997,8 @@ def get_markets(): 'quote': 'USDT', 'active': True, 'spot': True, + 'swap': False, + 'linear': None, 'type': 'spot', 'contractSize': None, 'taker': 0.0006, @@ -1015,6 +1036,8 @@ def get_markets(): 'quote': 'USD', 'active': True, 'spot': True, + 'swap': False, + 'linear': None, 'type': 'spot', 'contractSize': None, 'precision': { @@ -1048,6 +1071,8 @@ def get_markets(): 'quote': 'USDT', 'active': True, 'spot': False, + 'swap': True, + 'linear': True, 'type': 'swap', 'contractSize': 0.01, 'taker': 0.0006, @@ -1083,6 +1108,8 @@ def get_markets(): 'quote': 'ETH', 'active': True, 'spot': True, + 'swap': False, + 'linear': None, 'type': 'spot', 'contractSize': None, 'precision': { From 765c95f875aa5be63e59c3ae79a6031ce2b63b43 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Sat, 12 Feb 2022 15:41:02 -0600 Subject: [PATCH 31/70] test_okex.test_get_maintenance_ratio_and_amt_okex change pair names --- tests/exchange/test_okex.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/exchange/test_okex.py b/tests/exchange/test_okex.py index b97b90c27..affb2a28d 100644 --- a/tests/exchange/test_okex.py +++ b/tests/exchange/test_okex.py @@ -12,7 +12,7 @@ def test_get_maintenance_ratio_and_amt_okex( default_conf['margin_mode'] = 'isolated' default_conf['dry_run'] = False api_mock.fetch_leverage_tiers = MagicMock(return_value={ - 'SHIB/USDT:USDT': [ + 'ETH/USDT:USDT': [ { 'tier': 1, 'notionalFloor': 0, @@ -30,7 +30,7 @@ def test_get_maintenance_ratio_and_amt_okex( 'optMgnFactor': '0', 'quoteMaxLoan': '', 'tier': '1', - 'uly': 'SHIB-USDT' + 'uly': 'ETH-USDT' } }, { @@ -50,7 +50,7 @@ def test_get_maintenance_ratio_and_amt_okex( 'optMgnFactor': '0', 'quoteMaxLoan': '', 'tier': '2', - 'uly': 'SHIB-USDT' + 'uly': 'ETH-USDT' } }, { @@ -70,11 +70,11 @@ def test_get_maintenance_ratio_and_amt_okex( 'optMgnFactor': '0', 'quoteMaxLoan': '', 'tier': '3', - 'uly': 'SHIB-USDT' + 'uly': 'ETH-USDT' } }, ], - 'DOGE/USDT:USDT': [ + 'XLTCUSDT': [ { 'tier': 1, 'notionalFloor': 0, @@ -92,7 +92,7 @@ def test_get_maintenance_ratio_and_amt_okex( 'optMgnFactor': '0', 'quoteMaxLoan': '', 'tier': '1', - 'uly': 'DOGE-USDT' + 'uly': 'BTC-USDT' } }, { @@ -112,7 +112,7 @@ def test_get_maintenance_ratio_and_amt_okex( 'optMgnFactor': '0', 'quoteMaxLoan': '', 'tier': '2', - 'uly': 'DOGE-USDT' + 'uly': 'BTC-USDT' } }, { @@ -132,19 +132,19 @@ def test_get_maintenance_ratio_and_amt_okex( 'optMgnFactor': '0', 'quoteMaxLoan': '', 'tier': '3', - 'uly': 'DOGE-USDT' + 'uly': 'BTC-USDT' } }, ] }) exchange = get_patched_exchange(mocker, default_conf, api_mock, id="okex") - assert exchange.get_maintenance_ratio_and_amt('SHIB/USDT:USDT', 2000) == (0.01, None) - assert exchange.get_maintenance_ratio_and_amt('SHIB/USDT:USDT', 2001) == (0.015, None) - assert exchange.get_maintenance_ratio_and_amt('SHIB/USDT:USDT', 4001) == (0.02, None) - assert exchange.get_maintenance_ratio_and_amt('SHIB/USDT:USDT', 8000) == (0.02, None) + assert exchange.get_maintenance_ratio_and_amt('ETH/USDT:USDT', 2000) == (0.01, None) + assert exchange.get_maintenance_ratio_and_amt('ETH/USDT:USDT', 2001) == (0.015, None) + assert exchange.get_maintenance_ratio_and_amt('ETH/USDT:USDT', 4001) == (0.02, None) + assert exchange.get_maintenance_ratio_and_amt('ETH/USDT:USDT', 8000) == (0.02, None) - assert exchange.get_maintenance_ratio_and_amt('DOGE/USDT:USDT', 1) == (0.02, None) - assert exchange.get_maintenance_ratio_and_amt('DOGE/USDT:USDT', 2000) == (0.03, None) + assert exchange.get_maintenance_ratio_and_amt('XLTCUSDT', 1) == (0.02, None) + assert exchange.get_maintenance_ratio_and_amt('XLTCUSDT', 2000) == (0.03, None) def test_get_max_pair_stake_amount_okex(default_conf, mocker, leverage_tiers): From 531b4d238ca497c1804a68e0bc35dec288db673f Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Sat, 12 Feb 2022 15:55:26 -0600 Subject: [PATCH 32/70] removed test_get_maintenance_margin_and_amt_gatio as its no longer relevant --- tests/exchange/test_gateio.py | 59 +---------------------------------- 1 file changed, 1 insertion(+), 58 deletions(-) diff --git a/tests/exchange/test_gateio.py b/tests/exchange/test_gateio.py index dc6089788..6f7862909 100644 --- a/tests/exchange/test_gateio.py +++ b/tests/exchange/test_gateio.py @@ -1,11 +1,8 @@ -from unittest.mock import MagicMock, PropertyMock - import pytest -from freqtrade.exceptions import InvalidOrderException, OperationalException +from freqtrade.exceptions import OperationalException from freqtrade.exchange import Gateio from freqtrade.resolvers.exchange_resolver import ExchangeResolver -from tests.conftest import get_patched_exchange def test_validate_order_types_gateio(default_conf, mocker): @@ -29,57 +26,3 @@ def test_validate_order_types_gateio(default_conf, mocker): with pytest.raises(OperationalException, match=r'Exchange .* does not support market orders.'): ExchangeResolver.load_exchange('gateio', default_conf, True) - - -def test_get_maintenance_ratio_and_amt_gateio(default_conf, mocker): - api_mock = MagicMock() - default_conf['trading_mode'] = 'futures' - default_conf['margin_mode'] = 'isolated' - type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': False}) - exchange = get_patched_exchange(mocker, default_conf, api_mock, id="gateio") - mocker.patch( - 'freqtrade.exchange.Exchange.markets', - PropertyMock( - return_value={ - 'ETH/USDT:USDT': { - 'taker': 0.0000075, - 'maker': -0.0000025, - 'maintenanceMarginRate': 0.005, - 'info': {}, - 'id': 'ETH_USDT', - 'symbol': 'ETH/USDT:USDT', - }, - 'ADA/USDT:USDT': { - 'taker': 0.0000075, - 'maker': -0.0000025, - 'maintenanceMarginRate': 0.003, - 'info': {}, - 'id': 'ADA_USDT', - 'symbol': 'ADA/USDT:USDT', - }, - 'DOGE/USDT:USDT': { - 'taker': 0.0000075, - 'maker': -0.0000025, - 'maintenanceMarginRate': None, - 'info': {}, - 'id': 'ADA_USDT', - 'symbol': 'ADA/USDT:USDT', - }, - } - ) - ) - - assert exchange.get_maintenance_ratio_and_amt("ETH/USDT:USDT") == (0.005, None) - assert exchange.get_maintenance_ratio_and_amt("ADA/USDT:USDT") == (0.003, None) - - with pytest.raises( - InvalidOrderException, - match="Maintenance margin rate for DOGE/USDT:USDT is unavailable for Gateio", - ): - exchange.get_maintenance_ratio_and_amt('DOGE/USDT:USDT') - - with pytest.raises( - InvalidOrderException, - match="SHIB/USDT:USDT is not tradeable on Gateio futures", - ): - exchange.get_maintenance_ratio_and_amt('SHIB/USDT:USDT') From 8fe3f0c933e502f4874136184df373d37581d2d5 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Sat, 12 Feb 2022 21:59:26 -0600 Subject: [PATCH 33/70] fix breaking tests --- freqtrade/exchange/exchange.py | 4 +- tests/conftest.py | 113 +++++++- tests/exchange/test_binance.py | 30 --- tests/exchange/test_ccxt_compat.py | 2 +- tests/exchange/test_exchange.py | 75 ++++-- tests/exchange/test_okex.py | 401 +++++++++++++++++++---------- tests/test_freqtradebot.py | 4 +- 7 files changed, 434 insertions(+), 195 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 940b0312b..45d66db06 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1960,12 +1960,14 @@ class Exchange: 'Looped through all tiers without finding a max leverage. Should never be reached' ) - else: # Search markets.limits for max lev + elif self.trading_mode == TradingMode.MARGIN: # Search markets.limits for max lev market = self.markets[pair] if market['limits']['leverage']['max'] is not None: return market['limits']['leverage']['max'] else: return 1.0 # Default if max leverage cannot be found + else: + return 1.0 @retrier def _set_leverage( diff --git a/tests/conftest.py b/tests/conftest.py index 2b0480da8..b22e45526 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -960,21 +960,40 @@ def get_markets(): 'symbol': 'NEO/USDT', 'base': 'NEO', 'quote': 'USDT', - 'active': True, - 'spot': True, - 'swap': False, - 'linear': None, + 'settle': '', + 'baseId': 'NEO', + 'quoteId': 'USDT', + 'settleId': '', 'type': 'spot', + 'spot': True, + 'margin': True, + 'swap': False, + 'futures': False, + 'option': False, + 'active': True, + 'contract': False, + 'linear': None, + 'inverse': None, 'taker': 0.0006, 'maker': 0.0002, + 'contractSize': None, + 'expiry': None, + 'expiryDatetime': None, + 'strike': None, + 'optionType': None, + 'tierBased': None, + 'percentage': None, + 'lot': 0.00000001, 'precision': { 'price': 8, 'amount': 8, 'cost': 8, }, - 'lot': 0.00000001, - 'contractSize': None, 'limits': { + "leverage": { + 'min': 1, + 'max': 10 + }, 'amount': { 'min': 0.01, 'max': 1000, @@ -1071,10 +1090,10 @@ def get_markets(): 'quote': 'USDT', 'active': True, 'spot': False, - 'swap': True, - 'linear': True, 'type': 'swap', 'contractSize': 0.01, + 'swap': False, + 'linear': False, 'taker': 0.0006, 'maker': 0.0002, 'precision': { @@ -1162,7 +1181,6 @@ def get_markets(): 'taker': 0.0006, 'maker': 0.0002, 'contractSize': 10, - 'maintenanceMarginRate': 0.02, 'active': True, 'expiry': None, 'expiryDatetime': None, @@ -1191,6 +1209,83 @@ def get_markets(): 'amount': 1 }, 'info': {} + }, + 'ADA/USDT:USDT': { + 'limits': { + 'leverage': { + 'min': 1, + 'max': 20, + }, + 'amount': { + 'min': 1, + 'max': 1000000, + }, + 'price': { + 'min': 0.52981, + 'max': 1.58943, + }, + 'cost': { + 'min': None, + 'max': None, + } + }, + 'precision': { + 'amount': 1, + 'price': 0.00001 + }, + 'tierBased': True, + 'percentage': True, + 'taker': 0.0000075, + 'maker': -0.0000025, + 'feeSide': 'get', + 'tiers': { + 'maker': [ + [0, 0.002], [1.5, 0.00185], + [3, 0.00175], [6, 0.00165], + [12.5, 0.00155], [25, 0.00145], + [75, 0.00135], [200, 0.00125], + [500, 0.00115], [1250, 0.00105], + [2500, 0.00095], [3000, 0.00085], + [6000, 0.00075], [11000, 0.00065], + [20000, 0.00055], [40000, 0.00055], + [75000, 0.00055] + ], + 'taker': [ + [0, 0.002], [1.5, 0.00195], + [3, 0.00185], [6, 0.00175], + [12.5, 0.00165], [25, 0.00155], + [75, 0.00145], [200, 0.00135], + [500, 0.00125], [1250, 0.00115], + [2500, 0.00105], [3000, 0.00095], + [6000, 0.00085], [11000, 0.00075], + [20000, 0.00065], [40000, 0.00065], + [75000, 0.00065] + ] + }, + 'id': 'ADA_USDT', + 'symbol': 'ADA/USDT:USDT', + 'base': 'ADA', + 'quote': 'USDT', + 'settle': 'USDT', + 'baseId': 'ADA', + 'quoteId': 'USDT', + 'settleId': 'usdt', + 'type': 'swap', + 'spot': False, + 'margin': False, + 'swap': True, + 'future': False, + 'option': False, + 'active': True, + 'contract': True, + 'linear': True, + 'inverse': False, + 'contractSize': 0.01, + 'expiry': None, + 'expiryDatetime': None, + 'strike': None, + 'optionType': None, + 'info': {} } } diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index cfe3cde89..30ffeeae0 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -171,36 +171,6 @@ def test_stoploss_adjust_binance( assert not exchange.stoploss_adjust(sl3, order, side=side) -def test_get_max_leverage_binance(default_conf, mocker, leverage_tiers): - - # Test Spot - exchange = get_patched_exchange(mocker, default_conf, id="binance") - assert exchange.get_max_leverage("BNB/USDT", 100.0) == 1.0 - - # Test Futures - default_conf['trading_mode'] = 'futures' - default_conf['margin_mode'] = 'isolated' - exchange = get_patched_exchange(mocker, default_conf, id="binance") - - exchange._leverage_tiers = leverage_tiers - - assert exchange.get_max_leverage("BNB/BUSD", 1.0) == 20.0 - assert exchange.get_max_leverage("BNB/USDT", 100.0) == 75.0 - assert exchange.get_max_leverage("BTC/USDT", 170.30) == 125.0 - assert isclose(exchange.get_max_leverage("BNB/BUSD", 99999.9), 5.000005) - assert isclose(exchange.get_max_leverage("BNB/USDT", 1500), 33.333333333333333) - assert exchange.get_max_leverage("BTC/USDT", 300000000) == 2.0 - assert exchange.get_max_leverage("BTC/USDT", 600000000) == 1.0 # Last tier - - assert exchange.get_max_leverage("SPONGE/USDT", 200) == 1.0 # Pair not in leverage_tiers - assert exchange.get_max_leverage("BTC/USDT", 0.0) == 125.0 # No stake amount - with pytest.raises( - InvalidOrderException, - match=r'Amount 1000000000.01 too high for BTC/USDT' - ): - exchange.get_max_leverage("BTC/USDT", 1000000000.01) - - def test_fill_leverage_tiers_binance(default_conf, mocker): api_mock = MagicMock() api_mock.fetch_leverage_tiers = MagicMock(return_value={ diff --git a/tests/exchange/test_ccxt_compat.py b/tests/exchange/test_ccxt_compat.py index 30ba061fa..73af6af3e 100644 --- a/tests/exchange/test_ccxt_compat.py +++ b/tests/exchange/test_ccxt_compat.py @@ -341,7 +341,7 @@ class TestCCXTExchange(): def test_get_max_leverage_futures(self, exchange_futures): futures, futures_name = exchange_futures - # TODO-lev: binance, gateio, and okex test + # TODO-lev: binance, gateio, and okx test if futures: leverage_in_market_futures = EXCHANGES[futures_name]['leverage_in_market']['futures'] if leverage_in_market_futures: diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 211f15d0a..032473062 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -1207,9 +1207,20 @@ def test_create_order(default_conf, mocker, side, ordertype, rate, marketprice, assert exchange._set_leverage.call_count == 0 assert exchange.set_margin_mode.call_count == 0 + api_mock.create_order = MagicMock(return_value={ + 'id': order_id, + 'info': { + 'foo': 'bar' + }, + 'symbol': 'ADA/USDT:USDT', + 'amount': 1 + }) + exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name) exchange.trading_mode = TradingMode.FUTURES + exchange._set_leverage = MagicMock() + exchange.set_margin_mode = MagicMock() order = exchange.create_order( - pair='XLTCUSDT', + pair='ADA/USDT:USDT', ordertype=ordertype, side=side, amount=1, @@ -2998,7 +3009,7 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): # all markets, only spot pairs ([], [], False, False, True, False, ['BLK/BTC', 'BTT/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', - 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XRP/BTC']), + 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC']), # active markets ([], [], False, True, False, False, ['BLK/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', 'NEO/BTC', @@ -3006,11 +3017,11 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): # all pairs ([], [], True, False, False, False, ['BLK/BTC', 'BTT/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', - 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XRP/BTC']), + 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC']), # active pairs ([], [], True, True, False, False, ['BLK/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', 'NEO/BTC', - 'TKN/BTC', 'XRP/BTC']), + 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC']), # all markets, base=ETH, LTC (['ETH', 'LTC'], [], False, False, False, False, ['ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT']), @@ -3019,7 +3030,7 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): ['LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT']), # spot markets, base=LTC (['LTC'], [], False, False, True, False, - ['LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT']), + ['LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT']), # all markets, quote=USDT ([], ['USDT'], False, False, False, False, ['ETH/USDT', 'LTC/USDT', 'XLTCUSDT']), @@ -3031,13 +3042,13 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): ['ETH/USDT', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT']), # spot markets, quote=USDT, USD ([], ['USDT', 'USD'], False, False, True, False, - ['ETH/USDT', 'LTC/USD', 'LTC/USDT']), + ['ETH/USDT', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT']), # all markets, base=LTC, quote=USDT (['LTC'], ['USDT'], False, False, False, False, ['LTC/USDT', 'XLTCUSDT']), # all pairs, base=LTC, quote=USDT (['LTC'], ['USDT'], True, False, False, False, - ['LTC/USDT']), + ['LTC/USDT', 'XLTCUSDT']), # all markets, base=LTC, quote=USDT, NONEXISTENT (['LTC'], ['USDT', 'NONEXISTENT'], False, False, False, False, ['LTC/USDT', 'XLTCUSDT']), @@ -3486,7 +3497,7 @@ def test_set_margin_mode(mocker, default_conf, margin_mode): ("binance", TradingMode.FUTURES, MarginMode.ISOLATED, False), ("gateio", TradingMode.FUTURES, MarginMode.ISOLATED, False), - ("okex", TradingMode.FUTURES, MarginMode.ISOLATED, False), + ("okx", TradingMode.FUTURES, MarginMode.ISOLATED, False), # * Remove once implemented ("binance", TradingMode.MARGIN, MarginMode.CROSS, True), @@ -3560,8 +3571,8 @@ def test__ccxt_config( ("LTC/BTC", 0.0, 1.0), ("TKN/USDT", 210.30, 1.0), ]) -def test_get_max_leverage_from_markets(default_conf, mocker, pair, nominal_value, max_lev): - default_conf['trading_mode'] = 'futures' +def test_get_max_leverage_from_margin(default_conf, mocker, pair, nominal_value, max_lev): + default_conf['trading_mode'] = 'margin' default_conf['margin_mode'] = 'isolated' api_mock = MagicMock() type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': False}) @@ -3836,13 +3847,13 @@ def test__fetch_and_calculate_funding_fees_datetime_called( ('XLTCUSDT', 1, 'spot'), ('LTC/USD', 1, 'futures'), ('XLTCUSDT', 0.01, 'futures'), - ('LTC/ETH', 1, 'futures'), ('ETH/USDT:USDT', 10, 'futures') ]) def test__get_contract_size(mocker, default_conf, pair, expected_size, trading_mode): api_mock = MagicMock() default_conf['trading_mode'] = trading_mode default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, api_mock) mocker.patch('freqtrade.exchange.Exchange.markets', { 'LTC/USD': { 'symbol': 'LTC/USD', @@ -3852,15 +3863,11 @@ def test__get_contract_size(mocker, default_conf, pair, expected_size, trading_m 'symbol': 'XLTCUSDT', 'contractSize': '0.01', }, - 'LTC/ETH': { - 'symbol': 'LTC/ETH', - }, 'ETH/USDT:USDT': { 'symbol': 'ETH/USDT:USDT', 'contractSize': '10', } }) - exchange = get_patched_exchange(mocker, default_conf, api_mock) size = exchange._get_contract_size(pair) assert expected_size == size @@ -3868,7 +3875,7 @@ def test__get_contract_size(mocker, default_conf, pair, expected_size, trading_m @pytest.mark.parametrize('pair,contract_size,trading_mode', [ ('XLTCUSDT', 1, 'spot'), ('LTC/USD', 1, 'futures'), - ('XLTCUSDT', 0.01, 'futures'), + ('ADA/USDT:USDT', 0.01, 'futures'), ('LTC/ETH', 1, 'futures'), ('ETH/USDT:USDT', 10, 'futures'), ]) @@ -3952,7 +3959,7 @@ def test__order_contracts_to_amount( @pytest.mark.parametrize('pair,contract_size,trading_mode', [ ('XLTCUSDT', 1, 'spot'), ('LTC/USD', 1, 'futures'), - ('XLTCUSDT', 0.01, 'futures'), + ('ADA/USDT:USDT', 0.01, 'futures'), ('LTC/ETH', 1, 'futures'), ('ETH/USDT:USDT', 10, 'futures'), ]) @@ -3987,7 +3994,7 @@ def test__trades_contracts_to_amount( @pytest.mark.parametrize('pair,param_amount,param_size', [ - ('XLTCUSDT', 40, 4000), + ('ADA/USDT:USDT', 40, 4000), ('LTC/ETH', 30, 30), ('LTC/USD', 30, 30), ('ETH/USDT:USDT', 10, 1), @@ -4003,6 +4010,7 @@ def test__amount_to_contracts( api_mock = MagicMock() default_conf['trading_mode'] = 'spot' default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, api_mock) mocker.patch('freqtrade.exchange.Exchange.markets', { 'LTC/USD': { 'symbol': 'LTC/USD', @@ -4020,7 +4028,6 @@ def test__amount_to_contracts( 'contractSize': '10', } }) - exchange = get_patched_exchange(mocker, default_conf, api_mock) result_size = exchange._amount_to_contracts(pair, param_amount) assert result_size == param_amount result_amount = exchange._contracts_to_amount(pair, param_size) @@ -4342,3 +4349,33 @@ def test_get_maintenance_ratio_and_amt( default_conf['margin_mode'] = 'isolated' exchange = get_patched_exchange(mocker, default_conf, api_mock) exchange.get_maintenance_ratio_and_amt(pair, value) == (mmr, maintAmt) + + +def test_get_max_leverage_futures(default_conf, mocker, leverage_tiers): + + # Test Spot + exchange = get_patched_exchange(mocker, default_conf, id="binance") + assert exchange.get_max_leverage("BNB/USDT", 100.0) == 1.0 + + # Test Futures + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, id="binance") + + exchange._leverage_tiers = leverage_tiers + + assert exchange.get_max_leverage("BNB/BUSD", 1.0) == 20.0 + assert exchange.get_max_leverage("BNB/USDT", 100.0) == 75.0 + assert exchange.get_max_leverage("BTC/USDT", 170.30) == 125.0 + assert isclose(exchange.get_max_leverage("BNB/BUSD", 99999.9), 5.000005) + assert isclose(exchange.get_max_leverage("BNB/USDT", 1500), 33.333333333333333) + assert exchange.get_max_leverage("BTC/USDT", 300000000) == 2.0 + assert exchange.get_max_leverage("BTC/USDT", 600000000) == 1.0 # Last tier + + assert exchange.get_max_leverage("SPONGE/USDT", 200) == 1.0 # Pair not in leverage_tiers + assert exchange.get_max_leverage("BTC/USDT", 0.0) == 125.0 # No stake amount + with pytest.raises( + InvalidOrderException, + match=r'Amount 1000000000.01 too high for BTC/USDT' + ): + exchange.get_max_leverage("BTC/USDT", 1000000000.01) diff --git a/tests/exchange/test_okex.py b/tests/exchange/test_okex.py index affb2a28d..a9f7b8099 100644 --- a/tests/exchange/test_okex.py +++ b/tests/exchange/test_okex.py @@ -3,7 +3,7 @@ from unittest.mock import MagicMock # , PropertyMock from tests.conftest import get_patched_exchange -def test_get_maintenance_ratio_and_amt_okex( +def test_get_maintenance_ratio_and_amt_okx( default_conf, mocker, ): @@ -11,150 +11,153 @@ def test_get_maintenance_ratio_and_amt_okex( default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' default_conf['dry_run'] = False - api_mock.fetch_leverage_tiers = MagicMock(return_value={ - 'ETH/USDT:USDT': [ - { - 'tier': 1, - 'notionalFloor': 0, - 'notionalCap': 2000, - 'maintenanceMarginRatio': 0.01, - 'maxLeverage': 75, - 'info': { - 'baseMaxLoan': '', - 'imr': '0.013', - 'instId': '', - 'maxLever': '75', - 'maxSz': '2000', - 'minSz': '0', - 'mmr': '0.01', - 'optMgnFactor': '0', - 'quoteMaxLoan': '', - 'tier': '1', - 'uly': 'ETH-USDT' - } - }, - { - 'tier': 2, - 'notionalFloor': 2001, - 'notionalCap': 4000, - 'maintenanceMarginRatio': 0.015, - 'maxLeverage': 50, - 'info': { - 'baseMaxLoan': '', - 'imr': '0.02', - 'instId': '', - 'maxLever': '50', - 'maxSz': '4000', - 'minSz': '2001', - 'mmr': '0.015', - 'optMgnFactor': '0', - 'quoteMaxLoan': '', - 'tier': '2', - 'uly': 'ETH-USDT' - } - }, - { - 'tier': 3, - 'notionalFloor': 4001, - 'notionalCap': 8000, - 'maintenanceMarginRatio': 0.02, - 'maxLeverage': 20, - 'info': { - 'baseMaxLoan': '', - 'imr': '0.05', - 'instId': '', - 'maxLever': '20', - 'maxSz': '8000', - 'minSz': '4001', - 'mmr': '0.02', - 'optMgnFactor': '0', - 'quoteMaxLoan': '', - 'tier': '3', - 'uly': 'ETH-USDT' - } - }, - ], - 'XLTCUSDT': [ - { - 'tier': 1, - 'notionalFloor': 0, - 'notionalCap': 500, - 'maintenanceMarginRatio': 0.02, - 'maxLeverage': 75, - 'info': { - 'baseMaxLoan': '', - 'imr': '0.013', - 'instId': '', - 'maxLever': '75', - 'maxSz': '500', - 'minSz': '0', - 'mmr': '0.01', - 'optMgnFactor': '0', - 'quoteMaxLoan': '', - 'tier': '1', - 'uly': 'BTC-USDT' - } - }, - { - 'tier': 2, - 'notionalFloor': 501, - 'notionalCap': 1000, - 'maintenanceMarginRatio': 0.025, - 'maxLeverage': 50, - 'info': { - 'baseMaxLoan': '', - 'imr': '0.02', - 'instId': '', - 'maxLever': '50', - 'maxSz': '1000', - 'minSz': '501', - 'mmr': '0.015', - 'optMgnFactor': '0', - 'quoteMaxLoan': '', - 'tier': '2', - 'uly': 'BTC-USDT' - } - }, - { - 'tier': 3, - 'notionalFloor': 1001, - 'notionalCap': 2000, - 'maintenanceMarginRatio': 0.03, - 'maxLeverage': 20, - 'info': { - 'baseMaxLoan': '', - 'imr': '0.05', - 'instId': '', - 'maxLever': '20', - 'maxSz': '2000', - 'minSz': '1001', - 'mmr': '0.02', - 'optMgnFactor': '0', - 'quoteMaxLoan': '', - 'tier': '3', - 'uly': 'BTC-USDT' - } - }, - ] - }) - exchange = get_patched_exchange(mocker, default_conf, api_mock, id="okex") + mocker.patch.multiple( + 'freqtrade.exchange.Okx', + load_leverage_tiers=MagicMock(return_value={ + 'ETH/USDT:USDT': [ + { + 'tier': 1, + 'notionalFloor': 0, + 'notionalCap': 2000, + 'maintenanceMarginRatio': 0.01, + 'maxLeverage': 75, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.013', + 'instId': '', + 'maxLever': '75', + 'maxSz': '2000', + 'minSz': '0', + 'mmr': '0.01', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '1', + 'uly': 'ETH-USDT' + } + }, + { + 'tier': 2, + 'notionalFloor': 2001, + 'notionalCap': 4000, + 'maintenanceMarginRatio': 0.015, + 'maxLeverage': 50, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.02', + 'instId': '', + 'maxLever': '50', + 'maxSz': '4000', + 'minSz': '2001', + 'mmr': '0.015', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '2', + 'uly': 'ETH-USDT' + } + }, + { + 'tier': 3, + 'notionalFloor': 4001, + 'notionalCap': 8000, + 'maintenanceMarginRatio': 0.02, + 'maxLeverage': 20, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.05', + 'instId': '', + 'maxLever': '20', + 'maxSz': '8000', + 'minSz': '4001', + 'mmr': '0.02', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '3', + 'uly': 'ETH-USDT' + } + }, + ], + 'ADA/USDT:USDT': [ + { + 'tier': 1, + 'notionalFloor': 0, + 'notionalCap': 500, + 'maintenanceMarginRatio': 0.02, + 'maxLeverage': 75, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.013', + 'instId': '', + 'maxLever': '75', + 'maxSz': '500', + 'minSz': '0', + 'mmr': '0.01', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '1', + 'uly': 'ADA-USDT' + } + }, + { + 'tier': 2, + 'notionalFloor': 501, + 'notionalCap': 1000, + 'maintenanceMarginRatio': 0.025, + 'maxLeverage': 50, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.02', + 'instId': '', + 'maxLever': '50', + 'maxSz': '1000', + 'minSz': '501', + 'mmr': '0.015', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '2', + 'uly': 'ADA-USDT' + } + }, + { + 'tier': 3, + 'notionalFloor': 1001, + 'notionalCap': 2000, + 'maintenanceMarginRatio': 0.03, + 'maxLeverage': 20, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.05', + 'instId': '', + 'maxLever': '20', + 'maxSz': '2000', + 'minSz': '1001', + 'mmr': '0.02', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '3', + 'uly': 'ADA-USDT' + } + }, + ] + }) + ) + exchange = get_patched_exchange(mocker, default_conf, api_mock, id="okx") assert exchange.get_maintenance_ratio_and_amt('ETH/USDT:USDT', 2000) == (0.01, None) assert exchange.get_maintenance_ratio_and_amt('ETH/USDT:USDT', 2001) == (0.015, None) assert exchange.get_maintenance_ratio_and_amt('ETH/USDT:USDT', 4001) == (0.02, None) assert exchange.get_maintenance_ratio_and_amt('ETH/USDT:USDT', 8000) == (0.02, None) - assert exchange.get_maintenance_ratio_and_amt('XLTCUSDT', 1) == (0.02, None) - assert exchange.get_maintenance_ratio_and_amt('XLTCUSDT', 2000) == (0.03, None) + assert exchange.get_maintenance_ratio_and_amt('ADA/USDT:USDT', 1) == (0.02, None) + assert exchange.get_maintenance_ratio_and_amt('ADA/USDT:USDT', 2000) == (0.03, None) -def test_get_max_pair_stake_amount_okex(default_conf, mocker, leverage_tiers): +def test_get_max_pair_stake_amount_okx(default_conf, mocker, leverage_tiers): - exchange = get_patched_exchange(mocker, default_conf, id="okex") + exchange = get_patched_exchange(mocker, default_conf, id="okx") assert exchange.get_max_pair_stake_amount('BNB/BUSD', 1.0) == float('inf') default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' - exchange = get_patched_exchange(mocker, default_conf, id="okex") + exchange = get_patched_exchange(mocker, default_conf, id="okx") exchange._leverage_tiers = leverage_tiers assert exchange.get_max_pair_stake_amount('BNB/BUSD', 1.0) == 30000000 @@ -163,3 +166,135 @@ def test_get_max_pair_stake_amount_okex(default_conf, mocker, leverage_tiers): assert exchange.get_max_pair_stake_amount('BTC/USDT', 1.0, 10.0) == 100000000 assert exchange.get_max_pair_stake_amount('TTT/USDT', 1.0) == float('inf') # Not in tiers + + +# def test_load_leverage_tiers_okx(default_conf, mocker): +# mocker.patch.multiple( +# 'freqtrade.exchange.okx', +# load_leverage_tiers=MagicMock(return_value={ +# 'ETH/USDT:USDT': [ +# { +# 'tier': 1, +# 'notionalFloor': 0, +# 'notionalCap': 2000, +# 'maintenanceMarginRatio': 0.01, +# 'maxLeverage': 75, +# 'info': { +# 'baseMaxLoan': '', +# 'imr': '0.013', +# 'instId': '', +# 'maxLever': '75', +# 'maxSz': '2000', +# 'minSz': '0', +# 'mmr': '0.01', +# 'optMgnFactor': '0', +# 'quoteMaxLoan': '', +# 'tier': '1', +# 'uly': 'ETH-USDT' +# } +# }, +# { +# 'tier': 2, +# 'notionalFloor': 2001, +# 'notionalCap': 4000, +# 'maintenanceMarginRatio': 0.015, +# 'maxLeverage': 50, +# 'info': { +# 'baseMaxLoan': '', +# 'imr': '0.02', +# 'instId': '', +# 'maxLever': '50', +# 'maxSz': '4000', +# 'minSz': '2001', +# 'mmr': '0.015', +# 'optMgnFactor': '0', +# 'quoteMaxLoan': '', +# 'tier': '2', +# 'uly': 'ETH-USDT' +# } +# }, +# { +# 'tier': 3, +# 'notionalFloor': 4001, +# 'notionalCap': 8000, +# 'maintenanceMarginRatio': 0.02, +# 'maxLeverage': 20, +# 'info': { +# 'baseMaxLoan': '', +# 'imr': '0.05', +# 'instId': '', +# 'maxLever': '20', +# 'maxSz': '8000', +# 'minSz': '4001', +# 'mmr': '0.02', +# 'optMgnFactor': '0', +# 'quoteMaxLoan': '', +# 'tier': '3', +# 'uly': 'ETH-USDT' +# } +# }, +# ], +# 'ADA/USDT:USDT': [ +# { +# 'tier': 1, +# 'notionalFloor': 0, +# 'notionalCap': 500, +# 'maintenanceMarginRatio': 0.02, +# 'maxLeverage': 75, +# 'info': { +# 'baseMaxLoan': '', +# 'imr': '0.013', +# 'instId': '', +# 'maxLever': '75', +# 'maxSz': '500', +# 'minSz': '0', +# 'mmr': '0.01', +# 'optMgnFactor': '0', +# 'quoteMaxLoan': '', +# 'tier': '1', +# 'uly': 'ADA-USDT' +# } +# }, +# { +# 'tier': 2, +# 'notionalFloor': 501, +# 'notionalCap': 1000, +# 'maintenanceMarginRatio': 0.025, +# 'maxLeverage': 50, +# 'info': { +# 'baseMaxLoan': '', +# 'imr': '0.02', +# 'instId': '', +# 'maxLever': '50', +# 'maxSz': '1000', +# 'minSz': '501', +# 'mmr': '0.015', +# 'optMgnFactor': '0', +# 'quoteMaxLoan': '', +# 'tier': '2', +# 'uly': 'ADA-USDT' +# } +# }, +# { +# 'tier': 3, +# 'notionalFloor': 1001, +# 'notionalCap': 2000, +# 'maintenanceMarginRatio': 0.03, +# 'maxLeverage': 20, +# 'info': { +# 'baseMaxLoan': '', +# 'imr': '0.05', +# 'instId': '', +# 'maxLever': '20', +# 'maxSz': '2000', +# 'minSz': '1001', +# 'mmr': '0.02', +# 'optMgnFactor': '0', +# 'quoteMaxLoan': '', +# 'tier': '3', +# 'uly': 'ADA-USDT' +# } +# }, +# ] +# }) +# ) diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 0cb2d46f5..f9e75bb05 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -722,8 +722,8 @@ def test_process_informative_pairs_added(default_conf_usdt, ticker_usdt, mocker) (False, 'futures', 'binance', 'isolated', 0.05, 8.167171717171717), (True, 'futures', 'gateio', 'isolated', 0.05, 11.7804274688304), (False, 'futures', 'gateio', 'isolated', 0.05, 8.181423084697796), - (True, 'futures', 'okex', 'isolated', 11.87413417771621), - (False, 'futures', 'okex', 'isolated', 8.085708510208207), + (True, 'futures', 'okex', 'isolated', 0.0, 11.87413417771621), + (False, 'futures', 'okex', 'isolated', 0.0, 8.085708510208207), ]) def test_execute_entry(mocker, default_conf_usdt, fee, limit_order, limit_order_open, is_short, trading_mode, From eaf13f96f7760de4b06752904c88666a3c6e5769 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 13 Feb 2022 12:48:28 +0100 Subject: [PATCH 34/70] Use exchange_has to check for ccxt properties --- freqtrade/exchange/exchange.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 45d66db06..8af81ad47 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1856,7 +1856,7 @@ class Exchange: raise OperationalException(e) from e def load_leverage_tiers(self) -> Dict[str, List[Dict]]: - if self.trading_mode == TradingMode.FUTURES and self._api.has['fetchLeverageTiers']: + if self.trading_mode == TradingMode.FUTURES and self.exchange_has('fetchLeverageTiers'): try: return self._api.fetch_leverage_tiers() except ccxt.DDoSProtection as e: @@ -2259,7 +2259,7 @@ class Exchange: :return: (maintenance margin ratio, maintenance amount) """ - if self._api.has['fetchLeverageTiers']: + if self.exchange_has('fetchLeverageTiers'): if pair not in self._leverage_tiers: raise InvalidOrderException( From 7f0cedc769e8395e315f7e8208f40c8dbf582fb1 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 13 Feb 2022 12:54:49 +0100 Subject: [PATCH 35/70] Use "is_future" to check for futures markets --- freqtrade/exchange/okx.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index b11627bb1..03d66fb3d 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -70,8 +70,8 @@ class Okx(Exchange): symbols = [] for symbol, market in markets.items(): - if (market["swap"] and market["linear"]): - symbols.append(market["symbol"]) + if self.market_is_future(market): + symbols.append(symbol) tiers = {} for symbol in symbols: From b98297786c5db69ccacd35c381c24a0111c47b49 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 13 Feb 2022 12:56:32 +0100 Subject: [PATCH 36/70] Update failing mock --- tests/test_freqtradebot.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index f9e75bb05..93920a163 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -722,8 +722,8 @@ def test_process_informative_pairs_added(default_conf_usdt, ticker_usdt, mocker) (False, 'futures', 'binance', 'isolated', 0.05, 8.167171717171717), (True, 'futures', 'gateio', 'isolated', 0.05, 11.7804274688304), (False, 'futures', 'gateio', 'isolated', 0.05, 8.181423084697796), - (True, 'futures', 'okex', 'isolated', 0.0, 11.87413417771621), - (False, 'futures', 'okex', 'isolated', 0.0, 8.085708510208207), + (True, 'futures', 'okx', 'isolated', 0.0, 11.87413417771621), + (False, 'futures', 'okx', 'isolated', 0.0, 8.085708510208207), ]) def test_execute_entry(mocker, default_conf_usdt, fee, limit_order, limit_order_open, is_short, trading_mode, @@ -784,7 +784,7 @@ def test_execute_entry(mocker, default_conf_usdt, fee, limit_order, get_max_leverage=MagicMock(return_value=10), ) mocker.patch.multiple( - 'freqtrade.exchange.Okex', + 'freqtrade.exchange.Okx', get_max_pair_stake_amount=MagicMock(return_value=500000), ) pair = 'ETH/USDT' From bc855b2a326f65dda8af50f4c29c00c31f49a358 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 13 Feb 2022 13:00:38 +0100 Subject: [PATCH 37/70] Update some missing mocks --- tests/exchange/test_binance.py | 1 + tests/exchange/test_exchange.py | 2 ++ tests/exchange/test_okex.py | 1 + 3 files changed, 4 insertions(+) diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index 30ffeeae0..631b7e8c0 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -593,6 +593,7 @@ def test_get_maintenance_ratio_and_amt_binance( mm_ratio, amt, ): + mocker.patch('freqtrade.exchange.Exchange.exchange_has', return_value=True) exchange = get_patched_exchange(mocker, default_conf, id="binance") exchange._leverage_tiers = leverage_tiers (result_ratio, result_amt) = exchange.get_maintenance_ratio_and_amt(pair, nominal_value) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 032473062..fda3f6ea2 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4311,6 +4311,7 @@ def test_get_maintenance_ratio_and_amt_exceptions(mocker, default_conf, leverage api_mock = MagicMock() default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' + mocker.patch('freqtrade.exchange.Exchange.exchange_has', return_value=True) exchange = get_patched_exchange(mocker, default_conf, api_mock) exchange._leverage_tiers = leverage_tiers @@ -4347,6 +4348,7 @@ def test_get_maintenance_ratio_and_amt( api_mock = MagicMock() default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' + mocker.patch('freqtrade.exchange.Exchange.exchange_has', return_value=True) exchange = get_patched_exchange(mocker, default_conf, api_mock) exchange.get_maintenance_ratio_and_amt(pair, value) == (mmr, maintAmt) diff --git a/tests/exchange/test_okex.py b/tests/exchange/test_okex.py index a9f7b8099..f9a93c569 100644 --- a/tests/exchange/test_okex.py +++ b/tests/exchange/test_okex.py @@ -13,6 +13,7 @@ def test_get_maintenance_ratio_and_amt_okx( default_conf['dry_run'] = False mocker.patch.multiple( 'freqtrade.exchange.Okx', + exchange_has=MagicMock(return_value=True), load_leverage_tiers=MagicMock(return_value={ 'ETH/USDT:USDT': [ { From 96df31124459f26e8e329e07ceaf084dbf12fcf2 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 13 Feb 2022 13:01:01 +0100 Subject: [PATCH 38/70] Rename test_okex to test_okx --- tests/exchange/{test_okex.py => test_okx.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/exchange/{test_okex.py => test_okx.py} (100%) diff --git a/tests/exchange/test_okex.py b/tests/exchange/test_okx.py similarity index 100% rename from tests/exchange/test_okex.py rename to tests/exchange/test_okx.py From ad801e05f7ed98aaeed8f96aa65248d99366b529 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 13 Feb 2022 13:04:55 +0100 Subject: [PATCH 39/70] Filter loadable leverage tiers to stake-currency pairs --- freqtrade/exchange/okx.py | 3 ++- tests/exchange/test_binance.py | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 03d66fb3d..bd2913932 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -70,7 +70,8 @@ class Okx(Exchange): symbols = [] for symbol, market in markets.items(): - if self.market_is_future(market): + if (self.market_is_future(market) + and market['quote'] == self._config['stake_currency']): symbols.append(symbol) tiers = {} diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index 631b7e8c0..64c16d5e7 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -1,5 +1,4 @@ from datetime import datetime, timezone -from math import isclose from random import randint from unittest.mock import MagicMock, PropertyMock From 16e38592a9fb5559a0cf6a5fd4d0e559d293b771 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 14 Feb 2022 09:24:42 -0600 Subject: [PATCH 40/70] test_get_markets created debugging param test_comment --- tests/exchange/test_exchange.py | 71 +++++++++++++++++---------------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 032473062..39eeaa797 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -2988,7 +2988,7 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): @pytest.mark.parametrize( "base_currencies,quote_currencies,tradable_only,active_only,spot_only," - "futures_only,expected_keys", [ + "futures_only,expected_keys,test_comment", [ # Testing markets (in conftest.py): # 'BLK/BTC': 'active': True # 'BTT/BTC': 'active': True @@ -3002,64 +3002,65 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): # 'TKN/BTC': 'active' not set # 'XLTCUSDT': 'active': True, not a pair # 'XRP/BTC': 'active': False - # all markets ([], [], False, False, False, False, ['BLK/BTC', 'BTT/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', - 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC']), - # all markets, only spot pairs + 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC'], + 'all markets'), ([], [], False, False, True, False, ['BLK/BTC', 'BTT/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', - 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC']), - # active markets + 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC'], + 'all markets, only spot pairs'), ([], [], False, True, False, False, ['BLK/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', 'NEO/BTC', - 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC']), - # all pairs + 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC'], + 'active markets'), ([], [], True, False, False, False, ['BLK/BTC', 'BTT/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', - 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC']), - # active pairs + 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC'], + 'all pairs'), ([], [], True, True, False, False, ['BLK/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', 'NEO/BTC', - 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC']), - # all markets, base=ETH, LTC + 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC'], + 'active pairs'), (['ETH', 'LTC'], [], False, False, False, False, - ['ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT']), - # all markets, base=LTC + ['ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT'], + 'all markets, base=ETH, LTC'), (['LTC'], [], False, False, False, False, - ['LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT']), - # spot markets, base=LTC + ['LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT'], + 'all markets, base=LTC'), (['LTC'], [], False, False, True, False, - ['LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT']), - # all markets, quote=USDT + ['LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT'], + 'spot markets, base=LTC'), ([], ['USDT'], False, False, False, False, - ['ETH/USDT', 'LTC/USDT', 'XLTCUSDT']), - # Futures markets, quote=USDT + ['ETH/USDT', 'LTC/USDT', 'XLTCUSDT'], + 'all markets, quote=USDT'), ([], ['USDT'], False, False, False, True, - ['ETH/USDT', 'LTC/USDT']), - # all markets, quote=USDT, USD + ['ETH/USDT', 'LTC/USDT'], + 'Futures markets, quote=USDT'), ([], ['USDT', 'USD'], False, False, False, False, - ['ETH/USDT', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT']), - # spot markets, quote=USDT, USD + ['ETH/USDT', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT'], + 'all markets, quote=USDT, USD'), ([], ['USDT', 'USD'], False, False, True, False, - ['ETH/USDT', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT']), - # all markets, base=LTC, quote=USDT + ['ETH/USDT', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT'], + 'spot markets, quote=USDT, USD'), (['LTC'], ['USDT'], False, False, False, False, - ['LTC/USDT', 'XLTCUSDT']), - # all pairs, base=LTC, quote=USDT + ['LTC/USDT', 'XLTCUSDT'], + 'all markets, base=LTC, quote=USDT'), (['LTC'], ['USDT'], True, False, False, False, - ['LTC/USDT', 'XLTCUSDT']), - # all markets, base=LTC, quote=USDT, NONEXISTENT + ['LTC/USDT', 'XLTCUSDT'], + 'all pairs, base=LTC, quote=USDT'), (['LTC'], ['USDT', 'NONEXISTENT'], False, False, False, False, - ['LTC/USDT', 'XLTCUSDT']), - # all markets, base=LTC, quote=NONEXISTENT + ['LTC/USDT', 'XLTCUSDT'], + 'all markets, base=LTC, quote=USDT, NONEXISTENT'), (['LTC'], ['NONEXISTENT'], False, False, False, False, - []), + [], + 'all markets, base=LTC, quote=NONEXISTENT'), ]) def test_get_markets(default_conf, mocker, markets_static, base_currencies, quote_currencies, tradable_only, active_only, - spot_only, futures_only, - expected_keys): + spot_only, futures_only, expected_keys, + test_comment # Here for debugging purposes (Not used within method) + ): mocker.patch.multiple('freqtrade.exchange.Exchange', _init_ccxt=MagicMock(return_value=MagicMock()), _load_async_markets=MagicMock(), From c1d08dd03ae29ab0dd45c6f4a23e4cead747193f Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 14 Feb 2022 09:30:52 -0600 Subject: [PATCH 41/70] linting --- tests/exchange/test_binance.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index 30ffeeae0..302504df6 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -1,5 +1,4 @@ from datetime import datetime, timezone -from math import isclose from random import randint from unittest.mock import MagicMock, PropertyMock From cfd438b966e215cd1fe0fdd6981997091f7af24d Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 14 Feb 2022 09:40:01 -0600 Subject: [PATCH 42/70] fixed test_get_markets --- tests/exchange/test_exchange.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 39eeaa797..ae7ef45ea 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -3008,7 +3008,7 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): 'all markets'), ([], [], False, False, True, False, ['BLK/BTC', 'BTT/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', - 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC'], + 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XRP/BTC'], 'all markets, only spot pairs'), ([], [], False, True, False, False, ['BLK/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', 'NEO/BTC', @@ -3016,11 +3016,11 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): 'active markets'), ([], [], True, False, False, False, ['BLK/BTC', 'BTT/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', - 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC'], + 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XRP/BTC'], 'all pairs'), ([], [], True, True, False, False, ['BLK/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', 'NEO/BTC', - 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC'], + 'TKN/BTC', 'XRP/BTC'], 'active pairs'), (['ETH', 'LTC'], [], False, False, False, False, ['ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT'], @@ -3029,7 +3029,7 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): ['LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT'], 'all markets, base=LTC'), (['LTC'], [], False, False, True, False, - ['LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT'], + ['LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT'], 'spot markets, base=LTC'), ([], ['USDT'], False, False, False, False, ['ETH/USDT', 'LTC/USDT', 'XLTCUSDT'], @@ -3041,13 +3041,13 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): ['ETH/USDT', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT'], 'all markets, quote=USDT, USD'), ([], ['USDT', 'USD'], False, False, True, False, - ['ETH/USDT', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT'], + ['ETH/USDT', 'LTC/USD', 'LTC/USDT'], 'spot markets, quote=USDT, USD'), (['LTC'], ['USDT'], False, False, False, False, ['LTC/USDT', 'XLTCUSDT'], 'all markets, base=LTC, quote=USDT'), (['LTC'], ['USDT'], True, False, False, False, - ['LTC/USDT', 'XLTCUSDT'], + ['LTC/USDT'], 'all pairs, base=LTC, quote=USDT'), (['LTC'], ['USDT', 'NONEXISTENT'], False, False, False, False, ['LTC/USDT', 'XLTCUSDT'], From 99e3e265421985c5880dfe39f3897c4be73905a7 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 14 Feb 2022 19:14:40 +0100 Subject: [PATCH 43/70] Adjust ccxt test naming to align with the other tests --- tests/exchange/test_ccxt_compat.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/exchange/test_ccxt_compat.py b/tests/exchange/test_ccxt_compat.py index 73af6af3e..44bd68a31 100644 --- a/tests/exchange/test_ccxt_compat.py +++ b/tests/exchange/test_ccxt_compat.py @@ -329,7 +329,7 @@ class TestCCXTExchange(): assert 0 < exchange.get_fee(pair, 'market', 'buy') < threshold assert 0 < exchange.get_fee(pair, 'market', 'sell') < threshold - def test_get_max_leverage_spot(self, exchange): + def test_ccxt_get_max_leverage_spot(self, exchange): spot, spot_name = exchange if spot: leverage_in_market_spot = EXCHANGES[spot_name]['leverage_in_market']['spot'] @@ -339,7 +339,7 @@ class TestCCXTExchange(): assert (isinstance(spot_leverage, float) or isinstance(spot_leverage, int)) assert spot_leverage >= 1.0 - def test_get_max_leverage_futures(self, exchange_futures): + def test_ccxt_get_max_leverage_futures(self, exchange_futures): futures, futures_name = exchange_futures # TODO-lev: binance, gateio, and okx test if futures: @@ -364,17 +364,17 @@ class TestCCXTExchange(): assert (isinstance(contract_size, float) or isinstance(contract_size, int)) assert contract_size >= 0.0 - # def test_get_liquidation_price_compat(): + # def test_ccxt_get_liquidation_price(): # return # TODO-lev - # def test_liquidation_price_compat(): + # def test_ccxt_liquidation_price(): # return # TODO-lev - # def test_get_max_pair_stake_amount_compat(): + # def test_ccxt_get_max_pair_stake_amount(): # return # TODO-lev - # def test_load_leverage_tiers_compat(): + # def test_ccxt_load_leverage_tiers(): # return # TODO-lev - # def test_get_maintenance_ratio_and_amt_compat(): + # def test_ccxt_get_maintenance_ratio_and_amt(): # return # TODO-lev From 515b3fdfd2e6d863a8c14ebabf7a041aaecaef53 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 14 Feb 2022 19:42:15 +0100 Subject: [PATCH 44/70] Version bump ccxt --- requirements.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 160c8ba56..1fb95603e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ numpy==1.22.2 pandas==1.4.0 pandas-ta==0.3.14b -ccxt==1.72.36 +ccxt==1.73.3 # Pin cryptography for now due to rust build errors with piwheels cryptography==36.0.1 aiohttp==3.8.1 diff --git a/setup.py b/setup.py index 380b0d796..6cad4d804 100644 --- a/setup.py +++ b/setup.py @@ -42,7 +42,7 @@ setup( ], install_requires=[ # from requirements.txt - 'ccxt>=1.72.29', + 'ccxt>=1.73.1', 'SQLAlchemy', 'python-telegram-bot>=13.4', 'arrow>=0.17.0', From 513669f834bf60901ae0c6268ac66f2510834b38 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 14 Feb 2022 19:44:05 +0100 Subject: [PATCH 45/70] Be verbose on okex startup to point out delay. --- freqtrade/exchange/okx.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index bd2913932..508eded1f 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -75,9 +75,14 @@ class Okx(Exchange): symbols.append(symbol) tiers = {} + # Be verbose here, as this delays startup by ~1 minute. + logger.info( + f"Initializing leverage_tiers for {len(symbols)} markets. " + "This will take about a minute.") for symbol in symbols: res = self._api.fetchLeverageTiers(symbol) tiers[symbol] = res[symbol] + logger.info(f"Done initializing {len(symbols)} markets.") return tiers else: From f4a57b71e78f91dbbc0f880ffbb0eb314475dc75 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 14 Feb 2022 16:53:29 -0600 Subject: [PATCH 46/70] Filled in test_load_leverage_tiers_okx --- freqtrade/exchange/exchange.py | 5 +- freqtrade/exchange/okx.py | 3 +- tests/conftest.py | 106 ++++++++++- tests/exchange/test_okx.py | 324 ++++++++++++++++++++------------- 4 files changed, 304 insertions(+), 134 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 8af81ad47..55c75ca0a 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -347,7 +347,10 @@ class Exchange: return self.markets.get(pair, {}).get('base', '') def market_is_future(self, market: Dict[str, Any]) -> bool: - return market.get(self._ft_has["ccxt_futures_name"], False) is True + return ( + market.get(self._ft_has["ccxt_futures_name"], False) is True and + market.get('linear', False) is True + ) def market_is_spot(self, market: Dict[str, Any]) -> bool: return market.get('spot', False) is True diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index bd2913932..09bb48aa6 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -77,7 +77,8 @@ class Okx(Exchange): tiers = {} for symbol in symbols: res = self._api.fetchLeverageTiers(symbol) - tiers[symbol] = res[symbol] + res_symbol = res[symbol] + tiers[symbol] = self.parse_leverage_tier(res[symbol]) return tiers else: diff --git a/tests/conftest.py b/tests/conftest.py index b22e45526..04c4fd70d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -891,7 +891,8 @@ def get_markets(): 'future': True, 'swap': True, 'margin': True, - 'linear': True, + 'linear': False, + 'inverse': True, 'type': 'spot', 'contractSize': None, 'taker': 0.0006, @@ -1286,7 +1287,108 @@ def get_markets(): 'strike': None, 'optionType': None, 'info': {} - } + }, + 'SOL/BUSD:BUSD': { + 'limits': { + 'leverage': {'min': None, 'max': None}, + 'amount': {'min': 1, 'max': 1000000}, + 'price': {'min': 0.04, 'max': 100000}, + 'cost': {'min': 5, 'max': None}, + 'market': {'min': 1, 'max': 1500} + }, + 'precision': {'amount': 0, 'price': 2, 'base': 8, 'quote': 8}, + 'tierBased': False, + 'percentage': True, + 'taker': 0.0004, + 'maker': 0.0002, + 'feeSide': 'get', + 'id': 'SOLBUSD', + 'lowercaseId': 'solbusd', + 'symbol': 'SOL/BUSD', + 'base': 'SOL', + 'quote': 'BUSD', + 'settle': 'BUSD', + 'baseId': 'SOL', + 'quoteId': 'BUSD', + 'settleId': 'BUSD', + 'type': 'future', + 'spot': False, + 'margin': False, + 'future': True, + 'delivery': False, + 'option': False, + 'active': True, + 'contract': True, + 'linear': True, + 'inverse': False, + 'contractSize': 1, + 'expiry': None, + 'expiryDatetime': None, + 'strike': None, + 'optionType': None, + 'info': { + 'symbol': 'SOLBUSD', + 'pair': 'SOLBUSD', + 'contractType': 'PERPETUAL', + 'deliveryDate': '4133404800000', + 'onboardDate': '1630566000000', + 'status': 'TRADING', + 'maintMarginPercent': '2.5000', + 'requiredMarginPercent': '5.0000', + 'baseAsset': 'SOL', + 'quoteAsset': 'BUSD', + 'marginAsset': 'BUSD', + 'pricePrecision': '4', + 'quantityPrecision': '0', + 'baseAssetPrecision': '8', + 'quotePrecision': '8', + 'underlyingType': 'COIN', + 'underlyingSubType': [], + 'settlePlan': '0', + 'triggerProtect': '0.0500', + 'liquidationFee': '0.005000', + 'marketTakeBound': '0.05', + 'filters': [ + { + 'minPrice': '0.0400', + 'maxPrice': '100000', + 'filterType': 'PRICE_FILTER', + 'tickSize': '0.0100' + }, + { + 'stepSize': '1', + 'filterType': 'LOT_SIZE', + 'maxQty': '1000000', + 'minQty': '1' + }, + { + 'stepSize': '1', + 'filterType': 'MARKET_LOT_SIZE', + 'maxQty': '1500', + 'minQty': '1' + }, + {'limit': '200', 'filterType': 'MAX_NUM_ORDERS'}, + {'limit': '10', 'filterType': 'MAX_NUM_ALGO_ORDERS'}, + {'notional': '5', 'filterType': 'MIN_NOTIONAL'}, + { + 'multiplierDown': '0.9500', + 'multiplierUp': '1.0500', + 'multiplierDecimal': '4', + 'filterType': 'PERCENT_PRICE' + } + ], + 'orderTypes': [ + 'LIMIT', + 'MARKET', + 'STOP', + 'STOP_MARKET', + 'TAKE_PROFIT', + 'TAKE_PROFIT_MARKET', + 'TRAILING_STOP_MARKET' + ], + 'timeInForce': ['GTC', 'IOC', 'FOK', 'GTX'] + } + }, } diff --git a/tests/exchange/test_okx.py b/tests/exchange/test_okx.py index f9a93c569..388d8b510 100644 --- a/tests/exchange/test_okx.py +++ b/tests/exchange/test_okx.py @@ -1,6 +1,7 @@ from unittest.mock import MagicMock # , PropertyMock from tests.conftest import get_patched_exchange +from freqtrade.enums import TradingMode, MarginMode def test_get_maintenance_ratio_and_amt_okx( @@ -169,133 +170,196 @@ def test_get_max_pair_stake_amount_okx(default_conf, mocker, leverage_tiers): assert exchange.get_max_pair_stake_amount('TTT/USDT', 1.0) == float('inf') # Not in tiers -# def test_load_leverage_tiers_okx(default_conf, mocker): -# mocker.patch.multiple( -# 'freqtrade.exchange.okx', -# load_leverage_tiers=MagicMock(return_value={ -# 'ETH/USDT:USDT': [ -# { -# 'tier': 1, -# 'notionalFloor': 0, -# 'notionalCap': 2000, -# 'maintenanceMarginRatio': 0.01, -# 'maxLeverage': 75, -# 'info': { -# 'baseMaxLoan': '', -# 'imr': '0.013', -# 'instId': '', -# 'maxLever': '75', -# 'maxSz': '2000', -# 'minSz': '0', -# 'mmr': '0.01', -# 'optMgnFactor': '0', -# 'quoteMaxLoan': '', -# 'tier': '1', -# 'uly': 'ETH-USDT' -# } -# }, -# { -# 'tier': 2, -# 'notionalFloor': 2001, -# 'notionalCap': 4000, -# 'maintenanceMarginRatio': 0.015, -# 'maxLeverage': 50, -# 'info': { -# 'baseMaxLoan': '', -# 'imr': '0.02', -# 'instId': '', -# 'maxLever': '50', -# 'maxSz': '4000', -# 'minSz': '2001', -# 'mmr': '0.015', -# 'optMgnFactor': '0', -# 'quoteMaxLoan': '', -# 'tier': '2', -# 'uly': 'ETH-USDT' -# } -# }, -# { -# 'tier': 3, -# 'notionalFloor': 4001, -# 'notionalCap': 8000, -# 'maintenanceMarginRatio': 0.02, -# 'maxLeverage': 20, -# 'info': { -# 'baseMaxLoan': '', -# 'imr': '0.05', -# 'instId': '', -# 'maxLever': '20', -# 'maxSz': '8000', -# 'minSz': '4001', -# 'mmr': '0.02', -# 'optMgnFactor': '0', -# 'quoteMaxLoan': '', -# 'tier': '3', -# 'uly': 'ETH-USDT' -# } -# }, -# ], -# 'ADA/USDT:USDT': [ -# { -# 'tier': 1, -# 'notionalFloor': 0, -# 'notionalCap': 500, -# 'maintenanceMarginRatio': 0.02, -# 'maxLeverage': 75, -# 'info': { -# 'baseMaxLoan': '', -# 'imr': '0.013', -# 'instId': '', -# 'maxLever': '75', -# 'maxSz': '500', -# 'minSz': '0', -# 'mmr': '0.01', -# 'optMgnFactor': '0', -# 'quoteMaxLoan': '', -# 'tier': '1', -# 'uly': 'ADA-USDT' -# } -# }, -# { -# 'tier': 2, -# 'notionalFloor': 501, -# 'notionalCap': 1000, -# 'maintenanceMarginRatio': 0.025, -# 'maxLeverage': 50, -# 'info': { -# 'baseMaxLoan': '', -# 'imr': '0.02', -# 'instId': '', -# 'maxLever': '50', -# 'maxSz': '1000', -# 'minSz': '501', -# 'mmr': '0.015', -# 'optMgnFactor': '0', -# 'quoteMaxLoan': '', -# 'tier': '2', -# 'uly': 'ADA-USDT' -# } -# }, -# { -# 'tier': 3, -# 'notionalFloor': 1001, -# 'notionalCap': 2000, -# 'maintenanceMarginRatio': 0.03, -# 'maxLeverage': 20, -# 'info': { -# 'baseMaxLoan': '', -# 'imr': '0.05', -# 'instId': '', -# 'maxLever': '20', -# 'maxSz': '2000', -# 'minSz': '1001', -# 'mmr': '0.02', -# 'optMgnFactor': '0', -# 'quoteMaxLoan': '', -# 'tier': '3', -# 'uly': 'ADA-USDT' -# } -# }, -# ] -# }) -# ) +def test_load_leverage_tiers_okx(default_conf, mocker, markets): + api_mock = MagicMock() + api_mock.fetch_leverage_tiers = MagicMock(side_effect=[ + { + 'ADA/USDT:USDT': [ + { + 'tier': 1, + 'notionalFloor': 0, + 'notionalCap': 500, + 'maintenanceMarginRatio': 0.02, + 'maxLeverage': 75, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.013', + 'instId': '', + 'maxLever': '75', + 'maxSz': '500', + 'minSz': '0', + 'mmr': '0.01', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '1', + 'uly': 'ADA-USDT' + } + }, + { + 'tier': 2, + 'notionalFloor': 501, + 'notionalCap': 1000, + 'maintenanceMarginRatio': 0.025, + 'maxLeverage': 50, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.02', + 'instId': '', + 'maxLever': '50', + 'maxSz': '1000', + 'minSz': '501', + 'mmr': '0.015', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '2', + 'uly': 'ADA-USDT' + } + }, + { + 'tier': 3, + 'notionalFloor': 1001, + 'notionalCap': 2000, + 'maintenanceMarginRatio': 0.03, + 'maxLeverage': 20, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.05', + 'instId': '', + 'maxLever': '20', + 'maxSz': '2000', + 'minSz': '1001', + 'mmr': '0.02', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '3', + 'uly': 'ADA-USDT' + } + }, + ] + }, + { + 'ETH/USDT:USDT': [ + { + 'tier': 1, + 'notionalFloor': 0, + 'notionalCap': 2000, + 'maintenanceMarginRatio': 0.01, + 'maxLeverage': 75, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.013', + 'instId': '', + 'maxLever': '75', + 'maxSz': '2000', + 'minSz': '0', + 'mmr': '0.01', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '1', + 'uly': 'ETH-USDT' + } + }, + { + 'tier': 2, + 'notionalFloor': 2001, + 'notionalCap': 4000, + 'maintenanceMarginRatio': 0.015, + 'maxLeverage': 50, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.02', + 'instId': '', + 'maxLever': '50', + 'maxSz': '4000', + 'minSz': '2001', + 'mmr': '0.015', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '2', + 'uly': 'ETH-USDT' + } + }, + { + 'tier': 3, + 'notionalFloor': 4001, + 'notionalCap': 8000, + 'maintenanceMarginRatio': 0.02, + 'maxLeverage': 20, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.05', + 'instId': '', + 'maxLever': '20', + 'maxSz': '8000', + 'minSz': '4001', + 'mmr': '0.02', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '3', + 'uly': 'ETH-USDT' + } + }, + ] + }, + ]) + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + default_conf['stake_currency'] = 'USDT' + exchange = get_patched_exchange(mocker, default_conf, api_mock, id="okx") + exchange.trading_mode = TradingMode.FUTURES + exchange.margin_mode = MarginMode.ISOLATED + exchange.markets = markets + assert exchange.load_leverage_tiers() == { + 'ADA/USDT:USDT': [ + { + 'tier': 1, + 'min': 0, + 'max': 500, + 'mmr': 0.02, + 'lev': 75, + 'maintAmt': None + }, + { + 'tier': 2, + 'min': 501, + 'max': 1000, + 'mmr': 0.025, + 'lev': 50, + 'maintAmt': None + }, + { + 'tier': 3, + 'min': 1001, + 'max': 2000, + 'mmr': 0.03, + 'lev': 20, + 'maintAmt': None + }, + ], + 'ETH/USDT:USDT': [ + { + 'tier': 1, + 'min': 0, + 'max': 2000, + 'mmr': 0.01, + 'lev': 75, + 'maintAmt': None + }, + { + 'tier': 2, + 'min': 2001, + 'max': 4000, + 'mmr': 0.015, + 'lev': 50, + 'maintAmt': None + }, + { + 'tier': 3, + 'min': 4001, + 'max': 8000, + 'mmr': 0.02, + 'lev': 20, + 'maintAmt': None + }, + ], + } From 3753df26fc1fe0a918910566b37a23fb4678f710 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 14 Feb 2022 17:34:59 -0600 Subject: [PATCH 47/70] fixed tests --- freqtrade/exchange/gateio.py | 2 +- freqtrade/exchange/okx.py | 9 ++++++--- tests/exchange/test_binance.py | 1 - tests/exchange/test_exchange.py | 7 +++++-- tests/exchange/test_okx.py | 2 +- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/freqtrade/exchange/gateio.py b/freqtrade/exchange/gateio.py index 1c5b43cb7..0007b0f09 100644 --- a/freqtrade/exchange/gateio.py +++ b/freqtrade/exchange/gateio.py @@ -31,7 +31,7 @@ class Gateio(Exchange): # TradingMode.SPOT always supported and not required in this list # (TradingMode.MARGIN, MarginMode.CROSS), # (TradingMode.FUTURES, MarginMode.CROSS), - (TradingMode.FUTURES, MarginMode.ISOLATED) + # (TradingMode.FUTURES, MarginMode.ISOLATED) ] def validate_ordertypes(self, order_types: Dict) -> None: diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 09bb48aa6..ddbb85ea7 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -65,6 +65,7 @@ class Okx(Exchange): return pair_tiers[-1]['max'] / leverage def load_leverage_tiers(self) -> Dict[str, List[Dict]]: + # * This is slow(~45s) on Okex, must make 90-some api calls to load all linear swap markets if self.trading_mode == TradingMode.FUTURES: markets = self.markets symbols = [] @@ -74,11 +75,13 @@ class Okx(Exchange): and market['quote'] == self._config['stake_currency']): symbols.append(symbol) - tiers = {} + tiers: Dict[str, List[Dict]] = {} + for symbol in symbols: res = self._api.fetchLeverageTiers(symbol) - res_symbol = res[symbol] - tiers[symbol] = self.parse_leverage_tier(res[symbol]) + tiers[symbol] = [] + for tier in res[symbol]: + tiers[symbol].append(self.parse_leverage_tier(tier)) return tiers else: diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index 64c16d5e7..cb516e0d0 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -151,7 +151,6 @@ def test_stoploss_order_dry_run_binance(default_conf, mocker): def test_stoploss_adjust_binance( mocker, default_conf, - leverage_tiers, sl1, sl2, sl3, diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index a4aaa06f6..0de8ddfbc 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -689,7 +689,7 @@ def test_validate_stakecurrency_error(default_conf, mocker, caplog): def test_get_quote_currencies(default_conf, mocker): ex = get_patched_exchange(mocker, default_conf) - assert set(ex.get_quote_currencies()) == set(['USD', 'ETH', 'BTC', 'USDT']) + assert set(ex.get_quote_currencies()) == set(['USD', 'ETH', 'BTC', 'USDT', 'BUSD']) @pytest.mark.parametrize('pair,expected', [ @@ -3233,6 +3233,7 @@ def test_market_is_tradable( 'future': futures, 'swap': futures, 'margin': margin, + 'linear': True, **(add_dict), } assert ex.market_is_tradable(market) == expected_result @@ -3497,10 +3498,11 @@ def test_set_margin_mode(mocker, default_conf, margin_mode): ("okx", TradingMode.FUTURES, MarginMode.CROSS, True), ("binance", TradingMode.FUTURES, MarginMode.ISOLATED, False), - ("gateio", TradingMode.FUTURES, MarginMode.ISOLATED, False), + # ("gateio", TradingMode.FUTURES, MarginMode.ISOLATED, False), ("okx", TradingMode.FUTURES, MarginMode.ISOLATED, False), # * Remove once implemented + ("gateio", TradingMode.FUTURES, MarginMode.ISOLATED, True), ("binance", TradingMode.MARGIN, MarginMode.CROSS, True), ("binance", TradingMode.FUTURES, MarginMode.CROSS, True), ("kraken", TradingMode.MARGIN, MarginMode.CROSS, True), @@ -4351,6 +4353,7 @@ def test_get_maintenance_ratio_and_amt( default_conf['margin_mode'] = 'isolated' mocker.patch('freqtrade.exchange.Exchange.exchange_has', return_value=True) exchange = get_patched_exchange(mocker, default_conf, api_mock) + exchange._leverage_tiers = leverage_tiers exchange.get_maintenance_ratio_and_amt(pair, value) == (mmr, maintAmt) diff --git a/tests/exchange/test_okx.py b/tests/exchange/test_okx.py index 388d8b510..597c75632 100644 --- a/tests/exchange/test_okx.py +++ b/tests/exchange/test_okx.py @@ -1,7 +1,7 @@ from unittest.mock import MagicMock # , PropertyMock +from freqtrade.enums import MarginMode, TradingMode from tests.conftest import get_patched_exchange -from freqtrade.enums import TradingMode, MarginMode def test_get_maintenance_ratio_and_amt_okx( From 5ee5e0256b9a0f0d61fe83326625969ba23f8128 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 15 Feb 2022 06:39:47 +0100 Subject: [PATCH 48/70] Clarify todo --- tests/exchange/test_ccxt_compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/exchange/test_ccxt_compat.py b/tests/exchange/test_ccxt_compat.py index 44bd68a31..ce559e9dd 100644 --- a/tests/exchange/test_ccxt_compat.py +++ b/tests/exchange/test_ccxt_compat.py @@ -341,9 +341,9 @@ class TestCCXTExchange(): def test_ccxt_get_max_leverage_futures(self, exchange_futures): futures, futures_name = exchange_futures - # TODO-lev: binance, gateio, and okx test if futures: leverage_in_market_futures = EXCHANGES[futures_name]['leverage_in_market']['futures'] + # TODO-lev: binance, gateio, and okx don't have leverage_in_market if leverage_in_market_futures: futures_pair = EXCHANGES[futures_name].get( 'futures_pair', From 324fdcedb1bf36ecef37a6bff5d4a518cd355975 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 15 Feb 2022 06:59:10 +0100 Subject: [PATCH 49/70] Attempt test fix --- freqtrade/exchange/exchange.py | 2 +- freqtrade/exchange/okx.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 55c75ca0a..646425b9a 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1888,7 +1888,7 @@ class Exchange: self._leverage_tiers[pair] = pair_tiers def parse_leverage_tier(self, tier) -> Dict: - info = tier['info'] + info = tier.get('info', {}) return { 'min': tier['notionalFloor'], 'max': tier['notionalCap'], diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index c933153f5..833e3cc09 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -82,8 +82,8 @@ class Okx(Exchange): f"Initializing leverage_tiers for {len(symbols)} markets. " "This will take about a minute.") - for symbol in symbols: - res = self._api.fetchLeverageTiers(symbol) + for symbol in sorted(symbols): + res = self._api.fetch_leverage_tiers(symbol) tiers[symbol] = [] for tier in res[symbol]: tiers[symbol].append(self.parse_leverage_tier(tier)) From 1bae18c60a98680ed724fdd3c88755c0d0b49ba1 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 15 Feb 2022 07:04:50 +0100 Subject: [PATCH 50/70] Update decorator locations --- freqtrade/exchange/binance.py | 1 + freqtrade/exchange/exchange.py | 2 +- freqtrade/exchange/okx.py | 2 ++ tests/conftest.py | 6 +++--- tests/exchange/test_binance.py | 2 +- tests/exchange/test_exchange.py | 2 +- 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index d25a6a38f..3bae2bfe2 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -246,6 +246,7 @@ class Binance(Exchange): raise OperationalException( "Freqtrade only supports isolated futures for leverage trading") + @retrier def load_leverage_tiers(self) -> Dict[str, List[Dict]]: if self._config['dry_run']: leverage_tiers_path = ( diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 646425b9a..30e70461e 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1858,6 +1858,7 @@ class Exchange: except ccxt.BaseError as e: raise OperationalException(e) from e + @retrier def load_leverage_tiers(self) -> Dict[str, List[Dict]]: if self.trading_mode == TradingMode.FUTURES and self.exchange_has('fetchLeverageTiers'): try: @@ -1874,7 +1875,6 @@ class Exchange: else: return {} - @retrier def fill_leverage_tiers(self) -> None: """ Assigns property _leverage_tiers to a dictionary of information about the leverage diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 833e3cc09..3fa62de9e 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -4,6 +4,7 @@ from typing import Dict, List, Tuple from freqtrade.enums import MarginMode, TradingMode from freqtrade.exceptions import OperationalException from freqtrade.exchange import Exchange +from freqtrade.exchange.common import retrier logger = logging.getLogger(__name__) @@ -64,6 +65,7 @@ class Okx(Exchange): pair_tiers = self._leverage_tiers[pair] return pair_tiers[-1]['max'] / leverage + @retrier def load_leverage_tiers(self) -> Dict[str, List[Dict]]: # * This is slow(~45s) on Okex, must make 90-some api calls to load all linear swap markets if self.trading_mode == TradingMode.FUTURES: diff --git a/tests/conftest.py b/tests/conftest.py index 04c4fd70d..b9dd86d1d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -846,7 +846,7 @@ def get_markets(): 'option': False, 'active': True, 'contract': None, - 'linear': None, + 'linear': True, 'inverse': None, 'taker': 0.0006, 'maker': 0.0002, @@ -891,8 +891,8 @@ def get_markets(): 'future': True, 'swap': True, 'margin': True, - 'linear': False, - 'inverse': True, + 'linear': True, + 'inverse': False, 'type': 'spot', 'contractSize': None, 'taker': 0.0006, diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index cb516e0d0..64f18220f 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -486,7 +486,7 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): api_mock, "binance", "fill_leverage_tiers", - "fetch_leverage_tiers" + "fetch_leverage_tiers", ) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 0de8ddfbc..5e8a44ef4 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4247,7 +4247,7 @@ def test_load_leverage_tiers(mocker, default_conf, leverage_tiers): mocker, default_conf, api_mock, - "binance", + "ftx", "load_leverage_tiers", "fetch_leverage_tiers", ) From c37f03a638d31a4dbe561c90e5dd8d3353861f54 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 15 Feb 2022 07:42:40 +0100 Subject: [PATCH 51/70] Update static-markets to include futures pair --- freqtrade/exchange/okx.py | 4 +--- tests/commands/test_commands.py | 32 ++++++++++++++++---------------- tests/conftest.py | 8 +++++--- tests/exchange/test_exchange.py | 16 +++++++++------- tests/exchange/test_okx.py | 3 ++- 5 files changed, 33 insertions(+), 30 deletions(-) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 3fa62de9e..ce87c91a0 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -86,9 +86,7 @@ class Okx(Exchange): for symbol in sorted(symbols): res = self._api.fetch_leverage_tiers(symbol) - tiers[symbol] = [] - for tier in res[symbol]: - tiers[symbol].append(self.parse_leverage_tier(tier)) + tiers[symbol] = res[symbol] logger.info(f"Done initializing {len(symbols)} markets.") return tiers diff --git a/tests/commands/test_commands.py b/tests/commands/test_commands.py index 676499642..7baa91720 100644 --- a/tests/commands/test_commands.py +++ b/tests/commands/test_commands.py @@ -231,9 +231,9 @@ def test_list_markets(mocker, markets_static, capsys): ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 10 active markets: " - "BLK/BTC, ETH/BTC, ETH/USDT, LTC/BTC, LTC/ETH, LTC/USD, NEO/BTC, " - "TKN/BTC, XLTCUSDT, XRP/BTC.\n" + assert ("Exchange Bittrex has 12 active markets: " + "ADA/USDT:USDT, BLK/BTC, ETH/BTC, ETH/USDT, ETH/USDT:USDT, LTC/BTC, " + "LTC/ETH, LTC/USD, NEO/BTC, TKN/BTC, XLTCUSDT, XRP/BTC.\n" in captured.out) patch_exchange(mocker, api_mock=api_mock, id="binance", mock_markets=markets_static) @@ -246,7 +246,7 @@ def test_list_markets(mocker, markets_static, capsys): pargs['config'] = None start_list_markets(pargs, False) captured = capsys.readouterr() - assert re.match("\nExchange Binance has 10 active markets:\n", + assert re.match("\nExchange Binance has 12 active markets:\n", captured.out) patch_exchange(mocker, api_mock=api_mock, id="bittrex", mock_markets=markets_static) @@ -258,9 +258,9 @@ def test_list_markets(mocker, markets_static, capsys): ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 12 markets: " - "BLK/BTC, BTT/BTC, ETH/BTC, ETH/USDT, LTC/BTC, LTC/ETH, LTC/USD, LTC/USDT, NEO/BTC, " - "TKN/BTC, XLTCUSDT, XRP/BTC.\n" + assert ("Exchange Bittrex has 14 markets: " + "ADA/USDT:USDT, BLK/BTC, BTT/BTC, ETH/BTC, ETH/USDT, ETH/USDT:USDT, " + "LTC/BTC, LTC/ETH, LTC/USD, LTC/USDT, NEO/BTC, TKN/BTC, XLTCUSDT, XRP/BTC.\n" in captured.out) # Test list-pairs subcommand: active pairs @@ -297,8 +297,8 @@ def test_list_markets(mocker, markets_static, capsys): ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 6 active markets with ETH, LTC as base currencies: " - "ETH/BTC, ETH/USDT, LTC/BTC, LTC/ETH, LTC/USD, XLTCUSDT.\n" + assert ("Exchange Bittrex has 7 active markets with ETH, LTC as base currencies: " + "ETH/BTC, ETH/USDT, ETH/USDT:USDT, LTC/BTC, LTC/ETH, LTC/USD, XLTCUSDT.\n" in captured.out) # active markets, base=LTC @@ -323,8 +323,8 @@ def test_list_markets(mocker, markets_static, capsys): ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 3 active markets with USDT, USD as quote currencies: " - "ETH/USDT, LTC/USD, XLTCUSDT.\n" + assert ("Exchange Bittrex has 5 active markets with USDT, USD as quote currencies: " + "ADA/USDT:USDT, ETH/USDT, ETH/USDT:USDT, LTC/USD, XLTCUSDT.\n" in captured.out) # active markets, quote=USDT @@ -336,8 +336,8 @@ def test_list_markets(mocker, markets_static, capsys): ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 2 active markets with USDT as quote currency: " - "ETH/USDT, XLTCUSDT.\n" + assert ("Exchange Bittrex has 4 active markets with USDT as quote currency: " + "ADA/USDT:USDT, ETH/USDT, ETH/USDT:USDT, XLTCUSDT.\n" in captured.out) # active markets, base=LTC, quote=USDT @@ -399,7 +399,7 @@ def test_list_markets(mocker, markets_static, capsys): ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ("Exchange Bittrex has 10 active markets:\n" + assert ("Exchange Bittrex has 12 active markets:\n" in captured.out) # Test tabular output, no markets found @@ -422,8 +422,8 @@ def test_list_markets(mocker, markets_static, capsys): ] start_list_markets(get_args(args), False) captured = capsys.readouterr() - assert ('["BLK/BTC","ETH/BTC","ETH/USDT","LTC/BTC","LTC/ETH","LTC/USD","NEO/BTC",' - '"TKN/BTC","XLTCUSDT","XRP/BTC"]' + assert ('["ADA/USDT:USDT","BLK/BTC","ETH/BTC","ETH/USDT","ETH/USDT:USDT",' + '"LTC/BTC","LTC/ETH","LTC/USD","NEO/BTC","TKN/BTC","XLTCUSDT","XRP/BTC"]' in captured.out) # Test --print-csv diff --git a/tests/conftest.py b/tests/conftest.py index b9dd86d1d..00c8c3916 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -846,7 +846,7 @@ def get_markets(): 'option': False, 'active': True, 'contract': None, - 'linear': True, + 'linear': None, 'inverse': None, 'taker': 0.0006, 'maker': 0.0002, @@ -891,7 +891,7 @@ def get_markets(): 'future': True, 'swap': True, 'margin': True, - 'linear': True, + 'linear': None, 'inverse': False, 'type': 'spot', 'contractSize': None, @@ -1398,7 +1398,9 @@ def markets_static(): # market list. Do not modify this list without a good reason! Do not modify market parameters # of listed pairs in get_markets() without a good reason either! static_markets = ['BLK/BTC', 'BTT/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', - 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC'] + 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC', + 'ADA/USDT:USDT', 'ETH/USDT:USDT', + ] all_markets = get_markets() return {m: all_markets[m] for m in static_markets} diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 5e8a44ef4..d43c0518d 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -3003,8 +3003,9 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): # 'XLTCUSDT': 'active': True, not a pair # 'XRP/BTC': 'active': False ([], [], False, False, False, False, - ['BLK/BTC', 'BTT/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', - 'LTC/USDT', 'NEO/BTC', 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC'], + ['BLK/BTC', 'BTT/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', + 'NEO/BTC', 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC', 'ADA/USDT:USDT', + 'ETH/USDT:USDT'], 'all markets'), ([], [], False, False, True, False, ['BLK/BTC', 'BTT/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', @@ -3012,7 +3013,7 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): 'all markets, only spot pairs'), ([], [], False, True, False, False, ['BLK/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', 'NEO/BTC', - 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC'], + 'TKN/BTC', 'XLTCUSDT', 'XRP/BTC', 'ADA/USDT:USDT', 'ETH/USDT:USDT'], 'active markets'), ([], [], True, False, False, False, ['BLK/BTC', 'BTT/BTC', 'ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', @@ -3023,7 +3024,8 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): 'TKN/BTC', 'XRP/BTC'], 'active pairs'), (['ETH', 'LTC'], [], False, False, False, False, - ['ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT'], + ['ETH/BTC', 'ETH/USDT', 'LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT', + 'ETH/USDT:USDT'], 'all markets, base=ETH, LTC'), (['LTC'], [], False, False, False, False, ['LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT'], @@ -3032,13 +3034,13 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): ['LTC/BTC', 'LTC/ETH', 'LTC/USD', 'LTC/USDT'], 'spot markets, base=LTC'), ([], ['USDT'], False, False, False, False, - ['ETH/USDT', 'LTC/USDT', 'XLTCUSDT'], + ['ETH/USDT', 'LTC/USDT', 'XLTCUSDT', 'ADA/USDT:USDT', 'ETH/USDT:USDT'], 'all markets, quote=USDT'), ([], ['USDT'], False, False, False, True, - ['ETH/USDT', 'LTC/USDT'], + ['ADA/USDT:USDT', 'ETH/USDT:USDT'], 'Futures markets, quote=USDT'), ([], ['USDT', 'USD'], False, False, False, False, - ['ETH/USDT', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT'], + ['ETH/USDT', 'LTC/USD', 'LTC/USDT', 'XLTCUSDT', 'ADA/USDT:USDT', 'ETH/USDT:USDT'], 'all markets, quote=USDT, USD'), ([], ['USDT', 'USD'], False, False, True, False, ['ETH/USDT', 'LTC/USD', 'LTC/USDT'], diff --git a/tests/exchange/test_okx.py b/tests/exchange/test_okx.py index 597c75632..2eaa1736d 100644 --- a/tests/exchange/test_okx.py +++ b/tests/exchange/test_okx.py @@ -309,7 +309,8 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets): exchange.trading_mode = TradingMode.FUTURES exchange.margin_mode = MarginMode.ISOLATED exchange.markets = markets - assert exchange.load_leverage_tiers() == { + # Initialization of load_leverage_tiers happens as part of exchange init. + exchange._leverage_tiers == { 'ADA/USDT:USDT': [ { 'tier': 1, From 33cc5e0ac7b28621c3cebf0d5bfd62c4a9dfaad3 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 15 Feb 2022 18:56:58 +0100 Subject: [PATCH 52/70] Use kwargs for set_leverage --- freqtrade/exchange/okx.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index ce87c91a0..aa03fb08d 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -42,8 +42,8 @@ class Okx(Exchange): f"{self.name}.margin_mode must be set for {self.trading_mode.value}" ) self._api.set_leverage( - leverage, - pair, + leverage=leverage, + symbol=pair, params={ "mgnMode": self.margin_mode.value, "posSide": "long" if side == "buy" else "short", From 7f7c395b101f731485229cb8e8d186942e47f7ea Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 15 Feb 2022 19:30:02 +0100 Subject: [PATCH 53/70] Add exception handling for lev_prep in okx --- freqtrade/exchange/okx.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index aa03fb08d..8b71773be 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -1,8 +1,10 @@ import logging from typing import Dict, List, Tuple +import ccxt + from freqtrade.enums import MarginMode, TradingMode -from freqtrade.exceptions import OperationalException +from freqtrade.exceptions import DDosProtection, OperationalException, TemporaryError from freqtrade.exchange import Exchange from freqtrade.exchange.common import retrier @@ -30,6 +32,7 @@ class Okx(Exchange): (TradingMode.FUTURES, MarginMode.ISOLATED), ] + @retrier def _lev_prep( self, pair: str, @@ -41,13 +44,21 @@ class Okx(Exchange): raise OperationalException( f"{self.name}.margin_mode must be set for {self.trading_mode.value}" ) - self._api.set_leverage( - leverage=leverage, - symbol=pair, - params={ - "mgnMode": self.margin_mode.value, - "posSide": "long" if side == "buy" else "short", - }) + try: + self._api.set_leverage( + leverage=leverage, + symbol=pair, + params={ + "mgnMode": self.margin_mode.value, + # "posSide": "net"", + }) + except ccxt.DDoSProtection as e: + raise DDosProtection(e) from e + except (ccxt.NetworkError, ccxt.ExchangeError) as e: + raise TemporaryError( + f'Could not set leverage due to {e.__class__.__name__}. Message: {e}') from e + except ccxt.BaseError as e: + raise OperationalException(e) from e def get_max_pair_stake_amount( self, From ff5b3c323adc07b7cded5cb38ac8f54b235b76a8 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 16 Feb 2022 09:02:11 +0100 Subject: [PATCH 54/70] Fix okx trading mode --- freqtrade/exchange/okx.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 8b71773be..99b19903b 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -32,6 +32,24 @@ class Okx(Exchange): (TradingMode.FUTURES, MarginMode.ISOLATED), ] + def _get_params( + self, + ordertype: str, + leverage: float, + reduceOnly: bool, + time_in_force: str = 'gtc', + ) -> Dict: + # TODO-lev: Test me + params = super()._get_params( + ordertype=ordertype, + leverage=leverage, + reduceOnly=reduceOnly, + time_in_force=time_in_force, + ) + if self.trading_mode == TradingMode.FUTURES and self.margin_mode: + params['tdMode'] = self.margin_mode.value + return params + @retrier def _lev_prep( self, @@ -45,6 +63,7 @@ class Okx(Exchange): f"{self.name}.margin_mode must be set for {self.trading_mode.value}" ) try: + # TODO-lev: Test me properly (check mgnMode passed) self._api.set_leverage( leverage=leverage, symbol=pair, From c9da6f480f31b99c4056aaaa1ae38e2c1c553402 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 03:36:08 -0600 Subject: [PATCH 55/70] gateio get_max_leverage and get_maintenance_ratio_and_amt temporary solution --- freqtrade/exchange/gateio.py | 25 +++++++++++++++-- tests/exchange/test_gateio.py | 51 +++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/freqtrade/exchange/gateio.py b/freqtrade/exchange/gateio.py index 0007b0f09..cfa590fae 100644 --- a/freqtrade/exchange/gateio.py +++ b/freqtrade/exchange/gateio.py @@ -1,6 +1,6 @@ """ Gate.io exchange subclass """ import logging -from typing import Dict, List, Tuple +from typing import Dict, List, Optional, Tuple from freqtrade.enums import MarginMode, TradingMode from freqtrade.exceptions import OperationalException @@ -31,7 +31,7 @@ class Gateio(Exchange): # TradingMode.SPOT always supported and not required in this list # (TradingMode.MARGIN, MarginMode.CROSS), # (TradingMode.FUTURES, MarginMode.CROSS), - # (TradingMode.FUTURES, MarginMode.ISOLATED) + (TradingMode.FUTURES, MarginMode.ISOLATED) ] def validate_ordertypes(self, order_types: Dict) -> None: @@ -40,3 +40,24 @@ class Gateio(Exchange): if any(v == 'market' for k, v in order_types.items()): raise OperationalException( f'Exchange {self.name} does not support market orders.') + + def get_maintenance_ratio_and_amt( + self, + pair: str, + nominal_value: Optional[float] = 0.0, + ) -> Tuple[float, Optional[float]]: + """ + :return: The maintenance margin ratio and maintenance amount + """ + info = self.markets[pair]['info'] + return (float(info['maintenance_rate']), None) + + def get_max_leverage(self, pair: str, stake_amount: Optional[float]) -> float: + """ + Returns the maximum leverage that a pair can be traded at + :param pair: The base/quote currency pair being traded + :param nominal_value: The total value of the trade in quote currency (margin_mode + debt) + """ + market = self.markets[pair] + if market['limits']['leverage']['max'] is not None: + return market['limits']['leverage']['max'] diff --git a/tests/exchange/test_gateio.py b/tests/exchange/test_gateio.py index 6f7862909..209bf3577 100644 --- a/tests/exchange/test_gateio.py +++ b/tests/exchange/test_gateio.py @@ -1,8 +1,11 @@ +from unittest.mock import MagicMock, PropertyMock + import pytest from freqtrade.exceptions import OperationalException from freqtrade.exchange import Gateio from freqtrade.resolvers.exchange_resolver import ExchangeResolver +from tests.conftest import get_patched_exchange def test_validate_order_types_gateio(default_conf, mocker): @@ -26,3 +29,51 @@ def test_validate_order_types_gateio(default_conf, mocker): with pytest.raises(OperationalException, match=r'Exchange .* does not support market orders.'): ExchangeResolver.load_exchange('gateio', default_conf, True) + + +@pytest.mark.parametrize('pair,mm_ratio', [ + ("ETH/USDT:USDT", 0.005), + ("ADA/USDT:USDT", 0.003), +]) +def test_get_maintenance_ratio_and_amt_gateio(default_conf, mocker, pair, mm_ratio): + api_mock = MagicMock() + exchange = get_patched_exchange(mocker, default_conf, api_mock, id="gateio") + mocker.patch( + 'freqtrade.exchange.Exchange.markets', + PropertyMock( + return_value={ + 'ETH/USDT:USDT': { + 'taker': 0.0000075, + 'maker': -0.0000025, + 'info': { + 'maintenance_rate': '0.005', + }, + 'id': 'ETH_USDT', + 'symbol': 'ETH/USDT:USDT', + }, + 'ADA/USDT:USDT': { + 'taker': 0.0000075, + 'maker': -0.0000025, + 'info': { + 'maintenance_rate': '0.003', + }, + 'id': 'ADA_USDT', + 'symbol': 'ADA/USDT:USDT', + }, + } + ) + ) + assert exchange.get_maintenance_ratio_and_amt(pair) == (mm_ratio, None) + + +@pytest.mark.parametrize('pair,nominal_value,max_lev', [ + ("ETH/BTC", 0.0, 2.0), + ("TKN/BTC", 100.0, 5.0), + ("BLK/BTC", 173.31, 3.0), + ("LTC/BTC", 0.0, 1.0), + ("TKN/USDT", 210.30, 1.0), +]) +def test_get_max_leverage_gateio(default_conf, mocker, pair, nominal_value, max_lev): + # Binance has a different method of getting the max leverage + exchange = get_patched_exchange(mocker, default_conf, id="kraken") + assert exchange.get_max_leverage(pair, nominal_value) == max_lev From 3bfd9186f70518c237658c090789bdd10e6678aa Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 04:05:27 -0600 Subject: [PATCH 56/70] gateio.get_max_leverage small fix --- freqtrade/exchange/gateio.py | 2 ++ tests/exchange/test_exchange.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/freqtrade/exchange/gateio.py b/freqtrade/exchange/gateio.py index cfa590fae..305bf1547 100644 --- a/freqtrade/exchange/gateio.py +++ b/freqtrade/exchange/gateio.py @@ -61,3 +61,5 @@ class Gateio(Exchange): market = self.markets[pair] if market['limits']['leverage']['max'] is not None: return market['limits']['leverage']['max'] + else: + return 1.0 diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index d43c0518d..8eeededfe 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4335,7 +4335,7 @@ def test_get_maintenance_ratio_and_amt_exceptions(mocker, default_conf, leverage exchange.get_maintenance_ratio_and_amt('1000SHIB/USDT', 10000) -@ pytest.mark.parametrize('pair,value,mmr,maintAmt', [ +@pytest.mark.parametrize('pair,value,mmr,maintAmt', [ ('ADA/BUSD', 500, 0.025, 0.0), ('ADA/BUSD', 20000000, 0.5, 1527500.0), ('ZEC/USDT', 500, 0.01, 0.0), From 3fe0e13bb19a32cb7a872b396fd159a32d737fbf Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 04:37:11 -0600 Subject: [PATCH 57/70] expanded test_load_leverage_tiers --- tests/exchange/test_exchange.py | 58 +++++++++++++++++++++++++++++++++ tests/exchange/test_gateio.py | 2 +- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 8eeededfe..af0f7a027 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4242,8 +4242,66 @@ def test_load_leverage_tiers(mocker, default_conf, leverage_tiers): api_mock.fetch_leverage_tiers = MagicMock() type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) default_conf['dry_run'] = False + + api_mock.fetch_leverage_tiers = MagicMock(return_value=[ + { + 'ADA/USDT:USDT': [ + { + 'tier': 1, + 'notionalFloor': 0, + 'notionalCap': 500, + 'maintenanceMarginRatio': 0.02, + 'maxLeverage': 75, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.013', + 'instId': '', + 'maxLever': '75', + 'maxSz': '500', + 'minSz': '0', + 'mmr': '0.01', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '1', + 'uly': 'ADA-USDT' + } + }, + ] + } + ]) + + # SPOT + exchange = get_patched_exchange(mocker, default_conf, api_mock) + assert exchange.load_leverage_tiers() == {} + + # FUTURES default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, api_mock) + assert exchange.load_leverage_tiers() == { + 'ADA/USDT:USDT': [ + { + 'tier': 1, + 'notionalFloor': 0, + 'notionalCap': 500, + 'maintenanceMarginRatio': 0.02, + 'maxLeverage': 75, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.013', + 'instId': '', + 'maxLever': '75', + 'maxSz': '500', + 'minSz': '0', + 'mmr': '0.01', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '1', + 'uly': 'ADA-USDT' + } + }, + ] + } ccxt_exceptionhandlers( mocker, diff --git a/tests/exchange/test_gateio.py b/tests/exchange/test_gateio.py index 209bf3577..9f65560a5 100644 --- a/tests/exchange/test_gateio.py +++ b/tests/exchange/test_gateio.py @@ -75,5 +75,5 @@ def test_get_maintenance_ratio_and_amt_gateio(default_conf, mocker, pair, mm_rat ]) def test_get_max_leverage_gateio(default_conf, mocker, pair, nominal_value, max_lev): # Binance has a different method of getting the max leverage - exchange = get_patched_exchange(mocker, default_conf, id="kraken") + exchange = get_patched_exchange(mocker, default_conf, id="gateio") assert exchange.get_max_leverage(pair, nominal_value) == max_lev From 1f3d3d87f6eebf5bbe6a4d6cb48049c5e3302ad7 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 04:52:26 -0600 Subject: [PATCH 58/70] fixed tests --- tests/exchange/test_exchange.py | 58 ++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index af0f7a027..5c44aa5b4 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -3500,11 +3500,10 @@ def test_set_margin_mode(mocker, default_conf, margin_mode): ("okx", TradingMode.FUTURES, MarginMode.CROSS, True), ("binance", TradingMode.FUTURES, MarginMode.ISOLATED, False), - # ("gateio", TradingMode.FUTURES, MarginMode.ISOLATED, False), + ("gateio", TradingMode.FUTURES, MarginMode.ISOLATED, False), ("okx", TradingMode.FUTURES, MarginMode.ISOLATED, False), # * Remove once implemented - ("gateio", TradingMode.FUTURES, MarginMode.ISOLATED, True), ("binance", TradingMode.MARGIN, MarginMode.CROSS, True), ("binance", TradingMode.FUTURES, MarginMode.CROSS, True), ("kraken", TradingMode.MARGIN, MarginMode.CROSS, True), @@ -4274,34 +4273,41 @@ def test_load_leverage_tiers(mocker, default_conf, leverage_tiers): exchange = get_patched_exchange(mocker, default_conf, api_mock) assert exchange.load_leverage_tiers() == {} - # FUTURES + # FUTURES has.fetchLeverageTiers == False default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' exchange = get_patched_exchange(mocker, default_conf, api_mock) + type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': False}) + exchange = get_patched_exchange(mocker, default_conf, api_mock) + assert exchange.load_leverage_tiers() == {} + + # FUTURES regular + type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) + exchange = get_patched_exchange(mocker, default_conf, api_mock) assert exchange.load_leverage_tiers() == { - 'ADA/USDT:USDT': [ - { - 'tier': 1, - 'notionalFloor': 0, - 'notionalCap': 500, - 'maintenanceMarginRatio': 0.02, - 'maxLeverage': 75, - 'info': { - 'baseMaxLoan': '', - 'imr': '0.013', - 'instId': '', - 'maxLever': '75', - 'maxSz': '500', - 'minSz': '0', - 'mmr': '0.01', - 'optMgnFactor': '0', - 'quoteMaxLoan': '', - 'tier': '1', - 'uly': 'ADA-USDT' - } - }, - ] - } + 'ADA/USDT:USDT': [ + { + 'tier': 1, + 'notionalFloor': 0, + 'notionalCap': 500, + 'maintenanceMarginRatio': 0.02, + 'maxLeverage': 75, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.013', + 'instId': '', + 'maxLever': '75', + 'maxSz': '500', + 'minSz': '0', + 'mmr': '0.01', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '1', + 'uly': 'ADA-USDT' + } + }, + ] + } ccxt_exceptionhandlers( mocker, From 183f85efe3c24eaa07a3cd2f36e9d05058fcbf8d Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 05:08:11 -0600 Subject: [PATCH 59/70] test_execute_entry fixed --- tests/test_freqtradebot.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 93920a163..39654e780 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -929,6 +929,7 @@ def test_execute_entry(mocker, default_conf_usdt, fee, limit_order, assert trade.open_rate_requested == 10 # In case of custom entry price not float type + freqtrade.exchange.get_maintenance_ratio_and_amt = MagicMock(return_value=(0.01, 0.01)) freqtrade.exchange.name = exchange_name order['status'] = 'open' order['id'] = '5568' From c70050e75094e08a817d5d30f9adf3e5ce497581 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 05:26:52 -0600 Subject: [PATCH 60/70] fixed test_load_leverage_tiers --- freqtrade/exchange/binance.py | 33 ++++++++++-------- tests/exchange/test_exchange.py | 62 ++++++++++++++++----------------- 2 files changed, 49 insertions(+), 46 deletions(-) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 3bae2bfe2..ecd56bebf 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -248,19 +248,22 @@ class Binance(Exchange): @retrier def load_leverage_tiers(self) -> Dict[str, List[Dict]]: - if self._config['dry_run']: - leverage_tiers_path = ( - Path(__file__).parent / 'binance_leverage_tiers.json' - ) - with open(leverage_tiers_path) as json_file: - return json.load(json_file) + if self.trading_mode == TradingMode.FUTURES: + if self._config['dry_run']: + leverage_tiers_path = ( + Path(__file__).parent / 'binance_leverage_tiers.json' + ) + with open(leverage_tiers_path) as json_file: + return json.load(json_file) + else: + try: + return self._api.fetch_leverage_tiers() + except ccxt.DDoSProtection as e: + raise DDosProtection(e) from e + except (ccxt.NetworkError, ccxt.ExchangeError) as e: + raise TemporaryError(f'Could not fetch leverage amounts due to' + f'{e.__class__.__name__}. Message: {e}') from e + except ccxt.BaseError as e: + raise OperationalException(e) from e else: - try: - return self._api.fetch_leverage_tiers() - except ccxt.DDoSProtection as e: - raise DDosProtection(e) from e - except (ccxt.NetworkError, ccxt.ExchangeError) as e: - raise TemporaryError(f'Could not fetch leverage amounts due to' - f'{e.__class__.__name__}. Message: {e}') from e - except ccxt.BaseError as e: - raise OperationalException(e) from e + return {} diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 5c44aa5b4..5a78b26d2 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4236,54 +4236,54 @@ def test_get_max_pair_stake_amount( assert exchange.get_max_pair_stake_amount('ADA/USDT', 2.0) == 500 -def test_load_leverage_tiers(mocker, default_conf, leverage_tiers): +@pytest.mark.parametrize('exchange_name', EXCHANGES) +def test_load_leverage_tiers(mocker, default_conf, leverage_tiers, exchange_name): api_mock = MagicMock() api_mock.fetch_leverage_tiers = MagicMock() type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) default_conf['dry_run'] = False + mocker.patch('freqtrade.exchange.exchange.Exchange.validate_trading_mode_and_margin_mode') - api_mock.fetch_leverage_tiers = MagicMock(return_value=[ - { - 'ADA/USDT:USDT': [ - { - 'tier': 1, - 'notionalFloor': 0, - 'notionalCap': 500, - 'maintenanceMarginRatio': 0.02, - 'maxLeverage': 75, - 'info': { - 'baseMaxLoan': '', - 'imr': '0.013', - 'instId': '', - 'maxLever': '75', - 'maxSz': '500', - 'minSz': '0', - 'mmr': '0.01', - 'optMgnFactor': '0', - 'quoteMaxLoan': '', - 'tier': '1', - 'uly': 'ADA-USDT' - } - }, - ] - } - ]) + api_mock.fetch_leverage_tiers = MagicMock(return_value={ + 'ADA/USDT:USDT': [ + { + 'tier': 1, + 'notionalFloor': 0, + 'notionalCap': 500, + 'maintenanceMarginRatio': 0.02, + 'maxLeverage': 75, + 'info': { + 'baseMaxLoan': '', + 'imr': '0.013', + 'instId': '', + 'maxLever': '75', + 'maxSz': '500', + 'minSz': '0', + 'mmr': '0.01', + 'optMgnFactor': '0', + 'quoteMaxLoan': '', + 'tier': '1', + 'uly': 'ADA-USDT' + } + }, + ] + }) # SPOT - exchange = get_patched_exchange(mocker, default_conf, api_mock) + exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name) assert exchange.load_leverage_tiers() == {} # FUTURES has.fetchLeverageTiers == False default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' - exchange = get_patched_exchange(mocker, default_conf, api_mock) + exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name) type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': False}) exchange = get_patched_exchange(mocker, default_conf, api_mock) assert exchange.load_leverage_tiers() == {} # FUTURES regular type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) - exchange = get_patched_exchange(mocker, default_conf, api_mock) + exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name) assert exchange.load_leverage_tiers() == { 'ADA/USDT:USDT': [ { @@ -4313,7 +4313,7 @@ def test_load_leverage_tiers(mocker, default_conf, leverage_tiers): mocker, default_conf, api_mock, - "ftx", + exchange_name, "load_leverage_tiers", "fetch_leverage_tiers", ) From 6f410d3096c9bf77ecd02f7e83a44d424d2c744a Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 05:44:11 -0600 Subject: [PATCH 61/70] fixed test_load_leverage_tiers --- tests/exchange/test_exchange.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 5a78b26d2..4fa8f5f62 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4273,13 +4273,14 @@ def test_load_leverage_tiers(mocker, default_conf, leverage_tiers, exchange_name exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name) assert exchange.load_leverage_tiers() == {} - # FUTURES has.fetchLeverageTiers == False default_conf['trading_mode'] = 'futures' default_conf['margin_mode'] = 'isolated' - exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name) - type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': False}) - exchange = get_patched_exchange(mocker, default_conf, api_mock) - assert exchange.load_leverage_tiers() == {} + + if exchange_name != 'binance': + # FUTURES has.fetchLeverageTiers == False + type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': False}) + exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name) + assert exchange.load_leverage_tiers() == {} # FUTURES regular type(api_mock).has = PropertyMock(return_value={'fetchLeverageTiers': True}) From ef5dae27708f3dce134e2cb387ca935caee11257 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 08:08:10 -0600 Subject: [PATCH 62/70] ccxt_compat_tests for leverage tiers --- tests/exchange/test_ccxt_compat.py | 86 ++++++++++++++++-------------- 1 file changed, 47 insertions(+), 39 deletions(-) diff --git a/tests/exchange/test_ccxt_compat.py b/tests/exchange/test_ccxt_compat.py index ce559e9dd..bae74c948 100644 --- a/tests/exchange/test_ccxt_compat.py +++ b/tests/exchange/test_ccxt_compat.py @@ -24,10 +24,8 @@ EXCHANGES = { 'stake_currency': 'USDT', 'hasQuoteVolume': False, 'timeframe': '1h', - 'leverage_in_market': { - 'spot': False, - 'futures': False, - } + 'leverage_tiers_public': False, + 'leverage_in_spot_market': False, }, 'binance': { 'pair': 'BTC/USDT', @@ -35,20 +33,16 @@ EXCHANGES = { 'hasQuoteVolume': True, 'timeframe': '5m', 'futures': True, - 'leverage_in_market': { - 'spot': False, - 'futures': False, - } + 'leverage_tiers_public': False, + 'leverage_in_spot_market': False, }, 'kraken': { 'pair': 'BTC/USDT', 'stake_currency': 'USDT', 'hasQuoteVolume': True, 'timeframe': '5m', - 'leverage_in_market': { - 'spot': True, - 'futures': True, - } + 'leverage_tiers_public': False, + 'leverage_in_spot_market': True, }, 'ftx': { 'pair': 'BTC/USD', @@ -57,20 +51,16 @@ EXCHANGES = { 'timeframe': '5m', 'futures_pair': 'BTC/USD:USD', 'futures': True, - 'leverage_in_market': { - 'spot': True, - 'futures': True, - } + 'leverage_tiers_public': False, # TODO: Set to True once implemented on CCXT + 'leverage_in_spot_market': True, }, 'kucoin': { 'pair': 'BTC/USDT', 'stake_currency': 'USDT', 'hasQuoteVolume': True, 'timeframe': '5m', - 'leverage_in_market': { - 'spot': False, - 'futures': False, - } + 'leverage_tiers_public': False, + 'leverage_in_spot_market': True, }, 'gateio': { 'pair': 'BTC/USDT', @@ -79,10 +69,8 @@ EXCHANGES = { 'timeframe': '5m', 'futures': True, 'futures_pair': 'BTC/USDT:USDT', - 'leverage_in_market': { - 'spot': True, - 'futures': True, - } + 'leverage_tiers_public': False, # TODO-lev: Set to True once implemented on CCXT + 'leverage_in_spot_market': True, }, 'okx': { 'pair': 'BTC/USDT', @@ -91,20 +79,16 @@ EXCHANGES = { 'timeframe': '5m', 'futures_pair': 'BTC/USDT:USDT', 'futures': True, - 'leverage_in_market': { - 'spot': True, - 'futures': True, - } + 'leverage_tiers_public': True, + 'leverage_in_spot_market': True, }, 'bitvavo': { 'pair': 'BTC/EUR', 'stake_currency': 'EUR', 'hasQuoteVolume': True, 'timeframe': '5m', - 'leverage_in_market': { - 'spot': False, - 'futures': False, - } + 'leverage_tiers_public': False, + 'leverage_in_spot_market': False, }, } @@ -332,7 +316,7 @@ class TestCCXTExchange(): def test_ccxt_get_max_leverage_spot(self, exchange): spot, spot_name = exchange if spot: - leverage_in_market_spot = EXCHANGES[spot_name]['leverage_in_market']['spot'] + leverage_in_market_spot = EXCHANGES[spot_name]['leverage_in_spot_market'] if leverage_in_market_spot: spot_pair = EXCHANGES[spot_name].get('pair', EXCHANGES[spot_name]['pair']) spot_leverage = spot.get_max_leverage(spot_pair, 20) @@ -342,9 +326,8 @@ class TestCCXTExchange(): def test_ccxt_get_max_leverage_futures(self, exchange_futures): futures, futures_name = exchange_futures if futures: - leverage_in_market_futures = EXCHANGES[futures_name]['leverage_in_market']['futures'] - # TODO-lev: binance, gateio, and okx don't have leverage_in_market - if leverage_in_market_futures: + leverage_tiers_public = EXCHANGES[futures_name]['leverage_tiers_public'] + if leverage_tiers_public: futures_pair = EXCHANGES[futures_name].get( 'futures_pair', EXCHANGES[futures_name]['pair'] @@ -364,6 +347,34 @@ class TestCCXTExchange(): assert (isinstance(contract_size, float) or isinstance(contract_size, int)) assert contract_size >= 0.0 + def test_ccxt_load_leverage_tiers(self, exchange_futures): + futures, futures_name = exchange_futures + if futures and EXCHANGES[futures_name]['leverage_tiers_public']: + leverage_tiers = futures.load_leverage_tiers() + futures_pair = EXCHANGES[futures_name].get( + 'futures_pair', + EXCHANGES[futures_name]['pair'] + ) + assert (isinstance(leverage_tiers, dict)) + assert futures_pair in leverage_tiers + pair_tiers = leverage_tiers[futures_pair] + assert len(pair_tiers) > 0 + oldLeverage = 0 + oldMaintenanceMarginRate = oldNotionalFloor = oldNotionalCap = float('inf') + for tier in pair_tiers: + for key in ['maintenanceMarginRate', 'notionalFloor', 'notionalCap', 'maxLeverage']: + assert key in tier + assert pair_tiers[key] > 0.0 + assert pair_tiers['notionalCap'] > pair_tiers['notionalFloor'] + assert tier['maxLeverage'] < oldLeverage + assert tier['maintenanceMarginRate'] > oldMaintenanceMarginRate + assert tier['notionalFloor'] > oldNotionalFloor + assert tier['notionalCap'] > oldNotionalCap + oldLeverage = tier['maxLeverage'] + oldMaintenanceMarginRate = tier['maintenanceMarginRate'] + oldNotionalFloor = tier['notionalFloor'] + oldNotionalCap = tier['notionalCap'] + # def test_ccxt_get_liquidation_price(): # return # TODO-lev @@ -373,8 +384,5 @@ class TestCCXTExchange(): # def test_ccxt_get_max_pair_stake_amount(): # return # TODO-lev - # def test_ccxt_load_leverage_tiers(): - # return # TODO-lev - # def test_ccxt_get_maintenance_ratio_and_amt(): # return # TODO-lev From a1e9e940dd8ded65a0d8a7ab5f0f7350af9b0e6a Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 08:48:53 -0600 Subject: [PATCH 63/70] test_ccxt_load_leverage_tiers --- tests/exchange/test_ccxt_compat.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/tests/exchange/test_ccxt_compat.py b/tests/exchange/test_ccxt_compat.py index bae74c948..53f00944f 100644 --- a/tests/exchange/test_ccxt_compat.py +++ b/tests/exchange/test_ccxt_compat.py @@ -359,19 +359,24 @@ class TestCCXTExchange(): assert futures_pair in leverage_tiers pair_tiers = leverage_tiers[futures_pair] assert len(pair_tiers) > 0 - oldLeverage = 0 - oldMaintenanceMarginRate = oldNotionalFloor = oldNotionalCap = float('inf') + oldLeverage = float('inf') + oldMaintenanceMarginRate = oldNotionalFloor = oldNotionalCap = -1 for tier in pair_tiers: - for key in ['maintenanceMarginRate', 'notionalFloor', 'notionalCap', 'maxLeverage']: + for key in [ + 'maintenanceMarginRatio', # TODO-lev: Change to maintenanceMarginRate + 'notionalFloor', + 'notionalCap', + 'maxLeverage' + ]: assert key in tier - assert pair_tiers[key] > 0.0 - assert pair_tiers['notionalCap'] > pair_tiers['notionalFloor'] - assert tier['maxLeverage'] < oldLeverage - assert tier['maintenanceMarginRate'] > oldMaintenanceMarginRate + assert tier[key] >= 0.0 + assert tier['notionalCap'] > tier['notionalFloor'] + assert tier['maxLeverage'] <= oldLeverage + assert tier['maintenanceMarginRatio'] >= oldMaintenanceMarginRate assert tier['notionalFloor'] > oldNotionalFloor assert tier['notionalCap'] > oldNotionalCap oldLeverage = tier['maxLeverage'] - oldMaintenanceMarginRate = tier['maintenanceMarginRate'] + oldMaintenanceMarginRate = tier['maintenanceMarginRatio'] oldNotionalFloor = tier['notionalFloor'] oldNotionalCap = tier['notionalCap'] From dc73fccd3c30cb2ee9ce2c6c4ac6794a1eaae62b Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 09:03:50 -0600 Subject: [PATCH 64/70] removed test_ccxt_get_maintenance_ratio_and_amt --- tests/exchange/test_ccxt_compat.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/tests/exchange/test_ccxt_compat.py b/tests/exchange/test_ccxt_compat.py index 53f00944f..992396388 100644 --- a/tests/exchange/test_ccxt_compat.py +++ b/tests/exchange/test_ccxt_compat.py @@ -134,7 +134,6 @@ def exchange_futures(request, exchange_conf, class_mocker): yield exchange, request.param -@pytest.mark.longrun class TestCCXTExchange(): def test_load_markets(self, exchange): @@ -380,14 +379,19 @@ class TestCCXTExchange(): oldNotionalFloor = tier['notionalFloor'] oldNotionalCap = tier['notionalCap'] - # def test_ccxt_get_liquidation_price(): - # return # TODO-lev + def test_ccxt_get_liquidation_price(): + return # TODO-lev - # def test_ccxt_liquidation_price(): - # return # TODO-lev + def test_ccxt_liquidation_price(): + return # TODO-lev - # def test_ccxt_get_max_pair_stake_amount(): - # return # TODO-lev - - # def test_ccxt_get_maintenance_ratio_and_amt(): - # return # TODO-lev + def test_ccxt_get_max_pair_stake_amount(self, exchange_futures): + futures, futures_name = exchange_futures + if futures: + futures_pair = EXCHANGES[futures_name].get( + 'futures_pair', + EXCHANGES[futures_name]['pair'] + ) + max_stake_amount = futures.get_max_pair_stake_amount(futures_pair, 40000) + assert (isinstance(max_stake_amount, float)) + assert max_stake_amount >= 0.0 From 124532a4b7a4705baecb1d8c2bca985964ea3acc Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 09:04:43 -0600 Subject: [PATCH 65/70] maintenanceMarginRatio -> maintenanceMarginRate --- .../exchange/binance_leverage_tiers.json | 2154 ++++++++--------- freqtrade/exchange/exchange.py | 2 +- tests/exchange/test_binance.py | 26 +- tests/exchange/test_exchange.py | 8 +- tests/exchange/test_okx.py | 24 +- 5 files changed, 1107 insertions(+), 1107 deletions(-) diff --git a/freqtrade/exchange/binance_leverage_tiers.json b/freqtrade/exchange/binance_leverage_tiers.json index 048edfe41..c0bb965d0 100644 --- a/freqtrade/exchange/binance_leverage_tiers.json +++ b/freqtrade/exchange/binance_leverage_tiers.json @@ -4,7 +4,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -19,7 +19,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -34,7 +34,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -49,7 +49,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -64,7 +64,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -79,7 +79,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -96,7 +96,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -111,7 +111,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -126,7 +126,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -141,7 +141,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -156,7 +156,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -171,7 +171,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -186,7 +186,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -203,7 +203,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -218,7 +218,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -233,7 +233,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -248,7 +248,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -263,7 +263,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -278,7 +278,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -295,7 +295,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -310,7 +310,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -325,7 +325,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -340,7 +340,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -355,7 +355,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -370,7 +370,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -387,7 +387,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -402,7 +402,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -417,7 +417,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -432,7 +432,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -447,7 +447,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -462,7 +462,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -479,7 +479,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -494,7 +494,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -509,7 +509,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -524,7 +524,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -539,7 +539,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -554,7 +554,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -571,7 +571,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -586,7 +586,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -601,7 +601,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -616,7 +616,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -631,7 +631,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -646,7 +646,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -663,7 +663,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -678,7 +678,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -693,7 +693,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -708,7 +708,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -723,7 +723,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -738,7 +738,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -755,7 +755,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.004, + "maintenanceMarginRate": 0.004, "maxLeverage": 50, "info": { "bracket": "1", @@ -770,7 +770,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.005, + "maintenanceMarginRate": 0.005, "maxLeverage": 25, "info": { "bracket": "2", @@ -785,7 +785,7 @@ "tier": 3, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 20, "info": { "bracket": "3", @@ -800,7 +800,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 7500000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 10, "info": { "bracket": "4", @@ -815,7 +815,7 @@ "tier": 5, "notionalFloor": 7500000, "notionalCap": 40000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 6, "info": { "bracket": "5", @@ -830,7 +830,7 @@ "tier": 6, "notionalFloor": 40000000, "notionalCap": 100000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "6", @@ -845,7 +845,7 @@ "tier": 7, "notionalFloor": 100000000, "notionalCap": 200000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "7", @@ -860,7 +860,7 @@ "tier": 8, "notionalFloor": 200000000, "notionalCap": 400000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "8", @@ -875,7 +875,7 @@ "tier": 9, "notionalFloor": 400000000, "notionalCap": 600000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "9", @@ -890,7 +890,7 @@ "tier": 10, "notionalFloor": 600000000, "notionalCap": 1000000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "10", @@ -907,7 +907,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -922,7 +922,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -937,7 +937,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -952,7 +952,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -967,7 +967,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -982,7 +982,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -999,7 +999,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -1014,7 +1014,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -1029,7 +1029,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -1044,7 +1044,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -1059,7 +1059,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -1074,7 +1074,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -1089,7 +1089,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -1104,7 +1104,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -1119,7 +1119,7 @@ "tier": 9, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "9", @@ -1136,7 +1136,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -1151,7 +1151,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -1166,7 +1166,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -1181,7 +1181,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -1196,7 +1196,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -1211,7 +1211,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -1228,7 +1228,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -1243,7 +1243,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -1258,7 +1258,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -1273,7 +1273,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -1288,7 +1288,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -1303,7 +1303,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -1320,7 +1320,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -1335,7 +1335,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -1350,7 +1350,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -1365,7 +1365,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -1380,7 +1380,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -1395,7 +1395,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -1410,7 +1410,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -1425,7 +1425,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -1440,7 +1440,7 @@ "tier": 9, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "9", @@ -1457,7 +1457,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -1472,7 +1472,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -1487,7 +1487,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -1502,7 +1502,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -1517,7 +1517,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -1532,7 +1532,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -1547,7 +1547,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -1562,7 +1562,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -1577,7 +1577,7 @@ "tier": 9, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "9", @@ -1594,7 +1594,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.012, + "maintenanceMarginRate": 0.012, "maxLeverage": 50, "info": { "bracket": "1", @@ -1609,7 +1609,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -1624,7 +1624,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -1639,7 +1639,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -1654,7 +1654,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -1669,7 +1669,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -1686,7 +1686,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -1701,7 +1701,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -1716,7 +1716,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -1731,7 +1731,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -1746,7 +1746,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -1761,7 +1761,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -1778,7 +1778,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -1793,7 +1793,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -1808,7 +1808,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -1823,7 +1823,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -1838,7 +1838,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -1853,7 +1853,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -1868,7 +1868,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -1883,7 +1883,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -1898,7 +1898,7 @@ "tier": 9, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "9", @@ -1915,7 +1915,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -1930,7 +1930,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -1945,7 +1945,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -1960,7 +1960,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -1975,7 +1975,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -1990,7 +1990,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -2005,7 +2005,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -2020,7 +2020,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -2035,7 +2035,7 @@ "tier": 9, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "9", @@ -2052,7 +2052,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -2067,7 +2067,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -2082,7 +2082,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -2097,7 +2097,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -2112,7 +2112,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -2127,7 +2127,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -2144,7 +2144,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 100000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "1", @@ -2159,7 +2159,7 @@ "tier": 2, "notionalFloor": 100000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -2174,7 +2174,7 @@ "tier": 3, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -2189,7 +2189,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "4", @@ -2204,7 +2204,7 @@ "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "5", @@ -2219,7 +2219,7 @@ "tier": 6, "notionalFloor": 5000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -2236,7 +2236,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -2251,7 +2251,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -2266,7 +2266,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -2281,7 +2281,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -2296,7 +2296,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -2311,7 +2311,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -2326,7 +2326,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -2341,7 +2341,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 9223372036854776000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -2358,7 +2358,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.005, + "maintenanceMarginRate": 0.005, "maxLeverage": 100, "info": { "bracket": "1", @@ -2373,7 +2373,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "2", @@ -2388,7 +2388,7 @@ "tier": 3, "notionalFloor": 100000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "3", @@ -2403,7 +2403,7 @@ "tier": 4, "notionalFloor": 500000, "notionalCap": 1500000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "4", @@ -2418,7 +2418,7 @@ "tier": 5, "notionalFloor": 1500000, "notionalCap": 4000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "5", @@ -2433,7 +2433,7 @@ "tier": 6, "notionalFloor": 4000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "6", @@ -2448,7 +2448,7 @@ "tier": 7, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "7", @@ -2463,7 +2463,7 @@ "tier": 8, "notionalFloor": 20000000, "notionalCap": 40000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "8", @@ -2478,7 +2478,7 @@ "tier": 9, "notionalFloor": 40000000, "notionalCap": 150000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "9", @@ -2493,7 +2493,7 @@ "tier": 10, "notionalFloor": 150000000, "notionalCap": 500000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "10", @@ -2510,7 +2510,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -2525,7 +2525,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -2540,7 +2540,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -2555,7 +2555,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -2570,7 +2570,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -2585,7 +2585,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -2600,7 +2600,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -2617,7 +2617,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -2632,7 +2632,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -2647,7 +2647,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -2662,7 +2662,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -2677,7 +2677,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -2692,7 +2692,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -2709,7 +2709,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -2724,7 +2724,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -2739,7 +2739,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -2754,7 +2754,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -2769,7 +2769,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -2784,7 +2784,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -2801,7 +2801,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -2816,7 +2816,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -2831,7 +2831,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -2846,7 +2846,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -2861,7 +2861,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -2876,7 +2876,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -2893,7 +2893,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -2908,7 +2908,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -2923,7 +2923,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -2938,7 +2938,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -2953,7 +2953,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -2968,7 +2968,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -2985,7 +2985,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -3000,7 +3000,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -3015,7 +3015,7 @@ "tier": 3, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -3030,7 +3030,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -3045,7 +3045,7 @@ "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -3060,7 +3060,7 @@ "tier": 6, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -3075,7 +3075,7 @@ "tier": 7, "notionalFloor": 10000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -3092,7 +3092,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -3107,7 +3107,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -3122,7 +3122,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -3137,7 +3137,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -3152,7 +3152,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -3167,7 +3167,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -3182,7 +3182,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -3197,7 +3197,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -3212,7 +3212,7 @@ "tier": 9, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "9", @@ -3229,7 +3229,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -3244,7 +3244,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -3259,7 +3259,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -3274,7 +3274,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -3289,7 +3289,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -3304,7 +3304,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -3321,7 +3321,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.012, + "maintenanceMarginRate": 0.012, "maxLeverage": 20, "info": { "bracket": "1", @@ -3336,7 +3336,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 10, "info": { "bracket": "2", @@ -3351,7 +3351,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 5, "info": { "bracket": "3", @@ -3366,7 +3366,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 4, "info": { "bracket": "4", @@ -3381,7 +3381,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -3396,7 +3396,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 9223372036854776000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -3413,7 +3413,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -3428,7 +3428,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -3443,7 +3443,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -3458,7 +3458,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -3473,7 +3473,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -3488,7 +3488,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 9223372036854776000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -3505,7 +3505,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -3520,7 +3520,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -3535,7 +3535,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -3550,7 +3550,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -3565,7 +3565,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -3580,7 +3580,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -3597,7 +3597,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -3612,7 +3612,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -3627,7 +3627,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -3642,7 +3642,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -3657,7 +3657,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -3672,7 +3672,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -3689,7 +3689,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "1", @@ -3704,7 +3704,7 @@ "tier": 2, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -3719,7 +3719,7 @@ "tier": 3, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -3734,7 +3734,7 @@ "tier": 4, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "4", @@ -3749,7 +3749,7 @@ "tier": 5, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "5", @@ -3764,7 +3764,7 @@ "tier": 6, "notionalFloor": 10000000, "notionalCap": 9223372036854776000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -3781,7 +3781,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -3796,7 +3796,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -3811,7 +3811,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -3826,7 +3826,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -3841,7 +3841,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -3856,7 +3856,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -3873,7 +3873,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -3888,7 +3888,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -3903,7 +3903,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -3918,7 +3918,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -3933,7 +3933,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -3948,7 +3948,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -3965,7 +3965,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -3980,7 +3980,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -3995,7 +3995,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -4010,7 +4010,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -4025,7 +4025,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -4040,7 +4040,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -4055,7 +4055,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -4070,7 +4070,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -4085,7 +4085,7 @@ "tier": 9, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "9", @@ -4102,7 +4102,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.004, + "maintenanceMarginRate": 0.004, "maxLeverage": 20, "info": { "bracket": "1", @@ -4117,7 +4117,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.005, + "maintenanceMarginRate": 0.005, "maxLeverage": 15, "info": { "bracket": "2", @@ -4132,7 +4132,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 10, "info": { "bracket": "3", @@ -4147,7 +4147,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 7, "info": { "bracket": "4", @@ -4162,7 +4162,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 6, "info": { "bracket": "5", @@ -4177,7 +4177,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "6", @@ -4192,7 +4192,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "7", @@ -4207,7 +4207,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "8", @@ -4222,7 +4222,7 @@ "tier": 9, "notionalFloor": 20000000, "notionalCap": 9223372036854776000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "9", @@ -4239,7 +4239,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -4254,7 +4254,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -4269,7 +4269,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -4284,7 +4284,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -4299,7 +4299,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -4314,7 +4314,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -4331,7 +4331,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -4346,7 +4346,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -4361,7 +4361,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -4376,7 +4376,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -4391,7 +4391,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -4406,7 +4406,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -4423,7 +4423,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -4438,7 +4438,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -4453,7 +4453,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -4468,7 +4468,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -4483,7 +4483,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -4498,7 +4498,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -4515,7 +4515,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -4530,7 +4530,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -4545,7 +4545,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -4560,7 +4560,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -4575,7 +4575,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -4590,7 +4590,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -4605,7 +4605,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -4622,7 +4622,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -4637,7 +4637,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -4652,7 +4652,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -4667,7 +4667,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -4682,7 +4682,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -4697,7 +4697,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -4714,7 +4714,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -4729,7 +4729,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -4744,7 +4744,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -4759,7 +4759,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -4774,7 +4774,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -4789,7 +4789,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -4806,7 +4806,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -4821,7 +4821,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -4836,7 +4836,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -4851,7 +4851,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -4866,7 +4866,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -4881,7 +4881,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -4898,7 +4898,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -4913,7 +4913,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -4928,7 +4928,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -4943,7 +4943,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -4958,7 +4958,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -4973,7 +4973,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -4990,7 +4990,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -5005,7 +5005,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -5020,7 +5020,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -5035,7 +5035,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -5050,7 +5050,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -5065,7 +5065,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -5080,7 +5080,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -5095,7 +5095,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -5110,7 +5110,7 @@ "tier": 9, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "9", @@ -5127,7 +5127,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -5142,7 +5142,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -5157,7 +5157,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -5172,7 +5172,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -5187,7 +5187,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -5202,7 +5202,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -5217,7 +5217,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -5234,7 +5234,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -5249,7 +5249,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -5264,7 +5264,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -5279,7 +5279,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -5294,7 +5294,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -5309,7 +5309,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -5326,7 +5326,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 100000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "1", @@ -5341,7 +5341,7 @@ "tier": 2, "notionalFloor": 100000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -5356,7 +5356,7 @@ "tier": 3, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -5371,7 +5371,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "4", @@ -5386,7 +5386,7 @@ "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "5", @@ -5401,7 +5401,7 @@ "tier": 6, "notionalFloor": 5000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -5418,7 +5418,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -5433,7 +5433,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -5448,7 +5448,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -5463,7 +5463,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -5478,7 +5478,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -5493,7 +5493,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -5510,7 +5510,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -5525,7 +5525,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -5540,7 +5540,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -5555,7 +5555,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -5570,7 +5570,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -5585,7 +5585,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -5602,7 +5602,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -5617,7 +5617,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -5632,7 +5632,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -5647,7 +5647,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -5662,7 +5662,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -5677,7 +5677,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -5694,7 +5694,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -5709,7 +5709,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -5724,7 +5724,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -5739,7 +5739,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -5754,7 +5754,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -5769,7 +5769,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -5786,7 +5786,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -5801,7 +5801,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -5816,7 +5816,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -5831,7 +5831,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -5846,7 +5846,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -5861,7 +5861,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -5878,7 +5878,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -5893,7 +5893,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -5908,7 +5908,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -5923,7 +5923,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -5938,7 +5938,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -5953,7 +5953,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -5970,7 +5970,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -5985,7 +5985,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -6000,7 +6000,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -6015,7 +6015,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -6030,7 +6030,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -6045,7 +6045,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -6060,7 +6060,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -6075,7 +6075,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -6090,7 +6090,7 @@ "tier": 9, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "9", @@ -6107,7 +6107,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -6122,7 +6122,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -6137,7 +6137,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -6152,7 +6152,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -6167,7 +6167,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -6182,7 +6182,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -6199,7 +6199,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -6214,7 +6214,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -6229,7 +6229,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -6244,7 +6244,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -6259,7 +6259,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -6274,7 +6274,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -6291,7 +6291,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -6306,7 +6306,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -6321,7 +6321,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -6336,7 +6336,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -6351,7 +6351,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -6366,7 +6366,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -6383,7 +6383,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 100000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "1", @@ -6398,7 +6398,7 @@ "tier": 2, "notionalFloor": 100000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -6413,7 +6413,7 @@ "tier": 3, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -6428,7 +6428,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "4", @@ -6443,7 +6443,7 @@ "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "5", @@ -6458,7 +6458,7 @@ "tier": 6, "notionalFloor": 5000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -6475,7 +6475,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "1", @@ -6490,7 +6490,7 @@ "tier": 2, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -6505,7 +6505,7 @@ "tier": 3, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -6520,7 +6520,7 @@ "tier": 4, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "4", @@ -6535,7 +6535,7 @@ "tier": 5, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "5", @@ -6550,7 +6550,7 @@ "tier": 6, "notionalFloor": 10000000, "notionalCap": 9223372036854776000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -6567,7 +6567,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -6582,7 +6582,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -6597,7 +6597,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -6612,7 +6612,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -6627,7 +6627,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -6642,7 +6642,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -6659,7 +6659,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -6674,7 +6674,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -6689,7 +6689,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -6704,7 +6704,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -6719,7 +6719,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -6734,7 +6734,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -6749,7 +6749,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -6766,7 +6766,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -6781,7 +6781,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -6796,7 +6796,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -6811,7 +6811,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -6826,7 +6826,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -6841,7 +6841,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -6858,7 +6858,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -6873,7 +6873,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -6888,7 +6888,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -6903,7 +6903,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -6918,7 +6918,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -6933,7 +6933,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -6948,7 +6948,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -6965,7 +6965,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -6980,7 +6980,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -6995,7 +6995,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -7010,7 +7010,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -7025,7 +7025,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -7040,7 +7040,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -7057,7 +7057,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -7072,7 +7072,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -7087,7 +7087,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -7102,7 +7102,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -7117,7 +7117,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -7132,7 +7132,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -7149,7 +7149,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "1", @@ -7164,7 +7164,7 @@ "tier": 2, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -7179,7 +7179,7 @@ "tier": 3, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -7194,7 +7194,7 @@ "tier": 4, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "4", @@ -7209,7 +7209,7 @@ "tier": 5, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "5", @@ -7224,7 +7224,7 @@ "tier": 6, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -7239,7 +7239,7 @@ "tier": 7, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -7256,7 +7256,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -7271,7 +7271,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -7286,7 +7286,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -7301,7 +7301,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -7316,7 +7316,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -7331,7 +7331,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -7348,7 +7348,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -7363,7 +7363,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -7378,7 +7378,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -7393,7 +7393,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -7408,7 +7408,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -7423,7 +7423,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -7440,7 +7440,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 375000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "1", @@ -7455,7 +7455,7 @@ "tier": 2, "notionalFloor": 375000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -7470,7 +7470,7 @@ "tier": 3, "notionalFloor": 2000000, "notionalCap": 4000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -7485,7 +7485,7 @@ "tier": 4, "notionalFloor": 4000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "4", @@ -7500,7 +7500,7 @@ "tier": 5, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "5", @@ -7515,7 +7515,7 @@ "tier": 6, "notionalFloor": 20000000, "notionalCap": 40000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -7530,7 +7530,7 @@ "tier": 7, "notionalFloor": 40000000, "notionalCap": 400000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -7547,7 +7547,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -7562,7 +7562,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -7577,7 +7577,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -7592,7 +7592,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -7607,7 +7607,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -7622,7 +7622,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -7639,7 +7639,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -7654,7 +7654,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -7669,7 +7669,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -7684,7 +7684,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -7699,7 +7699,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -7714,7 +7714,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -7731,7 +7731,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -7746,7 +7746,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -7761,7 +7761,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -7776,7 +7776,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -7791,7 +7791,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -7806,7 +7806,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -7821,7 +7821,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -7836,7 +7836,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -7851,7 +7851,7 @@ "tier": 9, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "9", @@ -7868,7 +7868,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 375000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "1", @@ -7883,7 +7883,7 @@ "tier": 2, "notionalFloor": 375000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -7898,7 +7898,7 @@ "tier": 3, "notionalFloor": 2000000, "notionalCap": 4000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -7913,7 +7913,7 @@ "tier": 4, "notionalFloor": 4000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "4", @@ -7928,7 +7928,7 @@ "tier": 5, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "5", @@ -7943,7 +7943,7 @@ "tier": 6, "notionalFloor": 20000000, "notionalCap": 40000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -7958,7 +7958,7 @@ "tier": 7, "notionalFloor": 40000000, "notionalCap": 400000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -7975,7 +7975,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -7990,7 +7990,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -8005,7 +8005,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -8020,7 +8020,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -8035,7 +8035,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -8050,7 +8050,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -8067,7 +8067,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -8082,7 +8082,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -8097,7 +8097,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -8112,7 +8112,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -8127,7 +8127,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -8142,7 +8142,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -8159,7 +8159,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -8174,7 +8174,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -8189,7 +8189,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -8204,7 +8204,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -8219,7 +8219,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -8234,7 +8234,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -8251,7 +8251,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -8266,7 +8266,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -8281,7 +8281,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -8296,7 +8296,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -8311,7 +8311,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -8326,7 +8326,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -8343,7 +8343,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -8358,7 +8358,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -8373,7 +8373,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -8388,7 +8388,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -8403,7 +8403,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -8418,7 +8418,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -8435,7 +8435,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -8450,7 +8450,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "2", @@ -8465,7 +8465,7 @@ "tier": 3, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -8480,7 +8480,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -8495,7 +8495,7 @@ "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -8510,7 +8510,7 @@ "tier": 6, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.1665, + "maintenanceMarginRate": 0.1665, "maxLeverage": 3, "info": { "bracket": "6", @@ -8525,7 +8525,7 @@ "tier": 7, "notionalFloor": 10000000, "notionalCap": 15000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "7", @@ -8540,7 +8540,7 @@ "tier": 8, "notionalFloor": 15000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "8", @@ -8557,7 +8557,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -8572,7 +8572,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -8587,7 +8587,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -8602,7 +8602,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -8617,7 +8617,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -8632,7 +8632,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -8649,7 +8649,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -8664,7 +8664,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -8679,7 +8679,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -8694,7 +8694,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -8709,7 +8709,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -8724,7 +8724,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -8741,7 +8741,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -8756,7 +8756,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -8771,7 +8771,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -8786,7 +8786,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -8801,7 +8801,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -8816,7 +8816,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -8833,7 +8833,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -8848,7 +8848,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -8863,7 +8863,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -8878,7 +8878,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -8893,7 +8893,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -8908,7 +8908,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -8925,7 +8925,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -8940,7 +8940,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -8955,7 +8955,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -8970,7 +8970,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -8985,7 +8985,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -9000,7 +9000,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -9015,7 +9015,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -9032,7 +9032,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -9047,7 +9047,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -9062,7 +9062,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -9077,7 +9077,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -9092,7 +9092,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -9107,7 +9107,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -9124,7 +9124,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -9139,7 +9139,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -9154,7 +9154,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -9169,7 +9169,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -9184,7 +9184,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -9199,7 +9199,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -9216,7 +9216,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -9231,7 +9231,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -9246,7 +9246,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -9261,7 +9261,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -9276,7 +9276,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -9291,7 +9291,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -9306,7 +9306,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -9323,7 +9323,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -9338,7 +9338,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -9353,7 +9353,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -9368,7 +9368,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -9383,7 +9383,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -9398,7 +9398,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -9413,7 +9413,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -9430,7 +9430,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 100000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "1", @@ -9445,7 +9445,7 @@ "tier": 2, "notionalFloor": 100000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -9460,7 +9460,7 @@ "tier": 3, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -9475,7 +9475,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "4", @@ -9490,7 +9490,7 @@ "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "5", @@ -9505,7 +9505,7 @@ "tier": 6, "notionalFloor": 5000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -9522,7 +9522,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -9537,7 +9537,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -9552,7 +9552,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -9567,7 +9567,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -9582,7 +9582,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -9597,7 +9597,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -9614,7 +9614,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -9629,7 +9629,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -9644,7 +9644,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -9659,7 +9659,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -9674,7 +9674,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -9689,7 +9689,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -9704,7 +9704,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -9719,7 +9719,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -9734,7 +9734,7 @@ "tier": 9, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "9", @@ -9751,7 +9751,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -9766,7 +9766,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -9781,7 +9781,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -9796,7 +9796,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -9811,7 +9811,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -9826,7 +9826,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -9843,7 +9843,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -9858,7 +9858,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -9873,7 +9873,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -9888,7 +9888,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -9903,7 +9903,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -9918,7 +9918,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -9935,7 +9935,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -9950,7 +9950,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -9965,7 +9965,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -9980,7 +9980,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -9995,7 +9995,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -10010,7 +10010,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -10027,7 +10027,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -10042,7 +10042,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -10057,7 +10057,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -10072,7 +10072,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -10087,7 +10087,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -10102,7 +10102,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -10117,7 +10117,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -10134,7 +10134,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -10149,7 +10149,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -10164,7 +10164,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -10179,7 +10179,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -10194,7 +10194,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -10209,7 +10209,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -10224,7 +10224,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -10241,7 +10241,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -10256,7 +10256,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -10271,7 +10271,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -10286,7 +10286,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -10301,7 +10301,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -10316,7 +10316,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -10333,7 +10333,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -10348,7 +10348,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -10363,7 +10363,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -10378,7 +10378,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -10393,7 +10393,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -10408,7 +10408,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -10425,7 +10425,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -10440,7 +10440,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -10455,7 +10455,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -10470,7 +10470,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -10485,7 +10485,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -10500,7 +10500,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -10517,7 +10517,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 25000, - "maintenanceMarginRatio": 0.004, + "maintenanceMarginRate": 0.004, "maxLeverage": 50, "info": { "bracket": "1", @@ -10532,7 +10532,7 @@ "tier": 2, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.005, + "maintenanceMarginRate": 0.005, "maxLeverage": 25, "info": { "bracket": "2", @@ -10547,7 +10547,7 @@ "tier": 3, "notionalFloor": 100000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 20, "info": { "bracket": "3", @@ -10562,7 +10562,7 @@ "tier": 4, "notionalFloor": 500000, "notionalCap": 1500000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 10, "info": { "bracket": "4", @@ -10577,7 +10577,7 @@ "tier": 5, "notionalFloor": 1500000, "notionalCap": 4000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 6, "info": { "bracket": "5", @@ -10592,7 +10592,7 @@ "tier": 6, "notionalFloor": 4000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "6", @@ -10607,7 +10607,7 @@ "tier": 7, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "7", @@ -10622,7 +10622,7 @@ "tier": 8, "notionalFloor": 20000000, "notionalCap": 40000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "8", @@ -10637,7 +10637,7 @@ "tier": 9, "notionalFloor": 40000000, "notionalCap": 150000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "9", @@ -10652,7 +10652,7 @@ "tier": 10, "notionalFloor": 150000000, "notionalCap": 500000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "10", @@ -10669,7 +10669,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -10684,7 +10684,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -10699,7 +10699,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -10714,7 +10714,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -10729,7 +10729,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -10744,7 +10744,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -10759,7 +10759,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -10776,7 +10776,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -10791,7 +10791,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "2", @@ -10806,7 +10806,7 @@ "tier": 3, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -10821,7 +10821,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -10836,7 +10836,7 @@ "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -10851,7 +10851,7 @@ "tier": 6, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.1665, + "maintenanceMarginRate": 0.1665, "maxLeverage": 3, "info": { "bracket": "6", @@ -10866,7 +10866,7 @@ "tier": 7, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "7", @@ -10881,7 +10881,7 @@ "tier": 8, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "8", @@ -10898,7 +10898,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -10913,7 +10913,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -10928,7 +10928,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -10943,7 +10943,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -10958,7 +10958,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -10973,7 +10973,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -10990,7 +10990,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -11005,7 +11005,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -11020,7 +11020,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -11035,7 +11035,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -11050,7 +11050,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -11065,7 +11065,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -11080,7 +11080,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -11097,7 +11097,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -11112,7 +11112,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -11127,7 +11127,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -11142,7 +11142,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -11157,7 +11157,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -11172,7 +11172,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -11189,7 +11189,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "1", @@ -11204,7 +11204,7 @@ "tier": 2, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -11219,7 +11219,7 @@ "tier": 3, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -11234,7 +11234,7 @@ "tier": 4, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "4", @@ -11249,7 +11249,7 @@ "tier": 5, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "5", @@ -11264,7 +11264,7 @@ "tier": 6, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -11279,7 +11279,7 @@ "tier": 7, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -11296,7 +11296,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -11311,7 +11311,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -11326,7 +11326,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -11341,7 +11341,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -11356,7 +11356,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -11371,7 +11371,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -11386,7 +11386,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -11403,7 +11403,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -11418,7 +11418,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -11433,7 +11433,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -11448,7 +11448,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -11463,7 +11463,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 750000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -11478,7 +11478,7 @@ "tier": 6, "notionalFloor": 750000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -11493,7 +11493,7 @@ "tier": 7, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -11510,7 +11510,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 375000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "1", @@ -11525,7 +11525,7 @@ "tier": 2, "notionalFloor": 375000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -11540,7 +11540,7 @@ "tier": 3, "notionalFloor": 2000000, "notionalCap": 4000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -11555,7 +11555,7 @@ "tier": 4, "notionalFloor": 4000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "4", @@ -11570,7 +11570,7 @@ "tier": 5, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "5", @@ -11585,7 +11585,7 @@ "tier": 6, "notionalFloor": 20000000, "notionalCap": 40000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -11600,7 +11600,7 @@ "tier": 7, "notionalFloor": 40000000, "notionalCap": 400000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -11617,7 +11617,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -11632,7 +11632,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -11647,7 +11647,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -11662,7 +11662,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -11677,7 +11677,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -11692,7 +11692,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -11709,7 +11709,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -11724,7 +11724,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -11739,7 +11739,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -11754,7 +11754,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -11769,7 +11769,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -11784,7 +11784,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -11801,7 +11801,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -11816,7 +11816,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -11831,7 +11831,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -11846,7 +11846,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -11861,7 +11861,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -11876,7 +11876,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -11893,7 +11893,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -11908,7 +11908,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -11923,7 +11923,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -11938,7 +11938,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -11953,7 +11953,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 750000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -11968,7 +11968,7 @@ "tier": 6, "notionalFloor": 750000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -11983,7 +11983,7 @@ "tier": 7, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -12000,7 +12000,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.012, + "maintenanceMarginRate": 0.012, "maxLeverage": 50, "info": { "bracket": "1", @@ -12015,7 +12015,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -12030,7 +12030,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -12045,7 +12045,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -12060,7 +12060,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -12075,7 +12075,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 100000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -12092,7 +12092,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -12107,7 +12107,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -12122,7 +12122,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -12137,7 +12137,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -12152,7 +12152,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -12167,7 +12167,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -12184,7 +12184,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -12199,7 +12199,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -12214,7 +12214,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -12229,7 +12229,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -12244,7 +12244,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -12259,7 +12259,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -12276,7 +12276,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -12291,7 +12291,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "2", @@ -12306,7 +12306,7 @@ "tier": 3, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -12321,7 +12321,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -12336,7 +12336,7 @@ "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -12351,7 +12351,7 @@ "tier": 6, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.1665, + "maintenanceMarginRate": 0.1665, "maxLeverage": 3, "info": { "bracket": "6", @@ -12366,7 +12366,7 @@ "tier": 7, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "7", @@ -12381,7 +12381,7 @@ "tier": 8, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "8", @@ -12398,7 +12398,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -12413,7 +12413,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "2", @@ -12428,7 +12428,7 @@ "tier": 3, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -12443,7 +12443,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -12458,7 +12458,7 @@ "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -12473,7 +12473,7 @@ "tier": 6, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.1665, + "maintenanceMarginRate": 0.1665, "maxLeverage": 3, "info": { "bracket": "6", @@ -12488,7 +12488,7 @@ "tier": 7, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "7", @@ -12503,7 +12503,7 @@ "tier": 8, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "8", @@ -12520,7 +12520,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -12535,7 +12535,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -12550,7 +12550,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -12565,7 +12565,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -12580,7 +12580,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -12595,7 +12595,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -12610,7 +12610,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -12625,7 +12625,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 9223372036854776000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -12642,7 +12642,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -12657,7 +12657,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -12672,7 +12672,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -12687,7 +12687,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -12702,7 +12702,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -12717,7 +12717,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -12734,7 +12734,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -12749,7 +12749,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -12764,7 +12764,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -12779,7 +12779,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -12794,7 +12794,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -12809,7 +12809,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -12826,7 +12826,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -12841,7 +12841,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -12856,7 +12856,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -12871,7 +12871,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -12886,7 +12886,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -12901,7 +12901,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -12918,7 +12918,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -12933,7 +12933,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "2", @@ -12948,7 +12948,7 @@ "tier": 3, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -12963,7 +12963,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -12978,7 +12978,7 @@ "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -12993,7 +12993,7 @@ "tier": 6, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.1665, + "maintenanceMarginRate": 0.1665, "maxLeverage": 3, "info": { "bracket": "6", @@ -13008,7 +13008,7 @@ "tier": 7, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "7", @@ -13023,7 +13023,7 @@ "tier": 8, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "8", @@ -13040,7 +13040,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -13055,7 +13055,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -13070,7 +13070,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -13085,7 +13085,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -13100,7 +13100,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -13115,7 +13115,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -13132,7 +13132,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -13147,7 +13147,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -13162,7 +13162,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -13177,7 +13177,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -13192,7 +13192,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -13207,7 +13207,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -13224,7 +13224,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -13239,7 +13239,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -13254,7 +13254,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -13269,7 +13269,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -13284,7 +13284,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -13299,7 +13299,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -13316,7 +13316,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -13331,7 +13331,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -13346,7 +13346,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -13361,7 +13361,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -13376,7 +13376,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -13391,7 +13391,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -13408,7 +13408,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -13423,7 +13423,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -13438,7 +13438,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -13453,7 +13453,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -13468,7 +13468,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -13483,7 +13483,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -13500,7 +13500,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -13515,7 +13515,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -13530,7 +13530,7 @@ "tier": 3, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -13545,7 +13545,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -13560,7 +13560,7 @@ "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -13575,7 +13575,7 @@ "tier": 6, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -13590,7 +13590,7 @@ "tier": 7, "notionalFloor": 10000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -13607,7 +13607,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.004, + "maintenanceMarginRate": 0.004, "maxLeverage": 125, "info": { "bracket": "1", @@ -13622,7 +13622,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.005, + "maintenanceMarginRate": 0.005, "maxLeverage": 100, "info": { "bracket": "2", @@ -13637,7 +13637,7 @@ "tier": 3, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "3", @@ -13652,7 +13652,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 7500000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "4", @@ -13667,7 +13667,7 @@ "tier": 5, "notionalFloor": 7500000, "notionalCap": 40000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "5", @@ -13682,7 +13682,7 @@ "tier": 6, "notionalFloor": 40000000, "notionalCap": 100000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "6", @@ -13697,7 +13697,7 @@ "tier": 7, "notionalFloor": 100000000, "notionalCap": 200000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "7", @@ -13712,7 +13712,7 @@ "tier": 8, "notionalFloor": 200000000, "notionalCap": 400000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "8", @@ -13727,7 +13727,7 @@ "tier": 9, "notionalFloor": 400000000, "notionalCap": 600000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "9", @@ -13742,7 +13742,7 @@ "tier": 10, "notionalFloor": 600000000, "notionalCap": 1000000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "10", @@ -13759,7 +13759,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.024, + "maintenanceMarginRate": 0.024, "maxLeverage": 25, "info": { "bracket": "1", @@ -13774,7 +13774,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -13789,7 +13789,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -13804,7 +13804,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -13819,7 +13819,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -13834,7 +13834,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -13851,7 +13851,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -13866,7 +13866,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -13881,7 +13881,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -13896,7 +13896,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -13911,7 +13911,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -13926,7 +13926,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -13943,7 +13943,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -13958,7 +13958,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -13973,7 +13973,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -13988,7 +13988,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -14003,7 +14003,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -14018,7 +14018,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -14035,7 +14035,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 375000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "1", @@ -14050,7 +14050,7 @@ "tier": 2, "notionalFloor": 375000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -14065,7 +14065,7 @@ "tier": 3, "notionalFloor": 2000000, "notionalCap": 4000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -14080,7 +14080,7 @@ "tier": 4, "notionalFloor": 4000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "4", @@ -14095,7 +14095,7 @@ "tier": 5, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "5", @@ -14110,7 +14110,7 @@ "tier": 6, "notionalFloor": 20000000, "notionalCap": 40000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -14125,7 +14125,7 @@ "tier": 7, "notionalFloor": 40000000, "notionalCap": 400000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -14142,7 +14142,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -14157,7 +14157,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -14172,7 +14172,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -14187,7 +14187,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -14202,7 +14202,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 750000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -14217,7 +14217,7 @@ "tier": 6, "notionalFloor": 750000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -14232,7 +14232,7 @@ "tier": 7, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -14249,7 +14249,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -14264,7 +14264,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -14279,7 +14279,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -14294,7 +14294,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -14309,7 +14309,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -14324,7 +14324,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -14341,7 +14341,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -14356,7 +14356,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -14371,7 +14371,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -14386,7 +14386,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -14401,7 +14401,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -14416,7 +14416,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -14433,7 +14433,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -14448,7 +14448,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -14463,7 +14463,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -14478,7 +14478,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -14493,7 +14493,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -14508,7 +14508,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -14525,7 +14525,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.004, + "maintenanceMarginRate": 0.004, "maxLeverage": 20, "info": { "bracket": "1", @@ -14540,7 +14540,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.005, + "maintenanceMarginRate": 0.005, "maxLeverage": 15, "info": { "bracket": "2", @@ -14555,7 +14555,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 10, "info": { "bracket": "3", @@ -14570,7 +14570,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 7, "info": { "bracket": "4", @@ -14585,7 +14585,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 6, "info": { "bracket": "5", @@ -14600,7 +14600,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "6", @@ -14615,7 +14615,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "7", @@ -14630,7 +14630,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "8", @@ -14645,7 +14645,7 @@ "tier": 9, "notionalFloor": 20000000, "notionalCap": 9223372036854776000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "9", @@ -14662,7 +14662,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 100000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "1", @@ -14677,7 +14677,7 @@ "tier": 2, "notionalFloor": 100000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -14692,7 +14692,7 @@ "tier": 3, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -14707,7 +14707,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "4", @@ -14722,7 +14722,7 @@ "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "5", @@ -14737,7 +14737,7 @@ "tier": 6, "notionalFloor": 5000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -14754,7 +14754,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 100000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "1", @@ -14769,7 +14769,7 @@ "tier": 2, "notionalFloor": 100000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -14784,7 +14784,7 @@ "tier": 3, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -14799,7 +14799,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "4", @@ -14814,7 +14814,7 @@ "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "5", @@ -14829,7 +14829,7 @@ "tier": 6, "notionalFloor": 5000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -14846,7 +14846,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -14861,7 +14861,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -14876,7 +14876,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -14891,7 +14891,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -14906,7 +14906,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -14921,7 +14921,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -14936,7 +14936,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -14951,7 +14951,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 20000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -14966,7 +14966,7 @@ "tier": 9, "notionalFloor": 20000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "9", @@ -14983,7 +14983,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -14998,7 +14998,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -15013,7 +15013,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -15028,7 +15028,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -15043,7 +15043,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -15058,7 +15058,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -15075,7 +15075,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -15090,7 +15090,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -15105,7 +15105,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -15120,7 +15120,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -15135,7 +15135,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -15150,7 +15150,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -15165,7 +15165,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -15182,7 +15182,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -15197,7 +15197,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -15212,7 +15212,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -15227,7 +15227,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -15242,7 +15242,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -15257,7 +15257,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -15274,7 +15274,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 10000, - "maintenanceMarginRatio": 0.0065, + "maintenanceMarginRate": 0.0065, "maxLeverage": 75, "info": { "bracket": "1", @@ -15289,7 +15289,7 @@ "tier": 2, "notionalFloor": 10000, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "2", @@ -15304,7 +15304,7 @@ "tier": 3, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "3", @@ -15319,7 +15319,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "4", @@ -15334,7 +15334,7 @@ "tier": 5, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "5", @@ -15349,7 +15349,7 @@ "tier": 6, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "6", @@ -15364,7 +15364,7 @@ "tier": 7, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "7", @@ -15379,7 +15379,7 @@ "tier": 8, "notionalFloor": 10000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "8", @@ -15394,7 +15394,7 @@ "tier": 9, "notionalFloor": 50000000, "notionalCap": 100000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "9", @@ -15411,7 +15411,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -15426,7 +15426,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -15441,7 +15441,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -15456,7 +15456,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -15471,7 +15471,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -15486,7 +15486,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -15503,7 +15503,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -15518,7 +15518,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -15533,7 +15533,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -15548,7 +15548,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -15563,7 +15563,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -15578,7 +15578,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -15593,7 +15593,7 @@ "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -15610,7 +15610,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -15625,7 +15625,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -15640,7 +15640,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -15655,7 +15655,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -15670,7 +15670,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -15685,7 +15685,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -15702,7 +15702,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -15717,7 +15717,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.02, + "maintenanceMarginRate": 0.02, "maxLeverage": 25, "info": { "bracket": "2", @@ -15732,7 +15732,7 @@ "tier": 3, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -15747,7 +15747,7 @@ "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -15762,7 +15762,7 @@ "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -15777,7 +15777,7 @@ "tier": 6, "notionalFloor": 5000000, "notionalCap": 10000000, - "maintenanceMarginRatio": 0.1665, + "maintenanceMarginRate": 0.1665, "maxLeverage": 3, "info": { "bracket": "6", @@ -15792,7 +15792,7 @@ "tier": 7, "notionalFloor": 10000000, "notionalCap": 15000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "7", @@ -15807,7 +15807,7 @@ "tier": 8, "notionalFloor": 15000000, "notionalCap": 50000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "8", @@ -15824,7 +15824,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -15839,7 +15839,7 @@ "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -15854,7 +15854,7 @@ "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -15869,7 +15869,7 @@ "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -15884,7 +15884,7 @@ "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -15899,7 +15899,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 4000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -15914,7 +15914,7 @@ "tier": 7, "notionalFloor": 4000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", @@ -15931,7 +15931,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -15946,7 +15946,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -15961,7 +15961,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -15976,7 +15976,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -15991,7 +15991,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -16006,7 +16006,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -16023,7 +16023,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.012, + "maintenanceMarginRate": 0.012, "maxLeverage": 50, "info": { "bracket": "1", @@ -16038,7 +16038,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -16053,7 +16053,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -16068,7 +16068,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -16083,7 +16083,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -16098,7 +16098,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -16115,7 +16115,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -16130,7 +16130,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -16145,7 +16145,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -16160,7 +16160,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -16175,7 +16175,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -16190,7 +16190,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 9223372036854776000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -16207,7 +16207,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.012, + "maintenanceMarginRate": 0.012, "maxLeverage": 50, "info": { "bracket": "1", @@ -16222,7 +16222,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -16237,7 +16237,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -16252,7 +16252,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -16267,7 +16267,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -16282,7 +16282,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -16299,7 +16299,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -16314,7 +16314,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -16329,7 +16329,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -16344,7 +16344,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -16359,7 +16359,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -16374,7 +16374,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -16391,7 +16391,7 @@ "tier": 1, "notionalFloor": 0, "notionalCap": 5000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 25, "info": { "bracket": "1", @@ -16406,7 +16406,7 @@ "tier": 2, "notionalFloor": 5000, "notionalCap": 25000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -16421,7 +16421,7 @@ "tier": 3, "notionalFloor": 25000, "notionalCap": 100000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -16436,7 +16436,7 @@ "tier": 4, "notionalFloor": 100000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -16451,7 +16451,7 @@ "tier": 5, "notionalFloor": 250000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 2, "info": { "bracket": "5", @@ -16466,7 +16466,7 @@ "tier": 6, "notionalFloor": 1000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index c66c7384d..8f7c305e6 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1891,7 +1891,7 @@ class Exchange: return { 'min': tier['notionalFloor'], 'max': tier['notionalCap'], - 'mmr': tier['maintenanceMarginRatio'], + 'mmr': tier['maintenanceMarginRate'], 'lev': tier['maxLeverage'], 'maintAmt': float(info['cum']) if 'cum' in info else None, } diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index 64f18220f..c20f17409 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -177,7 +177,7 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): "tier": 1, "notionalFloor": 0, "notionalCap": 100000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "1", @@ -192,7 +192,7 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): "tier": 2, "notionalFloor": 100000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "2", @@ -207,7 +207,7 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): "tier": 3, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "3", @@ -222,7 +222,7 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): "tier": 4, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.15, + "maintenanceMarginRate": 0.15, "maxLeverage": 3, "info": { "bracket": "4", @@ -237,7 +237,7 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): "tier": 5, "notionalFloor": 2000000, "notionalCap": 5000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "5", @@ -252,7 +252,7 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): "tier": 6, "notionalFloor": 5000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "6", @@ -269,7 +269,7 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): "tier": 1, "notionalFloor": 0, "notionalCap": 50000, - "maintenanceMarginRatio": 0.01, + "maintenanceMarginRate": 0.01, "maxLeverage": 50, "info": { "bracket": "1", @@ -284,7 +284,7 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): "tier": 2, "notionalFloor": 50000, "notionalCap": 150000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "2", @@ -299,7 +299,7 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): "tier": 3, "notionalFloor": 150000, "notionalCap": 250000, - "maintenanceMarginRatio": 0.05, + "maintenanceMarginRate": 0.05, "maxLeverage": 10, "info": { "bracket": "3", @@ -314,7 +314,7 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): "tier": 4, "notionalFloor": 250000, "notionalCap": 500000, - "maintenanceMarginRatio": 0.1, + "maintenanceMarginRate": 0.1, "maxLeverage": 5, "info": { "bracket": "4", @@ -329,7 +329,7 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): "tier": 5, "notionalFloor": 500000, "notionalCap": 1000000, - "maintenanceMarginRatio": 0.125, + "maintenanceMarginRate": 0.125, "maxLeverage": 4, "info": { "bracket": "5", @@ -344,7 +344,7 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): "tier": 6, "notionalFloor": 1000000, "notionalCap": 2000000, - "maintenanceMarginRatio": 0.25, + "maintenanceMarginRate": 0.25, "maxLeverage": 2, "info": { "bracket": "6", @@ -359,7 +359,7 @@ def test_fill_leverage_tiers_binance(default_conf, mocker): "tier": 7, "notionalFloor": 2000000, "notionalCap": 30000000, - "maintenanceMarginRatio": 0.5, + "maintenanceMarginRate": 0.5, "maxLeverage": 1, "info": { "bracket": "7", diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 4fa8f5f62..522e23b49 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4250,7 +4250,7 @@ def test_load_leverage_tiers(mocker, default_conf, leverage_tiers, exchange_name 'tier': 1, 'notionalFloor': 0, 'notionalCap': 500, - 'maintenanceMarginRatio': 0.02, + 'maintenanceMarginRate': 0.02, 'maxLeverage': 75, 'info': { 'baseMaxLoan': '', @@ -4291,7 +4291,7 @@ def test_load_leverage_tiers(mocker, default_conf, leverage_tiers, exchange_name 'tier': 1, 'notionalFloor': 0, 'notionalCap': 500, - 'maintenanceMarginRatio': 0.02, + 'maintenanceMarginRate': 0.02, 'maxLeverage': 75, 'info': { 'baseMaxLoan': '', @@ -4327,7 +4327,7 @@ def test_parse_leverage_tier(mocker, default_conf): "tier": 1, "notionalFloor": 0, "notionalCap": 100000, - "maintenanceMarginRatio": 0.025, + "maintenanceMarginRate": 0.025, "maxLeverage": 20, "info": { "bracket": "1", @@ -4351,7 +4351,7 @@ def test_parse_leverage_tier(mocker, default_conf): 'tier': 1, 'notionalFloor': 0, 'notionalCap': 2000, - 'maintenanceMarginRatio': 0.01, + 'maintenanceMarginRate': 0.01, 'maxLeverage': 75, 'info': { 'baseMaxLoan': '', diff --git a/tests/exchange/test_okx.py b/tests/exchange/test_okx.py index 2eaa1736d..3bfe7bb21 100644 --- a/tests/exchange/test_okx.py +++ b/tests/exchange/test_okx.py @@ -21,7 +21,7 @@ def test_get_maintenance_ratio_and_amt_okx( 'tier': 1, 'notionalFloor': 0, 'notionalCap': 2000, - 'maintenanceMarginRatio': 0.01, + 'maintenanceMarginRate': 0.01, 'maxLeverage': 75, 'info': { 'baseMaxLoan': '', @@ -41,7 +41,7 @@ def test_get_maintenance_ratio_and_amt_okx( 'tier': 2, 'notionalFloor': 2001, 'notionalCap': 4000, - 'maintenanceMarginRatio': 0.015, + 'maintenanceMarginRate': 0.015, 'maxLeverage': 50, 'info': { 'baseMaxLoan': '', @@ -61,7 +61,7 @@ def test_get_maintenance_ratio_and_amt_okx( 'tier': 3, 'notionalFloor': 4001, 'notionalCap': 8000, - 'maintenanceMarginRatio': 0.02, + 'maintenanceMarginRate': 0.02, 'maxLeverage': 20, 'info': { 'baseMaxLoan': '', @@ -83,7 +83,7 @@ def test_get_maintenance_ratio_and_amt_okx( 'tier': 1, 'notionalFloor': 0, 'notionalCap': 500, - 'maintenanceMarginRatio': 0.02, + 'maintenanceMarginRate': 0.02, 'maxLeverage': 75, 'info': { 'baseMaxLoan': '', @@ -103,7 +103,7 @@ def test_get_maintenance_ratio_and_amt_okx( 'tier': 2, 'notionalFloor': 501, 'notionalCap': 1000, - 'maintenanceMarginRatio': 0.025, + 'maintenanceMarginRate': 0.025, 'maxLeverage': 50, 'info': { 'baseMaxLoan': '', @@ -123,7 +123,7 @@ def test_get_maintenance_ratio_and_amt_okx( 'tier': 3, 'notionalFloor': 1001, 'notionalCap': 2000, - 'maintenanceMarginRatio': 0.03, + 'maintenanceMarginRate': 0.03, 'maxLeverage': 20, 'info': { 'baseMaxLoan': '', @@ -179,7 +179,7 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets): 'tier': 1, 'notionalFloor': 0, 'notionalCap': 500, - 'maintenanceMarginRatio': 0.02, + 'maintenanceMarginRate': 0.02, 'maxLeverage': 75, 'info': { 'baseMaxLoan': '', @@ -199,7 +199,7 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets): 'tier': 2, 'notionalFloor': 501, 'notionalCap': 1000, - 'maintenanceMarginRatio': 0.025, + 'maintenanceMarginRate': 0.025, 'maxLeverage': 50, 'info': { 'baseMaxLoan': '', @@ -219,7 +219,7 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets): 'tier': 3, 'notionalFloor': 1001, 'notionalCap': 2000, - 'maintenanceMarginRatio': 0.03, + 'maintenanceMarginRate': 0.03, 'maxLeverage': 20, 'info': { 'baseMaxLoan': '', @@ -243,7 +243,7 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets): 'tier': 1, 'notionalFloor': 0, 'notionalCap': 2000, - 'maintenanceMarginRatio': 0.01, + 'maintenanceMarginRate': 0.01, 'maxLeverage': 75, 'info': { 'baseMaxLoan': '', @@ -263,7 +263,7 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets): 'tier': 2, 'notionalFloor': 2001, 'notionalCap': 4000, - 'maintenanceMarginRatio': 0.015, + 'maintenanceMarginRate': 0.015, 'maxLeverage': 50, 'info': { 'baseMaxLoan': '', @@ -283,7 +283,7 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets): 'tier': 3, 'notionalFloor': 4001, 'notionalCap': 8000, - 'maintenanceMarginRatio': 0.02, + 'maintenanceMarginRate': 0.02, 'maxLeverage': 20, 'info': { 'baseMaxLoan': '', From df86300729de336cb057dcff25e635b80ba1e009 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 09:20:22 -0600 Subject: [PATCH 66/70] test_ccxt_dry_run_liquidation_price --- tests/exchange/test_ccxt_compat.py | 34 +++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/tests/exchange/test_ccxt_compat.py b/tests/exchange/test_ccxt_compat.py index 992396388..968980af1 100644 --- a/tests/exchange/test_ccxt_compat.py +++ b/tests/exchange/test_ccxt_compat.py @@ -120,7 +120,7 @@ def exchange_futures(request, exchange_conf, class_mocker): exchange_conf = deepcopy(exchange_conf) exchange_conf['exchange']['name'] = request.param exchange_conf['trading_mode'] = 'futures' - exchange_conf['margin_mode'] = 'cross' + exchange_conf['margin_mode'] = 'isolated' exchange_conf['stake_currency'] = EXCHANGES[request.param]['stake_currency'] # TODO-lev: This mock should no longer be necessary once futures are enabled. @@ -134,6 +134,7 @@ def exchange_futures(request, exchange_conf, class_mocker): yield exchange, request.param +@pytest.mark.longrun class TestCCXTExchange(): def test_load_markets(self, exchange): @@ -379,11 +380,34 @@ class TestCCXTExchange(): oldNotionalFloor = tier['notionalFloor'] oldNotionalCap = tier['notionalCap'] - def test_ccxt_get_liquidation_price(): - return # TODO-lev + def test_ccxt_dry_run_liquidation_price(self, exchange_futures): + futures, futures_name = exchange_futures + if futures and EXCHANGES[futures_name]['leverage_tiers_public']: - def test_ccxt_liquidation_price(): - return # TODO-lev + futures_pair = EXCHANGES[futures_name].get( + 'futures_pair', + EXCHANGES[futures_name]['pair'] + ) + + liquidation_price = futures.dry_run_liquidation_price( + futures_pair, + 40000, + False, + 100, + 100, + ) + assert (isinstance(liquidation_price, float)) + assert liquidation_price >= 0.0 + + liquidation_price = futures.dry_run_liquidation_price( + futures_pair, + 40000, + False, + 100, + 100, + ) + assert (isinstance(liquidation_price, float)) + assert liquidation_price >= 0.0 def test_ccxt_get_max_pair_stake_amount(self, exchange_futures): futures, futures_name = exchange_futures From 2015e9345d9b7a0fd227cbec881bf7c4eeade103 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 09:25:08 -0600 Subject: [PATCH 67/70] test_ccxt_compat maintenanceMarginRatio -> maintenanceMarginRate --- tests/exchange/test_ccxt_compat.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/exchange/test_ccxt_compat.py b/tests/exchange/test_ccxt_compat.py index 968980af1..6bf555867 100644 --- a/tests/exchange/test_ccxt_compat.py +++ b/tests/exchange/test_ccxt_compat.py @@ -363,7 +363,7 @@ class TestCCXTExchange(): oldMaintenanceMarginRate = oldNotionalFloor = oldNotionalCap = -1 for tier in pair_tiers: for key in [ - 'maintenanceMarginRatio', # TODO-lev: Change to maintenanceMarginRate + 'maintenanceMarginRate', 'notionalFloor', 'notionalCap', 'maxLeverage' @@ -372,11 +372,11 @@ class TestCCXTExchange(): assert tier[key] >= 0.0 assert tier['notionalCap'] > tier['notionalFloor'] assert tier['maxLeverage'] <= oldLeverage - assert tier['maintenanceMarginRatio'] >= oldMaintenanceMarginRate + assert tier['maintenanceMarginRate'] >= oldMaintenanceMarginRate assert tier['notionalFloor'] > oldNotionalFloor assert tier['notionalCap'] > oldNotionalCap oldLeverage = tier['maxLeverage'] - oldMaintenanceMarginRate = tier['maintenanceMarginRatio'] + oldMaintenanceMarginRate = tier['maintenanceMarginRate'] oldNotionalFloor = tier['notionalFloor'] oldNotionalCap = tier['notionalCap'] From a37287d9ba92de699145fb1f29f7c5c3582dd04c Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 10:00:06 -0600 Subject: [PATCH 68/70] test__get_params --- freqtrade/exchange/okx.py | 1 - tests/exchange/test_exchange.py | 54 +++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 99b19903b..8bdd81b14 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -39,7 +39,6 @@ class Okx(Exchange): reduceOnly: bool, time_in_force: str = 'gtc', ) -> Dict: - # TODO-lev: Test me params = super()._get_params( ordertype=ordertype, leverage=leverage, diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 522e23b49..9c54686e6 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4452,3 +4452,57 @@ def test_get_max_leverage_futures(default_conf, mocker, leverage_tiers): match=r'Amount 1000000000.01 too high for BTC/USDT' ): exchange.get_max_leverage("BTC/USDT", 1000000000.01) + + +@pytest.mark.parametrize("exchange_name", ['bittrex', 'binance', 'kraken', 'ftx', 'gateio', 'okx']) +def test__get_params(mocker, default_conf, exchange_name): + api_mock = MagicMock() + mocker.patch('freqtrade.exchange.Exchange.exchange_has', return_value=True) + exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name) + exchange._params = {'test': True} + + params1 = {'test': True} + params2 = { + 'test': True, + 'timeInForce': 'ioc', + 'reduceOnly': True, + } + + if exchange_name == 'kraken': + params2['leverage'] = 3.0 + + if exchange_name == 'okx': + params2['tdMode'] = 'isolated' + + assert exchange._get_params( + ordertype='market', + reduceOnly=False, + time_in_force='gtc', + leverage=1.0, + ) == params1 + + assert exchange._get_params( + ordertype='market', + reduceOnly=False, + time_in_force='ioc', + leverage=1.0, + ) == params1 + + assert exchange._get_params( + ordertype='limit', + reduceOnly=False, + time_in_force='gtc', + leverage=1.0, + ) == params1 + + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name) + exchange._params = {'test': True} + + assert exchange._get_params( + ordertype='limit', + reduceOnly=True, + time_in_force='ioc', + leverage=3.0, + ) == params2 From d9d9867a54a37bed2d233107828a9deca88ca642 Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Wed, 16 Feb 2022 21:09:02 -0600 Subject: [PATCH 69/70] updated ccxt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 1fb95603e..50ad32eb9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ numpy==1.22.2 pandas==1.4.0 pandas-ta==0.3.14b -ccxt==1.73.3 +ccxt==1.73.17 # Pin cryptography for now due to rust build errors with piwheels cryptography==36.0.1 aiohttp==3.8.1 From de8d789962ce8094eb0a9a28b03fe3b27448befb Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 17 Feb 2022 19:37:24 +0100 Subject: [PATCH 70/70] Fix test missing assert statement --- tests/exchange/test_binance.py | 9 +-------- tests/exchange/test_okx.py | 8 +------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index c20f17409..f6016a2fc 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -148,14 +148,7 @@ def test_stoploss_order_dry_run_binance(default_conf, mocker): (1501, 1499, 1501, "sell"), (1499, 1501, 1499, "buy") ]) -def test_stoploss_adjust_binance( - mocker, - default_conf, - sl1, - sl2, - sl3, - side -): +def test_stoploss_adjust_binance(mocker, default_conf, sl1, sl2, sl3, side): exchange = get_patched_exchange(mocker, default_conf, id='binance') order = { 'type': 'stop_loss_limit', diff --git a/tests/exchange/test_okx.py b/tests/exchange/test_okx.py index 3bfe7bb21..035e08f26 100644 --- a/tests/exchange/test_okx.py +++ b/tests/exchange/test_okx.py @@ -310,10 +310,9 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets): exchange.margin_mode = MarginMode.ISOLATED exchange.markets = markets # Initialization of load_leverage_tiers happens as part of exchange init. - exchange._leverage_tiers == { + assert exchange._leverage_tiers == { 'ADA/USDT:USDT': [ { - 'tier': 1, 'min': 0, 'max': 500, 'mmr': 0.02, @@ -321,7 +320,6 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets): 'maintAmt': None }, { - 'tier': 2, 'min': 501, 'max': 1000, 'mmr': 0.025, @@ -329,7 +327,6 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets): 'maintAmt': None }, { - 'tier': 3, 'min': 1001, 'max': 2000, 'mmr': 0.03, @@ -339,7 +336,6 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets): ], 'ETH/USDT:USDT': [ { - 'tier': 1, 'min': 0, 'max': 2000, 'mmr': 0.01, @@ -347,7 +343,6 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets): 'maintAmt': None }, { - 'tier': 2, 'min': 2001, 'max': 4000, 'mmr': 0.015, @@ -355,7 +350,6 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets): 'maintAmt': None }, { - 'tier': 3, 'min': 4001, 'max': 8000, 'mmr': 0.02,