[build-system]
requires = ["setuptools >= 64.0.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "freqtrade"
dynamic = ["version"]
authors = [
{name = "Freqtrade Team"},
{name = "Freqtrade Team", email = "freqtrade@protonmail.com"},
]
description = "Freqtrade - Crypto Trading Bot"
readme = "README.md"
requires-python = ">=3.11"
license = {text = "GPLv3"}
classifiers = [
"Environment :: Console",
"Intended Audience :: Science/Research",
"License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Operating System :: MacOS",
"Operating System :: Unix",
"Topic :: Office/Business :: Financial :: Investment",
]
dependencies = [
"ccxt>=4.5.76",
"SQLAlchemy>=2.0.6",
"python-telegram-bot>=20.1",
"humanize>=4.0.0",
"cachetools",
"requests",
"httpx>=0.24.1",
"urllib3",
"certifi>=2026.1.4",
"jsonschema",
"scipy",
"numpy>2.0,<3.0",
"pandas>=2.2.0,<4.0",
"bottleneck>=1.5.0",
"numexpr>=2.14.0",
"TA-Lib<0.8",
"ft-pandas-ta",
"technical",
"tabulate",
"pycoingecko>=3.2.0",
"python-rapidjson",
"orjson",
"jinja2",
"questionary",
"prompt-toolkit",
"joblib>=1.2.0",
"rich",
'pyarrow; platform_machine != "armv7l"',
"fastapi",
"pydantic>=2.2.0",
"pyjwt",
"websockets",
"uvicorn",
"psutil",
"schedule",
"janus",
"ast-comments",
"aiofiles",
"aiohttp",
"cryptography",
"sdnotify",
"python-dateutil",
"pytz",
"packaging",
"freqtrade-client",
]
[project.optional-dependencies]
plot = ["plotly>=4.0"]
hyperopt = [
"cmaes",
"filelock",
"optuna > 4.0.0",
"scikit-learn",
]
freqai = [
"datasieve>=0.1.5",
"joblib",
"lightgbm",
"scikit-learn",
"tensorboard",
"xgboost",
]
freqai_rl = [
"gymnasium",
"sb3-contrib; sys_platform != 'darwin' or platform_machine != 'x86_64'",
"stable-baselines3; sys_platform != 'darwin' or platform_machine != 'x86_64'",
"torch; sys_platform != 'darwin' or platform_machine != 'x86_64'",
"tqdm",
]
develop = [
"mypy",
"pre-commit",
"pytest-asyncio",
"pytest-cov",
"pytest-mock",
"pytest-random-order",
"pytest-timeout",
"pytest-xdist",
"pytest",
"ruff",
"scipy-stubs",
"time-machine",
"types-cachetools",
"types-filelock",
"types-python-dateutil",
"types-requests",
"types-tabulate",
]
jupyter = [
"ipykernel",
"jupyter",
"nbconvert",
"nbstripout",
]
all = [
"freqtrade[plot,hyperopt,freqai,freqai_rl,jupyter]",
]
dev = [
"freqtrade[all,develop]",
]
[project.urls]
Homepage = "https://github.com/freqtrade/freqtrade"
Documentation = "https://freqtrade.io"
"Bug Tracker" = "https://github.com/freqtrade/freqtrade/issues"
[project.scripts]
freqtrade = "freqtrade.main:main"
[tool.setuptools]
include-package-data = true
zip-safe = false
[tool.setuptools.packages.find]
where = ["."]
include = ["freqtrade*"]
exclude = ["tests", "tests.*", "user_data", "user_data*"]
namespaces = true
[tool.setuptools.dynamic]
version = {attr = "freqtrade.__version__"}
[tool.pytest]
log_format = "%(asctime)s %(levelname)s %(message)s"
log_date_format = "%Y-%m-%d %H:%M:%S"
addopts = ["--dist", "loadscope"]
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
filterwarnings = [
"ignore:enable_cleanup_closed ignored:DeprecationWarning:aiohttp.connector",
]
[tool.mypy]
ignore_missing_imports = true
namespace_packages = false
warn_unused_ignores = true
exclude = [
'^build_helpers\.py$',
'^ft_client/build/.*$',
]
plugins = [
"sqlalchemy.ext.mypy.plugin"
]
[[tool.mypy.overrides]]
module = "tests.*"
ignore_errors = true
[[tool.mypy.overrides]]
module = [
"freqtrade.templates.*",
"tests.strategy.strats"
]
disable_error_code = "attr-defined"
[tool.pyright]
include = ["freqtrade", "ft_client"]
exclude = [
"**/__pycache__",
"build_helpers/*.py",
"ft_client/build/*",
"build/*",
]
ignore = ["freqtrade/vendor/**"]
pythonPlatform = "All"
pythonVersion = "3.11"
typeCheckingMode = "off"
reportArgumentType = false
reportAssignmentType = false
reportAttributeAccessIssue = false
reportCallIssue = false
reportGeneralTypeIssues = false
reportIncompatibleMethodOverride = false
reportIncompatibleVariableOverride = false
reportIndexIssue = false
reportMissingImports = false
reportOperatorIssue = false
reportOptionalMemberAccess = false
reportOptionalOperand = false
reportPossiblyUnboundVariable = false
reportPrivateImportUsage = false
reportRedeclaration = false
reportReturnType = false
reportTypedDictNotRequiredAccess = false
[tool.uv]
exclude-newer = "1 week"
[tool.uv.exclude-newer-package]
ccxt = false
ruff = "5 days"
cryptography = "5 days"
[tool.ruff]
line-length = 100
extend-exclude = [".env", ".venv", "*.md"]
[tool.ruff.lint]
extend-select = [
"C90",
"B",
"F",
"E",
"W",
"UP",
"I",
"A",
"TID",
"YTT",
"S",
"PTH",
"RUF",
"ASYNC",
"NPY",
]
extend-ignore = [
"E241",
"E272",
"E221",
"B904",
"S603",
"S607",
"S608",
"NPY002",
"RUF010",
"RUF012",
"RUF022",
"RUF005",
"BLE001",
"N999",
"DTZ007",
"TRY401",
"TRY",
"SIM",
]
[tool.ruff.lint.per-file-ignores]
"freqtrade/freqai/**/*.py" = [
"S311",
]
"tests/**.py" = [
"S101",
"S104",
"S311",
"S105",
"S106",
"S110",
"TRY002",
"DTZ005",
"DTZ",
]
"freqtrade/templates/**.py" = [
"RUF100",
]
"ft_client/test_client/**.py" = [
"S101",
]
[tool.ruff.lint.mccabe]
max-complexity = 12
[tool.ruff.lint.flake8-bugbear]
extend-immutable-calls = ["fastapi.Depends", "fastapi.Query"]
[tool.ruff.lint.isort]
lines-after-imports = 2
known-first-party = ["freqtrade_client"]
[tool.flake8]
ignore = ["E121","E123","E126","E24", "E203","E704","W503","W504"]
max-line-length = 100
max-complexity = 12
exclude = [
".git",
"__pycache__",
".eggs",
"user_data",
".venv",
".env",
]
[tool.codespell]
ignore-words-list = "coo,fo,strat,zar,selectin"
skip="*.svg,./user_data,freqtrade/rpc/api_server/ui/installed,freqtrade/exchange/*.json"