freqtrade/freqtrade · error · ConfigurationError

The Edge module has been deprecated in 2023.9 and removed in

Error message

The Edge module has been deprecated in 2023.9 and removed in 2025.6. All functionalities of edge have been removed.

What it means

Fifth check of _force_entry_validations: the pair's quote currency must equal the configured stake_currency (e.g. stake USDT but pair ETH/BTC) — otherwise the entry cannot be funded from the stake wallet. The error interpolates the allowed stake currency: "Wrong pair selected. Only pairs with stake-currency {stake_currency} allowed."

Source

Thrown at freqtrade/commands/optimize_commands.py:132

        logger.info("Another running instance of freqtrade Hyperopt detected.")
        logger.info(
            "Simultaneous execution of multiple Hyperopt commands is not supported. "
            "Hyperopt module is resource hungry. Please run your Hyperopt sequentially "
            "or on separate machines."
        )
        logger.info("Quitting now.")
        # TODO: return False here in order to help freqtrade to exit
        # with non-zero exit code...
        # Same in Edge and Backtesting start() functions.


def start_edge(args: dict[str, Any]) -> None:
    """
    Start Edge script
    :param args: Cli args from Arguments()
    :return: None
    """
    raise ConfigurationError(
        "The Edge module has been deprecated in 2023.9 and removed in 2025.6. "
        "All functionalities of edge have been removed."
    )


def start_lookahead_analysis(args: dict[str, Any]) -> None:
    """
    Start the backtest bias tester script
    :param args: Cli args from Arguments()
    :return: None
    """
    from freqtrade.configuration import setup_utils_configuration
    from freqtrade.optimize.analysis.lookahead_helpers import LookaheadAnalysisSubFunctions

    config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)
    LookaheadAnalysisSubFunctions.start(config)

View on GitHub (pinned to 1c8edfe4d1)

Solutions

  1. Enter only pairs quoted in your stake currency: for USDT stake use */USDT pairs.
  2. Or change stake_currency in config to the desired quote (and fund that wallet).
  3. Verify with exchange.get_pair_quote_currency(pair) == config['stake_currency'] before calling.

Example fix

# before: stake_currency = USDT
client.post('/api/v1/forceenter', json={'pair': 'ETH/BTC'})  # wrong quote

# after
client.post('/api/v1/forceenter', json={'pair': 'ETH/USDT'})
Defensive patterns

Strategy: validation

Validate before calling

stake = config['stake_currency']
quote = exchange.get_pair_quote_currency(pair)
if quote != stake:
    raise ValueError(f'{pair} quoted in {quote}; need */{stake} pair')

Type guard

def pair_matches_stake(pair: str, stake_currency: str) -> bool:
    return pair.split('/')[-1] == stake_currency if '/' in pair else False

Try / catch

from freqtrade.rpc import RPCException
try:
    rpc._rpc_force_entry(pair, None)
except RPCException as e:
    if 'Wrong pair selected' in str(e):
        pair = pair.split('/')[0] + '/' + config['stake_currency']
        rpc._rpc_force_entry(pair, None)
    else:
        raise

Prevention

When it happens

Trigger: Config stake_currency=USDT, forceenter ETH/BTC; stake_currency=BTC and pair X/USDT; misreading which side is quote (BASE/QUOTE convention).

Common situations: Operators seeing a good signal on a BTC-quoted pair while running USDT stakes; configs migrated between exchanges with different dominant quotes (USD vs USDT); typo in stake_currency itself ('usdt' case must match exactly).

Related errors


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