diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 6fcead08c..a922d9c0d 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -155,20 +155,29 @@ class Binance(Exchange): except ccxt.BaseError as e: raise OperationalException(e) from e - def get_max_leverage(self, pair: Optional[str], nominal_value: Optional[float]) -> float: + 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 - :nominal_value: The total value of the trade in quote currency (collateral + debt) + :stake_amount: The total value of the traders collateral in quote currency """ if pair not in self._leverage_brackets: return 1.0 pair_brackets = self._leverage_brackets[pair] - max_lev = 1.0 - for [min_amount, margin_req] in pair_brackets: - if nominal_value >= min_amount: - max_lev = 1/margin_req - return max_lev + num_brackets = len(pair_brackets) + min_amount = 0 + for bracket_num in range(num_brackets): + [_, margin_req] = pair_brackets[bracket_num] + lev = 1/margin_req + 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 @retrier def _set_leverage( diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 58321a2db..e737d2b2a 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1807,7 +1807,7 @@ class Exchange: """ return - def get_max_leverage(self, pair: Optional[str], nominal_value: Optional[float]) -> float: + 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 diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index ac7647e73..1c377c70a 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -162,43 +162,49 @@ 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,nominal_value,max_lev', [ +@pytest.mark.parametrize('pair,stake_amount,max_lev', [ ("BNB/BUSD", 0.0, 40.0), - ("BNB/USDT", 100.0, 153.84615384615384), + ("BNB/USDT", 100.0, 100.0), ("BTC/USDT", 170.30, 250.0), - ("BNB/BUSD", 999999.9, 10.0), - ("BNB/USDT", 5000000.0, 6.666666666666667), - ("BTC/USDT", 300000000.1, 2.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, nominal_value, max_lev): +def test_get_max_leverage_binance(default_conf, mocker, pair, stake_amount, max_lev): exchange = get_patched_exchange(mocker, default_conf, id="binance") exchange._leverage_brackets = { - '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/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]], + 'BNB/BUSD': [ + [0.0, 0.025], # lev = 40.0 + [100000.0, 0.05], # lev = 20.0 + [500000.0, 0.1], # lev = 10.0 + [1000000.0, 0.15], # lev = 6.666666666666667 + [2000000.0, 0.25], # lev = 4.0 + [5000000.0, 0.5], # lev = 2.0 + ], + 'BNB/USDT': [ + [0.0, 0.0065], # lev = 153.84615384615384 + [10000.0, 0.01], # lev = 100.0 + [50000.0, 0.02], # lev = 50.0 + [250000.0, 0.05], # lev = 20.0 + [1000000.0, 0.1], # lev = 10.0 + [2000000.0, 0.125], # lev = 8.0 + [5000000.0, 0.15], # lev = 6.666666666666667 + [10000000.0, 0.25], # lev = 4.0 + ], + 'BTC/USDT': [ + [0.0, 0.004], # lev = 250.0 + [50000.0, 0.005], # lev = 200.0 + [250000.0, 0.01], # lev = 100.0 + [1000000.0, 0.025], # lev = 40.0 + [5000000.0, 0.05], # lev = 20.0 + [20000000.0, 0.1], # lev = 10.0 + [50000000.0, 0.125], # lev = 8.0 + [100000000.0, 0.15], # lev = 6.666666666666667 + [200000000.0, 0.25], # lev = 4.0 + [300000000.0, 0.5], # lev = 2.0 + ], } - assert exchange.get_max_leverage(pair, nominal_value) == max_lev + assert exchange.get_max_leverage(pair, stake_amount) == max_lev def test_fill_leverage_brackets_binance(default_conf, mocker):