freqtrade/freqtrade · error · TemporaryError

Could not set leverage due to {e.__class__.__name__}. Messag

Error message

Could not set leverage due to {e.__class__.__name__}. Message: {e}

What it means

TemporaryError raised by Okx._set_leverage() when set_leverage fails with ccxt.OperationFailed/ExchangeError AND __fetch_leverage_already_set() confirms the leverage is NOT already at the target. OKX rejects redundant set-leverage calls with an error, so the code first checks whether the error is benign (leverage already equals the requested value); only a genuine failure raises.

Source

Thrown at freqtrade/exchange/okx.py:173

    def _lev_prep(self, pair: str, leverage: float, side: BuySell, accept_fail: bool = False):
        if self.trading_mode != TradingMode.SPOT and self.margin_mode is not None:
            try:
                res = self._api.set_leverage(
                    leverage=leverage,
                    symbol=pair,
                    params={
                        "mgnMode": self.margin_mode.value,
                        "posSide": self._get_posSide(side, False),
                    },
                )
                self._log_exchange_response("set_leverage", res)

            except ccxt.DDoSProtection as e:
                raise DDosProtection(e) from e
            except (ccxt.OperationFailed, ccxt.ExchangeError) as e:
                already_set = self.__fetch_leverage_already_set(pair, leverage, side)
                if not already_set:
                    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, 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:
            return float("inf")

        pair_tiers = self._leverage_tiers[pair]
        last_max_notional = pair_tiers[-1]["maxNotional"]
        if last_max_notional is None:
            return float("inf")
        return last_max_notional / leverage

View on GitHub (pinned to 1c8edfe4d1)

Solutions

  1. Read the embedded ccxt message — OKX usually states 'leverage greater than the max' or similar; lower max_leverage in the strategy.
  2. Verify margin_mode config (isolated/cross) matches what the account and pair support.
  3. Confirm the pair is still tradable on OKX.
  4. Update ccxt so leverage tier data and error codes are current.

Example fix

# strategy.py — clamp leverage to what OKX allows for the pair
# before
def leverage(self, pair, current_time, current_rate, proposed_leverage, max_leverage, entry_tag, side, **kwargs) -> float:
    return 10.0
# after
def leverage(self, pair, current_time, current_rate, proposed_leverage, max_leverage, entry_tag, side, **kwargs) -> float:
    return min(10.0, max_leverage)
Defensive patterns

Strategy: validation

Validate before calling

tiers = exchange.get_leverage_tiers(pair) if hasattr(exchange, 'get_leverage_tiers') else {}
max_ok = tiers.get(pair, [{}])[-1].get('maxLeverage', 100) if tiers else 100
lev = min(requested_leverage, max_ok)

Try / catch

from freqtrade.exceptions import TemporaryError
try:
    exchange.set_leverage(lev, pair, side)
except TemporaryError as e:
    if 'leverage' in str(e).lower():
        lev = min(lev, 3)  # retry with conservative leverage
        exchange.set_leverage(lev, pair, side)

Prevention

When it happens

Trigger: Placing an order whose leverage differs from the account's current setting while OKX rejects the change: leverage above the tier limit for the pair/margin mode, insufficient margin for requested leverage, or 'Instrument not found' style errors.

Common situations: Strategy max_leverage exceeds OKX's per-pair cap for the position tier, margin mode mismatch (isolated vs cross), or a pair delisted/renamed on OKX.

Related errors


AI-assisted analysis of freqtrade/freqtrade@1c8edfe4d1 (2026-08-15). Data as JSON: /api/errors/4d3d663aaf09d5a8. Report an issue: GitHub.