freqtrade/freqtrade · error · OperationalException

PrecisionFilter not allowed for backtesting multiple strateg

Error message

PrecisionFilter not allowed for backtesting multiple strategies.

What it means

Thrown by Backtesting._validate_pairlists_for_backtesting when more than one strategy is being backtested (via --strategy-list) while the PrecisionFilter pairlist is active. PrecisionFilter removes pairs whose price precision makes targets (ROI/stop) unreachable, but the decision depends on each strategy's precision-related behavior, so it cannot be applied consistently across a multi-strategy run. Freqtrade rejects the combination instead of producing per-strategy-inconsistent pair sets.

Source

Thrown at freqtrade/optimize/backtesting.py:255

        self.trading_mode: TradingMode = self.config.get("trading_mode", TradingMode.SPOT)
        self.margin_mode: MarginMode = self.config.get("margin_mode", MarginMode.ISOLATED)
        # strategies which define "can_short=True" will fail to load in Spot mode.
        self._can_short = self.trading_mode != TradingMode.SPOT
        self._position_stacking: bool = self.config.get("position_stacking", False)
        self.enable_protections: bool = self.config.get("enable_protections", False)
        migrate_data(config, self.exchange)

        self.init_backtest()

    def _validate_pairlists_for_backtesting(self):
        if "VolumePairList" in self.pairlists.name_list:
            raise OperationalException(
                "VolumePairList not allowed for backtesting. Please use StaticPairList instead."
            )

        if len(self.strategylist) > 1 and "PrecisionFilter" in self.pairlists.name_list:
            raise OperationalException(
                "PrecisionFilter not allowed for backtesting multiple strategies."
            )

    def log_once(self, msg: str) -> None:
        """
        Partial reimplementation of log_once from the Login mixin.
        only used by recursive, as __initial_backtest is false in all other cases.

        """
        if self.__initial_backtest:
            logger.info(msg)

    def set_fee(self):
        if self.config.get("fee", None) is not None:
            self.fee = self.config["fee"]
            self.log_once(f"Using fee {self.fee:.4%} from config.")
        else:
            fees = [

View on GitHub (pinned to 1c8edfe4d1)

Solutions

  1. Remove PrecisionFilter from the pairlists for the multi-strategy comparison run.
  2. Or split into separate single-strategy backtests (`--strategy StratA`, then `--strategy StratB`), which may keep PrecisionFilter.
  3. Use a dedicated backtest config without PrecisionFilter and pass it with `-c`.

Example fix

# before
"pairlists": [{"method": "StaticPairList"}, {"method": "PrecisionFilter"}]
# freqtrade backtesting --strategy-list StratA StratB
# after
"pairlists": [{"method": "StaticPairList"}]
# freqtrade backtesting --strategy-list StratA StratB
Defensive patterns

Strategy: validation

Validate before calling

def validate_multi_strategy_pairlists(config, strategy_list):
    methods = [p.get("method") for p in config.get("pairlists", [])]
    if len(strategy_list) > 1 and "PrecisionFilter" in methods:
        raise ValueError("PrecisionFilter cannot be used with --strategy-list")

Prevention

When it happens

Trigger: Running `freqtrade backtesting --strategy-list StratA StratB` with a config whose pairlists include {"method": "PrecisionFilter"}.

Common situations: Comparing several strategies with one command while keeping the production pairlist chain that includes PrecisionFilter.

Related errors


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