{"record":{"id":"eafb77102e0d3b47","repo":"freqtrade/freqtrade","slug":"the-ccxt-library-does-not-provide-the-list-of-time","errorCode":null,"errorMessage":"The ccxt library does not provide the list of timeframes for the exchange {self.name} and this exchange is therefore not supported. ccxt fetchOHLCV: {self.exchange_has('fetchOHLCV')}","messagePattern":"The ccxt library does not provide the list of timeframes for the exchange (.+?) and this exchange is therefore not supported\\. ccxt fetchOHLCV: (.+?)","errorType":"exception","errorClass":"OperationalException","httpStatus":null,"severity":"critical","filePath":"freqtrade/exchange/exchange.py","lineNumber":790,"sourceCode":"            f\"{curr_2}/{curr_1}\",\n            f\"{curr_1}/{curr_2}:{curr_2}\",\n            f\"{curr_2}/{curr_1}:{curr_1}\",\n        ):\n            if pair in self.markets and self.markets[pair].get(\"active\"):\n                yielded = True\n                yield pair\n        if not yielded:\n            raise ValueError(f\"Could not combine {curr_1} and {curr_2} to get a valid pair.\")\n\n    def validate_timeframes(self, timeframe: str | None) -> None:\n        \"\"\"\n        Check if timeframe from config is a supported timeframe on the exchange\n        \"\"\"\n        if not hasattr(self._api, \"timeframes\") or self._api.timeframes is None:\n            # If timeframes attribute is missing (or is None), the exchange probably\n            # has no fetchOHLCV method.\n            # Therefore we also show that.\n            raise OperationalException(\n                f\"The ccxt library does not provide the list of timeframes \"\n                f\"for the exchange {self.name} and this exchange \"\n                f\"is therefore not supported. ccxt fetchOHLCV: {self.exchange_has('fetchOHLCV')}\"\n            )\n\n        if timeframe and (timeframe not in self.timeframes):\n            raise ConfigurationError(\n                f\"Invalid timeframe '{timeframe}'. This exchange supports: {self.timeframes}\"\n            )\n\n        if (\n            timeframe\n            and self._config[\"runmode\"] != RunMode.UTIL_EXCHANGE\n            and timeframe_to_minutes(timeframe) < 1\n        ):\n            raise ConfigurationError(\"Timeframes < 1m are currently not supported by Freqtrade.\")\n\n    def validate_ordertypes(self, order_types: dict) -> None:","sourceCodeStart":772,"sourceCodeEnd":808,"githubUrl":"https://github.com/freqtrade/freqtrade/blob/1c8edfe4d1e8d11bd4b40e8fc3237c26c3a60e15/freqtrade/exchange/exchange.py#L772-L808","documentation":"Raised in validate_timeframes() during startup when the ccxt exchange class exposes no timeframes attribute (or it is None). Without that list freqtrade cannot verify the configured timeframe, which almost always means the exchange has no fetchOHLCV support at all. The message includes exchange_has('fetchOHLCV') to make that diagnosis immediate. This is an OperationalException: the exchange subclass is fundamentally incompatible with freqtrade's data model.","triggerScenarios":"Configuring an exchange whose ccxt implementation lacks OHLCV (fetchOHLCV false), or a mocked/partial ccxt class without a timeframes member, then running validate_timeframes during Exchange initialization (any live/dry/util runmode).","commonSituations":"User points config at a niche or newly added ccxt exchange that only supports tickers/trades; a custom exchange subclass overrides _api with a stub; ccxt version change removed/renamed the timeframes property.","solutions":["Switch exchange.name to a fully supported exchange (binance, kraken, bybit, etc.).","Upgrade ccxt to a version where the target exchange implements fetchOHLCV and timeframes.","If writing a custom exchange subclass, ensure _ft_has and the underlying ccxt class provide timeframes/fetchOHLCV."],"exampleFix":"# config.json - before\n\"exchange\": { \"name\": \"somefeed\", ... }\n\n# after\n\"exchange\": { \"name\": \"binance\", ... }","handlingStrategy":"validation","validationCode":"import ccxt\napi = getattr(ccxt, exchange_name)()\nif not getattr(api, 'has', {}).get('fetchOHLCV') or not getattr(api, 'timeframes', None):\n    raise SystemExit(f\"{exchange_name} cannot provide OHLCV; pick another exchange\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Before configuring, check ccxt exchange.has['fetchOHLCV'] and exchange.timeframes programmatically.","Prefer first-class freqtrade exchanges (binance, bybit, kraken, okx) unless you verified OHLCV support.","Pin a ccxt version known to support your exchange and re-verify after upgrades."],"tags":["exchange","ccxt","timeframe","ohlcv","startup"],"backgroundTag":null,"analyzedSha":"1c8edfe4d1e8d11bd4b40e8fc3237c26c3a60e15","analyzedAt":"2026-08-15T05:09:08.096Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}