freqtrade/freqtrade · error · ConfigurationError

On exchange stoploss is not supported for {self.name}.

Error message

On exchange stoploss is not supported for {self.name}.

What it means

Raised in validate_stop_ordertypes() when config sets order_types['stoploss_on_exchange'] = True but the exchange subclass's _ft_has dict does not declare stoploss_on_exchange support. On-exchange stoploss requires per-exchange implementation work in freqtrade (order placement, polling, adjustment); merely having the option in config is not enough. This is a hard startup failure, not a warning.

Source

Thrown at freqtrade/exchange/exchange.py:824

            raise ConfigurationError("Timeframes < 1m are currently not supported by Freqtrade.")

    def validate_ordertypes(self, order_types: dict) -> None:
        """
        Checks if order-types configured in strategy/config are supported
        """
        if any(v == "market" for k, v in order_types.items()):
            if not self.exchange_has("createMarketOrder"):
                raise ConfigurationError(f"Exchange {self.name} does not support market orders.")
        self.validate_stop_ordertypes(order_types)

    def validate_stop_ordertypes(self, order_types: dict) -> None:
        """
        Validate stoploss order types
        """
        if order_types.get("stoploss_on_exchange") and not self._ft_has.get(
            "stoploss_on_exchange", False
        ):
            raise ConfigurationError(f"On exchange stoploss is not supported for {self.name}.")
        if self.trading_mode == TradingMode.FUTURES:
            price_mapping = self._ft_has.get("stop_price_type_value_mapping", {}).keys()
            if (
                order_types.get("stoploss_on_exchange", False) is True
                and "stoploss_price_type" in order_types
                and order_types["stoploss_price_type"] not in price_mapping
            ):
                raise ConfigurationError(
                    f"On exchange stoploss price type '{order_types['stoploss_price_type']}' "
                    f"is not supported for {self.name}."
                )

    def validate_pricing(self, pricing: dict) -> None:
        if pricing.get("use_order_book", False) and not self.exchange_has("fetchL2OrderBook"):
            raise ConfigurationError(f"Orderbook not available for {self.name}.")
        if not pricing.get("use_order_book", False) and (
            not self.exchange_has("fetchTicker") or not self._ft_has["tickers_have_price"]
        ):

View on GitHub (pinned to 1c8edfe4d1)

Solutions

  1. Set "stoploss_on_exchange": false in order_types (freqtrade then manages stoploss locally).
  2. Switch to an exchange whose freqtrade subclass supports on-exchange stoploss (see its _ft_has).
  3. Keep stoploss_on_exchange only in exchange-specific config files.

Example fix

# config.json - before
"order_types": { ..., "stoploss_on_exchange": true }

# after
"order_types": { ..., "stoploss_on_exchange": false }
Defensive patterns

Strategy: validation

Validate before calling

if config['order_types'].get('stoploss_on_exchange') and not exchange._ft_has.get('stoploss_on_exchange', False):
    raise SystemExit("stoploss_on_exchange unsupported here; set it false")

Prevention

When it happens

Trigger: Enabling stoploss_on_exchange on exchanges whose subclass (e.g. many spot implementations) lacks stoploss_on_exchange in _ft_has; inheriting a strategy-config template written for binance futures and using it on another exchange.

Common situations: Config copy-paste between exchanges; users assuming ccxt stop-order support implies freqtrade support; running spot mode on an exchange where only futures supports it.

Related errors


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