Compare commits

...

1090 Commits

Author SHA1 Message Date
Matthias 9adf0316f1 Merge pull request #13179 from freqtrade/dependabot/pip/develop/uvicorn-0.47.0
chore(deps): bump uvicorn from 0.46.0 to 0.47.0
2026-05-25 10:00:07 +02:00
Matthias 830166e1c7 Merge pull request #13182 from freqtrade/dependabot/github_actions/develop/zizmorcore/zizmor-action-0.5.6
chore(deps): bump zizmorcore/zizmor-action from 0.5.3 to 0.5.6
2026-05-25 09:59:49 +02:00
Matthias 50aaf2cfc9 Merge pull request #13187 from freqtrade/dependabot/pip/develop/types-96391afc29
chore(deps-dev): bump the types group across 1 directory with 3 updates
2026-05-25 09:57:48 +02:00
Matthias 1b741f9c58 Merge pull request #13186 from freqtrade/dependabot/pip/develop/pandas-3.0.3
chore(deps): bump pandas from 3.0.2 to 3.0.3
2026-05-25 09:53:50 +02:00
Matthias 606f3b7dfe Merge pull request #13181 from freqtrade/dependabot/pip/develop/requests-2.34.2
chore(deps): bump requests from 2.33.1 to 2.34.2
2026-05-25 09:53:35 +02:00
Matthias 2d9b13e65a Merge pull request #13180 from freqtrade/dependabot/pip/develop/mypy-2.1.0
chore(deps-dev): bump mypy from 2.0.0 to 2.1.0
2026-05-25 09:40:04 +02:00
dependabot[bot] 1a476c4078 chore(deps): bump requests from 2.33.1 to 2.34.2
Bumps [requests](https://github.com/psf/requests) from 2.33.1 to 2.34.2.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.33.1...v2.34.2)

---
updated-dependencies:
- dependency-name: requests
  dependency-version: 2.34.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-25 07:14:52 +00:00
dependabot[bot] 0c1c0990e8 chore(deps): bump uvicorn from 0.46.0 to 0.47.0
Bumps [uvicorn](https://github.com/Kludex/uvicorn) from 0.46.0 to 0.47.0.
- [Release notes](https://github.com/Kludex/uvicorn/releases)
- [Changelog](https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md)
- [Commits](https://github.com/Kludex/uvicorn/compare/0.46.0...0.47.0)

---
updated-dependencies:
- dependency-name: uvicorn
  dependency-version: 0.47.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-25 07:14:51 +00:00
Freqtrade Bot be37cafcb9 chore(deps): Apply pre-commit types update 2026-05-25 06:56:04 +00:00
dependabot[bot] 87a9f11773 chore(deps): bump pandas from 3.0.2 to 3.0.3
Bumps [pandas](https://github.com/pandas-dev/pandas) from 3.0.2 to 3.0.3.
- [Release notes](https://github.com/pandas-dev/pandas/releases)
- [Commits](https://github.com/pandas-dev/pandas/compare/v3.0.2...v3.0.3)

---
updated-dependencies:
- dependency-name: pandas
  dependency-version: 3.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-25 06:53:42 +00:00
dependabot[bot] 0fedcf9eb1 chore(deps): bump zizmorcore/zizmor-action from 0.5.3 to 0.5.6
Bumps [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) from 0.5.3 to 0.5.6.
- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)
- [Commits](https://github.com/zizmorcore/zizmor-action/compare/b1d7e1fb5de872772f31590499237e7cce841e8e...5f14fd08f7cf1cb1609c1e344975f152c7ee938d)

---
updated-dependencies:
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.5.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-25 06:49:57 +00:00
dependabot[bot] a54464905b chore(deps-dev): bump the types group across 1 directory with 3 updates
Bumps the types group with 3 updates in the / directory: [types-cachetools](https://github.com/python/typeshed), [types-requests](https://github.com/python/typeshed) and [types-python-dateutil](https://github.com/python/typeshed).


Updates `types-cachetools` from 7.0.0.20260503 to 7.0.0.20260518
- [Commits](https://github.com/python/typeshed/commits)

Updates `types-requests` from 2.33.0.20260508 to 2.33.0.20260518
- [Commits](https://github.com/python/typeshed/commits)

Updates `types-python-dateutil` from 2.9.0.20260508 to 2.9.0.20260518
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-cachetools
  dependency-version: 7.0.0.20260518
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
- dependency-name: types-requests
  dependency-version: 2.33.0.20260518
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
- dependency-name: types-python-dateutil
  dependency-version: 2.9.0.20260518
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-25 06:43:40 +00:00
Matthias 7c8aeed806 Merge pull request #13183 from freqtrade/dependabot/pip/develop/numpy-2.4.5
chore(deps): bump numpy from 2.4.4 to 2.4.5
2026-05-25 08:42:59 +02:00
dependabot[bot] bd706557bd chore(deps-dev): bump mypy from 2.0.0 to 2.1.0
Bumps [mypy](https://github.com/python/mypy) from 2.0.0 to 2.1.0.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v2.0.0...v2.1.0)

---
updated-dependencies:
- dependency-name: mypy
  dependency-version: 2.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-25 06:38:34 +00:00
Matthias d657a9760a Merge pull request #13178 from freqtrade/dependabot/pip/develop/cachetools-7.1.2
chore(deps): bump cachetools from 7.1.1 to 7.1.2
2026-05-25 08:38:06 +02:00
Matthias 0333e7e227 Merge pull request #13184 from freqtrade/dependabot/github_actions/develop/codecov/codecov-action-6.0.1
chore(deps): bump codecov/codecov-action from 6.0.0 to 6.0.1
2026-05-25 08:24:23 +02:00
dependabot[bot] 90945675bc chore(deps): bump numpy from 2.4.4 to 2.4.5
Bumps [numpy](https://github.com/numpy/numpy) from 2.4.4 to 2.4.5.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v2.4.4...v2.4.5)

---
updated-dependencies:
- dependency-name: numpy
  dependency-version: 2.4.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-25 06:22:25 +00:00
Matthias d3713cbf09 fix: typo 2026-05-25 08:21:21 +02:00
Matthias 9003d5e9e0 fix: disable failing okx live test 2026-05-25 08:19:34 +02:00
dependabot[bot] 7b197aa974 chore(deps): bump codecov/codecov-action from 6.0.0 to 6.0.1
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6.0.0 to 6.0.1.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/57e3a136b779b570ffcdbf80b3bdc90e7fab3de2...e79a6962e0d4c0c17b229090214935d2e33f8354)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-25 03:25:14 +00:00
dependabot[bot] ec65c88797 chore(deps): bump cachetools from 7.1.1 to 7.1.2
Bumps [cachetools](https://github.com/tkem/cachetools) from 7.1.1 to 7.1.2.
- [Changelog](https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tkem/cachetools/compare/v7.1.1...v7.1.2)

---
updated-dependencies:
- dependency-name: cachetools
  dependency-version: 7.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-25 03:24:40 +00:00
Matthias ba6627cd13 chore: update schedule for pre-commit update 2026-05-24 08:59:54 +02:00
Matthias 22a6fdab13 Merge pull request #13161 from ducky-duke/fix/historic-balance-bot-managed-bool
fix: /api/v1/historic_balance returns 500 on MySQL/MariaDB backends
2026-05-23 20:58:58 +02:00
Matthias 580e5b945f test: improve test for bot_balance from mariadb 2026-05-23 20:43:13 +02:00
Matthias 83649ab787 chore: revert unnecessary comment 2026-05-23 20:39:57 +02:00
Matthias 8165fd6310 Merge pull request #13166 from stash86/main-stash
add return type of check_delisting docs section
2026-05-22 17:07:52 +02:00
Stefano 6cf46338ef add return type of check_delisting docs section 2026-05-22 16:53:27 +09:00
Matthias 0d84e80eb7 Merge pull request #13163 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-05-21 06:30:27 +02:00
Freqtrade Bot 476abf80cc chore: update binance leverage tiers 2026-05-21 03:38:09 +00:00
ducky-duke a03ebc8472 fix: coerce bot_managed to bool in _rpc_get_historic_balance
read_sql may return the wallet_history `bot_managed` Boolean column as an
integer dtype (e.g. MySQL/MariaDB TINYINT). results.loc[results["bot_managed"]]
then does label-based indexing instead of boolean masking, raising a KeyError
on GET /api/v1/historic_balance (HTTP 500). Coerce with .astype(bool).
2026-05-20 17:57:59 +07:00
Matthias 1182c03b73 Merge pull request #13160 from freqtrade/dependabot/pip/pymdown-extensions-10.21.3
chore(deps): bump pymdown-extensions from 10.21.2 to 10.21.3
2026-05-20 06:31:34 +02:00
Matthias 2152fd7325 chore: temporarily decrase cooldown for pymdown 2026-05-20 06:16:15 +02:00
dependabot[bot] c7f84403d8 chore(deps): bump pymdown-extensions from 10.21.2 to 10.21.3
Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 10.21.2 to 10.21.3.
- [Release notes](https://github.com/facelessuser/pymdown-extensions/releases)
- [Commits](https://github.com/facelessuser/pymdown-extensions/compare/10.21.2...10.21.3)

---
updated-dependencies:
- dependency-name: pymdown-extensions
  dependency-version: 10.21.3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-19 21:43:30 +00:00
Matthias 6dcea8bac1 Merge pull request #13158 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2026-05-19 06:44:17 +02:00
Matthias 217a71b834 chore: temporarily revert the zizmor pre-commit update 2026-05-19 06:31:07 +02:00
Freqtrade Bot cf578a4b76 chore: update pre-commit hooks 2026-05-19 04:17:16 +00:00
Matthias f645d3e21a fix: live pair data must respect end-date 2026-05-18 18:25:14 +02:00
Matthias 9c480b4f4d chore: remove urlilb3 newer exclusion 2026-05-18 18:00:52 +02:00
Matthias 3a714cef14 Merge pull request #13154 from freqtrade/dependabot/pip/develop/ccxt-4.5.54
chore(deps): bump ccxt from 4.5.52 to 4.5.54
2026-05-18 06:57:08 +02:00
Matthias d67b54bcb5 chore(ci): work around powershell install failure
happens on northcentralus region (sometimes) ...
2026-05-18 06:34:13 +02:00
Matthias 9aebce306d Merge pull request #13151 from freqtrade/dependabot/pip/develop/types-83c091f25c
chore(deps-dev): bump the types group with 3 updates
2026-05-18 06:26:57 +02:00
Matthias 8e7aed5013 Merge pull request #13157 from freqtrade/dependabot/pip/develop/pydantic-2.13.4
chore(deps): bump pydantic from 2.13.3 to 2.13.4
2026-05-18 06:21:45 +02:00
dependabot[bot] 4cee997d11 chore(deps): bump ccxt from 4.5.52 to 4.5.54
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.52 to 4.5.54.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.52...v4.5.54)

---
updated-dependencies:
- dependency-name: ccxt
  dependency-version: 4.5.54
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-18 04:21:17 +00:00
Matthias 806a11c63a Merge pull request #13156 from freqtrade/dependabot/pip/develop/orjson-3.11.9
chore(deps): bump orjson from 3.11.8 to 3.11.9
2026-05-18 06:19:39 +02:00
Matthias 2e760ae1c5 Merge pull request #13155 from freqtrade/dependabot/pip/develop/mypy-2.0.0
chore(deps-dev): bump mypy from 1.20.2 to 2.0.0
2026-05-18 06:19:20 +02:00
Matthias 674b2c11bd Merge pull request #13153 from freqtrade/dependabot/pip/develop/cryptography-48.0.0
chore(deps): bump cryptography from 47.0.0 to 48.0.0
2026-05-18 06:19:00 +02:00
Freqtrade Bot 5a5dae22d3 chore(deps): Apply pre-commit types update 2026-05-18 03:33:22 +00:00
dependabot[bot] 0a1498af2d chore(deps): bump pydantic from 2.13.3 to 2.13.4
Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.13.3 to 2.13.4.
- [Release notes](https://github.com/pydantic/pydantic/releases)
- [Changelog](https://github.com/pydantic/pydantic/blob/v2.13.4/HISTORY.md)
- [Commits](https://github.com/pydantic/pydantic/compare/v2.13.3...v2.13.4)

---
updated-dependencies:
- dependency-name: pydantic
  dependency-version: 2.13.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-18 03:29:40 +00:00
dependabot[bot] e8cdbf0a8e chore(deps): bump orjson from 3.11.8 to 3.11.9
Bumps [orjson](https://github.com/ijl/orjson) from 3.11.8 to 3.11.9.
- [Release notes](https://github.com/ijl/orjson/releases)
- [Changelog](https://github.com/ijl/orjson/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ijl/orjson/compare/3.11.8...3.11.9)

---
updated-dependencies:
- dependency-name: orjson
  dependency-version: 3.11.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-18 03:29:32 +00:00
dependabot[bot] c0ee618bd0 chore(deps-dev): bump mypy from 1.20.2 to 2.0.0
Bumps [mypy](https://github.com/python/mypy) from 1.20.2 to 2.0.0.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.20.2...v2.0.0)

---
updated-dependencies:
- dependency-name: mypy
  dependency-version: 2.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-18 03:29:14 +00:00
dependabot[bot] a4ed0a03f1 chore(deps): bump cryptography from 47.0.0 to 48.0.0
Bumps [cryptography](https://github.com/pyca/cryptography) from 47.0.0 to 48.0.0.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/47.0.0...48.0.0)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 48.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-18 03:28:58 +00:00
dependabot[bot] 25d8d831ec chore(deps-dev): bump the types group with 3 updates
Bumps the types group with 3 updates: [types-requests](https://github.com/python/typeshed), [types-tabulate](https://github.com/python/typeshed) and [types-python-dateutil](https://github.com/python/typeshed).


Updates `types-requests` from 2.33.0.20260503 to 2.33.0.20260508
- [Commits](https://github.com/python/typeshed/commits)

Updates `types-tabulate` from 0.10.0.20260408 to 0.10.0.20260508
- [Commits](https://github.com/python/typeshed/commits)

Updates `types-python-dateutil` from 2.9.0.20260408 to 2.9.0.20260508
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-requests
  dependency-version: 2.33.0.20260508
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
- dependency-name: types-tabulate
  dependency-version: 0.10.0.20260508
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
- dependency-name: types-python-dateutil
  dependency-version: 2.9.0.20260508
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-18 03:28:08 +00:00
Matthias 3d91223c2b refactor: further improve hyper function wording 2026-05-17 20:17:43 +02:00
Matthias 875daac375 refactor: improve naming to reflect method functionality 2026-05-17 20:13:42 +02:00
Matthias 03fac42047 chore: fix docstring typo 2026-05-17 17:20:38 +02:00
Matthias 5bcc4fbf03 Merge pull request #13147 from freqtrade/dependabot/docker/python-3.14.5-slim-trixie
chore(deps): bump python from 3.14.3-slim-trixie to 3.14.5-slim-trixie
2026-05-15 06:31:31 +02:00
dependabot[bot] 0ea2258fa8 chore(deps): bump python from 3.14.3-slim-trixie to 3.14.5-slim-trixie
Bumps python from 3.14.3-slim-trixie to 3.14.5-slim-trixie.

---
updated-dependencies:
- dependency-name: python
  dependency-version: 3.14.5-slim-trixie
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-15 03:15:25 +00:00
Matthias a0627aa2fc docs: improve freqai docs formatting 2026-05-14 19:14:05 +02:00
Matthias 764b32a0cf Merge pull request #13145 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-05-14 06:21:48 +02:00
Freqtrade Bot fc634f42f6 chore: update binance leverage tiers 2026-05-14 03:37:42 +00:00
Matthias 8cce4be23c Merge pull request #13141 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2026-05-12 06:29:32 +02:00
Freqtrade Bot 11ab80bfc4 chore: update pre-commit hooks 2026-05-12 04:15:44 +00:00
Matthias e00a1fd28c Merge pull request #13140 from freqtrade/dependabot/pip/urllib3-2.7.0
chore(deps): bump urllib3 from 2.6.3 to 2.7.0
2026-05-11 19:36:08 +02:00
Matthias b132a49f40 chore(ci): use better name for mypy-version-update 2026-05-11 19:23:17 +02:00
Matthias f82e4ce9ec chore: urllib exclude for security fix 2026-05-11 19:17:13 +02:00
Matthias fac00475a1 Merge pull request #13132 from freqtrade/dependabot/pip/develop/types-67d33dbf9b
chore(deps-dev): bump the types group across 1 directory with 2 updates
2026-05-11 19:16:02 +02:00
Matthias 2ac99fc2bf chore: switch environment for security 2026-05-11 19:15:20 +02:00
Freqtrade Bot d935de08fe Apply pre-commit types update 2026-05-11 16:36:09 +00:00
Matthias a92e0b2545 chore(ci): improved condition syntax 2026-05-11 18:34:32 +02:00
Matthias 8abdd496f6 chore: fix pre-commit updates misconception 2026-05-11 18:32:11 +02:00
dependabot[bot] 443a245d82 chore(deps-dev): bump the types group across 1 directory with 2 updates
Bumps the types group with 2 updates in the / directory: [types-cachetools](https://github.com/python/typeshed) and [types-requests](https://github.com/python/typeshed).


Updates `types-cachetools` from 6.2.0.20260408 to 7.0.0.20260503
- [Commits](https://github.com/python/typeshed/commits)

Updates `types-requests` from 2.33.0.20260408 to 2.33.0.20260503
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-cachetools
  dependency-version: 7.0.0.20260503
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: types
- dependency-name: types-requests
  dependency-version: 2.33.0.20260503
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-11 16:18:16 +00:00
Matthias d95789a2e0 feat(ci): add pre-commit types update workflow 2026-05-11 18:13:06 +02:00
Matthias 3a4adfac52 feat: auto-update pre-commit config 2026-05-11 18:05:52 +02:00
Matthias 523216a39c fix: work around to_json pandas deprecation 2026-05-11 18:05:35 +02:00
Matthias e5d4fd6b62 chore: simplify rpc code 2026-05-11 18:05:21 +02:00
dependabot[bot] 939ea01d12 chore(deps): bump urllib3 from 2.6.3 to 2.7.0
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.6.3 to 2.7.0.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/2.6.3...2.7.0)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-version: 2.7.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-11 16:04:30 +00:00
Matthias c587a1ccda Merge pull request #13136 from freqtrade/dependabot/pip/develop/ccxt-4.5.52
chore(deps): bump ccxt from 4.5.51 to 4.5.52
2026-05-11 06:38:12 +02:00
Matthias 6751b8e468 Merge pull request #13134 from freqtrade/dependabot/pip/develop/cachetools-7.1.1
chore(deps): bump cachetools from 7.0.6 to 7.1.1
2026-05-11 06:34:59 +02:00
Matthias ef1dca92eb Merge pull request #13137 from freqtrade/dependabot/pip/develop/pytz-2026.2
chore(deps): bump pytz from 2026.1.post1 to 2026.2
2026-05-11 06:34:49 +02:00
Matthias 0e33e69d8e Merge pull request #13135 from freqtrade/dependabot/pip/develop/build-1.5.0
chore(deps-dev): bump build from 1.4.4 to 1.5.0
2026-05-11 06:34:31 +02:00
dependabot[bot] 021011df31 chore(deps): bump pytz from 2026.1.post1 to 2026.2
Bumps [pytz](https://github.com/stub42/pytz) from 2026.1.post1 to 2026.2.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2026.1.post1...release_2026.2)

---
updated-dependencies:
- dependency-name: pytz
  dependency-version: '2026.2'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-11 03:04:36 +00:00
dependabot[bot] c2e89e5f11 chore(deps): bump ccxt from 4.5.51 to 4.5.52
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.51 to 4.5.52.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.51...v4.5.52)

---
updated-dependencies:
- dependency-name: ccxt
  dependency-version: 4.5.52
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-11 03:04:29 +00:00
dependabot[bot] ba89faab6a chore(deps-dev): bump build from 1.4.4 to 1.5.0
Bumps [build](https://github.com/pypa/build) from 1.4.4 to 1.5.0.
- [Release notes](https://github.com/pypa/build/releases)
- [Changelog](https://github.com/pypa/build/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/build/compare/1.4.4...1.5.0)

---
updated-dependencies:
- dependency-name: build
  dependency-version: 1.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-11 03:04:16 +00:00
dependabot[bot] ef38cb325b chore(deps): bump cachetools from 7.0.6 to 7.1.1
Bumps [cachetools](https://github.com/tkem/cachetools) from 7.0.6 to 7.1.1.
- [Changelog](https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tkem/cachetools/compare/v7.0.6...v7.1.1)

---
updated-dependencies:
- dependency-name: cachetools
  dependency-version: 7.1.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-11 03:03:56 +00:00
Matthias e0df17ef33 chore: take some endpoints out of alpha 2026-05-10 15:07:58 +02:00
Matthias c2578dca06 chore: update json schema 2026-05-09 09:09:32 +02:00
Matthias c8605ae8fb fix: require minimum 32 characters for JWT secrets 2026-05-09 08:55:35 +02:00
Matthias 22ef7697e8 chore: remove unused variable 2026-05-09 08:34:49 +02:00
Matthias 77cabd291f Merge pull request #13128 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-05-07 07:48:26 +02:00
Freqtrade Bot 59b47a9a67 chore: update binance leverage tiers 2026-05-07 03:37:17 +00:00
Matthias e8eb5cdb4c Merge pull request #13115 from freqtrade/dependabot/pip/develop/uvicorn-0.46.0
chore(deps): bump uvicorn from 0.44.0 to 0.46.0
2026-05-04 09:31:26 +02:00
Matthias c9274a7d04 Merge pull request #13116 from freqtrade/dependabot/pip/develop/ruff-0.15.12
chore(deps-dev): bump ruff from 0.15.11 to 0.15.12
2026-05-04 07:57:25 +02:00
dependabot[bot] c6a481a2dc chore(deps): bump uvicorn from 0.44.0 to 0.46.0
Bumps [uvicorn](https://github.com/Kludex/uvicorn) from 0.44.0 to 0.46.0.
- [Release notes](https://github.com/Kludex/uvicorn/releases)
- [Changelog](https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md)
- [Commits](https://github.com/Kludex/uvicorn/compare/0.44.0...0.46.0)

---
updated-dependencies:
- dependency-name: uvicorn
  dependency-version: 0.46.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 05:49:07 +00:00
Matthias 0188d68a85 Merge pull request #13120 from freqtrade/dependabot/pip/develop/fastapi-0.136.1
chore(deps): bump fastapi from 0.136.0 to 0.136.1
2026-05-04 07:47:49 +02:00
Matthias 10c2ec39db Merge pull request #13122 from freqtrade/dependabot/pip/develop/cachetools-7.0.6
chore(deps): bump cachetools from 7.0.5 to 7.0.6
2026-05-04 07:43:53 +02:00
Matthias d0bf09b7e1 Merge pull request #13121 from freqtrade/dependabot/pip/develop/ccxt-4.5.51
chore(deps): bump ccxt from 4.5.50 to 4.5.51
2026-05-04 07:37:35 +02:00
Matthias d2cbae6f50 Merge pull request #13117 from freqtrade/dependabot/pip/develop/pyarrow-24.0.0
chore(deps): bump pyarrow from 23.0.1 to 24.0.0
2026-05-04 07:36:39 +02:00
dependabot[bot] 7e41443db8 chore(deps-dev): bump ruff from 0.15.11 to 0.15.12
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.11 to 0.15.12.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.15.11...0.15.12)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.15.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 05:33:30 +00:00
Matthias 011098209a Merge pull request #13118 from freqtrade/dependabot/pip/develop/pre-commit-4.6.0
chore(deps-dev): bump pre-commit from 4.5.1 to 4.6.0
2026-05-04 07:29:31 +02:00
dependabot[bot] 885a147b48 chore(deps): bump ccxt from 4.5.50 to 4.5.51
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.50 to 4.5.51.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.50...v4.5.51)

---
updated-dependencies:
- dependency-name: ccxt
  dependency-version: 4.5.51
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 04:50:13 +00:00
Matthias 1ad03ecb13 Merge pull request #13119 from freqtrade/dependabot/pip/develop/cryptography-47.0.0
chore(deps): bump cryptography from 46.0.7 to 47.0.0
2026-05-04 06:42:38 +02:00
Matthias c46272a7fc chore(dependabot): group bymnasium/sb3 dependencies 2026-05-04 06:41:47 +02:00
Matthias 1d8034ab66 chore: package naming in freqai-rl 2026-05-04 06:41:47 +02:00
Matthias 0b12dcfec9 chore: bump pyarrow armv7 wheel 2026-05-04 06:35:55 +02:00
dependabot[bot] cf541f8e7c chore(deps): bump fastapi from 0.136.0 to 0.136.1
Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.136.0 to 0.136.1.
- [Release notes](https://github.com/fastapi/fastapi/releases)
- [Commits](https://github.com/fastapi/fastapi/compare/0.136.0...0.136.1)

---
updated-dependencies:
- dependency-name: fastapi
  dependency-version: 0.136.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 04:35:04 +00:00
dependabot[bot] 7c46980e9d chore(deps): bump cachetools from 7.0.5 to 7.0.6
Bumps [cachetools](https://github.com/tkem/cachetools) from 7.0.5 to 7.0.6.
- [Changelog](https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tkem/cachetools/compare/v7.0.5...v7.0.6)

---
updated-dependencies:
- dependency-name: cachetools
  dependency-version: 7.0.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 04:34:50 +00:00
dependabot[bot] 7c9554349d chore(deps-dev): bump pre-commit from 4.5.1 to 4.6.0
Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 4.5.1 to 4.6.0.
- [Release notes](https://github.com/pre-commit/pre-commit/releases)
- [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pre-commit/pre-commit/compare/v4.5.1...v4.6.0)

---
updated-dependencies:
- dependency-name: pre-commit
  dependency-version: 4.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 04:33:58 +00:00
Matthias 2d3ccb841d Merge pull request #13114 from freqtrade/dependabot/pip/develop/certifi-2026.4.22
chore(deps): bump certifi from 2026.2.25 to 2026.4.22
2026-05-04 06:33:43 +02:00
Matthias 68768748dc Merge pull request #13113 from freqtrade/dependabot/pip/develop/pydantic-2.13.3
chore(deps): bump pydantic from 2.13.2 to 2.13.3
2026-05-04 06:33:17 +02:00
Matthias 0b0a4e5df1 Merge pull request #13112 from freqtrade/dependabot/pip/develop/mypy-1.20.2
chore(deps-dev): bump mypy from 1.20.1 to 1.20.2
2026-05-04 06:33:04 +02:00
Matthias 2b47d2e91d Merge pull request #13111 from freqtrade/dependabot/pip/develop/build-1.4.4
chore(deps-dev): bump build from 1.4.3 to 1.4.4
2026-05-04 06:32:27 +02:00
Matthias 60cbf93b8f Merge pull request #13110 from freqtrade/dependabot/pip/develop/packaging-26.2
chore(deps): bump packaging from 26.1 to 26.2
2026-05-04 06:32:18 +02:00
dependabot[bot] 1b67a5b533 chore(deps): bump cryptography from 46.0.7 to 47.0.0
Bumps [cryptography](https://github.com/pyca/cryptography) from 46.0.7 to 47.0.0.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/46.0.7...47.0.0)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 47.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 03:04:35 +00:00
dependabot[bot] 30832e702c chore(deps): bump pyarrow from 23.0.1 to 24.0.0
Bumps [pyarrow](https://github.com/apache/arrow) from 23.0.1 to 24.0.0.
- [Release notes](https://github.com/apache/arrow/releases)
- [Commits](https://github.com/apache/arrow/compare/apache-arrow-23.0.1...apache-arrow-24.0.0)

---
updated-dependencies:
- dependency-name: pyarrow
  dependency-version: 24.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 03:04:22 +00:00
dependabot[bot] 8c8738e5f9 chore(deps): bump certifi from 2026.2.25 to 2026.4.22
Bumps [certifi](https://github.com/certifi/python-certifi) from 2026.2.25 to 2026.4.22.
- [Commits](https://github.com/certifi/python-certifi/compare/2026.02.25...2026.04.22)

---
updated-dependencies:
- dependency-name: certifi
  dependency-version: 2026.4.22
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 03:03:49 +00:00
dependabot[bot] f72d734e8c chore(deps): bump pydantic from 2.13.2 to 2.13.3
Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.13.2 to 2.13.3.
- [Release notes](https://github.com/pydantic/pydantic/releases)
- [Changelog](https://github.com/pydantic/pydantic/blob/main/HISTORY.md)
- [Commits](https://github.com/pydantic/pydantic/compare/v2.13.2...v2.13.3)

---
updated-dependencies:
- dependency-name: pydantic
  dependency-version: 2.13.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 03:03:44 +00:00
dependabot[bot] 110ffde14e chore(deps-dev): bump mypy from 1.20.1 to 1.20.2
Bumps [mypy](https://github.com/python/mypy) from 1.20.1 to 1.20.2.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.20.1...v1.20.2)

---
updated-dependencies:
- dependency-name: mypy
  dependency-version: 1.20.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 03:03:35 +00:00
dependabot[bot] 2d0ab2d973 chore(deps-dev): bump build from 1.4.3 to 1.4.4
Bumps [build](https://github.com/pypa/build) from 1.4.3 to 1.4.4.
- [Release notes](https://github.com/pypa/build/releases)
- [Changelog](https://github.com/pypa/build/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/build/compare/1.4.3...1.4.4)

---
updated-dependencies:
- dependency-name: build
  dependency-version: 1.4.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 03:03:27 +00:00
dependabot[bot] 8e9615ba6c chore(deps): bump packaging from 26.1 to 26.2
Bumps [packaging](https://github.com/pypa/packaging) from 26.1 to 26.2.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/26.1...26.2)

---
updated-dependencies:
- dependency-name: packaging
  dependency-version: '26.2'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 03:03:19 +00:00
Matthias 55244fb098 Merge pull request #13109 from dtmkeng/improve/maxsize-marketcappairlist
fix: increase marketcap cache size to improve performance
2026-05-03 19:16:28 +02:00
dtmkeng 2087e04a62 fix: reduce marketcap cache size to optimize memory usage 2026-05-03 15:22:31 +07:00
Matthias 5ecd64d17e fix: realized_profit calculation for open trades
while the trade is open, funding fees need to be added on every exit
this keeps realized_profit in line with prior close profits.

closes #13102
2026-05-03 08:50:03 +02:00
dtmkeng 047a107ff3 fix: increase marketcap cache size to improve performance 2026-05-03 02:36:06 +07:00
Matthias 4acdb2eb0c chore: ensure __repr__ always has an order side 2026-05-02 16:25:13 +02:00
Matthias 58a18e1e9c fix: use "toint" for show-trades 2026-05-02 16:21:54 +02:00
Matthias 17b5e9bac7 chore: minor typo fix 2026-05-02 08:27:08 +02:00
Matthias 610d03570c chore: bump version to 2026.5-dev 2026-04-30 07:13:14 +02:00
Matthias 2ea4c4de2f Merge pull request #13105 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-04-30 06:31:39 +02:00
Freqtrade Bot ad8dc57e9b chore: update binance leverage tiers 2026-04-30 03:37:35 +00:00
Matthias dd970f2be1 fix: rate can be None in balance migration 2026-04-29 20:01:50 +02:00
Matthias 63819fa7e0 test: update test for unwatch_ohlcv adjustment
Co-authored-by: Copilot <copilot@github.com>
2026-04-28 20:54:04 +02:00
Matthias bfe05868eb feat: implement unwatchOHLCV
closes #13082

Co-authored-by: Copilot <copilot@github.com>
2026-04-28 20:51:47 +02:00
Matthias 14d66100be Merge pull request #13104 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2026-04-28 06:36:39 +02:00
Freqtrade Bot afc00c5a2e chore: update pre-commit hooks 2026-04-28 04:15:25 +00:00
Matthias 0b13ddfc0a Merge pull request #13096 from freqtrade/dependabot/pip/develop/pydantic-2.13.2
chore(deps): bump pydantic from 2.12.5 to 2.13.2
2026-04-27 07:30:50 +02:00
Matthias 820000fac4 chore: update dry-run order-id generation to uuid
this is supposed to avoid insert errors in windows CI
due to time imprecisions on windows ...

Co-authored-by: Copilot <copilot@github.com>
2026-04-27 07:17:01 +02:00
Matthias 5710fe4477 Merge pull request #13093 from freqtrade/dependabot/pip/develop/sb3-contrib-gte-2.8.0
chore(deps): update sb3-contrib requirement from >=2.2.1 to >=2.8.0
2026-04-27 07:12:03 +02:00
Matthias 3c84ac6d3f Merge pull request #13097 from freqtrade/dependabot/github_actions/develop/astral-sh/setup-uv-8.1.0
chore(deps): bump astral-sh/setup-uv from 8.0.0 to 8.1.0
2026-04-27 07:06:15 +02:00
Matthias 3116139336 Merge pull request #13095 from freqtrade/dependabot/pip/develop/packaging-26.1
chore(deps): bump packaging from 26.0 to 26.1
2026-04-27 07:00:26 +02:00
Matthias 24e40d3a7a Merge pull request #13092 from freqtrade/dependabot/pip/develop/scipy-e4bafee045
chore(deps-dev): bump scipy-stubs from 1.17.1.3 to 1.17.1.4 in the scipy group
2026-04-27 06:57:32 +02:00
Matthias 5b83dce052 chore: precisely pin sb3_contrib 2026-04-27 06:37:09 +02:00
dependabot[bot] bab128b359 chore(deps): bump pydantic from 2.12.5 to 2.13.2
Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.12.5 to 2.13.2.
- [Release notes](https://github.com/pydantic/pydantic/releases)
- [Changelog](https://github.com/pydantic/pydantic/blob/main/HISTORY.md)
- [Commits](https://github.com/pydantic/pydantic/compare/v2.12.5...v2.13.2)

---
updated-dependencies:
- dependency-name: pydantic
  dependency-version: 2.13.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-27 04:32:29 +00:00
Matthias 875c464a07 chore: bump scipy-stubs in pre-commit config 2026-04-27 06:32:00 +02:00
Matthias 604fddd735 Merge pull request #13094 from freqtrade/dependabot/pip/develop/fastapi-0.136.0
chore(deps): bump fastapi from 0.135.3 to 0.136.0
2026-04-27 06:31:13 +02:00
Matthias bd247f3642 Merge pull request #13098 from freqtrade/dependabot/github_actions/develop/devcontainers/ci-0.3.1900000449
chore(deps): bump devcontainers/ci from 0.3.1900000417 to 0.3.1900000449
2026-04-27 06:30:56 +02:00
Matthias ca6419228c Merge pull request #13099 from freqtrade/dependabot/pip/develop/ruff-0.15.11
chore(deps-dev): bump ruff from 0.15.10 to 0.15.11
2026-04-27 06:30:24 +02:00
Matthias 003cc4dc38 Merge pull request #13100 from freqtrade/dependabot/pip/develop/mike-2.2.0
chore(deps): bump mike from 2.1.4 to 2.2.0
2026-04-27 06:30:10 +02:00
Matthias 41deb75279 Merge pull request #13101 from freqtrade/dependabot/pip/develop/filelock-3.29.0
chore(deps): bump filelock from 3.25.2 to 3.29.0
2026-04-27 06:29:58 +02:00
dependabot[bot] 5a8131caf6 chore(deps): bump filelock from 3.25.2 to 3.29.0
Bumps [filelock](https://github.com/tox-dev/py-filelock) from 3.25.2 to 3.29.0.
- [Release notes](https://github.com/tox-dev/py-filelock/releases)
- [Changelog](https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst)
- [Commits](https://github.com/tox-dev/py-filelock/compare/3.25.2...3.29.0)

---
updated-dependencies:
- dependency-name: filelock
  dependency-version: 3.29.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-27 03:04:21 +00:00
dependabot[bot] a5cb607311 chore(deps): bump mike from 2.1.4 to 2.2.0
Bumps [mike](https://github.com/jimporter/mike) from 2.1.4 to 2.2.0.
- [Release notes](https://github.com/jimporter/mike/releases)
- [Changelog](https://github.com/jimporter/mike/blob/master/CHANGES.md)
- [Commits](https://github.com/jimporter/mike/compare/v2.1.4...v2.2.0)

---
updated-dependencies:
- dependency-name: mike
  dependency-version: 2.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-27 03:04:14 +00:00
dependabot[bot] cf5ba35bb0 chore(deps-dev): bump ruff from 0.15.10 to 0.15.11
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.10 to 0.15.11.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.15.10...0.15.11)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.15.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-27 03:04:07 +00:00
dependabot[bot] 668f7b7e9c chore(deps): bump devcontainers/ci from 0.3.1900000417 to 0.3.1900000449
Bumps [devcontainers/ci](https://github.com/devcontainers/ci) from 0.3.1900000417 to 0.3.1900000449.
- [Release notes](https://github.com/devcontainers/ci/releases)
- [Commits](https://github.com/devcontainers/ci/compare/8bf61b26e9c3a98f69cb6ce2f88d24ff59b785c6...b63b30de439b47a52267f241112c5b453b673db5)

---
updated-dependencies:
- dependency-name: devcontainers/ci
  dependency-version: 0.3.1900000449
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-27 03:04:06 +00:00
dependabot[bot] e2879f11f5 chore(deps): bump astral-sh/setup-uv from 8.0.0 to 8.1.0
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 8.0.0 to 8.1.0.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/cec208311dfd045dd5311c1add060b2062131d57...08807647e7069bb48b6ef5acd8ec9567f424441b)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 8.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-27 03:03:57 +00:00
dependabot[bot] 700d4ea2ff chore(deps): bump packaging from 26.0 to 26.1
Bumps [packaging](https://github.com/pypa/packaging) from 26.0 to 26.1.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/26.0...26.1)

---
updated-dependencies:
- dependency-name: packaging
  dependency-version: '26.1'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-27 03:03:47 +00:00
dependabot[bot] 1f94154220 chore(deps): bump fastapi from 0.135.3 to 0.136.0
Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.135.3 to 0.136.0.
- [Release notes](https://github.com/fastapi/fastapi/releases)
- [Commits](https://github.com/fastapi/fastapi/compare/0.135.3...0.136.0)

---
updated-dependencies:
- dependency-name: fastapi
  dependency-version: 0.136.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-27 03:03:37 +00:00
dependabot[bot] 14ee96172a chore(deps): update sb3-contrib requirement from >=2.2.1 to >=2.8.0
Updates the requirements on [sb3-contrib](https://github.com/Stable-Baselines-Team/stable-baselines3-contrib) to permit the latest version.
- [Release notes](https://github.com/Stable-Baselines-Team/stable-baselines3-contrib/releases)
- [Commits](https://github.com/Stable-Baselines-Team/stable-baselines3-contrib/compare/v2.2.1...v2.8.0)

---
updated-dependencies:
- dependency-name: sb3-contrib
  dependency-version: 2.8.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-27 03:03:23 +00:00
dependabot[bot] 159bde944b chore(deps-dev): bump scipy-stubs in the scipy group
Bumps the scipy group with 1 update: [scipy-stubs](https://github.com/scipy/scipy-stubs).


Updates `scipy-stubs` from 1.17.1.3 to 1.17.1.4
- [Release notes](https://github.com/scipy/scipy-stubs/releases)
- [Commits](https://github.com/scipy/scipy-stubs/compare/v1.17.1.3...v1.17.1.4)

---
updated-dependencies:
- dependency-name: scipy-stubs
  dependency-version: 1.17.1.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: scipy
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-27 03:03:14 +00:00
Matthias 0a49903695 test: update bitget test for lev_prep adjustment 2026-04-26 09:07:02 +02:00
Matthias e5f7d0cbb4 fix: bitget should set margin mode explicitly
Without this, leverage may be set on the wrong margin mode.
the leverage endpoint doesn't allow setting margin mode,
so we must control this manually.
2026-04-26 09:05:58 +02:00
Matthias f17e383157 test: add tests for get_ohlcv and ohlcvs 2026-04-25 13:09:34 +02:00
Matthias 093cc74774 refactor: make klines_last_refresh private 2026-04-25 12:49:31 +02:00
Matthias c34cd6a7dd refactor: don't use exchange_ws internal variables 2026-04-25 12:48:56 +02:00
Matthias 17678f1819 refactor: make klines_last_request private 2026-04-25 08:48:46 +02:00
Matthias 057c51b0cd test: improve tests 2026-04-25 08:47:28 +02:00
Matthias 0858b82d3e chore: add locks to exchange_ws key variables 2026-04-25 08:46:49 +02:00
Matthias 5e624d658f test: add test for startup concurrency 2026-04-25 08:37:19 +02:00
Matthias 3949efadfe chore: improve exchange_ws startup safety 2026-04-25 08:37:09 +02:00
Matthias af1de46cd4 chore: fix minor typos 2026-04-24 18:24:31 +02:00
Matthias 9d0fb9b025 test: add explicit test for continuous_stopped handling 2026-04-24 07:08:48 +02:00
Matthias 6d096c20b0 test: add test for exchange_ws reset connection details 2026-04-24 07:06:07 +02:00
Matthias 05c3360892 chore: harden ws stop cleanup 2026-04-24 06:37:05 +02:00
Matthias f9be1ac82c chore: ignore ws shutdown network errors 2026-04-24 06:33:04 +02:00
Matthias 8e9d193791 chore: improved shutdown wording 2026-04-24 06:32:55 +02:00
Matthias cdc01122d5 chore: improve ws shutdown 2026-04-24 06:32:55 +02:00
Matthias a625cbecff chore: improve shutdown for exchange_ws 2026-04-24 06:32:55 +02:00
Matthias 2e4b92ea6c Merge pull request #13083 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-04-23 06:33:59 +02:00
Freqtrade Bot f2f17f6d7b chore: update binance leverage tiers 2026-04-23 03:36:46 +00:00
Matthias 3e3436e432 test: add explicit test for db_migration 2026-04-21 07:17:32 +02:00
Matthias 9dfbe8cf63 refactor: move db-migration to persistence 2026-04-21 07:17:05 +02:00
Matthias 85af9dd3fc fix: migrate wallet_history table 2026-04-21 07:16:39 +02:00
Matthias 72f9e9a051 test: update test for wallet-history_id column 2026-04-21 07:15:20 +02:00
Matthias 2549808b52 fix: add wallet_history_id to set_sequence_id logic 2026-04-21 07:15:20 +02:00
Matthias ef1e81f514 Merge pull request #13081 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2026-04-21 06:52:10 +02:00
Matthias eabaef0da2 fix(ci): align action version comment 2026-04-21 06:39:00 +02:00
Matthias f78e9c9014 chore: bump ccxt to 4.5.50 2026-04-21 06:34:28 +02:00
Freqtrade Bot ab6f3b8222 chore: update pre-commit hooks 2026-04-21 04:02:06 +00:00
Matthias 3e42dfff13 Merge pull request #13066 from ABSllk/fix-bitget-stoploss
Add pos_loss for Bitget futures stoploss cancellation
2026-04-20 20:55:31 +02:00
Matthias af2e741465 test: add test for bitget stoploss canceling 2026-04-20 20:03:58 +02:00
Matthias 0fa3459271 Merge pull request #13069 from freqtrade/dependabot/pip/develop/types-1f2dda44ba
chore(deps-dev): bump the types group across 1 directory with 4 updates
2026-04-20 07:18:36 +02:00
Matthias ba3d29b100 Merge pull request #13072 from freqtrade/dependabot/pip/develop/ruff-0.15.10
chore(deps-dev): bump ruff from 0.15.9 to 0.15.10
2026-04-20 07:08:30 +02:00
Matthias d1132d2b13 Merge pull request #13074 from freqtrade/dependabot/github_actions/develop/peter-evans/create-pull-request-8.1.1
chore(deps): bump peter-evans/create-pull-request from 8.1.0 to 8.1.1
2026-04-20 07:07:10 +02:00
Matthias 0850f048e7 chore: align pre-commit-config type versions 2026-04-20 06:38:13 +02:00
Matthias 56f6da9026 Merge pull request #13080 from freqtrade/dependabot/pip/develop/ccxt-4.5.49
chore(deps): bump ccxt from 4.5.48 to 4.5.49
2026-04-20 06:34:05 +02:00
Matthias 470a7bf285 Merge pull request #13079 from freqtrade/dependabot/pip/develop/uvicorn-0.44.0
chore(deps): bump uvicorn from 0.43.0 to 0.44.0
2026-04-20 06:32:39 +02:00
Matthias c16a951555 Merge pull request #13078 from freqtrade/dependabot/pip/develop/rich-15.0.0
chore(deps): bump rich from 14.3.3 to 15.0.0
2026-04-20 06:32:14 +02:00
dependabot[bot] 0013b3639d chore(deps-dev): bump the types group with 4 updates
Bumps the types group with 4 updates: [types-cachetools](https://github.com/python/typeshed), [types-requests](https://github.com/python/typeshed), [types-tabulate](https://github.com/python/typeshed) and [types-python-dateutil](https://github.com/python/typeshed).


Updates `types-cachetools` from 6.2.0.20260317 to 6.2.0.20260408
- [Commits](https://github.com/python/typeshed/commits)

Updates `types-requests` from 2.33.0.20260402 to 2.33.0.20260408
- [Commits](https://github.com/python/typeshed/commits)

Updates `types-tabulate` from 0.10.0.20260308 to 0.10.0.20260408
- [Commits](https://github.com/python/typeshed/commits)

Updates `types-python-dateutil` from 2.9.0.20260402 to 2.9.0.20260408
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-cachetools
  dependency-version: 6.2.0.20260408
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
- dependency-name: types-requests
  dependency-version: 2.33.0.20260408
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
- dependency-name: types-tabulate
  dependency-version: 0.10.0.20260408
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
- dependency-name: types-python-dateutil
  dependency-version: 2.9.0.20260408
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-20 04:32:07 +00:00
Matthias fdf182df55 Merge pull request #13070 from freqtrade/dependabot/github_actions/develop/actions-4684ddd577
chore(deps): bump actions/upload-artifact from 7.0.0 to 7.0.1 in the actions group
2026-04-20 06:31:45 +02:00
dependabot[bot] f3d227270e chore(deps-dev): bump ruff from 0.15.9 to 0.15.10
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.9 to 0.15.10.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.15.9...0.15.10)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.15.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-20 04:31:41 +00:00
Matthias c1a8b5520a Merge pull request #13071 from freqtrade/dependabot/pip/develop/nbconvert-7.17.1
chore(deps-dev): bump nbconvert from 7.17.0 to 7.17.1
2026-04-20 06:31:18 +02:00
Matthias d4a6fbc7c0 Merge pull request #13077 from freqtrade/dependabot/pip/develop/build-1.4.3
chore(deps-dev): bump build from 1.4.2 to 1.4.3
2026-04-20 06:30:40 +02:00
Matthias 8c5f63127d Merge pull request #13073 from freqtrade/dependabot/pip/develop/mypy-1.20.1
chore(deps-dev): bump mypy from 1.20.0 to 1.20.1
2026-04-20 06:30:07 +02:00
Matthias d9e0a2837a Merge pull request #13076 from freqtrade/dependabot/pip/develop/plotly-6.7.0
chore(deps): bump plotly from 6.6.0 to 6.7.0
2026-04-20 06:29:24 +02:00
Matthias 24bb7649eb Merge pull request #13075 from freqtrade/dependabot/github_actions/develop/zizmorcore/zizmor-action-0.5.3
chore(deps): bump zizmorcore/zizmor-action from 0.5.2 to 0.5.3
2026-04-20 06:29:09 +02:00
dependabot[bot] 4ddec7463a chore(deps): bump ccxt from 4.5.48 to 4.5.49
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.48 to 4.5.49.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.48...v4.5.49)

---
updated-dependencies:
- dependency-name: ccxt
  dependency-version: 4.5.49
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-20 03:04:33 +00:00
dependabot[bot] 5ddd4d4583 chore(deps): bump uvicorn from 0.43.0 to 0.44.0
Bumps [uvicorn](https://github.com/Kludex/uvicorn) from 0.43.0 to 0.44.0.
- [Release notes](https://github.com/Kludex/uvicorn/releases)
- [Changelog](https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md)
- [Commits](https://github.com/Kludex/uvicorn/compare/0.43.0...0.44.0)

---
updated-dependencies:
- dependency-name: uvicorn
  dependency-version: 0.44.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-20 03:04:18 +00:00
dependabot[bot] 11e35c467f chore(deps): bump rich from 14.3.3 to 15.0.0
Bumps [rich](https://github.com/Textualize/rich) from 14.3.3 to 15.0.0.
- [Release notes](https://github.com/Textualize/rich/releases)
- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Textualize/rich/compare/v14.3.3...v15.0.0)

---
updated-dependencies:
- dependency-name: rich
  dependency-version: 15.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-20 03:04:11 +00:00
dependabot[bot] 053134297c chore(deps-dev): bump build from 1.4.2 to 1.4.3
Bumps [build](https://github.com/pypa/build) from 1.4.2 to 1.4.3.
- [Release notes](https://github.com/pypa/build/releases)
- [Changelog](https://github.com/pypa/build/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/build/compare/1.4.2...1.4.3)

---
updated-dependencies:
- dependency-name: build
  dependency-version: 1.4.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-20 03:04:06 +00:00
dependabot[bot] b97f037472 chore(deps): bump plotly from 6.6.0 to 6.7.0
Bumps [plotly](https://github.com/plotly/plotly.py) from 6.6.0 to 6.7.0.
- [Release notes](https://github.com/plotly/plotly.py/releases)
- [Changelog](https://github.com/plotly/plotly.py/blob/main/CHANGELOG.md)
- [Commits](https://github.com/plotly/plotly.py/compare/v6.6.0...v6.7.0)

---
updated-dependencies:
- dependency-name: plotly
  dependency-version: 6.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-20 03:04:01 +00:00
dependabot[bot] 097ffd87b3 chore(deps): bump zizmorcore/zizmor-action from 0.5.2 to 0.5.3
Bumps [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) from 0.5.2 to 0.5.3.
- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)
- [Commits](https://github.com/zizmorcore/zizmor-action/compare/71321a20a9ded102f6e9ce5718a2fcec2c4f70d8...b1d7e1fb5de872772f31590499237e7cce841e8e)

---
updated-dependencies:
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.5.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-20 03:04:00 +00:00
dependabot[bot] cd58bba697 chore(deps): bump peter-evans/create-pull-request from 8.1.0 to 8.1.1
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 8.1.0 to 8.1.1.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/c0f553fe549906ede9cf27b5156039d195d2ece0...5f6978faf089d4d20b00c7766989d076bb2fc7f1)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-version: 8.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-20 03:03:56 +00:00
dependabot[bot] 7d455c7e48 chore(deps-dev): bump mypy from 1.20.0 to 1.20.1
Bumps [mypy](https://github.com/python/mypy) from 1.20.0 to 1.20.1.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.20.0...v1.20.1)

---
updated-dependencies:
- dependency-name: mypy
  dependency-version: 1.20.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-20 03:03:54 +00:00
dependabot[bot] 9d019f1018 chore(deps-dev): bump nbconvert from 7.17.0 to 7.17.1
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.17.0 to 7.17.1.
- [Release notes](https://github.com/jupyter/nbconvert/releases)
- [Changelog](https://github.com/jupyter/nbconvert/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jupyter/nbconvert/compare/v7.17.0...v7.17.1)

---
updated-dependencies:
- dependency-name: nbconvert
  dependency-version: 7.17.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-20 03:03:22 +00:00
dependabot[bot] cd70e74d7b chore(deps): bump actions/upload-artifact in the actions group
Bumps the actions group with 1 update: [actions/upload-artifact](https://github.com/actions/upload-artifact).


Updates `actions/upload-artifact` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-20 03:03:20 +00:00
ABS b467eff8be fix(bitget): add legacy fallback for futures stoploss cancel 2026-04-20 00:11:23 +08:00
ABS a02c84ecda Merge branch 'freqtrade:develop' into fix-bitget-stoploss 2026-04-19 23:15:35 +08:00
Matthias 84535a1404 chore: add migration path for kvstore 2026-04-19 13:09:40 +02:00
Matthias 832fb7044c fix: kvstore key should allow 50 characters
closes #13068
2026-04-19 13:09:10 +02:00
Matthias 55361f0a9e fix: ensure proper quoting in migrations 2026-04-19 13:04:23 +02:00
Matthias c1795c79f3 Merge pull request #13048 from freqtrade/dependabot/pip/develop/pandas-3.0.2
chore(deps): bump pandas from 2.3.3 to 3.0.2
2026-04-17 06:21:04 +02:00
Matthias ee65ffc68f fix: align telegram output better 2026-04-16 20:17:05 +02:00
ABS 284446d782 Merge branch 'fix-bitget-stoploss' of https://github.com/ABSllk/freqtrade into fix-bitget-stoploss 2026-04-17 00:18:59 +08:00
ABS 6e270c5d06 fix(bitget): Use correct planType for Bitget futures stoploss cancellation 2026-04-17 00:18:45 +08:00
Matthias 143726edc1 Merge pull request #13064 from freqtrade/maint/remove_python_action
Remove python setup action
2026-04-16 06:56:13 +02:00
Matthias d27de49266 Merge pull request #13065 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-04-16 06:44:52 +02:00
Matthias 7e3e206ab3 chore(ci): move leverage tiers update by 1 hour 2026-04-16 06:35:04 +02:00
Freqtrade Bot 12ccd292b1 chore: update binance leverage tiers 2026-04-16 04:28:50 +00:00
Matthias f1828d72ac chore(ci): improved task naming 2026-04-15 19:37:02 +02:00
Matthias 0248c20999 chore(ci): remove actions/python - uv can do this on it's own 2026-04-15 19:32:33 +02:00
Matthias 63f2a8bb68 chore: remove shorter install allows 2026-04-15 06:55:21 +02:00
Matthias b1747fe9ea docs: clarify plot_config setup 2026-04-15 06:49:19 +02:00
Matthias d55c479886 Merge pull request #13053 from ABSllk/fix-bitget-stoploss
bitget - update  stopLossPrice mapping for futures
2026-04-14 21:15:05 +02:00
Matthias b71f91a156 test: attempted reduction of test flukes by resetting recwarn 2026-04-14 21:07:16 +02:00
Matthias 7105279654 fix(bitget): handle old and new stoploss order types 2026-04-14 20:41:18 +02:00
Matthias 812dc64cd7 chore: bump cryptography exclusion to 6 days 2026-04-14 07:18:09 +02:00
Matthias 019f1ab28d Merge pull request #13062 from freqtrade/dependabot/pip/pytest-9.0.3
chore(deps-dev): bump pytest from 9.0.2 to 9.0.3
2026-04-14 07:15:04 +02:00
Matthias ff7e6c3737 chore: allow pytest to be newer temporarily 2026-04-14 06:34:14 +02:00
Matthias ac3e0899a3 Merge pull request #13063 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2026-04-14 06:32:18 +02:00
Freqtrade Bot 0568c7b945 chore: update pre-commit hooks 2026-04-14 04:01:05 +00:00
dependabot[bot] 3a31337e43 chore(deps-dev): bump pytest from 9.0.2 to 9.0.3
Bumps [pytest](https://github.com/pytest-dev/pytest) from 9.0.2 to 9.0.3.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/9.0.2...9.0.3)

---
updated-dependencies:
- dependency-name: pytest
  dependency-version: 9.0.3
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-14 02:29:25 +00:00
Matthias 2c5dc72985 chore: ensure date-column is in ms range 2026-04-13 20:09:47 +02:00
Matthias 16547dbdbe fix: improve json trades storing for pandas3 2026-04-13 18:13:40 +02:00
Matthias 412e112c0f test: fix pandas3 test 2026-04-13 18:13:40 +02:00
Matthias cd5ea969c4 test: update test pandas frequency usage 2026-04-13 18:13:40 +02:00
Matthias 15bba1b0d0 chore: remove some deprecated functions from datakitchen 2026-04-13 18:13:40 +02:00
dependabot[bot] 755a426992 chore(deps): bump pandas from 2.3.3 to 3.0.2
Bumps [pandas](https://github.com/pandas-dev/pandas) from 2.3.3 to 3.0.2.
- [Release notes](https://github.com/pandas-dev/pandas/releases)
- [Commits](https://github.com/pandas-dev/pandas/compare/v2.3.3...v3.0.2)

---
updated-dependencies:
- dependency-name: pandas
  dependency-version: 3.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-13 18:13:40 +02:00
Matthias c19982dd36 chore: use string aliases for astype calls 2026-04-13 18:06:59 +02:00
Matthias 74ba9d76a2 fix: use as_unit instead of int math 2026-04-13 07:18:48 +02:00
Matthias 187d06b5ba fix: use pd.notna to check for empty strings 2026-04-13 07:10:09 +02:00
Matthias 202326875d Merge pull request #13055 from freqtrade/dependabot/pip/develop/sqlalchemy-2.0.49
chore(deps): bump sqlalchemy from 2.0.48 to 2.0.49
2026-04-13 06:54:31 +02:00
Matthias 895a9f351f chore: bump sqlalchemy in pre-commit config 2026-04-13 06:32:28 +02:00
Matthias 48b67f7bfb Merge pull request #13059 from freqtrade/dependabot/pip/develop/ccxt-4.5.48
chore(deps): bump ccxt from 4.5.47 to 4.5.48
2026-04-13 06:31:42 +02:00
Matthias fcf5785367 Merge pull request #13058 from freqtrade/dependabot/pip/develop/technical-1.6.0
chore(deps): bump technical from 1.5.4 to 1.6.0
2026-04-13 06:31:05 +02:00
Matthias 85e84d8b69 Merge pull request #13057 from freqtrade/dependabot/pip/develop/uvicorn-0.43.0
chore(deps): bump uvicorn from 0.42.0 to 0.43.0
2026-04-13 06:30:53 +02:00
Matthias b8bd4604fa Merge pull request #13056 from freqtrade/dependabot/github_actions/develop/docker-cb5fd4910d
chore(deps): bump docker/login-action from 4.0.0 to 4.1.0 in the docker group
2026-04-13 06:30:38 +02:00
Matthias f7080ac11d Merge pull request #13054 from freqtrade/dependabot/pip/develop/ruff-0.15.9
chore(deps-dev): bump ruff from 0.15.8 to 0.15.9
2026-04-13 06:30:18 +02:00
dependabot[bot] a9b1fd219b chore(deps): bump ccxt from 4.5.47 to 4.5.48
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.47 to 4.5.48.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.47...v4.5.48)

---
updated-dependencies:
- dependency-name: ccxt
  dependency-version: 4.5.48
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-13 03:04:23 +00:00
dependabot[bot] 3da3290224 chore(deps): bump technical from 1.5.4 to 1.6.0
Bumps [technical](https://github.com/freqtrade/technical) from 1.5.4 to 1.6.0.
- [Release notes](https://github.com/freqtrade/technical/releases)
- [Commits](https://github.com/freqtrade/technical/compare/1.5.4...1.6.0)

---
updated-dependencies:
- dependency-name: technical
  dependency-version: 1.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-13 03:04:11 +00:00
dependabot[bot] 2f8d82e0b0 chore(deps): bump uvicorn from 0.42.0 to 0.43.0
Bumps [uvicorn](https://github.com/Kludex/uvicorn) from 0.42.0 to 0.43.0.
- [Release notes](https://github.com/Kludex/uvicorn/releases)
- [Changelog](https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md)
- [Commits](https://github.com/Kludex/uvicorn/compare/0.42.0...0.43.0)

---
updated-dependencies:
- dependency-name: uvicorn
  dependency-version: 0.43.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-13 03:04:03 +00:00
dependabot[bot] 94e52f5241 chore(deps): bump docker/login-action in the docker group
Bumps the docker group with 1 update: [docker/login-action](https://github.com/docker/login-action).


Updates `docker/login-action` from 4.0.0 to 4.1.0
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/b45d80f862d83dbcd57f89517bcf500b2ab88fb2...4907a6ddec9925e35a0a9e82d7399ccc52663121)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: docker
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-13 03:04:02 +00:00
dependabot[bot] df9469d195 chore(deps): bump sqlalchemy from 2.0.48 to 2.0.49
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.48 to 2.0.49.
- [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases)
- [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst)
- [Commits](https://github.com/sqlalchemy/sqlalchemy/commits)

---
updated-dependencies:
- dependency-name: sqlalchemy
  dependency-version: 2.0.49
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-13 03:03:59 +00:00
dependabot[bot] c9d4276c66 chore(deps-dev): bump ruff from 0.15.8 to 0.15.9
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.8 to 0.15.9.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.15.8...0.15.9)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.15.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-13 03:03:36 +00:00
Matthias 12f37b7575 chore: more generic datetime selection 2026-04-12 19:54:44 +02:00
Matthias 51d61bc6a8 chore: don't use microsecond precision for 2026-04-12 19:52:18 +02:00
Matthias 79ea1ba1d5 fix: use is_string_dtype to check for object/string types 2026-04-12 19:50:27 +02:00
Matthias f6f0180fc1 fix: use more stable "date to ms" method 2026-04-12 13:35:36 +02:00
Matthias 33211c8eb1 chore: don't use deprecated resmapling frequency 2026-04-12 13:25:07 +02:00
Matthias c60d96922d chore: improve type safety 2026-04-12 10:38:44 +02:00
Matthias 45d4c5d036 docs: update backtesting docs 2026-04-12 10:07:05 +02:00
Matthias 09106ecbe0 chore: further reorder backtest output 2026-04-12 10:06:59 +02:00
Matthias da9f592d3d docs: update backtesting docs 2026-04-12 10:03:06 +02:00
Matthias 22707d6c04 test: update test with new metrics 2026-04-12 09:51:54 +02:00
Matthias 2d930f1fff chore: improved wallet stat drawdown safety 2026-04-12 09:33:39 +02:00
Matthias 44919adae4 feat: improve backtest-output 2026-04-12 09:27:47 +02:00
Matthias a28545a67a feat: improved backtst output 2026-04-12 09:18:46 +02:00
Matthias 76c09299a9 feat: calculate complete drawdown metrics from wallet (incl. underwater) 2026-04-12 09:18:37 +02:00
Matthias 173c75c08c feat: improve wording on metrics 2026-04-12 09:00:14 +02:00
Matthias dfa2db8575 docs: add new fields to the docs 2026-04-12 09:00:04 +02:00
ABS 81fcd5ea5a fix(bitget): use stopLossPrice mapping for futures stoploss handling 2026-04-12 02:42:35 +08:00
Matthias 5e0eb5da10 chore: improved backtest-output ordering 2026-04-11 18:15:36 +02:00
Matthias 64ceb028ac test: add test for wallet based output 2026-04-11 17:25:58 +02:00
Matthias bc0c8ffb71 feat: add wallet based metrics to backtest output 2026-04-11 17:25:45 +02:00
Matthias 624be0c469 feat: add calmar_from_balance 2026-04-11 17:10:05 +02:00
Matthias bcd9023a8d feat: add max-drawdown from wallet balance 2026-04-11 17:09:37 +02:00
Matthias fba843cb61 refactor: extract balance df checks for future reuse 2026-04-11 17:05:55 +02:00
Matthias 6210927bdb feat: add sortino_from_balance calculation 2026-04-11 16:59:55 +02:00
Matthias c2b95090f7 refactor: reusable "daily_returns_from_balance" method 2026-04-11 16:59:55 +02:00
Matthias 017df564ce refactor: extract annualizated ratio calculation 2026-04-11 16:43:28 +02:00
Matthias 97badd0d3b test: add tests for sharpe based on balance 2026-04-11 16:43:28 +02:00
Matthias f3c84d6a3c feat: calculate sharpe-ratio from historic balance snapshots 2026-04-11 16:42:08 +02:00
Matthias 68d514db91 test: split test_btanalysis and test_metrics 2026-04-11 16:41:07 +02:00
Matthias f838db6409 fix: show balance also for old backtests 2026-04-11 13:38:19 +02:00
Matthias e8501dfb7a chore: fix double-space typos 2026-04-11 13:09:13 +02:00
Matthias e5a8aae831 docs: Update hyperliquid vault / subaccount documentation 2026-04-11 09:05:52 +02:00
Matthias 174a857d72 Merge pull request #12763 from freqtrade/feat/tb-lightgbm
feat: Add tensorboard callback to lightgbm
2026-04-10 06:39:18 +02:00
Matthias b66b0c3c9b Merge pull request #13038 from freqtrade/dependabot/pip/cryptography-46.0.7
chore(deps): bump cryptography from 46.0.6 to 46.0.7
2026-04-09 19:43:20 +02:00
Matthias 85ce0a1840 chore: allow cryptography security upgrades 2026-04-09 19:26:48 +02:00
dependabot[bot] 5dd2ad532b chore(deps): bump cryptography from 46.0.6 to 46.0.7
Bumps [cryptography](https://github.com/pyca/cryptography) from 46.0.6 to 46.0.7.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/46.0.6...46.0.7)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 46.0.7
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-09 19:26:46 +02:00
Matthias 68ea331703 Merge pull request #13047 from freqtrade/dependabot/pip/develop/ccxt-4.5.47
chore(deps): bump ccxt from 4.5.46 to 4.5.47
2026-04-09 18:25:58 +02:00
dependabot[bot] d93ae4e92d chore(deps): bump ccxt from 4.5.46 to 4.5.47
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.46 to 4.5.47.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.46...v4.5.47)

---
updated-dependencies:
- dependency-name: ccxt
  dependency-version: 4.5.47
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-09 11:45:21 +00:00
Matthias 6dfc64b5b9 Merge pull request #13043 from freqtrade/dependabot/pip/develop/aiohttp-3.13.5
chore(deps): bump aiohttp from 3.13.4 to 3.13.5
2026-04-09 13:43:55 +02:00
Matthias 44880fdc0d Merge pull request #13041 from freqtrade/dependabot/pip/develop/types-2917a68c1c
chore(deps-dev): bump the types group with 2 updates
2026-04-09 13:28:17 +02:00
Matthias 0b838d2e7c Merge pull request #13044 from freqtrade/dependabot/pip/develop/mypy-1.20.0
chore(deps-dev): bump mypy from 1.19.1 to 1.20.0
2026-04-09 13:27:40 +02:00
Matthias 6c218c8647 Merge pull request #13042 from freqtrade/dependabot/github_actions/develop/pypa/gh-action-pypi-publish-1.14.0
chore(deps): bump pypa/gh-action-pypi-publish from 1.13.0 to 1.14.0
2026-04-09 09:30:56 +02:00
Matthias 1479b0becd Merge pull request #13049 from freqtrade/dependabot/pip/develop/stable-baselines3-2.8.0
chore(deps): bump stable-baselines3 from 2.7.1 to 2.8.0
2026-04-09 09:30:40 +02:00
Matthias 7792a0b86f Merge pull request #13050 from freqtrade/dependabot/pip/develop/fastapi-0.135.3
chore(deps): bump fastapi from 0.135.2 to 0.135.3
2026-04-09 09:22:41 +02:00
Matthias 7dc7511eef Merge pull request #13046 from freqtrade/dependabot/pip/develop/requests-2.33.1
chore(deps): bump requests from 2.33.0 to 2.33.1
2026-04-09 09:09:43 +02:00
Matthias c5a46dff84 Merge pull request #13045 from freqtrade/dependabot/pip/develop/orjson-3.11.8
chore(deps): bump orjson from 3.11.7 to 3.11.8
2026-04-09 08:59:19 +02:00
dependabot[bot] 48b178b353 chore(deps): bump pypa/gh-action-pypi-publish from 1.13.0 to 1.14.0
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.13.0 to 1.14.0.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e...cef221092ed1bacb1cc03d23a2d87d1d172e277b)

---
updated-dependencies:
- dependency-name: pypa/gh-action-pypi-publish
  dependency-version: 1.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-09 06:16:11 +00:00
dependabot[bot] b5ac870eac chore(deps): bump stable-baselines3 from 2.7.1 to 2.8.0
Bumps [stable-baselines3](https://github.com/DLR-RM/stable-baselines3) from 2.7.1 to 2.8.0.
- [Release notes](https://github.com/DLR-RM/stable-baselines3/releases)
- [Commits](https://github.com/DLR-RM/stable-baselines3/compare/v2.7.1...v2.8.0)

---
updated-dependencies:
- dependency-name: stable-baselines3
  dependency-version: 2.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-09 06:15:15 +00:00
dependabot[bot] 968dea5b66 chore(deps): bump aiohttp from 3.13.4 to 3.13.5
---
updated-dependencies:
- dependency-name: aiohttp
  dependency-version: 3.13.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-09 06:15:05 +00:00
dependabot[bot] c4aca0c2b9 chore(deps-dev): bump mypy from 1.19.1 to 1.20.0
Bumps [mypy](https://github.com/python/mypy) from 1.19.1 to 1.20.0.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.19.1...v1.20.0)

---
updated-dependencies:
- dependency-name: mypy
  dependency-version: 1.20.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-09 06:11:44 +00:00
dependabot[bot] 3872906a57 chore(deps): bump orjson from 3.11.7 to 3.11.8
Bumps [orjson](https://github.com/ijl/orjson) from 3.11.7 to 3.11.8.
- [Release notes](https://github.com/ijl/orjson/releases)
- [Changelog](https://github.com/ijl/orjson/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ijl/orjson/compare/3.11.7...3.11.8)

---
updated-dependencies:
- dependency-name: orjson
  dependency-version: 3.11.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-09 06:09:08 +00:00
dependabot[bot] 55e4250bcd chore(deps): bump requests from 2.33.0 to 2.33.1
Bumps [requests](https://github.com/psf/requests) from 2.33.0 to 2.33.1.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.33.0...v2.33.1)

---
updated-dependencies:
- dependency-name: requests
  dependency-version: 2.33.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-09 06:08:26 +00:00
dependabot[bot] 90d538d41a chore(deps): bump fastapi from 0.135.2 to 0.135.3
Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.135.2 to 0.135.3.
- [Release notes](https://github.com/fastapi/fastapi/releases)
- [Commits](https://github.com/fastapi/fastapi/compare/0.135.2...0.135.3)

---
updated-dependencies:
- dependency-name: fastapi
  dependency-version: 0.135.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-09 06:08:00 +00:00
Matthias 4762abd13f chore: zizmor exception 2026-04-09 06:54:15 +02:00
Matthias 724ed63c41 chore: bump types in pre-commit config 2026-04-09 06:47:26 +02:00
dependabot[bot] 1dbb0f0ee7 chore(deps-dev): bump the types group with 2 updates
Bumps the types group with 2 updates: [types-requests](https://github.com/python/typeshed) and [types-python-dateutil](https://github.com/python/typeshed).


Updates `types-requests` from 2.33.0.20260327 to 2.33.0.20260402
- [Commits](https://github.com/python/typeshed/commits)

Updates `types-python-dateutil` from 2.9.0.20260323 to 2.9.0.20260402
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-requests
  dependency-version: 2.33.0.20260402
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
- dependency-name: types-python-dateutil
  dependency-version: 2.9.0.20260402
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-09 04:45:48 +00:00
Matthias e5baa27d51 fix: dependabot currently doesn't support cooldown for docker
ref: https://github.com/dependabot/dependabot-core/issues/14044
2026-04-09 06:44:23 +02:00
Matthias 7c43833a2d chore: explicitly disable demo mode for binance 2026-04-09 06:39:51 +02:00
Matthias ff7cddf4ca docs: add documentation for demo bybit mode 2026-04-09 06:38:24 +02:00
Matthias 36b427cd3b feat: be clear on the use of demo exchanges 2026-04-09 06:38:24 +02:00
Matthias 8b204c75cb test: test validate_demo / dry-run combo 2026-04-09 06:38:24 +02:00
Matthias f56ea7a6ca feat: validate demo-trading and dry-run incompatibility 2026-04-09 06:38:24 +02:00
Matthias 39569df42a feat: expose demo mode via show_config 2026-04-09 06:38:24 +02:00
Matthias 08f0f28e90 feat: enable demo trading mode for ccxt 2026-04-09 06:38:24 +02:00
Matthias d8e0d41001 feat: clearly highlight if bot is starting in demo mode 2026-04-09 06:38:24 +02:00
Matthias 1ac68d6161 feat: show message when enabling demo trading mode 2026-04-09 06:38:24 +02:00
Matthias e7f9059ff4 test: add test for demo trading validation 2026-04-09 06:38:24 +02:00
Matthias 98fd645df6 feat: enable config validation for demo_trading 2026-04-09 06:38:24 +02:00
Matthias 86b8eae344 feat: add supports_demo_trading ft_has key 2026-04-09 06:38:24 +02:00
Matthias 8e62158145 Merge pull request #13039 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-04-09 06:32:47 +02:00
Matthias 6a5fb9af42 chore: remove aiohttp shorter exclude-newer exception 2026-04-09 06:32:09 +02:00
Freqtrade Bot 02125f1883 chore: update binance leverage tiers 2026-04-09 04:18:20 +00:00
Matthias ed6899aad6 Merge pull request #13019 from freqtrade/feat/capture_wallets
Capture wallet balance
2026-04-07 07:16:34 +02:00
Matthias 4cced59530 Merge pull request #13032 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2026-04-07 07:01:18 +02:00
Matthias 70b24fd0c1 test: reset pairlocks pior to running test 2026-04-07 06:44:25 +02:00
Freqtrade Bot d026b67dee chore: update pre-commit hooks 2026-04-07 03:56:56 +00:00
Matthias c906e146fc test: add reset_locks to the end of the new test 2026-04-06 10:24:41 +02:00
Matthias 8890cdbcdb chore: shorter wording in docstring 2026-04-06 10:05:26 +02:00
Matthias 6712d20578 test: Add test for new pairlock deduplication 2026-04-06 09:58:58 +02:00
Matthias 9582bd3cd7 feat: don't allow re-creation of existing logs
This prevents lock spam - where 100ds of identical rows can be inserted
into the database
2026-04-06 09:58:35 +02:00
Matthias 04990a888b fix: improve bot cleanup methods for safer shutdown 2026-04-06 09:26:28 +02:00
Matthias e6aa098c4e Merge pull request #13022 from freqtrade/dependabot/pip/develop/types-5079a209b0
chore(deps-dev): bump the types group across 1 directory with 2 updates
2026-04-06 09:15:39 +02:00
Matthias c27f719fb5 Merge pull request #13021 from AchmadFathoni/develop
Enforce SKDecimal 'name' parameter as string
2026-04-06 09:06:51 +02:00
Matthias e45d781630 chore: bump types in pre-commit config 2026-04-06 08:58:56 +02:00
dependabot[bot] 63ac3bef01 chore(deps-dev): bump the types group with 2 updates
Bumps the types group with 2 updates: [types-requests](https://github.com/python/typeshed) and [types-python-dateutil](https://github.com/python/typeshed).


Updates `types-requests` from 2.32.4.20260107 to 2.33.0.20260327
- [Commits](https://github.com/python/typeshed/commits)

Updates `types-python-dateutil` from 2.9.0.20260305 to 2.9.0.20260323
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-requests
  dependency-version: 2.33.0.20260327
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: types
- dependency-name: types-python-dateutil
  dependency-version: 2.9.0.20260323
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-06 06:38:04 +00:00
Matthias 753bf99b95 Merge pull request #13031 from freqtrade/dependabot/pip/develop/torch-2.11.0
chore(deps): bump torch from 2.10.0 to 2.11.0
2026-04-06 08:36:48 +02:00
Matthias f13a02e2ec Merge pull request #13023 from freqtrade/dependabot/pip/develop/numpy-2.4.4
chore(deps): bump numpy from 2.4.3 to 2.4.4
2026-04-06 08:35:20 +02:00
Matthias b7b1bdda27 Merge pull request #13030 from freqtrade/dependabot/pip/develop/ccxt-4.5.46
chore(deps): bump ccxt from 4.5.45 to 4.5.46
2026-04-06 08:35:01 +02:00
Matthias 262c002a74 Merge pull request #13025 from freqtrade/dependabot/pip/develop/cmaes-0.13.0
chore(deps): bump cmaes from 0.12.0 to 0.13.0
2026-04-06 08:32:51 +02:00
Matthias a68d943eeb Merge pull request #13029 from freqtrade/dependabot/github_actions/develop/codecov/codecov-action-6.0.0
chore(deps): bump codecov/codecov-action from 5.5.2 to 6.0.0
2026-04-06 08:32:30 +02:00
Matthias a4c6cbcfd4 Merge pull request #13027 from freqtrade/dependabot/github_actions/develop/astral-sh/setup-uv-8.0.0
chore(deps): bump astral-sh/setup-uv from 7.3.1 to 8.0.0
2026-04-06 08:32:05 +02:00
Matthias f151639677 Merge pull request #13026 from freqtrade/dependabot/pip/develop/ruff-0.15.8
chore(deps-dev): bump ruff from 0.15.7 to 0.15.8
2026-04-06 08:30:43 +02:00
Matthias 0f4d1df59f Merge pull request #13024 from freqtrade/dependabot/pip/develop/fastapi-0.135.2
chore(deps): bump fastapi from 0.135.1 to 0.135.2
2026-04-06 08:30:30 +02:00
Matthias 043281ba1b Merge pull request #13028 from freqtrade/dependabot/pip/develop/pymdown-extensions-10.21.2
chore(deps): bump pymdown-extensions from 10.21 to 10.21.2
2026-04-06 08:30:03 +02:00
dependabot[bot] a33def834a chore(deps): bump torch from 2.10.0 to 2.11.0
Bumps [torch](https://github.com/pytorch/pytorch) from 2.10.0 to 2.11.0.
- [Release notes](https://github.com/pytorch/pytorch/releases)
- [Changelog](https://github.com/pytorch/pytorch/blob/main/RELEASE.md)
- [Commits](https://github.com/pytorch/pytorch/compare/v2.10.0...v2.11.0)

---
updated-dependencies:
- dependency-name: torch
  dependency-version: 2.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-06 03:04:48 +00:00
dependabot[bot] d25124021c chore(deps): bump ccxt from 4.5.45 to 4.5.46
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.45 to 4.5.46.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.45...v4.5.46)

---
updated-dependencies:
- dependency-name: ccxt
  dependency-version: 4.5.46
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-06 03:04:40 +00:00
dependabot[bot] 82ab8c4674 chore(deps): bump codecov/codecov-action from 5.5.2 to 6.0.0
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.5.2 to 6.0.0.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/671740ac38dd9b0130fbe1cec585b89eea48d3de...57e3a136b779b570ffcdbf80b3bdc90e7fab3de2)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-06 03:04:24 +00:00
dependabot[bot] 696af8ec07 chore(deps): bump pymdown-extensions from 10.21 to 10.21.2
Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 10.21 to 10.21.2.
- [Release notes](https://github.com/facelessuser/pymdown-extensions/releases)
- [Commits](https://github.com/facelessuser/pymdown-extensions/compare/10.21...10.21.2)

---
updated-dependencies:
- dependency-name: pymdown-extensions
  dependency-version: 10.21.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-06 03:04:15 +00:00
dependabot[bot] 7af050ecc4 chore(deps): bump astral-sh/setup-uv from 7.3.1 to 8.0.0
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.3.1 to 8.0.0.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/5a095e7a2014a4212f075830d4f7277575a9d098...cec208311dfd045dd5311c1add060b2062131d57)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 8.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-06 03:04:08 +00:00
dependabot[bot] 13c872d079 chore(deps-dev): bump ruff from 0.15.7 to 0.15.8
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.7 to 0.15.8.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.15.7...0.15.8)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.15.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-06 03:04:08 +00:00
dependabot[bot] bc574509bf chore(deps): bump cmaes from 0.12.0 to 0.13.0
Bumps [cmaes](https://github.com/CyberAgentAILab/cmaes) from 0.12.0 to 0.13.0.
- [Release notes](https://github.com/CyberAgentAILab/cmaes/releases)
- [Commits](https://github.com/CyberAgentAILab/cmaes/compare/v0.12.0...v0.13.0)

---
updated-dependencies:
- dependency-name: cmaes
  dependency-version: 0.13.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-06 03:03:56 +00:00
dependabot[bot] 90d4447911 chore(deps): bump fastapi from 0.135.1 to 0.135.2
Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.135.1 to 0.135.2.
- [Release notes](https://github.com/fastapi/fastapi/releases)
- [Commits](https://github.com/fastapi/fastapi/compare/0.135.1...0.135.2)

---
updated-dependencies:
- dependency-name: fastapi
  dependency-version: 0.135.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-06 03:03:51 +00:00
dependabot[bot] 69ffc2c7a2 chore(deps): bump numpy from 2.4.3 to 2.4.4
Bumps [numpy](https://github.com/numpy/numpy) from 2.4.3 to 2.4.4.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v2.4.3...v2.4.4)

---
updated-dependencies:
- dependency-name: numpy
  dependency-version: 2.4.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-06 03:03:44 +00:00
Matthias 3d68d6aefc test: Add exchange mock for get_pair_base_currency 2026-04-05 17:06:53 +02:00
Achmad Fathoni de064505c5 Enforce SKDecimal 'name' parameter as string 2026-04-05 21:55:42 +07:00
Matthias 4ba01b5c12 fix: don't assume "/" for pair base currency 2026-04-05 10:10:06 +02:00
Matthias aaadb01a6a docs: improve doc wording 2026-04-05 10:08:56 +02:00
Matthias 8768fe90b3 refactor: slightly improve generate_wallet_stats 2026-04-05 10:08:50 +02:00
Matthias 51478baa47 docs: Add Dashboard section to freqUI docs 2026-04-04 19:46:46 +02:00
Matthias b6b9ae5eb0 test: assert repr for walletHistory 2026-04-04 14:09:36 +02:00
Matthias af815a3c76 chore: unify treatment of pos.leverage fallbacks 2026-04-04 13:51:13 +02:00
Matthias 754f24c8a6 feat: allow skipping of the wallet migration
fallback method in case of problems
2026-04-04 13:48:54 +02:00
Matthias b45e086b50 test: add tests for get_backtest_wallet_change (and market change) 2026-04-04 13:41:20 +02:00
Matthias 7af322a197 fix: impove behavior when loading old backtest results 2026-04-04 13:17:48 +02:00
Matthias 75bfa87f74 chore: minor code cleanup 2026-04-04 13:12:43 +02:00
Matthias a40de0a59b chore: rename variable for better debuggability 2026-04-04 13:12:43 +02:00
Matthias 66eb7f0199 test: add test for historic_balance endpoint 2026-04-04 13:12:43 +02:00
Matthias d001d91640 chore: rename temporary column for clarity 2026-04-04 12:50:10 +02:00
Matthias dec3c3e13b test: fix a couple tsts ... 2026-04-04 12:12:11 +02:00
Matthias f99ccc5e3d docs: improved backtesting doc wording 2026-04-04 11:52:46 +02:00
Matthias 78ccb68929 fix: adjust backtest-logic to new capture method 2026-04-04 11:50:47 +02:00
Matthias e28da4b087 test: Fix and improve balance distribution test 2026-04-04 09:12:44 +02:00
Matthias 425ebeeedb fix: include fees on both trade sides 2026-04-04 09:12:44 +02:00
Matthias c3b2a73eef feat: warn for pairs without history 2026-04-04 09:12:44 +02:00
Matthias 35806c26bf fix: Improved migration for short trades 2026-04-04 09:12:44 +02:00
Matthias a9bbc45ba5 fix(migration): stake should be non-leveraged. 2026-04-04 09:12:44 +02:00
Matthias 5e6d3e265b tests: rename mock helper function 2026-04-04 09:12:44 +02:00
Matthias f9db85fcaf chore: slightly reorder parallelism code 2026-04-04 09:12:44 +02:00
Matthias 138b70a2bf test: add explicit test for prepare_balance_distribution 2026-04-04 09:12:44 +02:00
Matthias 518092a0ad fix: handle error-cases gracefully 2026-04-04 09:12:44 +02:00
Matthias 5d3776309c refactor: improve migration code structure 2026-04-04 09:12:44 +02:00
Matthias ab2e0e6d6f chore: improved logging for clarity on startup wait 2026-04-04 09:12:44 +02:00
Matthias fa48910e96 feat: improved dataframe handling 2026-04-04 09:12:44 +02:00
Matthias 5d2a7d2187 feat: wallet-migration for futures trades 2026-04-04 09:12:44 +02:00
Matthias e4eee1aa1b feat: add short fields to balance_distribution 2026-04-04 09:12:44 +02:00
Matthias 803b4cae78 chore: improved docstring 2026-04-04 09:12:44 +02:00
Matthias 09ddef3716 chore: improved variable naming 2026-04-04 09:12:44 +02:00
Matthias 5a847665ff fix: add total_quote to migration 2026-04-04 09:12:44 +02:00
Matthias 50fd6d152e fix: use correct formula for shorts 2026-04-04 09:12:44 +02:00
Matthias b4961a2cb7 fix: add quote_currency to wallet migration 2026-04-04 09:12:44 +02:00
Matthias 4cac724709 test: update wallet capture test 2026-04-04 09:12:44 +02:00
Matthias 05bbc84bf2 fix: use correct formula for wallet capture 2026-04-04 09:12:44 +02:00
Matthias 21ac7d1969 refactor: use shorter variable name 2026-04-04 09:12:44 +02:00
Matthias f125349587 feat: add additional columns to better cover futures 2026-04-04 09:12:44 +02:00
Matthias f7ddf46b32 refactor: rename WalletHistory fieldname from price to rate 2026-04-04 09:12:44 +02:00
Matthias 623991c772 chore: rename variable to price 2026-04-04 09:12:44 +02:00
Matthias 1237bb798c test: fix backtest api wallets test 2026-04-04 09:12:44 +02:00
Matthias a09036cd6e chore: fix Model naming collision 2026-04-04 09:12:44 +02:00
Matthias 9891b8332b chore: set wallet_migration_date in the correct space 2026-04-04 09:12:44 +02:00
Matthias 7b223f3d38 feat: improve balance_history response 2026-04-04 09:12:44 +02:00
Matthias 61a5ab8e1c feat: add bot_managed to wallet-history migration 2026-04-04 09:12:44 +02:00
Matthias 98493dc9ed feat: add "bot_managed" to wallet_history 2026-04-04 09:12:44 +02:00
Matthias 0835318b8f fix: capture correct balance for futures 2026-04-04 09:12:44 +02:00
Matthias b69a042f5b feat: update wallet migration to keep leverage 2026-04-04 09:12:44 +02:00
Matthias 00d39bbb80 feat: add leverage column to wallet history 2026-04-04 09:12:44 +02:00
Matthias a88dc8839d chore: simplify imports 2026-04-04 09:12:44 +02:00
Matthias cb8d68f395 test: add test for record_wallet_state 2026-04-04 09:12:44 +02:00
Matthias 7dfcf846d0 test: add asserts for backtest wallet capturing 2026-04-04 09:12:44 +02:00
Matthias 3a9160aace chore: simplify date import 2026-04-04 09:12:44 +02:00
Matthias 4904c7b9fd refactor: split trade_parallelism trades into their own testfile 2026-04-04 09:12:44 +02:00
Matthias 27c7a37531 test: add test for balance_distribution_over_time 2026-04-04 09:12:44 +02:00
Matthias 9f9e13cec2 chore: add better docstring 2026-04-04 09:12:44 +02:00
Matthias 175e77794c chore: improve wallet migration code 2026-04-04 09:12:44 +02:00
Matthias 1d7b1cd4ea test: improve test to make it more realistic 2026-04-04 09:12:44 +02:00
Matthias 323f42fc53 fix: Don't round date up to next date
it'll cause a record in the future eventually.
2026-04-04 09:12:44 +02:00
Matthias 03fd0575ce test: simplify imports 2026-04-04 09:12:44 +02:00
Matthias c12c2177cd test: add tests for wallets_migration 2026-04-04 09:12:44 +02:00
Matthias c884fd20ea chore: add repr output for wallet_history 2026-04-04 09:12:44 +02:00
Matthias 0f9cab4231 chore: fix edge-case bug for empty pairlist 2026-04-04 09:12:44 +02:00
Matthias 97e7939a30 chore: improve wallet capturing performance 2026-04-04 09:12:44 +02:00
Matthias 6e3c850807 chore: minor nitpick changes 2026-04-04 09:12:44 +02:00
Matthias 7b49dc8c11 chore: improve optimize reports stability 2026-04-04 09:12:44 +02:00
Matthias cbd1a4c060 chore: minor improvements 2026-04-04 09:12:44 +02:00
Matthias 921cb4dad8 feat: Only ffill until the end of the trade 2026-04-04 09:12:44 +02:00
Matthias bf5ec98918 chore: use "filled" over amount for balance distribution 2026-04-04 09:12:44 +02:00
Matthias c877d267c7 feat: expose minfied when converting trade list to dataframe 2026-04-04 09:12:44 +02:00
Matthias c66adf2bf1 docs: update backtesting docs with new output 2026-04-04 09:12:44 +02:00
Matthias 1ede186484 feat: display min/max balance 2026-04-04 09:12:44 +02:00
Matthias 680aeb89c3 feat: store wallet stats 2026-04-04 09:12:44 +02:00
Matthias ba1092b726 chore: use builtin helpers 2026-04-04 09:12:44 +02:00
Matthias 9ddabbd849 feat: use proper starting balance 2026-04-04 09:12:44 +02:00
Matthias b5f31bf82d chore: use proper starting balance 2026-04-04 09:12:44 +02:00
Matthias db2309dfd2 fix: avoid errors for delisted pairs 2026-04-04 09:12:44 +02:00
Matthias 418acb7034 chore: exclude open orders from balance calculation 2026-04-04 09:12:44 +02:00
Matthias 8a284060d1 fix: wrong usage of getdatetimevalue 2026-04-04 09:12:44 +02:00
Matthias 235c46ae12 chore: add wallet migration timing log 2026-04-04 09:12:44 +02:00
Matthias 1f32dbef9a feat: enable wallet-capture in webserver mode 2026-04-04 09:12:44 +02:00
Matthias d105770ff6 chore: Improve response model naming 2026-04-04 09:12:44 +02:00
Matthias 15be0510fc feat: return "capture_start_ts" as part of API response 2026-04-04 09:12:44 +02:00
Matthias 6c24925522 fix: make sure wallet_summary exists 2026-04-04 09:12:44 +02:00
Matthias a8295de2b9 chore: fix endpoint naming 2026-04-04 09:12:44 +02:00
Matthias d6a0a4ec6c chore: rename WalletHistory model to better match it's intend 2026-04-04 09:12:44 +02:00
Matthias c7878130f1 feat: capture wallet_history_date 2026-04-04 09:12:44 +02:00
Matthias 51cf051fce test: add test for backtest/wallets endpoint 2026-04-04 09:12:44 +02:00
Matthias 1f15d28eeb feat: prevent duplicate wallet migrations 2026-04-04 09:12:44 +02:00
Matthias 281b627db3 feat: add historic_balance api endpoint 2026-04-04 09:12:44 +02:00
Matthias 2d2cee2c58 refactor: rename walletsSummary schema 2026-04-04 09:12:44 +02:00
Matthias 63869be376 feat: initial attempt at migrating walletHistory 2026-04-04 09:12:44 +02:00
Matthias 37fae7ea71 feat: use proper properties for record_wallet_state 2026-04-04 09:12:44 +02:00
Matthias e52276e3da chore: fix import error 2026-04-04 09:12:44 +02:00
Matthias cba49307b6 chore: improve imports 2026-04-04 09:12:44 +02:00
Matthias b614ec4ef9 chore: schedule wallet_state capturing every night. 2026-04-04 09:12:44 +02:00
Matthias ed560f995d feat: add WalletBalance model 2026-04-04 09:11:48 +02:00
Matthias 21269b8a8d feat: add backtest/.../wallets endpoint 2026-04-04 09:11:48 +02:00
Matthias ee745551a2 feat: store wallet_summary 2026-04-04 09:11:48 +02:00
Matthias 10cc857c51 feat: add wallet to dataframe conversion 2026-04-04 09:11:48 +02:00
Matthias 11cb3ef416 feat: reset wallet_captures list in Backtesting 2026-04-04 09:11:48 +02:00
Matthias a3e7ee9895 feat: capture wallet state per candle in backtesting 2026-04-04 09:11:48 +02:00
Matthias 3a76235c48 fix: improved check for emc due to type 2026-04-04 09:09:16 +02:00
Matthias 4ddb7fd43f chore: clarify delist-filter exception 2026-04-04 09:02:52 +02:00
Matthias e3c316f311 fix: Graceful shutdown in case of failed initialization 2026-04-04 08:51:04 +02:00
Matthias 1ebd75b32a fix: improve freqtradebot cleanup resilience 2026-04-04 08:47:50 +02:00
Matthias 65f494be26 fix: don't raise freqAI in pre-mature shutdown scenarios 2026-04-04 08:41:13 +02:00
Matthias 8a98b6172c refactor: use fstrings for regular log output 2026-04-04 08:40:54 +02:00
Matthias 3e4f0df957 Merge pull request #13014 from freqtrade/dependabot/pip/aiohttp-3.13.4
chore(deps): bump aiohttp from 3.13.3 to 3.13.4
2026-04-03 12:23:18 +02:00
dependabot[bot] 4f600eb078 chore(deps): bump aiohttp from 3.13.3 to 3.13.4
---
updated-dependencies:
- dependency-name: aiohttp
  dependency-version: 3.13.4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-03 09:57:50 +00:00
Matthias b5d400c50d chore: increase aiohttp exclude to 5 days 2026-04-03 11:56:04 +02:00
Matthias f96f9b7601 chore: move futures only flags to ft_has_futures 2026-04-02 07:26:07 +02:00
Matthias f1fc3e1451 chore: remove temporary exclude-newer-package sections 2026-04-02 07:05:33 +02:00
Matthias a7c99b3ba7 Merge pull request #13015 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-04-02 06:34:24 +02:00
Freqtrade Bot 57b42b8cf0 chore: update binance leverage tiers 2026-04-02 04:15:15 +00:00
Matthias cdffee23e1 docs: Add stoploss order type explainer
closes #12984
2026-04-01 22:20:34 +02:00
Matthias 384e0c5e5a feat: update dockerfile base to python 3.14.3 2026-04-01 20:44:30 +02:00
Matthias d1b378ead6 chore: bump armhf image to 3.11.15 2026-04-01 20:29:23 +02:00
Matthias 42a153953a Merge pull request #13012 from freqtrade/feat/setup_14
Add support for 3.14 in setup-scripts
2026-04-01 19:58:12 +02:00
Matthias 8eb2edc0e2 feat: support 3.14 in setup scripts 2026-04-01 07:24:33 +02:00
Matthias b0c14d1122 docs: update non-working links to supported-futures 2026-03-31 07:21:48 +02:00
Matthias 7e7e475d4a chore: update deploy-docs to use uv 2026-03-31 07:19:37 +02:00
Matthias c21b8587a6 fix: incorrect balance estimation while entry order is not filled
closes #12993
2026-03-31 06:52:52 +02:00
Matthias ea51c646cd chore: add uv exclude-newer safeguard 2026-03-31 06:40:03 +02:00
Matthias 36d2ed061f Merge pull request #13008 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2026-03-31 06:35:03 +02:00
Freqtrade Bot 61e27462b1 chore: update pre-commit hooks 2026-03-31 03:57:08 +00:00
Matthias c47f5f9494 Merge pull request #12997 from freqtrade/dependabot/pip/develop/scipy-7ad29c80bf
chore(deps-dev): bump scipy-stubs from 1.17.1.2 to 1.17.1.3 in the scipy group across 1 directory
2026-03-30 09:20:33 +02:00
Matthias 60ede009d9 Merge pull request #13000 from freqtrade/dependabot/pip/develop/ruff-0.15.7
chore(deps-dev): bump ruff from 0.15.6 to 0.15.7
2026-03-30 09:20:05 +02:00
Matthias 89b6cabf77 Merge pull request #12998 from freqtrade/dependabot/pip/develop/ccxt-4.5.45
chore(deps): bump ccxt from 4.5.44 to 4.5.45
2026-03-30 07:29:51 +02:00
Matthias 4b9ab0a54f chore: bump scipy-stubs in pre-commit config 2026-03-30 07:18:37 +02:00
dependabot[bot] 5782e39fc5 chore(deps-dev): bump scipy-stubs in the scipy group
Bumps the scipy group with 1 update: [scipy-stubs](https://github.com/scipy/scipy-stubs).


Updates `scipy-stubs` from 1.17.1.2 to 1.17.1.3
- [Release notes](https://github.com/scipy/scipy-stubs/releases)
- [Commits](https://github.com/scipy/scipy-stubs/compare/v1.17.1.2...v1.17.1.3)

---
updated-dependencies:
- dependency-name: scipy-stubs
  dependency-version: 1.17.1.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: scipy
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-30 05:17:09 +00:00
Matthias f91e71e092 Merge pull request #12994 from freqtrade/dependabot/pip/develop/types-7fbf452716
chore(deps-dev): bump types-cachetools from 6.2.0.20251022 to 6.2.0.20260317 in the types group
2026-03-30 07:15:53 +02:00
dependabot[bot] 6a8d1fff8f chore(deps-dev): bump ruff from 0.15.6 to 0.15.7
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.6 to 0.15.7.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.15.6...0.15.7)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.15.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-30 05:15:20 +00:00
Matthias e703d6fea9 chore: temporarily revert exclude-newer 2026-03-30 07:13:10 +02:00
Matthias a9f6fcc7bb chore: uv.tool add exclude-newer 2026-03-30 07:06:07 +02:00
Matthias 230281f8f2 chore: bump develop version to 2026.4-dev 2026-03-30 07:02:22 +02:00
Matthias 326ef6d49b test: update krakenfutures "filled" test 2026-03-30 06:51:31 +02:00
dependabot[bot] 5c129506ae chore(deps): bump ccxt from 4.5.44 to 4.5.45
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.44 to 4.5.45.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.44...v4.5.45)

---
updated-dependencies:
- dependency-name: ccxt
  dependency-version: 4.5.45
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-30 04:48:19 +00:00
Matthias 9a94d97e69 chore: bump types-cachetools in pre-commit config 2026-03-30 06:47:13 +02:00
Matthias e0942e1328 Merge pull request #13001 from freqtrade/dependabot/pip/develop/uvicorn-0.42.0
chore(deps): bump uvicorn from 0.41.0 to 0.42.0
2026-03-30 06:45:58 +02:00
Matthias 88c3fd2bd5 Merge pull request #12999 from freqtrade/dependabot/pip/develop/optuna-4.8.0
chore(deps): bump optuna from 4.7.0 to 4.8.0
2026-03-30 06:45:36 +02:00
Matthias 6e11ce9bd5 Merge pull request #12995 from freqtrade/dependabot/pip/develop/pytest-8100fefb0e
chore(deps-dev): bump pytest-cov from 7.0.0 to 7.1.0 in the pytest group
2026-03-30 06:44:44 +02:00
Matthias 5dccabe2d8 Merge pull request #12996 from freqtrade/dependabot/pip/develop/mkdocs-cf6347e75e
chore(deps): bump mkdocs-material from 9.7.5 to 9.7.6 in the mkdocs group
2026-03-30 06:44:00 +02:00
Matthias b79a280e55 Merge pull request #13002 from freqtrade/dependabot/pip/develop/python-telegram-bot-22.7
chore(deps): bump python-telegram-bot from 22.6 to 22.7
2026-03-30 06:43:40 +02:00
dependabot[bot] 1615c0bd92 chore(deps): bump python-telegram-bot from 22.6 to 22.7
Bumps [python-telegram-bot](https://github.com/python-telegram-bot/python-telegram-bot) from 22.6 to 22.7.
- [Release notes](https://github.com/python-telegram-bot/python-telegram-bot/releases)
- [Commits](https://github.com/python-telegram-bot/python-telegram-bot/compare/v22.6...v22.7)

---
updated-dependencies:
- dependency-name: python-telegram-bot
  dependency-version: '22.7'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-30 03:04:24 +00:00
dependabot[bot] 9df068c426 chore(deps): bump uvicorn from 0.41.0 to 0.42.0
Bumps [uvicorn](https://github.com/Kludex/uvicorn) from 0.41.0 to 0.42.0.
- [Release notes](https://github.com/Kludex/uvicorn/releases)
- [Changelog](https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md)
- [Commits](https://github.com/Kludex/uvicorn/compare/0.41.0...0.42.0)

---
updated-dependencies:
- dependency-name: uvicorn
  dependency-version: 0.42.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-30 03:04:11 +00:00
dependabot[bot] e8fde061b5 chore(deps): bump optuna from 4.7.0 to 4.8.0
Bumps [optuna](https://github.com/optuna/optuna) from 4.7.0 to 4.8.0.
- [Release notes](https://github.com/optuna/optuna/releases)
- [Commits](https://github.com/optuna/optuna/compare/v4.7.0...v4.8.0)

---
updated-dependencies:
- dependency-name: optuna
  dependency-version: 4.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-30 03:03:39 +00:00
dependabot[bot] 8d024f5e08 chore(deps): bump mkdocs-material in the mkdocs group
Bumps the mkdocs group with 1 update: [mkdocs-material](https://github.com/squidfunk/mkdocs-material).


Updates `mkdocs-material` from 9.7.5 to 9.7.6
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.7.5...9.7.6)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-version: 9.7.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: mkdocs
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-30 03:03:15 +00:00
dependabot[bot] 6541450c7c chore(deps-dev): bump pytest-cov from 7.0.0 to 7.1.0 in the pytest group
Bumps the pytest group with 1 update: [pytest-cov](https://github.com/pytest-dev/pytest-cov).


Updates `pytest-cov` from 7.0.0 to 7.1.0
- [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-cov/compare/v7.0.0...v7.1.0)

---
updated-dependencies:
- dependency-name: pytest-cov
  dependency-version: 7.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: pytest
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-30 03:03:04 +00:00
dependabot[bot] c29956866d chore(deps-dev): bump types-cachetools in the types group
Bumps the types group with 1 update: [types-cachetools](https://github.com/python/typeshed).


Updates `types-cachetools` from 6.2.0.20251022 to 6.2.0.20260317
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-cachetools
  dependency-version: 6.2.0.20260317
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-30 03:02:43 +00:00
Matthias 0ed613a574 fix: further improvements to exit codes 2026-03-29 13:52:51 +02:00
Matthias c7dfd54eb3 test: stabilize time-dependant test after summer time switch 2026-03-29 13:33:56 +02:00
Matthias 697814ed6a fix: improved sysexit handling
closes #12988
2026-03-29 13:30:26 +02:00
Matthias d5417d40ae Merge pull request #12986 from freqtrade/dependabot/pip/cryptography-46.0.6
chore(deps): bump cryptography from 46.0.5 to 46.0.6
2026-03-29 12:55:25 +02:00
dependabot[bot] e386334130 chore(deps): bump cryptography from 46.0.5 to 46.0.6
Bumps [cryptography](https://github.com/pyca/cryptography) from 46.0.5 to 46.0.6.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/46.0.5...46.0.6)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 46.0.6
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-28 12:50:32 +00:00
Matthias 57e489b9aa Merge pull request #12985 from freqtrade/maint/pin_build
Pin individual installs in CI
2026-03-28 13:49:39 +01:00
Matthias e0d55bf5d3 chore(ci): install pinned ccxt and orjson versions 2026-03-28 13:04:42 +01:00
Matthias f169f99a5f chore(ci): pre-commit-update pin pre-commit 2026-03-28 13:03:24 +01:00
Matthias 0982b26d6b chore(ci): pin pyyaml explicitly 2026-03-28 13:02:03 +01:00
Matthias 626e719942 chore(ci): don't upgrade wheel
it'll be auto-installed in the build environment
2026-03-28 12:56:24 +01:00
Matthias d82cac3895 chore(ci): pin "build" and use the pinned version in CI 2026-03-28 12:55:02 +01:00
Matthias 3e40944b4e test: skip pygments vulnerability for now 2026-03-26 07:15:21 +01:00
Matthias 05081df48b chore(ci): revert build pinning 2026-03-26 07:12:36 +01:00
Matthias 6e6082fa2b test: update test wording for stoploss price type 2026-03-26 07:08:44 +01:00
Matthias 3c43e3dae3 feat: improve stop price type not supported message 2026-03-26 07:08:40 +01:00
Matthias 515a754dc4 docs: clarify stop price type validation logic for spot markets
(it's not validated in that case).
2026-03-26 07:08:40 +01:00
Matthias 1c98c2feeb feat(bitget): add stoploss price type support
closes #12981
2026-03-26 07:08:40 +01:00
Matthias 697059a4a2 Merge pull request #12980 from freqtrade/dependabot/pip/requests-2.33.0
chore(deps): bump requests from 2.32.5 to 2.33.0
2026-03-26 07:08:07 +01:00
Matthias 1b1508d8f2 Merge pull request #12982 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-03-26 07:02:25 +01:00
Freqtrade Bot 48905e55e5 chore: update pre-commit hooks 2026-03-26 04:18:28 +00:00
Matthias a203f4129a Merge pull request #12952 from Briarion/feat/pytorch-early-stopping
feat: add early stopping support to PyTorchModelTrainer
2026-03-25 19:54:48 +01:00
dependabot[bot] 0b3f3a94b5 chore(deps): bump requests from 2.32.5 to 2.33.0
Bumps [requests](https://github.com/psf/requests) from 2.32.5 to 2.33.0.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.32.5...v2.33.0)

---
updated-dependencies:
- dependency-name: requests
  dependency-version: 2.33.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-25 18:12:12 +00:00
Briarion daf9918bb5 docs: add early_stopping_patience to parameter table
Document the new early_stopping_patience trainer_kwargs parameter
in the FreqAI parameter table, including description, datatype,
default value, and usage notes.
2026-03-25 15:29:15 +03:00
Briarion 3bde73740c feat: add early stopping support to PyTorchModelTrainer
Add optional early stopping to prevent overfitting in PyTorch-based
FreqAI models. When `early_stopping_patience` is set in
model_training_parameters, training will stop if validation loss
does not improve for the specified number of epochs.

Changes:
- Add `early_stopping_patience` parameter (default 0 = disabled)
- `estimate_loss()` now returns average loss (float | None) instead
  of None, enabling downstream use for schedulers and early stopping
- Track best validation loss and patience counter across epochs

Usage in config:
```json
{
  "model_training_parameters": {
    "n_epochs": 100,
    "early_stopping_patience": 10
  }
}
```

The change is fully backward compatible - early stopping is disabled
by default, and the return value of estimate_loss() can be safely
ignored by existing subclasses.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 15:24:58 +03:00
Matthias 3f9eaba1ef Merge pull request #12979 from freqtrade/fix/freqai_torch
Fix freqai torch model loading
2026-03-25 12:45:41 +01:00
Matthias d557b4b298 Merge branch 'develop' into fix/freqai_torch 2026-03-25 12:31:28 +01:00
Matthias fd858b79af test: remove "ignore-vuln" from pip-audit tests
the vulnerability was fixed.
2026-03-25 10:58:39 +01:00
Matthias e96c67e140 fix: pin build to 1.4.0 for now 2026-03-25 10:58:02 +01:00
Matthias faf28180a5 docs: fix minor documentation bug 2026-03-24 20:57:17 +01:00
Matthias e98959f3f0 fix: set weights_only=False when loading from pytorch
closes #12964
2026-03-24 20:31:35 +01:00
Matthias 0a2c3379c6 docs: add security warning message to pytorch docs 2026-03-24 20:29:45 +01:00
Matthias b8f5df7cf6 chore: remove unnecessary child method
(it does the same thing than the parent).
2026-03-24 20:15:09 +01:00
Matthias 04a4a97efb Merge pull request #12974 from freqtrade/maint/migrate_add_event_handler
migrate fastapi add event handler
2026-03-24 07:05:58 +01:00
Matthias 143d9a90c6 chore: import sorting 2026-03-24 06:33:57 +01:00
Matthias c112fa6632 Merge pull request #12978 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2026-03-24 06:29:43 +01:00
Freqtrade Bot cb46f72109 chore: update pre-commit hooks 2026-03-24 03:47:28 +00:00
Matthias 2eb5efed64 Merge pull request #12975 from hallonstedt/docs-krakenfutures-exchange-features
docs: add Kraken futures row to exchange features
2026-03-23 10:51:56 +01:00
matstedt 7657e37f67 docs: add Kraken futures row to exchange features 2026-03-23 09:36:43 +01:00
Matthias ec763e684f Merge pull request #12967 from freqtrade/dependabot/pip/develop/scipy-7cfe552463
chore(deps-dev): bump scipy-stubs from 1.17.1.1 to 1.17.1.2 in the scipy group
2026-03-23 08:00:57 +01:00
Matthias d3847080e8 Merge pull request #12966 from freqtrade/dependabot/pip/develop/mkdocs-d673e4145a
chore(deps): bump mkdocs-material from 9.7.4 to 9.7.5 in the mkdocs group
2026-03-23 07:54:00 +01:00
Matthias 97305221ac Merge pull request #12968 from freqtrade/dependabot/github_actions/develop/actions-1fa769d870
chore(deps): bump actions/download-artifact from 8.0.0 to 8.0.1 in the actions group
2026-03-23 07:53:08 +01:00
Matthias b65aa8671a Merge pull request #12970 from freqtrade/dependabot/pip/develop/cachetools-7.0.5
chore(deps): bump cachetools from 7.0.4 to 7.0.5
2026-03-23 07:50:47 +01:00
Matthias d35bc15562 Merge pull request #12971 from freqtrade/dependabot/pip/develop/numpy-2.4.3
chore(deps): bump numpy from 2.4.2 to 2.4.3
2026-03-23 07:50:31 +01:00
Matthias a9cabe1162 Merge pull request #12969 from freqtrade/dependabot/pip/develop/pyjwt-2.12.1
chore(deps): bump pyjwt from 2.12.0 to 2.12.1
2026-03-23 07:33:02 +01:00
Matthias bb6f4eb60d Merge pull request #12972 from freqtrade/dependabot/pip/develop/filelock-3.25.2
chore(deps): bump filelock from 3.25.0 to 3.25.2
2026-03-23 07:21:10 +01:00
Matthias cea1700eaa chore: drop starlette upper version bound 2026-03-23 07:20:08 +01:00
Matthias bb2f4ac37e fix: migrate from add_event_handler to lifespan
add_event_handler was removed in starlette 1.0.0
2026-03-23 07:19:53 +01:00
Matthias 996123ea52 Merge pull request #12973 from freqtrade/dependabot/pip/develop/ruff-0.15.6
chore(deps-dev): bump ruff from 0.15.5 to 0.15.6
2026-03-23 07:19:43 +01:00
Matthias 252b7b5e68 chore: bump scipy-stubs in pre-commit config 2026-03-23 07:06:29 +01:00
dependabot[bot] fefba87922 chore(deps): bump mkdocs-material in the mkdocs group
Bumps the mkdocs group with 1 update: [mkdocs-material](https://github.com/squidfunk/mkdocs-material).


Updates `mkdocs-material` from 9.7.4 to 9.7.5
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.7.4...9.7.5)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-version: 9.7.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: mkdocs
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-23 06:04:51 +00:00
dependabot[bot] 434911c1cf chore(deps-dev): bump scipy-stubs in the scipy group
Bumps the scipy group with 1 update: [scipy-stubs](https://github.com/scipy/scipy-stubs).


Updates `scipy-stubs` from 1.17.1.1 to 1.17.1.2
- [Release notes](https://github.com/scipy/scipy-stubs/releases)
- [Commits](https://github.com/scipy/scipy-stubs/compare/v1.17.1.1...v1.17.1.2)

---
updated-dependencies:
- dependency-name: scipy-stubs
  dependency-version: 1.17.1.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: scipy
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-23 06:04:20 +00:00
dependabot[bot] 1d947ba21a chore(deps): bump actions/download-artifact in the actions group
Bumps the actions group with 1 update: [actions/download-artifact](https://github.com/actions/download-artifact).


Updates `actions/download-artifact` from 8.0.0 to 8.0.1
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3...3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: 8.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-23 05:56:41 +00:00
dependabot[bot] 55a6591f10 chore(deps): bump cachetools from 7.0.4 to 7.0.5
Bumps [cachetools](https://github.com/tkem/cachetools) from 7.0.4 to 7.0.5.
- [Changelog](https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tkem/cachetools/compare/v7.0.4...v7.0.5)

---
updated-dependencies:
- dependency-name: cachetools
  dependency-version: 7.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-23 05:55:39 +00:00
dependabot[bot] 266fe5c6cb chore(deps): bump numpy from 2.4.2 to 2.4.3
Bumps [numpy](https://github.com/numpy/numpy) from 2.4.2 to 2.4.3.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v2.4.2...v2.4.3)

---
updated-dependencies:
- dependency-name: numpy
  dependency-version: 2.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-23 05:51:35 +00:00
dependabot[bot] 3d4395ebe6 chore(deps): bump filelock from 3.25.0 to 3.25.2
Bumps [filelock](https://github.com/tox-dev/py-filelock) from 3.25.0 to 3.25.2.
- [Release notes](https://github.com/tox-dev/py-filelock/releases)
- [Changelog](https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst)
- [Commits](https://github.com/tox-dev/py-filelock/compare/3.25.0...3.25.2)

---
updated-dependencies:
- dependency-name: filelock
  dependency-version: 3.25.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-23 05:44:30 +00:00
dependabot[bot] 463f0050ed chore(deps-dev): bump ruff from 0.15.5 to 0.15.6
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.5 to 0.15.6.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.15.5...0.15.6)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.15.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-23 05:42:49 +00:00
dependabot[bot] b0b9c8d43a chore(deps): bump pyjwt from 2.12.0 to 2.12.1
Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.12.0 to 2.12.1.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.12.0...2.12.1)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-version: 2.12.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-23 05:41:35 +00:00
Matthias 94d0080208 chore: pin starlette to < 1.0.0 2026-03-23 06:37:34 +01:00
Matthias 250156f1a3 Merge pull request #12706 from hallonstedt/feature-krakenfutures
Feature krakenfutures
2026-03-22 19:22:43 +01:00
Matthias 724318c43e test(krakenfutures): Add canceled order test 2026-03-22 19:07:19 +01:00
Matthias 37dbaae8aa feat(krakenfutures): exchange_override fetchOrders to false
to force fallback to individual orders
2026-03-22 19:07:19 +01:00
Matthias 1bd0404503 fix: workaround for missing "filled" parsing 2026-03-22 19:07:19 +01:00
matstedt eba9c24510 refactor(krakenfutures): drop resolved trigger price workaround 2026-03-22 19:07:19 +01:00
Matthias 6bf1901f9b chore: bump ccxt to 4.5.44 2026-03-22 19:07:19 +01:00
Matthias bd9697e6be test: fix krakenfutures tests 2026-03-22 19:07:19 +01:00
Matthias 200b9da2a2 test: remove unnecessary test
ccxt limit is tested as part of test_ohlcv_limit_futures in compat testing
2026-03-22 19:07:19 +01:00
Matthias 32fecd7b15 test(krakenfutures): improve _ft_has test 2026-03-22 19:07:19 +01:00
Matthias f8b99c6e66 test(krakenfutures): update stop strip test 2026-03-22 19:07:19 +01:00
Matthias 0fda77a39c chore: filter open orders by pair 2026-03-22 19:07:19 +01:00
Matthias 57c7edfe26 test: update krakenfutures live test 2026-03-22 19:07:19 +01:00
Matthias 437d0a264c test: Improve test sequence (simplifies analysis) 2026-03-22 19:07:19 +01:00
Matthias 3a28c91635 test: add regular market order 2026-03-22 19:07:19 +01:00
Matthias 1f4c188dbf test: add futures market-parsing test 2026-03-22 19:07:19 +01:00
matstedt 7f9b1a9f90 krakenfutures: correct ccxt issue link to 27996 2026-03-22 19:07:19 +01:00
matstedt 5096ec8a50 krakenfutures: defer order-level fee aggregation 2026-03-22 19:07:19 +01:00
matstedt 35d812a271 krakenfutures: run order adjustments via _order_contracts_to_amount 2026-03-22 19:07:19 +01:00
matstedt 1e79c1961b krakenfutures: aggregate order fees in _adjust_krakenfutures_order 2026-03-22 19:07:19 +01:00
matstedt bfd758d353 krakenfutures: recompute average and cost from fills for terminal orders 2026-03-22 19:07:19 +01:00
matstedt b1ef0bf58d krakenfutures: use safe_value_nested for trigger price extraction 2026-03-22 19:07:19 +01:00
Matthias d25b2ea10a fix: crash on comparison of filled=None 2026-03-22 19:07:19 +01:00
matstedt c533e48310 refactor: remove funding_fee_candle_limit override
Kraken Futures now provides 1 year of hourly funding rate history.
The previous limit of 700 candles (29 days) was a workaround for
limited API retention. Freqtrade paginates funding rate fetches
automatically, so the CCXT default (2000) works correctly.
2026-03-22 19:07:19 +01:00
matstedt a1e9b6bea8 fix: compute average price from trades and enrich fees for Kraken Futures
Kraken Futures' /orders/status returns limitPrice (not fill price) and
/fills omits fee amounts (only fillType). This adds:

- _adjust_krakenfutures_order: fetches trades for closed/filled orders
  with average=None and computes VWAP average price.
- get_trades_for_order override: enriches trades with calculated fees
  from the market's maker/taker fee schedule.

Tests: 7 new tests covering VWAP computation, fee enrichment with
maker/taker rates, and preservation of existing values.
2026-03-22 19:07:19 +01:00
matstedt 0dfd7324bd fix: extract triggerPrice from priceTriggerOptions for stoploss orders
CCXT's krakenfutures parse_order misses triggerPrice when the
/orders/status endpoint nests it inside priceTriggerOptions.
Override _order_contracts_to_amount to populate triggerPrice and
stopPrice from info.order.priceTriggerOptions.triggerPrice.
2026-03-22 19:07:19 +01:00
Matthias 3c4b07ce46 test: update krakenfutures_tests for usage of __name__ 2026-03-22 19:07:19 +01:00
Matthias d6e6c9d038 chore: log fetch_order responses for better tracability 2026-03-22 19:07:19 +01:00
Matthias 027ac3d66c test: simplify longrun tests 2026-03-22 19:07:19 +01:00
matstedt 8c1674b415 fix(tests): use CandleType.FUTURES in test_ohlcv_limit_futures
The futures_only ternary incorrectly used CandleType.SPOT for exchanges
that support both spot and futures (binance, gate), causing candle limit
mismatch against candle_count_futures.
2026-03-22 19:07:19 +01:00
matstedt eaa35d7b47 style: ruff format 2026-03-22 19:07:19 +01:00
matstedt 0dc26584cc krakenfutures: add funding_fee_candle_limit for limited history
Kraken Futures retains only ~29 days of hourly funding rate history.
Set funding_fee_candle_limit to 700 so ohlcv_candle_limit returns the
correct cap for CandleType.FUNDING_RATE instead of the general OHLCV
limit.
2026-03-22 19:07:19 +01:00
matstedt cb2e50abcf fix(tests): restore exchange_params return in get_futures_exchange 2026-03-22 19:07:19 +01:00
matstedt f0aedc8d23 test(krakenfutures): align tests with simplified stoploss handling
- Add test for stoploss_query_requires_stop_flag in _ft_has.
- Replace _fix_trigger_order_id tests with base class integration tests
  (verify stop=True is passed by fetch_stoploss_order/cancel_stoploss_order).
- Add tests for stop param flow: passed to history endpoints, stripped
  from open orders query.
- Remove obsolete cancel_stoploss_order/fetch_stoploss_order override tests.
2026-03-22 19:07:19 +01:00
matstedt 086e1d8bad refactor(krakenfutures): simplify stoploss handling after ccxt fix
- Add stoploss_query_requires_stop_flag to _ft_has so the base class
  handles fetch_stoploss_order and cancel_stoploss_order (adds stop=True
  which CCXT maps to trigger history endpoints).
- Remove _fix_trigger_order_id — ccxt 4.5.38 now parses order IDs
  correctly in all response formats.
- Remove cancel_stoploss_order override — base class handles it.
- Remove fetch_stoploss_order override — base class handles it.
- Simplify _fetch_order_fallback — stop=True flows from base class,
  no need to auto-retry with trigger=True.

Addresses review comments from freqtrade/freqtrade#12706.
2026-03-22 19:07:19 +01:00
Matthias 83c2ca5a90 test: krakenfutures has no websockets at the moment 2026-03-22 19:07:19 +01:00
Matthias 68c8dd4e18 chore: krakenfutures tickers don't have volume 2026-03-22 19:07:19 +01:00
Matthias b25defb8b9 refactor: invert balance logic to simplify function 2026-03-22 19:07:19 +01:00
Matthias b190079aa8 test: Simplify live test setup 2026-03-22 19:07:19 +01:00
Matthias a831a6ee34 docs: align krakenfutures link in Readme.md 2026-03-22 19:07:19 +01:00
matstedt bfbae5d040 fix(krakenfutures): re-introduce improved stoploss lookup for trigger orders 2026-03-22 19:07:19 +01:00
matstedt bb2f19deaa krakenfutures: replace assert with typed None-guard for ruff S101 2026-03-22 19:07:19 +01:00
matstedt cfa4924b8e krakenfutures: satisfy mypy narrowing in flex USD used calculation 2026-03-22 19:07:19 +01:00
matstedt 4f8291384d docs: align Kraken Futures config and collateral guidance 2026-03-22 19:07:05 +01:00
matstedt f81e335b27 krakenfutures: simplify order/balance handling and harden error mapping 2026-03-22 19:07:05 +01:00
matstedt 756f178ec3 exchange_utils: use ccxt exchange.has directly in capability checks 2026-03-22 19:07:05 +01:00
Matthias c68c6896d7 chore: revert odd, unnecessary modifications 2026-03-22 19:07:05 +01:00
Matthias 712fd8ac14 chore: import formatting 2026-03-22 19:07:05 +01:00
Matthias cb6a1267b6 chore: remove pointless comments 2026-03-22 19:07:05 +01:00
matstedt 1c77bd6f5d krakenfutures: improve fetch_order fallback 2026-03-22 19:07:05 +01:00
Matthias 1d0bcbe234 test: remove no longer necessary test 2026-03-22 19:07:05 +01:00
Matthias 445a22222a chore: remove leverage tier fixing code 2026-03-22 19:07:04 +01:00
matstedt ba80329eda krakenfutures: guard maxNotional for non‑contract tiers 2026-03-22 19:07:04 +01:00
matstedt a8d7a72cec tests: drop unused krakenfutures spot leverage flag 2026-03-22 19:07:04 +01:00
matstedt 6ed470884b krakenfutures: backfill leverage tier notionals 2026-03-22 19:07:04 +01:00
matstedt 0d4dadd63f docs: add Kraken to the list of supported Futures Exchanges 2026-03-22 19:07:04 +01:00
matstedt 0cab0e8ac5 fix(tests): use myokx for non-futures list-exchanges check 2026-03-22 19:07:04 +01:00
matstedt 9ddf464c03 fix(exchange): drop unused get_ft_has override plumbing 2026-03-22 19:07:04 +01:00
matstedt 06abc95b2e test: fix contradictory sorting by ruff and isort 7 2026-03-22 19:07:04 +01:00
matstedt b4daabe491 test: re-organize imports 2026-03-22 19:07:04 +01:00
matstedt e5a23f5afd test: fix import order in exchange utils test 2026-03-22 19:07:04 +01:00
matstedt 7ee4338b1f tests: increase coverage - krakenfutures edge paths and ft_has overrides 2026-03-22 19:07:04 +01:00
matstedt 3f6e7ca4c1 tests: cover krakenfutures currency sum and funding fees 2026-03-22 19:07:04 +01:00
matstedt 1345cfdbee exchange: fallback to canceled orders for krakenfutures fetch_order; add tests 2026-03-22 19:07:04 +01:00
matstedt f2780c7c68 exchange: drop ccxt workarounds; keep closed-order fallback 2026-03-22 19:07:04 +01:00
matstedt 1254bd5bab tests: align krakenfutures ohlcv limit check 2026-03-22 19:07:04 +01:00
matstedt cef63725aa exchange: drop krakenfutures ohlcv limit override 2026-03-22 19:07:04 +01:00
matstedt 5af4147eb3 tests: adjust list-exchanges futures assertions for krakenfutures 2026-03-22 19:07:04 +01:00
matstedt ca9d4ed026 tests: fix _exchange_has_helper input in exchange_utils test 2026-03-22 19:07:04 +01:00
matstedt 15359f57a8 krakenfutures: avoid mypy optional assignment in fetch_order 2026-03-22 19:07:04 +01:00
matstedt 4b23e9ccce krakenfutures: strip history-only params from open/closed order calls 2026-03-22 19:07:04 +01:00
matstedt 35706eb9ec krakenfutures: restore get_ft_has so exchange validation sees fetchOrder/createMarketOrder overrides until CCXT is updated 2026-03-22 19:07:04 +01:00
matstedt 272771af38 docs(exchanges): remove redundant text 2026-03-22 19:07:04 +01:00
matstedt 2ed3db330a krakenfutures: use fetch_order_emulated with history fallback 2026-03-22 19:07:04 +01:00
matstedt 38d197b3bf krakenfutures: rely on ft_has stoploss params, update tests/docs 2026-03-22 19:07:04 +01:00
Mattias Hellerstedt 6c588cce65 docs: clarify flex account handling in Kraken Futures balances 2026-03-22 19:07:04 +01:00
matstedt 5752e52b0f tests: update krakenfutures tests for get_ft_has removal and InvalidOrderException 2026-03-22 19:07:04 +01:00
matstedt 2077f34a78 krakenfutures: use Bybit/Hyperliquid funding fee calculation 2026-03-22 19:07:04 +01:00
matstedt 7718e8e1e9 krakenfutures: fix fetch_order to raise exception instead of returning pseudo order 2026-03-22 19:07:04 +01:00
matstedt 06e2b8ae0d style: ruff format 2026-03-22 19:07:04 +01:00
matstedt 42361bc046 krakenfutures: remove redundant get_ft_has method 2026-03-22 19:07:04 +01:00
matstedt 507ea87e9f krakenfutures: convert _filter_params_for_open_closed to instance method 2026-03-22 19:07:04 +01:00
matstedt 60f71bbc2b tests: re-enable hyperliquid spot online tests 2026-03-22 19:07:04 +01:00
matstedt ea5ae9627d style: ruff format 2026-03-22 19:07:04 +01:00
matstedt 6fdeab2747 krakenfutures: align class name with resolver titlecase and remove unnecessary alias 2026-03-22 19:07:04 +01:00
matstedt 04ec24e737 krakenfutures: move ohlcv cap to _ft_has and support futures-only online tests 2026-03-22 19:07:04 +01:00
matstedt d9629c4d67 docs(exchange): add Kraken Futures notes 2026-03-22 19:07:04 +01:00
matstedt 2f7e77a41e test(exchange): add Kraken Futures exchange tests 2026-03-22 19:07:04 +01:00
matstedt 46e96e20a9 feat(exchange): add Kraken Futures exchange class 2026-03-22 19:07:04 +01:00
matstedt 1a5f4127e0 feat(exchange): register Kraken Futures exchange 2026-03-22 19:07:04 +01:00
matstedt 51588c2ef1 feat(exchange): apply ft_has overrides in check_exchange 2026-03-22 19:07:04 +01:00
matstedt 271ee6d36e feat(exchange): honor subclass has overrides in exchange validation 2026-03-22 19:07:04 +01:00
matstedt 72995835ea feat(exchange): enable krakenfutures in supported list 2026-03-22 19:07:04 +01:00
Matthias 1922f15735 chore(ci): remove reference to non-existing step 2026-03-22 09:12:25 +01:00
Matthias 633ff8c98c chore(ci): remove outdated action
it's not needed as the new discord action has nofail set by default
2026-03-22 09:10:15 +01:00
Matthias 10b2a27342 Merge pull request #12962 from freqtrade/maint/ci-discord-notify
Update discord notify action
2026-03-22 09:04:01 +01:00
Matthias 6ed329bac3 chore(ci): replace discord-webhook-notify
it's buggy since months without update / fix - we need a maintained action.
2026-03-22 08:45:07 +01:00
Matthias cebbb40c99 test: remove testing for time_in_ratio 2026-03-21 14:09:49 +01:00
Matthias adec491b3b chore: remove unused argument time_in_ratio
It was there in preparation for kraken, but kraken
doesn't seem to have this anymore.
2026-03-21 14:09:42 +01:00
Matthias cbeae975f0 test: simplify funding fee test 2026-03-21 14:08:20 +01:00
Matthias a2b1c3710f chore: remove pointless futures stuff from kraken class
(kraken futures can only be supported via krakenfutures class)
2026-03-21 14:00:57 +01:00
Matthias bbb1fecb02 test: enhanced fetch_order_fallback test 2026-03-21 09:32:28 +01:00
Matthias b7c89a72fa feat: enhance orders_emulate to include canceled orders 2026-03-21 09:19:27 +01:00
Matthias 0a7fe730f0 fix: trade recovery improvement 2026-03-21 08:51:15 +01:00
Matthias cadb269b58 Merge pull request #12957 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-03-19 07:40:47 +01:00
Matthias 168962f847 Merge pull request #12953 from Briarion/fix/data-kitchen-fragmentation
fix: avoid DataFrame fragmentation in get_predictions_to_append
2026-03-19 07:24:45 +01:00
Freqtrade Bot e70e56df96 chore: update pre-commit hooks 2026-03-19 07:22:10 +01:00
Matthias 3242be2e29 fix: add dynamic timeframe_floor freq
fixes problems where funding-rates may be on the 1st second of the hour
(observed on gate from time to time)
2026-03-19 07:19:07 +01:00
Matthias 7fc6463900 refactor: align naming for clean_ohlcv_dataframe 2026-03-19 07:04:49 +01:00
Briarion 9560ba2144 fix: move do_predict and DI_values into dict before DataFrame construction
Address review feedback: do_predict and DI_values were still assigned
after DataFrame creation, partially defeating the fragmentation fix.
Now all columns are collected in the dict before the single DataFrame()
call, ensuring zero post-construction column assignments.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 08:05:22 +03:00
Matthias 257e26f2c0 Merge pull request #12955 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2026-03-17 06:29:38 +01:00
Freqtrade Bot 27a650cf1c chore: update pre-commit hooks 2026-03-17 03:47:29 +00:00
Matthias 5dca913b9e Merge pull request #12936 from freqtrade/dependabot/pip/develop/types-9ab316b5d0
chore(deps-dev): bump the types group with 2 updates
2026-03-16 14:56:49 +01:00
Matthias 6492f3d29e chore: bump types in pre-commit-config 2026-03-16 14:43:22 +01:00
dependabot[bot] 21c5cc7994 chore(deps-dev): bump the types group with 2 updates
Bumps the types group with 2 updates: [types-tabulate](https://github.com/typeshed-internal/stub_uploader) and [types-python-dateutil](https://github.com/typeshed-internal/stub_uploader).


Updates `types-tabulate` from 0.9.0.20241207 to 0.10.0.20260308
- [Commits](https://github.com/typeshed-internal/stub_uploader/commits)

Updates `types-python-dateutil` from 2.9.0.20260124 to 2.9.0.20260305
- [Commits](https://github.com/typeshed-internal/stub_uploader/commits)

---
updated-dependencies:
- dependency-name: types-tabulate
  dependency-version: 0.10.0.20260308
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: types
- dependency-name: types-python-dateutil
  dependency-version: 2.9.0.20260305
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 10:14:00 +00:00
Matthias 056bb213f8 Merge pull request #12941 from freqtrade/dependabot/pip/develop/sqlalchemy-2.0.48
chore(deps): bump sqlalchemy from 2.0.47 to 2.0.48
2026-03-16 11:10:02 +01:00
Matthias 5d3c65f7da chore: bump sqlalchemy in pre-commit config 2026-03-16 09:00:57 +01:00
dependabot[bot] 5061554ada chore(deps): bump sqlalchemy from 2.0.47 to 2.0.48
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.47 to 2.0.48.
- [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases)
- [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst)
- [Commits](https://github.com/sqlalchemy/sqlalchemy/commits)

---
updated-dependencies:
- dependency-name: sqlalchemy
  dependency-version: 2.0.48
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 07:56:21 +00:00
Matthias 14e97e3f22 Merge pull request #12938 from freqtrade/dependabot/pip/develop/scipy-1e08eb4daa
chore(deps-dev): bump scipy-stubs from 1.17.1.0 to 1.17.1.1 in the scipy group
2026-03-16 07:36:56 +01:00
Matthias 0f816ddfb7 Merge pull request #12937 from freqtrade/dependabot/pip/develop/mkdocs-4d03651020
chore(deps): bump mkdocs-material from 9.7.3 to 9.7.4 in the mkdocs group
2026-03-16 07:29:06 +01:00
dependabot[bot] 92dd17ab62 chore(deps): bump mkdocs-material in the mkdocs group
Bumps the mkdocs group with 1 update: [mkdocs-material](https://github.com/squidfunk/mkdocs-material).


Updates `mkdocs-material` from 9.7.3 to 9.7.4
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.7.3...9.7.4)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-version: 9.7.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: mkdocs
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 05:49:03 +00:00
Briarion a8c887a5b0 fix: avoid DataFrame fragmentation in get_predictions_to_append
Replace column-by-column DataFrame assignment with dict-based
construction. The previous approach triggered pandas
PerformanceWarning about DataFrame fragmentation when many
prediction columns and their corresponding mean/std columns
were added one at a time.

Also add defensive key checks (label in self.data["labels_mean"])
to prevent KeyError when custom models produce prediction columns
that don't have corresponding entries in labels_mean/labels_std.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 08:46:57 +03:00
Matthias 009fa747e3 chore: combine actions updates from docker/*
they release as one anyway
2026-03-16 06:45:47 +01:00
Matthias 2744449773 Merge pull request #12950 from stash86/main-stash
fix cagr on zero or negative values
2026-03-16 06:41:47 +01:00
Matthias 537426d77a Merge pull request #12948 from freqtrade/dependabot/pip/develop/tabulate-0.10.0
chore(deps): bump tabulate from 0.9.0 to 0.10.0
2026-03-16 06:38:45 +01:00
Matthias e3994d1add chore: bump scipy-stubs in pre-commit config 2026-03-16 06:37:24 +01:00
Matthias 720cd8b68c Merge pull request #12946 from freqtrade/dependabot/github_actions/develop/docker/setup-qemu-action-4.0.0
chore(deps): bump docker/setup-qemu-action from 3.7.0 to 4.0.0
2026-03-16 06:36:21 +01:00
Matthias 3846bd16f0 Merge pull request #12944 from freqtrade/dependabot/github_actions/develop/docker/login-action-4.0.0
chore(deps): bump docker/login-action from 3.7.0 to 4.0.0
2026-03-16 06:36:08 +01:00
Matthias 7863d4b854 Merge pull request #12945 from freqtrade/dependabot/pip/develop/pytz-2026.1.post1
chore(deps): bump pytz from 2025.2 to 2026.1.post1
2026-03-16 06:34:44 +01:00
Matthias 7e8da54ad1 Merge pull request #12943 from freqtrade/dependabot/pip/develop/plotly-6.6.0
chore(deps): bump plotly from 6.5.2 to 6.6.0
2026-03-16 06:34:30 +01:00
Matthias ae06f90ca6 Merge pull request #12942 from freqtrade/dependabot/pip/develop/cachetools-7.0.4
chore(deps): bump cachetools from 7.0.1 to 7.0.4
2026-03-16 06:34:06 +01:00
Matthias 8a7b235b6e Merge pull request #12940 from freqtrade/dependabot/github_actions/develop/zizmorcore/zizmor-action-0.5.2
chore(deps): bump zizmorcore/zizmor-action from 0.5.0 to 0.5.2
2026-03-16 06:33:53 +01:00
Matthias daa0361c02 Merge pull request #12939 from freqtrade/dependabot/github_actions/develop/docker/setup-buildx-action-4.0.0
chore(deps): bump docker/setup-buildx-action from 3.12.0 to 4.0.0
2026-03-16 06:33:33 +01:00
Matthias 9136877bc7 Merge pull request #12949 from freqtrade/dependabot/pip/develop/mike-2.1.4
chore(deps): bump mike from 2.1.3 to 2.1.4
2026-03-16 06:33:03 +01:00
Matthias 2df3890917 Merge pull request #12947 from freqtrade/dependabot/pip/develop/ruff-0.15.5
chore(deps-dev): bump ruff from 0.15.4 to 0.15.5
2026-03-16 06:32:50 +01:00
Stefano f2b930079b fix cagr on zero or negative values 2026-03-16 12:38:39 +09:00
dependabot[bot] f0a83c9e59 chore(deps): bump mike from 2.1.3 to 2.1.4
Bumps [mike](https://github.com/jimporter/mike) from 2.1.3 to 2.1.4.
- [Release notes](https://github.com/jimporter/mike/releases)
- [Changelog](https://github.com/jimporter/mike/blob/master/CHANGES.md)
- [Commits](https://github.com/jimporter/mike/compare/v2.1.3...v2.1.4)

---
updated-dependencies:
- dependency-name: mike
  dependency-version: 2.1.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 03:04:36 +00:00
dependabot[bot] b12ea975e0 chore(deps): bump tabulate from 0.9.0 to 0.10.0
Bumps [tabulate](https://github.com/astanin/python-tabulate) from 0.9.0 to 0.10.0.
- [Changelog](https://github.com/astanin/python-tabulate/blob/master/CHANGELOG)
- [Commits](https://github.com/astanin/python-tabulate/compare/v0.9.0...v0.10.0)

---
updated-dependencies:
- dependency-name: tabulate
  dependency-version: 0.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 03:04:30 +00:00
dependabot[bot] ab74dd785c chore(deps-dev): bump ruff from 0.15.4 to 0.15.5
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.4 to 0.15.5.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.15.4...0.15.5)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.15.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 03:04:25 +00:00
dependabot[bot] 39affd30f9 chore(deps): bump docker/setup-qemu-action from 3.7.0 to 4.0.0
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3.7.0 to 4.0.0.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/c7c53464625b32c7a7e944ae62b3e17d2b600130...ce360397dd3f832beb865e1373c09c0e9f86d70a)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 03:04:20 +00:00
dependabot[bot] ff6c96022e chore(deps): bump pytz from 2025.2 to 2026.1.post1
Bumps [pytz](https://github.com/stub42/pytz) from 2025.2 to 2026.1.post1.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2025.2...release_2026.1.post1)

---
updated-dependencies:
- dependency-name: pytz
  dependency-version: 2026.1.post1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 03:04:06 +00:00
dependabot[bot] fc3b8f37b0 chore(deps): bump docker/login-action from 3.7.0 to 4.0.0
Bumps [docker/login-action](https://github.com/docker/login-action) from 3.7.0 to 4.0.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/c94ce9fb468520275223c153574b00df6fe4bcc9...b45d80f862d83dbcd57f89517bcf500b2ab88fb2)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 03:03:54 +00:00
dependabot[bot] 26615dbd55 chore(deps): bump plotly from 6.5.2 to 6.6.0
Bumps [plotly](https://github.com/plotly/plotly.py) from 6.5.2 to 6.6.0.
- [Release notes](https://github.com/plotly/plotly.py/releases)
- [Changelog](https://github.com/plotly/plotly.py/blob/main/CHANGELOG.md)
- [Commits](https://github.com/plotly/plotly.py/compare/v6.5.2...v6.6.0)

---
updated-dependencies:
- dependency-name: plotly
  dependency-version: 6.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 03:03:45 +00:00
dependabot[bot] 6411a76f03 chore(deps): bump cachetools from 7.0.1 to 7.0.4
Bumps [cachetools](https://github.com/tkem/cachetools) from 7.0.1 to 7.0.4.
- [Changelog](https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tkem/cachetools/compare/v7.0.1...v7.0.4)

---
updated-dependencies:
- dependency-name: cachetools
  dependency-version: 7.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 03:03:40 +00:00
dependabot[bot] ce1734b176 chore(deps): bump zizmorcore/zizmor-action from 0.5.0 to 0.5.2
Bumps [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) from 0.5.0 to 0.5.2.
- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)
- [Commits](https://github.com/zizmorcore/zizmor-action/compare/0dce2577a4760a2749d8cfb7a84b7d5585ebcb7d...71321a20a9ded102f6e9ce5718a2fcec2c4f70d8)

---
updated-dependencies:
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.5.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 03:03:32 +00:00
dependabot[bot] 2b3e3a5c46 chore(deps): bump docker/setup-buildx-action from 3.12.0 to 4.0.0
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.12.0 to 4.0.0.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/8d2750c68a42422c14e847fe6c8ac0403b4cbd6f...4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 03:03:28 +00:00
dependabot[bot] 0eddda2ee1 chore(deps-dev): bump scipy-stubs in the scipy group
Bumps the scipy group with 1 update: [scipy-stubs](https://github.com/scipy/scipy-stubs).


Updates `scipy-stubs` from 1.17.1.0 to 1.17.1.1
- [Release notes](https://github.com/scipy/scipy-stubs/releases)
- [Commits](https://github.com/scipy/scipy-stubs/compare/v1.17.1.0...v1.17.1.1)

---
updated-dependencies:
- dependency-name: scipy-stubs
  dependency-version: 1.17.1.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: scipy
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 03:03:26 +00:00
Matthias 05ffc2dba0 chore: migrate pytest ini_options to pytest section 2026-03-15 09:11:03 +01:00
Matthias ec1aee1f85 chore: reorder pyproject.toml dependencies 2026-03-15 08:58:27 +01:00
Matthias 9524fc0f81 chore: remove isort - ruff covers this already 2026-03-15 08:57:22 +01:00
Matthias 3d56701e20 chore: remove unused black configuration 2026-03-15 08:54:08 +01:00
Matthias d8d86ce861 chore: remove flake8 pre-commit check 2026-03-15 08:52:43 +01:00
Matthias 503dfb7313 docs: update recommendation from black to ruff format 2026-03-15 08:52:33 +01:00
Matthias 16717df1a9 docs: improve sql cheatsheet example 2026-03-15 08:44:51 +01:00
Matthias 6713cda109 docs: Update timeout docs to point to adjust_order_price
part of #12928
2026-03-15 08:41:56 +01:00
Matthias 0652339356 docs: fix parameters table formatting 2026-03-15 08:39:12 +01:00
Matthias 59a81dc07a fix: round exit-prices to proper precision
this avoids odd visualization in freqUI where prices had 16 decimals
out of backtesting
2026-03-14 17:00:46 +01:00
Matthias fcecbe780b test: Re-write test-data with proper decimals 2026-03-14 16:40:04 +01:00
Matthias be00f2c26f test: update mock for price_to_precision 2026-03-14 15:54:18 +01:00
Matthias 10ba9e3105 Merge pull request #12930 from freqtrade/dependabot/pip/pyjwt-2.12.0
chore(deps): bump pyjwt from 2.11.0 to 2.12.0
2026-03-14 08:20:16 +01:00
dependabot[bot] 1498860530 chore(deps): bump pyjwt from 2.11.0 to 2.12.0
Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.11.0 to 2.12.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.11.0...2.12.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-version: 2.12.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-14 06:58:35 +00:00
Matthias 902bc75bf3 Merge pull request #12931 from stash86/main-stash
Fix short desc error on RemotePairlist when number_assets is None
2026-03-14 07:53:22 +01:00
Matthias bd6f891b07 chore(ci): rename online action name 2026-03-14 07:52:28 +01:00
Stefano 36e259b347 undo minor typo fix 2026-03-14 12:11:52 +09:00
Stefano f1aaf99317 fix desc 2026-03-14 12:02:34 +09:00
Stefano 459a0decbd forgotten change 2026-03-14 11:59:36 +09:00
Matthias 71598294a1 chore(ci): Update python setup 2026-03-13 21:08:43 +01:00
Matthias e28eedaf1c chore(ci): re-add python step for pre-commit 2026-03-13 20:21:51 +01:00
Matthias 3cd8b2e841 chore(ci): remove unnecessary action step, bump doc build to 3.12 2026-03-13 20:14:28 +01:00
Matthias 9925c4ac14 fix: docstring typos 2026-03-13 20:11:55 +01:00
Matthias 4170c943e7 chore: update remotePairlist num_assets for webserver mode 2026-03-13 06:35:20 +01:00
Matthias 70fe211a8b Merge pull request #12927 from stash86/main-stash
number_assets in RemotePairlist becomes optional
2026-03-13 06:31:43 +01:00
Matthias 23a17859b1 fix: fastAPI user warning due to unsupported use of api_route 2026-03-13 06:29:14 +01:00
Matthias c1fa259ad7 feat: Improved docstrings for /sysinfo endpoint 2026-03-13 06:29:14 +01:00
Matthias 4a9a630765 test: add test for new sysinfo behavior 2026-03-13 06:29:14 +01:00
Matthias a1cbfce316 feat: enhance sysinfo endpoint with additional features
closes #12918
2026-03-13 06:29:14 +01:00
Stefano 5edfa675ef update docs 2026-03-13 12:01:30 +09:00
Stefano 3158adad03 one change left 2026-03-13 11:53:28 +09:00
Stefano ebf39b35b8 Merge branch 'main-stash' of https://github.com/stash86/freqtrade into main-stash 2026-03-13 11:52:45 +09:00
Stefano 756b956a77 number_assets in RemotePairlist become optional 2026-03-13 11:52:40 +09:00
Matthias b46ff76d58 Merge pull request #12925 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-03-12 06:52:46 +01:00
Matthias 6f039fa27c Merge pull request #12923 from stash86/main-stash
use default needstickers for rangestabilityfilter
2026-03-12 06:32:15 +01:00
Freqtrade Bot acf3559205 chore: update pre-commit hooks 2026-03-12 04:12:41 +00:00
Stefano c05fe50b47 use default needstickers 2026-03-12 08:41:46 +09:00
Matthias a51ba0a2b4 fix(hyperliquid): dex balance requests are only necessary in non-unified mode 2026-03-11 21:40:19 +01:00
Matthias 9da9250865 chore: bump ccxt to 4.5.43
closes #12848
2026-03-11 19:57:02 +01:00
Matthias 881edddb6e test: explicitly convert warnings to string 2026-03-10 19:01:39 +01:00
Matthias 0bd5086a0f Merge pull request #12914 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2026-03-10 12:31:33 +01:00
Matthias e563e07d40 Merge branch 'develop' into update/pre-commit-hooks 2026-03-10 12:16:42 +01:00
Matthias f34ad5fc42 chore(ci): pass dockerhub secrets from parent
though they only exist in the environment
2026-03-10 07:15:31 +01:00
Matthias 6b6dcd8c52 chore(ci): re-add secrets as docker build parameters 2026-03-10 06:47:48 +01:00
Matthias d5fa99696d fix(ci): allow certain secrets at repo level 2026-03-10 06:46:15 +01:00
Freqtrade Bot 2d75f002f9 chore: update pre-commit hooks 2026-03-10 03:45:37 +00:00
Matthias c31894be72 chore: enable docker description dispatch 2026-03-09 20:10:13 +01:00
Matthias 4d254952e3 fix(ci): move Docker environment vars to environment 2026-03-09 20:09:50 +01:00
Matthias 24c57b5356 fix(ci): move REPO_SCOPED_TOKEN to be an environment token 2026-03-09 19:55:36 +01:00
Matthias 186e547ce1 chore(ci): fix wrong version in upload-artifact 2026-03-09 19:45:37 +01:00
Matthias 555f653440 Merge pull request #12906 from freqtrade/dependabot/pip/develop/sqlalchemy-2.0.47
chore(deps): bump sqlalchemy from 2.0.46 to 2.0.47
2026-03-09 07:23:35 +01:00
Matthias 8ef5f54e61 chore: bump sqlalchemy in pre-commit config 2026-03-09 07:07:27 +01:00
dependabot[bot] 6576528aad chore(deps): bump sqlalchemy from 2.0.46 to 2.0.47
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.46 to 2.0.47.
- [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases)
- [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst)
- [Commits](https://github.com/sqlalchemy/sqlalchemy/commits)

---
updated-dependencies:
- dependency-name: sqlalchemy
  dependency-version: 2.0.47
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 06:01:07 +00:00
Matthias 052e6f7865 Merge pull request #12904 from freqtrade/dependabot/pip/develop/scipy-9cda224771
chore(deps-dev): bump scipy-stubs from 1.17.0.2 to 1.17.1.0 in the scipy group
2026-03-09 06:57:11 +01:00
Matthias 560cb49d66 chore: bump scipy-stubs in pre-commit config 2026-03-09 06:33:30 +01:00
Matthias c93ca48d17 Merge pull request #12907 from freqtrade/dependabot/pip/develop/ccxt-4.5.42
chore(deps): bump ccxt from 4.5.40 to 4.5.42
2026-03-09 06:28:36 +01:00
Matthias c2d682a5ed Merge pull request #12908 from freqtrade/dependabot/github_actions/develop/astral-sh/setup-uv-7.3.1
chore(deps): bump astral-sh/setup-uv from 7.3.0 to 7.3.1
2026-03-09 06:28:10 +01:00
Matthias 1e7c9cc285 Merge pull request #12905 from freqtrade/dependabot/github_actions/develop/actions-1a3042a095
chore(deps): bump the actions group with 2 updates
2026-03-09 06:27:57 +01:00
Matthias f0a9a6a7c0 Merge pull request #12913 from freqtrade/dependabot/pip/develop/filelock-3.25.0
chore(deps): bump filelock from 3.24.3 to 3.25.0
2026-03-09 06:27:09 +01:00
Matthias 47433ebe67 Merge pull request #12912 from freqtrade/dependabot/pip/develop/isort-8.0.1
chore(deps-dev): bump isort from 8.0.0 to 8.0.1
2026-03-09 06:26:56 +01:00
Matthias e2034ed286 Merge pull request #12911 from freqtrade/dependabot/pip/develop/certifi-2026.2.25
chore(deps): bump certifi from 2026.1.4 to 2026.2.25
2026-03-09 06:26:46 +01:00
Matthias cd5b9a0d56 Merge pull request #12910 from freqtrade/dependabot/pip/develop/ruff-0.15.4
chore(deps-dev): bump ruff from 0.15.2 to 0.15.4
2026-03-09 06:26:31 +01:00
Matthias 8dd3fdafa9 Merge pull request #12903 from freqtrade/dependabot/pip/develop/mkdocs-007c418a98
chore(deps): bump mkdocs-material from 9.7.2 to 9.7.3 in the mkdocs group
2026-03-09 06:25:54 +01:00
Matthias 6d6a9619a3 Merge pull request #12909 from freqtrade/dependabot/pip/develop/fastapi-0.135.1
chore(deps): bump fastapi from 0.131.0 to 0.135.1
2026-03-09 06:24:29 +01:00
dependabot[bot] a097727e32 chore(deps): bump filelock from 3.24.3 to 3.25.0
Bumps [filelock](https://github.com/tox-dev/py-filelock) from 3.24.3 to 3.25.0.
- [Release notes](https://github.com/tox-dev/py-filelock/releases)
- [Changelog](https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst)
- [Commits](https://github.com/tox-dev/py-filelock/compare/3.24.3...3.25.0)

---
updated-dependencies:
- dependency-name: filelock
  dependency-version: 3.25.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 03:04:50 +00:00
dependabot[bot] 14f3d7c819 chore(deps-dev): bump isort from 8.0.0 to 8.0.1
Bumps [isort](https://github.com/PyCQA/isort) from 8.0.0 to 8.0.1.
- [Release notes](https://github.com/PyCQA/isort/releases)
- [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md)
- [Commits](https://github.com/PyCQA/isort/compare/8.0.0...8.0.1)

---
updated-dependencies:
- dependency-name: isort
  dependency-version: 8.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 03:04:44 +00:00
dependabot[bot] 7492f6d34e chore(deps): bump certifi from 2026.1.4 to 2026.2.25
Bumps [certifi](https://github.com/certifi/python-certifi) from 2026.1.4 to 2026.2.25.
- [Commits](https://github.com/certifi/python-certifi/compare/2026.01.04...2026.02.25)

---
updated-dependencies:
- dependency-name: certifi
  dependency-version: 2026.2.25
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 03:04:40 +00:00
dependabot[bot] 7a69e85cd6 chore(deps-dev): bump ruff from 0.15.2 to 0.15.4
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.2 to 0.15.4.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.15.2...0.15.4)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.15.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 03:04:28 +00:00
dependabot[bot] 27a39a4ec6 chore(deps): bump fastapi from 0.131.0 to 0.135.1
Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.131.0 to 0.135.1.
- [Release notes](https://github.com/fastapi/fastapi/releases)
- [Commits](https://github.com/fastapi/fastapi/compare/0.131.0...0.135.1)

---
updated-dependencies:
- dependency-name: fastapi
  dependency-version: 0.135.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 03:04:06 +00:00
dependabot[bot] 5e520136be chore(deps): bump ccxt from 4.5.40 to 4.5.42
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.40 to 4.5.42.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.40...v4.5.42)

---
updated-dependencies:
- dependency-name: ccxt
  dependency-version: 4.5.42
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 03:03:56 +00:00
dependabot[bot] c6c30135c3 chore(deps): bump astral-sh/setup-uv from 7.3.0 to 7.3.1
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.3.0 to 7.3.1.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/eac588ad8def6316056a12d4907a9d4d84ff7a3b...5a095e7a2014a4212f075830d4f7277575a9d098)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 7.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 03:03:56 +00:00
dependabot[bot] 6f06569a11 chore(deps): bump the actions group with 2 updates
Bumps the actions group with 2 updates: [actions/upload-artifact](https://github.com/actions/upload-artifact) and [actions/download-artifact](https://github.com/actions/download-artifact).


Updates `actions/upload-artifact` from 6.0.0 to 7.0.0
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/b7c566a772e6b6bfb58ed0dc250532a479d7789f...bbbca2ddaa5d8feaa63e36b76fdaad77386f024f)

Updates `actions/download-artifact` from 7.0.0 to 8.0.0
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/37930b1c2abaa49bbe596cd826c3c89aef350131...70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/download-artifact
  dependency-version: 8.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 03:03:35 +00:00
dependabot[bot] f3f6c7b73c chore(deps-dev): bump scipy-stubs in the scipy group
Bumps the scipy group with 1 update: [scipy-stubs](https://github.com/scipy/scipy-stubs).


Updates `scipy-stubs` from 1.17.0.2 to 1.17.1.0
- [Release notes](https://github.com/scipy/scipy-stubs/releases)
- [Commits](https://github.com/scipy/scipy-stubs/compare/v1.17.0.2...v1.17.1.0)

---
updated-dependencies:
- dependency-name: scipy-stubs
  dependency-version: 1.17.1.0
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: scipy
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 03:03:29 +00:00
dependabot[bot] 958a9307fc chore(deps): bump mkdocs-material in the mkdocs group
Bumps the mkdocs group with 1 update: [mkdocs-material](https://github.com/squidfunk/mkdocs-material).


Updates `mkdocs-material` from 9.7.2 to 9.7.3
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.7.2...9.7.3)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-version: 9.7.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: mkdocs
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 03:03:21 +00:00
Matthias c49dc36a23 docs: hyperliquid unified accounts documentation 2026-03-08 15:45:10 +01:00
Matthias 6cf73786e3 feat: Be verbose on init 2026-03-08 15:17:19 +01:00
Matthias 71f03ffbc6 feat: support hyperliquid unified account 2026-03-08 15:15:46 +01:00
Matthias b57a7f207e test: simplify ccxt_order_parse test (but improve it at the same time) 2026-03-06 21:07:59 +01:00
Matthias b283cabbcd refactor: rely on parent class "needstickers" property 2026-03-06 18:32:14 +01:00
Matthias 38e64e06d1 refactor: use default "needstickers" function
most pairlists use False - so we can use this default and omit tons of lines.
2026-03-06 18:31:40 +01:00
Matthias b35082e45e docs: update brightness of discord badge 2026-03-06 06:38:58 +01:00
Matthias 02475ebcce Merge pull request #12899 from stash86/main-stash
fix typo
2026-03-05 09:54:47 +01:00
Stefano d584544a6a fix typo 2026-03-05 17:36:22 +09:00
Matthias 428d1397a7 Merge pull request #12874 from stash86/main-stash
Add CrossMarketPairList
2026-03-05 06:57:31 +01:00
Matthias aabda8d4f1 test: simplify test 2026-03-05 06:40:04 +01:00
Matthias 9cee5cc4d0 chore: fix pairlist docstring 2026-03-05 06:39:51 +01:00
Matthias 9dd2a9e5f5 Merge pull request #12898 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-03-05 06:33:51 +01:00
Freqtrade Bot 2832c6b858 chore: update pre-commit hooks 2026-03-05 04:12:28 +00:00
Matthias bc0aeb367a Merge pull request #12876 from freqtrade/fix/chinese_char_pairs
Allow non-ascii characters in pair names
2026-03-04 07:11:01 +01:00
Matthias 1e33ea0059 Merge pull request #12890 from hamadbinghalib/fix/download-data-convert-log-format
fix(configuration): avoid format-string IndexError for --convert in download-data
2026-03-04 07:01:38 +01:00
Stefano 0ca49bf1d3 Merge branch 'freqtrade:develop' into main-stash 2026-03-04 10:03:14 +09:00
Stefano c1c2d24bdc fix docs 2026-03-04 10:02:52 +09:00
Stefano bbba9579dc switch "mode" into "pairs_exist_on" 2026-03-04 09:57:11 +09:00
Matthias f92c66db56 Merge pull request #12891 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2026-03-03 09:54:36 +01:00
Freqtrade Bot f08874d9b8 chore: update pre-commit hooks 2026-03-03 03:46:52 +00:00
hamadbinghalib da0e3912c6 fix(configuration): avoid IndexError with --convert in download-data 2026-03-03 07:08:16 +04:00
Matthias e15cd81383 Merge pull request #12885 from freqtrade/dependabot/pip/develop/filelock-3.24.3
chore(deps): bump filelock from 3.24.2 to 3.24.3
2026-03-02 10:51:11 +01:00
Matthias d1a17a2508 Merge pull request #12886 from freqtrade/dependabot/pip/develop/pyarrow-23.0.1
chore(deps): bump pyarrow from 23.0.0 to 23.0.1
2026-03-02 09:22:56 +01:00
Matthias da3c44137a Merge pull request #12887 from freqtrade/dependabot/pip/develop/ast-comments-1.3.0
chore(deps): bump ast-comments from 1.2.3 to 1.3.0
2026-03-02 09:03:35 +01:00
Matthias 192bd754df chore: add armhf wheel for pyarrow 23.0.1 2026-03-02 06:53:13 +01:00
dependabot[bot] ec46299ec0 chore(deps): bump pyarrow from 23.0.0 to 23.0.1
Bumps [pyarrow](https://github.com/apache/arrow) from 23.0.0 to 23.0.1.
- [Release notes](https://github.com/apache/arrow/releases)
- [Commits](https://github.com/apache/arrow/compare/apache-arrow-23.0.0...apache-arrow-23.0.1)

---
updated-dependencies:
- dependency-name: pyarrow
  dependency-version: 23.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 05:39:01 +00:00
Matthias f1bc324eb3 Merge pull request #12884 from freqtrade/dependabot/pip/develop/uvicorn-0.41.0
chore(deps): bump uvicorn from 0.40.0 to 0.41.0
2026-03-02 06:37:54 +01:00
Matthias f5189f8846 Merge pull request #12888 from freqtrade/dependabot/pip/develop/rich-14.3.3
chore(deps): bump rich from 14.3.2 to 14.3.3
2026-03-02 06:34:52 +01:00
Matthias 29d24c7a9d Merge pull request #12883 from freqtrade/dependabot/pip/develop/ccxt-4.5.40
chore(deps): bump ccxt from 4.5.39 to 4.5.40
2026-03-02 06:34:22 +01:00
Matthias c360f8fe04 Merge pull request #12882 from freqtrade/dependabot/pip/develop/isort-8.0.0
chore(deps-dev): bump isort from 7.0.0 to 8.0.0
2026-03-02 06:34:02 +01:00
Matthias 539b7a3a22 Merge pull request #12880 from freqtrade/dependabot/pip/develop/fastapi-0.131.0
chore(deps): bump fastapi from 0.129.0 to 0.131.0
2026-03-02 06:33:38 +01:00
dependabot[bot] 8a67eee960 chore(deps): bump filelock from 3.24.2 to 3.24.3
Bumps [filelock](https://github.com/tox-dev/py-filelock) from 3.24.2 to 3.24.3.
- [Release notes](https://github.com/tox-dev/py-filelock/releases)
- [Changelog](https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst)
- [Commits](https://github.com/tox-dev/py-filelock/compare/3.24.2...3.24.3)

---
updated-dependencies:
- dependency-name: filelock
  dependency-version: 3.24.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 05:32:46 +00:00
Matthias de0c275832 Merge pull request #12879 from freqtrade/dependabot/pip/develop/ruff-0.15.2
chore(deps-dev): bump ruff from 0.15.1 to 0.15.2
2026-03-02 06:31:48 +01:00
Matthias 97062ef4b8 Merge pull request #12878 from freqtrade/dependabot/pip/develop/scipy-3a2038e1d7
chore(deps): bump scipy from 1.17.0 to 1.17.1 in the scipy group
2026-03-02 06:30:49 +01:00
Matthias ac5491bf6d Merge pull request #12877 from freqtrade/dependabot/pip/develop/mkdocs-ec1788883e
chore(deps): bump mkdocs-material from 9.7.1 to 9.7.2 in the mkdocs group
2026-03-02 06:30:22 +01:00
dependabot[bot] d49075b4e2 chore(deps): bump rich from 14.3.2 to 14.3.3
Bumps [rich](https://github.com/Textualize/rich) from 14.3.2 to 14.3.3.
- [Release notes](https://github.com/Textualize/rich/releases)
- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Textualize/rich/compare/v14.3.2...v14.3.3)

---
updated-dependencies:
- dependency-name: rich
  dependency-version: 14.3.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 03:04:49 +00:00
dependabot[bot] e9f3543040 chore(deps): bump ast-comments from 1.2.3 to 1.3.0
Bumps [ast-comments](https://github.com/t3rn0/ast-comments) from 1.2.3 to 1.3.0.
- [Release notes](https://github.com/t3rn0/ast-comments/releases)
- [Commits](https://github.com/t3rn0/ast-comments/compare/1.2.3...1.3.0)

---
updated-dependencies:
- dependency-name: ast-comments
  dependency-version: 1.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 03:04:45 +00:00
dependabot[bot] 022134a652 chore(deps): bump uvicorn from 0.40.0 to 0.41.0
Bumps [uvicorn](https://github.com/Kludex/uvicorn) from 0.40.0 to 0.41.0.
- [Release notes](https://github.com/Kludex/uvicorn/releases)
- [Changelog](https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md)
- [Commits](https://github.com/Kludex/uvicorn/compare/0.40.0...0.41.0)

---
updated-dependencies:
- dependency-name: uvicorn
  dependency-version: 0.41.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 03:04:14 +00:00
dependabot[bot] e551cb0bfe chore(deps): bump ccxt from 4.5.39 to 4.5.40
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.39 to 4.5.40.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.39...v4.5.40)

---
updated-dependencies:
- dependency-name: ccxt
  dependency-version: 4.5.40
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 03:04:05 +00:00
dependabot[bot] 2731decf60 chore(deps-dev): bump isort from 7.0.0 to 8.0.0
Bumps [isort](https://github.com/PyCQA/isort) from 7.0.0 to 8.0.0.
- [Release notes](https://github.com/PyCQA/isort/releases)
- [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md)
- [Commits](https://github.com/PyCQA/isort/compare/7.0.0...8.0.0)

---
updated-dependencies:
- dependency-name: isort
  dependency-version: 8.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 03:03:54 +00:00
dependabot[bot] 5dad681ab6 chore(deps): bump fastapi from 0.129.0 to 0.131.0
Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.129.0 to 0.131.0.
- [Release notes](https://github.com/fastapi/fastapi/releases)
- [Commits](https://github.com/fastapi/fastapi/compare/0.129.0...0.131.0)

---
updated-dependencies:
- dependency-name: fastapi
  dependency-version: 0.131.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 03:03:44 +00:00
dependabot[bot] 96f7c1e37b chore(deps-dev): bump ruff from 0.15.1 to 0.15.2
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.1 to 0.15.2.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.15.1...0.15.2)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.15.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 03:03:35 +00:00
dependabot[bot] bab787efb1 chore(deps): bump scipy from 1.17.0 to 1.17.1 in the scipy group
Bumps the scipy group with 1 update: [scipy](https://github.com/scipy/scipy).


Updates `scipy` from 1.17.0 to 1.17.1
- [Release notes](https://github.com/scipy/scipy/releases)
- [Commits](https://github.com/scipy/scipy/compare/v1.17.0...v1.17.1)

---
updated-dependencies:
- dependency-name: scipy
  dependency-version: 1.17.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: scipy
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 03:03:24 +00:00
dependabot[bot] 2601be0777 chore(deps): bump mkdocs-material in the mkdocs group
Bumps the mkdocs group with 1 update: [mkdocs-material](https://github.com/squidfunk/mkdocs-material).


Updates `mkdocs-material` from 9.7.1 to 9.7.2
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.7.1...9.7.2)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-version: 9.7.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: mkdocs
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 03:03:12 +00:00
Stefano e487b76d1e Merge branch 'main-stash' of https://github.com/stash86/freqtrade into main-stash 2026-03-02 10:24:52 +09:00
Stefano 5788a75acc add tests to satisfy codecov 2026-03-02 10:24:45 +09:00
Stefano 64f87fe187 Update freqtrade/plugins/pairlist/CrossMarketPairList.py
Co-authored-by: Matthias <xmatthias@outlook.com>
2026-03-01 08:28:56 +09:00
Matthias 84a680d6c3 fix: improve non-matching pairs filter 2026-02-28 13:32:01 +01:00
Matthias 56d73e0d74 test: update tests for new, simplified scenarios 2026-02-28 13:03:48 +01:00
Matthias b8220a0a46 fix: Support non-utf8 characters in pair filenames 2026-02-28 13:03:19 +01:00
Matthias 31bec6b65e fix: allow chinese names as pair names 2026-02-28 13:03:19 +01:00
Matthias a73028796c chore: bump version to 2026.3-dev 2026-02-28 08:07:35 +01:00
Stefano 3b59616cbe add to checma 2026-02-28 11:03:24 +09:00
Stefano 818162b630 fix letters' case 2026-02-28 11:01:45 +09:00
Stefano 991a1b1ab7 add tests 2026-02-28 10:58:34 +09:00
Stefano b94b0926a7 Merge branch 'freqtrade:develop' into main-stash 2026-02-27 16:53:10 +09:00
Matthias f7b11c5166 Merge pull request #12863 from ABSllk/fix-pairlock-expiration
fix: align pairlock backtesting expiration condition with live/dry run
2026-02-27 07:02:04 +01:00
Matthias 2e92fccd7b Merge pull request #12865 from stash86/develop-copy
move pair prefixes to constants, update prefixes
2026-02-27 06:38:40 +01:00
Stefano 09c60b9543 remove M 2026-02-27 14:17:46 +09:00
Matthias 166476b21c refactor: remove unused method 2026-02-26 20:17:35 +01:00
ABS 3a775a5b65 test: align backtest_pricecontours expected trades with correctly fixed pairlock expiry duration 2026-02-26 14:23:42 +08:00
Matthias ab9b6989be fix: historic precision must also workf or big numbers 2026-02-26 07:14:37 +01:00
Matthias 1f69cafd16 Merge pull request #12867 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-02-26 06:35:22 +01:00
Freqtrade Bot 7030b0bfcc chore: update pre-commit hooks 2026-02-26 04:13:10 +00:00
Stefano 8fb21e8f50 change into pairlist plugin 2026-02-25 17:17:26 +09:00
Stefano f0dd3e4ab8 move pair prefixes to constants 2026-02-25 16:17:35 +09:00
Stefano 9719f28795 add crossmarketfilter 2026-02-25 15:51:56 +09:00
Matthias 402ef216c3 chore: bump dockerfile from 3.13.11 to 3.13.12 2026-02-25 07:24:36 +01:00
Matthias 5f585e330f docs: Add discord server Badge 2026-02-25 07:20:25 +01:00
Matthias 6d04874e26 docs: update coverage badge 2026-02-24 23:14:53 +01:00
Matthias 4b45e3f3d2 chore(ci): bump pester version in Ci 2026-02-24 22:34:25 +01:00
Matthias 4359de7cc5 test: fix exchange.close test warnings 2026-02-24 22:01:50 +01:00
Matthias 48015a9b1b fix: path traversal in web_ui 2026-02-24 21:52:37 +01:00
Matthias 34df7b1793 test: add test for path traversal fix 2026-02-24 21:50:23 +01:00
Matthias 429276cac6 test: add tests for base64 strategy verification 2026-02-24 21:20:48 +01:00
Matthias e7154c93a9 fix: disallow base64 strategies through rpc endpoints 2026-02-24 21:20:34 +01:00
Matthias 523a9d644b test: update test for new error message 2026-02-24 21:12:00 +01:00
Matthias 3a6311b7fc refactor: extract check for base64 strategies 2026-02-24 21:11:52 +01:00
Matthias f6dbca35f3 fix: safe_value_dict on a non-iterable object 2026-02-24 20:33:20 +01:00
Matthias 07e1088839 test: improve safe_value_nested test 2026-02-24 20:31:05 +01:00
Matthias 74d373e37d docs: improve contributing formatting 2026-02-24 18:51:22 +01:00
Matthias 6ce4d1a7c5 docs: update contributing about AI usage 2026-02-24 18:24:34 +01:00
ABS 402a3bb2c2 Merge branch 'freqtrade:develop' into fix-pairlock-expiration 2026-02-24 15:21:22 +08:00
ABS 961eaef2a5 fix: align pairlock backtesting expiration condition with live/dry run 2026-02-24 15:19:09 +08:00
Matthias 6e49a90730 docs: improve some doc formatting/wording 2026-02-24 06:44:24 +01:00
Matthias 246a9049e6 Merge pull request #12862 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2026-02-24 06:38:39 +01:00
Freqtrade Bot 816f81e5b4 chore: update pre-commit hooks 2026-02-24 03:48:10 +00:00
Matthias 49e32b2600 Merge pull request #12835 from ABSllk/feat/fix-max-drawdown-protection
Change max drawdown protection calculation
2026-02-23 20:32:44 +01:00
Matthias b6993f0b24 test: fix random test failure due to missing mandatory key 2026-02-23 20:14:20 +01:00
ABS 58079a8b50 refactor: fetch starting_balance only once at backtest initialization 2026-02-23 16:15:43 +08:00
Matthias bdf080155d Merge pull request #12855 from freqtrade/dependabot/pip/develop/xgboost-3.2.0
chore(deps): bump xgboost from 3.1.3 to 3.2.0
2026-02-23 06:37:24 +01:00
Matthias 52fede6307 Merge pull request #12854 from freqtrade/dependabot/pip/develop/ccxt-4.5.39
chore(deps): bump ccxt from 4.5.38 to 4.5.39
2026-02-23 06:34:39 +01:00
Matthias 7d6c80fa7c Merge pull request #12853 from freqtrade/dependabot/pip/develop/cachetools-7.0.1
chore(deps): bump cachetools from 7.0.0 to 7.0.1
2026-02-23 06:33:48 +01:00
Matthias 814111adb9 Merge pull request #12852 from freqtrade/dependabot/pip/develop/fastapi-0.129.0
chore(deps): bump fastapi from 0.128.5 to 0.129.0
2026-02-23 06:33:33 +01:00
Matthias f0f4191dcf Merge pull request #12851 from freqtrade/dependabot/pip/develop/filelock-3.24.2
chore(deps): bump filelock from 3.20.3 to 3.24.2
2026-02-23 06:33:11 +01:00
Matthias 9a80a11577 Merge pull request #12850 from freqtrade/dependabot/pip/develop/ruff-0.15.1
chore(deps-dev): bump ruff from 0.15.0 to 0.15.1
2026-02-23 06:32:39 +01:00
Matthias 5551a287a8 Merge pull request #12857 from freqtrade/dependabot/pip/develop/markdown-3.10.2
chore(deps): bump markdown from 3.10.1 to 3.10.2
2026-02-23 06:32:06 +01:00
Matthias b0f7c91548 Merge pull request #12856 from freqtrade/dependabot/pip/develop/pymdown-extensions-10.21
chore(deps): bump pymdown-extensions from 10.20.1 to 10.21
2026-02-23 06:31:49 +01:00
dependabot[bot] 9232e17af4 chore(deps): bump markdown from 3.10.1 to 3.10.2
Bumps [markdown](https://github.com/Python-Markdown/markdown) from 3.10.1 to 3.10.2.
- [Release notes](https://github.com/Python-Markdown/markdown/releases)
- [Changelog](https://github.com/Python-Markdown/markdown/blob/master/docs/changelog.md)
- [Commits](https://github.com/Python-Markdown/markdown/compare/3.10.1...3.10.2)

---
updated-dependencies:
- dependency-name: markdown
  dependency-version: 3.10.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-23 03:04:11 +00:00
dependabot[bot] d962137d24 chore(deps): bump pymdown-extensions from 10.20.1 to 10.21
Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 10.20.1 to 10.21.
- [Release notes](https://github.com/facelessuser/pymdown-extensions/releases)
- [Commits](https://github.com/facelessuser/pymdown-extensions/commits/10.21)

---
updated-dependencies:
- dependency-name: pymdown-extensions
  dependency-version: '10.21'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-23 03:04:07 +00:00
dependabot[bot] 22c91137bb chore(deps): bump xgboost from 3.1.3 to 3.2.0
Bumps [xgboost](https://github.com/dmlc/xgboost) from 3.1.3 to 3.2.0.
- [Release notes](https://github.com/dmlc/xgboost/releases)
- [Changelog](https://github.com/dmlc/xgboost/blob/master/NEWS.md)
- [Commits](https://github.com/dmlc/xgboost/compare/v3.1.3...v3.2.0)

---
updated-dependencies:
- dependency-name: xgboost
  dependency-version: 3.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-23 03:04:04 +00:00
dependabot[bot] 92b8bdd113 chore(deps): bump ccxt from 4.5.38 to 4.5.39
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.38 to 4.5.39.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.38...v4.5.39)

---
updated-dependencies:
- dependency-name: ccxt
  dependency-version: 4.5.39
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-23 03:03:55 +00:00
dependabot[bot] 3c5178b002 chore(deps): bump cachetools from 7.0.0 to 7.0.1
Bumps [cachetools](https://github.com/tkem/cachetools) from 7.0.0 to 7.0.1.
- [Changelog](https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tkem/cachetools/compare/v7.0.0...v7.0.1)

---
updated-dependencies:
- dependency-name: cachetools
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-23 03:03:43 +00:00
dependabot[bot] 8231005225 chore(deps): bump fastapi from 0.128.5 to 0.129.0
Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.128.5 to 0.129.0.
- [Release notes](https://github.com/fastapi/fastapi/releases)
- [Commits](https://github.com/fastapi/fastapi/compare/0.128.5...0.129.0)

---
updated-dependencies:
- dependency-name: fastapi
  dependency-version: 0.129.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-23 03:03:36 +00:00
dependabot[bot] 2646313c11 chore(deps): bump filelock from 3.20.3 to 3.24.2
Bumps [filelock](https://github.com/tox-dev/py-filelock) from 3.20.3 to 3.24.2.
- [Release notes](https://github.com/tox-dev/py-filelock/releases)
- [Changelog](https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst)
- [Commits](https://github.com/tox-dev/py-filelock/compare/3.20.3...3.24.2)

---
updated-dependencies:
- dependency-name: filelock
  dependency-version: 3.24.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-23 03:03:31 +00:00
dependabot[bot] 12b4875e24 chore(deps-dev): bump ruff from 0.15.0 to 0.15.1
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.0 to 0.15.1.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.15.0...0.15.1)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.15.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-23 03:03:13 +00:00
ABS 6a98df1c71 Merge branch 'freqtrade:develop' into feat/fix-max-drawdown-protection 2026-02-23 10:36:08 +08:00
ABS a5d24f14cb docs: clarify MaxDrawdown calculation modes and update example 2026-02-23 10:34:59 +08:00
ABS 50f914d6d5 fix: pass starting_balance to protection manager in backtest 2026-02-23 10:34:41 +08:00
Matthias b4422131fb chore: move show_sensitive warning
out of datadir options
2026-02-22 19:51:51 +01:00
Matthias f61b50dbfc chore: improved docstring 2026-02-21 20:35:50 +01:00
Matthias ce590cced7 chore: clarify --export-filename Deprecation messages
part of #12846
2026-02-21 20:20:14 +01:00
Matthias a417af1ff0 chore: add note to todo about still running jobs 2026-02-21 16:56:55 +01:00
Matthias d2e650d188 chore: remove missleading comment in help 2026-02-21 16:34:04 +01:00
Matthias 088516b2ed chore: Update help to clarify backtest-filename deprecation
closes #12846
2026-02-21 13:19:38 +01:00
Matthias 797ea46bb3 Merge pull request #12840 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-02-19 06:49:54 +01:00
Freqtrade Bot 96c0a6296f chore: update pre-commit hooks 2026-02-19 04:13:39 +00:00
ABS e524e030ef docs: clarify mode behavior and sample config in MaxDrawdown protection 2026-02-19 04:21:32 +08:00
ABS e19d96f85c test: improve MaxDrawdown mode coverage and naming 2026-02-19 04:20:21 +08:00
ABS 0672d8f094 refactor: limit pre-window balance aggregation to equity mode 2026-02-19 04:19:27 +08:00
ABS 780858f538 Merge branch 'freqtrade:develop' into feat/fix-max-drawdown-protection 2026-02-19 04:15:09 +08:00
Matthias 7ec495be67 Merge pull request #12839 from dux-helektra/develop
`/ping` endpoint support HEAD request method
2026-02-18 18:27:57 +01:00
ABS d27aef2063 fix: correct parameter naming 2026-02-18 20:59:02 +08:00
dux-helektra d7d07bde75 /ping route support HEAD request method
Allow services like Uptimerobot to monitor the WebUI which uses `HEAD` request method because it is lighter whereas in order to use `GET` method, payment is required.

There's no significant impact for this changes.
2026-02-18 11:16:21 +08:00
ABS f54ccde5fc Merge branch 'freqtrade:develop' into feat/fix-max-drawdown-protection 2026-02-17 15:20:40 +08:00
ABS e1d7c7a081 test: update MaxDrawdown protection tests for starting_balance and calculation modes 2026-02-17 15:20:12 +08:00
ABS d593384219 docs: update MaxDrawdown protections documentation with new calculation methods 2026-02-17 15:19:26 +08:00
ABS 5c737d977d refactor: optimize performance and remove redundant logic in protections 2026-02-17 15:18:22 +08:00
Matthias 22c0af9bb1 Merge pull request #12837 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2026-02-17 06:35:21 +01:00
Freqtrade Bot 1c21b092e6 chore: update pre-commit hooks 2026-02-17 03:48:08 +00:00
Matthias 2325e5f535 chore: reduce binance futures candle count to 499
closes #12751
2026-02-16 19:54:36 +01:00
ABS dbaece9462 docs: update MaxDrawdown description to reflect equity-based logic 2026-02-16 20:43:39 +08:00
ABS edd33ab77e Test: update MaxDrawdown tests to match new equity-based logic 2026-02-16 20:32:18 +08:00
ABS 38934ddda2 Feat: implement accurate drawdown calculation in MaxDrawdown protection 2026-02-16 20:32:02 +08:00
ABS 5c9455c32a Refactor: update IProtection interface to support starting_balance 2026-02-16 20:31:43 +08:00
Matthias 9e2eca3b8b Merge pull request #12829 from freqtrade/dependabot/pip/develop/ccxt-4.5.38
chore(deps): bump ccxt from 4.5.36 to 4.5.38
2026-02-16 06:40:21 +01:00
Matthias 82a487ec50 Merge pull request #12832 from freqtrade/dependabot/pip/develop/fastapi-0.128.5
chore(deps): bump fastapi from 0.128.0 to 0.128.5
2026-02-16 06:38:30 +01:00
Matthias 466db15ccb Merge pull request #12831 from freqtrade/dependabot/pip/develop/tqdm-4.67.3
chore(deps): bump tqdm from 4.67.2 to 4.67.3
2026-02-16 06:38:01 +01:00
Matthias c7dfb005ba Merge pull request #12833 from freqtrade/dependabot/github_actions/develop/astral-sh/setup-uv-7.3.0
chore(deps): bump astral-sh/setup-uv from 7.2.0 to 7.3.0
2026-02-16 06:37:37 +01:00
Matthias 82ae8b64e4 Merge pull request #12830 from freqtrade/dependabot/pip/develop/orjson-3.11.7
chore(deps): bump orjson from 3.11.6 to 3.11.7
2026-02-16 06:37:21 +01:00
dependabot[bot] 1ffc2e47a1 chore(deps): bump astral-sh/setup-uv from 7.2.0 to 7.3.0
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.2.0 to 7.3.0.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/61cb8a9741eeb8a550a1b8544337180c0fc8476b...eac588ad8def6316056a12d4907a9d4d84ff7a3b)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 7.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-16 03:03:57 +00:00
dependabot[bot] a5c392e176 chore(deps): bump fastapi from 0.128.0 to 0.128.5
Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.128.0 to 0.128.5.
- [Release notes](https://github.com/fastapi/fastapi/releases)
- [Commits](https://github.com/fastapi/fastapi/compare/0.128.0...0.128.5)

---
updated-dependencies:
- dependency-name: fastapi
  dependency-version: 0.128.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-16 03:03:50 +00:00
dependabot[bot] 8f9754dd54 chore(deps): bump tqdm from 4.67.2 to 4.67.3
Bumps [tqdm](https://github.com/tqdm/tqdm) from 4.67.2 to 4.67.3.
- [Release notes](https://github.com/tqdm/tqdm/releases)
- [Commits](https://github.com/tqdm/tqdm/compare/v4.67.2...v4.67.3)

---
updated-dependencies:
- dependency-name: tqdm
  dependency-version: 4.67.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-16 03:03:35 +00:00
dependabot[bot] b3b3b1d134 chore(deps): bump orjson from 3.11.6 to 3.11.7
Bumps [orjson](https://github.com/ijl/orjson) from 3.11.6 to 3.11.7.
- [Release notes](https://github.com/ijl/orjson/releases)
- [Changelog](https://github.com/ijl/orjson/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ijl/orjson/compare/3.11.6...3.11.7)

---
updated-dependencies:
- dependency-name: orjson
  dependency-version: 3.11.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-16 03:03:28 +00:00
dependabot[bot] 26fd70ce4b chore(deps): bump ccxt from 4.5.36 to 4.5.38
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.36 to 4.5.38.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.36...v4.5.38)

---
updated-dependencies:
- dependency-name: ccxt
  dependency-version: 4.5.38
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-16 03:03:15 +00:00
Matthias 18aed385f9 fix: increment latest ID by 1 on migration
part of  #12825
2026-02-15 19:28:11 +01:00
Matthias e6db0ab00d fix: pairlocks table migration on postgres 2026-02-15 18:27:22 +01:00
Matthias 8ed1e6c394 chore: refactor get_last_sequence_ids 2026-02-15 18:24:02 +01:00
Matthias da62e614d7 chore: improve typesafety for migrations 2026-02-15 18:10:42 +01:00
Matthias ca94909ccc test: improve test for migrate_set_sequence_id's 2026-02-15 18:09:05 +01:00
Matthias 131c1aaf13 chore: clarify set_sequence_id's docstring 2026-02-15 18:08:26 +01:00
Matthias 5f06b1d43e test: update dry_order_fill test 2026-02-15 16:14:00 +01:00
Matthias c999de6291 feat: immediately triggering stoploss orders should cause emergency exits
closes #12824
2026-02-15 16:12:13 +01:00
Matthias a42c8faeca test: add test for immediately triggering stop order
part of #12824
2026-02-15 16:11:54 +01:00
Matthias ecfbfa2a35 test: try fix for test_exchangews_ohlcv random failures 2026-02-15 11:49:01 +01:00
Matthias 6b86214ca8 fix: random hangs in CI 2026-02-14 18:09:33 +01:00
Matthias df6f53ba30 test: update set_sequence_ids test 2026-02-14 16:08:35 +01:00
Matthias 0888f6dba0 feat: add db migration functionality for custom-data and kv store
closes #12825
2026-02-14 16:08:26 +01:00
Matthias 5d3c798dfd fix: further improve exchange.close fix 2026-02-14 13:22:46 +01:00
Matthias 93d2397f72 fix: improved shutdown loop fix for tests 2026-02-14 08:29:08 +01:00
Matthias 05e759a38c fix: check if loop exists
avoids errors if exchange init shuts down before the loop is created

closes #12822
2026-02-14 08:11:13 +01:00
Matthias 67eaa4ac49 fix: prevent warnings in online tests 2026-02-13 21:03:49 +01:00
Matthias e8aeebb123 fix: use safe_value_nested for features 2026-02-13 20:22:32 +01:00
Matthias d121e97067 test: add test for safe_value_nested 2026-02-13 20:14:01 +01:00
Matthias bdf5c4de8e feat: add safe_value_nested function 2026-02-13 20:13:49 +01:00
Matthias 7492cf8bf5 docs: update doc links from latest to stable 2026-02-12 19:03:08 +01:00
Matthias d29d4cba66 chore: update doc links from latest to stable 2026-02-12 19:01:42 +01:00
Matthias 655d61e560 docs: Have readme links point to the documentation 2026-02-12 07:03:58 +01:00
Matthias ba6d210662 Merge pull request #12811 from stash86/main-stash
Add note about different pair naming for HIP-3
2026-02-12 07:03:44 +01:00
Matthias aff46acdd0 Merge pull request #12816 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-02-12 06:36:40 +01:00
Freqtrade Bot 5a16cbe602 chore: update pre-commit hooks 2026-02-12 04:14:36 +00:00
Matthias 519f2d93ba test: update tests for new stoploss_from_absolute behavior 2026-02-11 07:15:29 +01:00
Matthias 646c091e02 fix: don't bracked stoploss to 1
it's problematic for short trades - especially if they move past the 100% profit  margin - as price starts to trail.
2026-02-11 07:15:29 +01:00
Matthias 12c3698480 Merge pull request #12813 from freqtrade/dependabot/pip/cryptography-46.0.5
chore(deps): bump cryptography from 46.0.4 to 46.0.5
2026-02-11 06:57:43 +01:00
dependabot[bot] c86acd20d6 chore(deps): bump cryptography from 46.0.4 to 46.0.5
Bumps [cryptography](https://github.com/pyca/cryptography) from 46.0.4 to 46.0.5.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/46.0.4...46.0.5)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 46.0.5
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-11 03:01:11 +00:00
Matthias 60b787edc9 chore: extract schema.json 2026-02-10 20:34:03 +01:00
Matthias eec33190d2 chore: jwt_secret_key is guaranteed to be in the schema now 2026-02-10 20:33:39 +01:00
Matthias 6e38759bd1 chore: add new randomDefault value 2026-02-10 20:22:48 +01:00
Matthias 6a242356a0 docs: update docs about jwt_secret_key 2026-02-10 20:20:29 +01:00
Matthias 04d2ea8773 chore: update sample configs with longer jwt_secret key 2026-02-10 20:19:00 +01:00
Matthias d78ffd7a05 test: use longer JWT_Secret_key for tests 2026-02-10 20:15:35 +01:00
Matthias 3f21a18f46 Merge pull request #12810 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2026-02-10 19:56:09 +01:00
Matthias c4514f94cf feat: show supported python versions in windows script
closes #12812
2026-02-10 19:50:06 +01:00
Matthias af39ec1e07 fix: improve setup.ps1 stability 2026-02-10 19:50:06 +01:00
Matthias c02530759d feat: show supported versions for setup.sh script
as proposed in #12812
2026-02-10 19:50:06 +01:00
Matthias 6df42502ac chore: simplify MarginMode init 2026-02-10 19:01:08 +01:00
Stefano fea13d1d3d revert wrong markdownlint "fix" 2026-02-10 16:40:41 +09:00
Matthias c7685febcf Merge pull request #12808 from freqtrade/feat/strategy_params
add Strategy parameters  to api
2026-02-10 07:21:05 +01:00
Matthias abf5f2b49a test: update test for strEnum 2026-02-10 07:20:01 +01:00
Matthias 24319585b4 refactor: switch SignalTypes to StrEnum 2026-02-10 07:16:01 +01:00
Matthias 812f357d7e refactor: Update to StrEnum where possible 2026-02-10 07:14:16 +01:00
Matthias 51431d9533 chore: update ruff version 0.15.0 2026-02-10 07:09:40 +01:00
Matthias eb81c70523 chore: format according to 2026 styleguide 2026-02-10 07:05:06 +01:00
Matthias b52805cd96 chore: split Decimal and RealParameters 2026-02-10 06:49:45 +01:00
Matthias cb1266225e chore: fix unused imports 2026-02-10 06:48:47 +01:00
Matthias 33ba2ad17c chore: don't use empty iterable 2026-02-10 06:43:40 +01:00
Matthias 2f2b36f648 chore: cleanup web_ui definition 2026-02-10 06:42:03 +01:00
Matthias aa1de750e9 test: update test for new response code 2026-02-10 06:41:41 +01:00
Stefano 68410f2f37 add note about HIP-3 pair naming 2026-02-10 14:23:30 +09:00
Freqtrade Bot 1f00c9d680 chore: update pre-commit hooks 2026-02-10 03:57:12 +00:00
Matthias a91fd66abc fix: improve openAPI schema definition 2026-02-09 20:02:09 +01:00
Matthias 4036375759 test: remove pointless test calculation 2026-02-09 20:02:09 +01:00
Matthias 9eb668d08a chore: improve response security 2026-02-09 20:02:09 +01:00
Matthias ed22b4e09b Merge pull request #12796 from onerobotband/develop
Fix regex pattern for model folder matching
2026-02-09 08:33:35 +01:00
Matthias 52090d7b8e Merge pull request #12804 from freqtrade/dependabot/github_actions/develop/zizmorcore/zizmor-action-0.5.0
chore(deps): bump zizmorcore/zizmor-action from 0.4.1 to 0.5.0
2026-02-09 07:11:12 +01:00
Matthias 3a065c27e8 Merge pull request #12805 from freqtrade/dependabot/pip/develop/cryptography-46.0.4
chore(deps): bump cryptography from 46.0.3 to 46.0.4
2026-02-09 07:11:03 +01:00
Matthias a14f54735c Merge pull request #12799 from freqtrade/dependabot/pip/develop/pyjwt-2.11.0
chore(deps): bump pyjwt from 2.10.1 to 2.11.0
2026-02-09 07:03:00 +01:00
Matthias c5697c7d68 Apply suggestion from @Copilot
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-09 06:52:56 +01:00
Matthias 6381a32685 Merge pull request #12807 from freqtrade/dependabot/pip/develop/cachetools-7.0.0
chore(deps): bump cachetools from 6.2.5 to 7.0.0
2026-02-09 06:37:39 +01:00
dependabot[bot] 42230fdd0e chore(deps): bump pyjwt from 2.10.1 to 2.11.0
Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.10.1 to 2.11.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.10.1...2.11.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-version: 2.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-09 05:36:20 +00:00
dependabot[bot] 4934a83a2d chore(deps): bump cryptography from 46.0.3 to 46.0.4
Bumps [cryptography](https://github.com/pyca/cryptography) from 46.0.3 to 46.0.4.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/46.0.3...46.0.4)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 46.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-09 05:35:32 +00:00
Matthias 0ef0ff2a78 Merge pull request #12797 from freqtrade/dependabot/pip/develop/tqdm-4.67.2
chore(deps): bump tqdm from 4.67.1 to 4.67.2
2026-02-09 06:35:32 +01:00
Matthias 80d23f1ba1 Merge pull request #12803 from freqtrade/dependabot/pip/develop/numpy-2.4.2
chore(deps): bump numpy from 2.4.1 to 2.4.2
2026-02-09 06:34:58 +01:00
Matthias 59b05ece77 Merge pull request #12801 from freqtrade/dependabot/pip/develop/psutil-7.2.2
chore(deps): bump psutil from 7.2.1 to 7.2.2
2026-02-09 06:34:42 +01:00
Matthias e467405e60 Merge pull request #12806 from freqtrade/dependabot/github_actions/develop/docker/login-action-3.7.0
chore(deps): bump docker/login-action from 3.6.0 to 3.7.0
2026-02-09 06:34:25 +01:00
Matthias 1f92c3fd70 Merge pull request #12802 from freqtrade/dependabot/pip/develop/ccxt-4.5.36
chore(deps): bump ccxt from 4.5.35 to 4.5.36
2026-02-09 06:33:11 +01:00
Matthias 74e8875280 Merge pull request #12800 from freqtrade/dependabot/pip/develop/orjson-3.11.6
chore(deps): bump orjson from 3.11.5 to 3.11.6
2026-02-09 06:31:26 +01:00
Matthias 3c44a013e5 Merge pull request #12798 from freqtrade/dependabot/pip/develop/rich-14.3.2
chore(deps): bump rich from 14.3.1 to 14.3.2
2026-02-09 06:30:29 +01:00
dependabot[bot] 8546542a16 chore(deps): bump cachetools from 6.2.5 to 7.0.0
Bumps [cachetools](https://github.com/tkem/cachetools) from 6.2.5 to 7.0.0.
- [Changelog](https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tkem/cachetools/compare/v6.2.5...v7.0.0)

---
updated-dependencies:
- dependency-name: cachetools
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-09 03:04:21 +00:00
dependabot[bot] f56460cc1f chore(deps): bump docker/login-action from 3.6.0 to 3.7.0
Bumps [docker/login-action](https://github.com/docker/login-action) from 3.6.0 to 3.7.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/5e57cd118135c172c3672efd75eb46360885c0ef...c94ce9fb468520275223c153574b00df6fe4bcc9)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 3.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-09 03:04:12 +00:00
dependabot[bot] 54f25b5b8f chore(deps): bump zizmorcore/zizmor-action from 0.4.1 to 0.5.0
Bumps [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) from 0.4.1 to 0.5.0.
- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)
- [Commits](https://github.com/zizmorcore/zizmor-action/compare/135698455da5c3b3e55f73f4419e481ab68cdd95...0dce2577a4760a2749d8cfb7a84b7d5585ebcb7d)

---
updated-dependencies:
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-09 03:04:02 +00:00
dependabot[bot] 541b976b8e chore(deps): bump numpy from 2.4.1 to 2.4.2
Bumps [numpy](https://github.com/numpy/numpy) from 2.4.1 to 2.4.2.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v2.4.1...v2.4.2)

---
updated-dependencies:
- dependency-name: numpy
  dependency-version: 2.4.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-09 03:03:58 +00:00
dependabot[bot] b6c7e24cad chore(deps): bump ccxt from 4.5.35 to 4.5.36
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.35 to 4.5.36.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.35...v4.5.36)

---
updated-dependencies:
- dependency-name: ccxt
  dependency-version: 4.5.36
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-09 03:03:51 +00:00
dependabot[bot] 22d624a25d chore(deps): bump psutil from 7.2.1 to 7.2.2
Bumps [psutil](https://github.com/giampaolo/psutil) from 7.2.1 to 7.2.2.
- [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst)
- [Commits](https://github.com/giampaolo/psutil/compare/release-7.2.1...release-7.2.2)

---
updated-dependencies:
- dependency-name: psutil
  dependency-version: 7.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-09 03:03:40 +00:00
dependabot[bot] d482117fd1 chore(deps): bump orjson from 3.11.5 to 3.11.6
Bumps [orjson](https://github.com/ijl/orjson) from 3.11.5 to 3.11.6.
- [Release notes](https://github.com/ijl/orjson/releases)
- [Changelog](https://github.com/ijl/orjson/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ijl/orjson/compare/3.11.5...3.11.6)

---
updated-dependencies:
- dependency-name: orjson
  dependency-version: 3.11.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-09 03:03:35 +00:00
dependabot[bot] 835f00b106 chore(deps): bump rich from 14.3.1 to 14.3.2
Bumps [rich](https://github.com/Textualize/rich) from 14.3.1 to 14.3.2.
- [Release notes](https://github.com/Textualize/rich/releases)
- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Textualize/rich/compare/v14.3.1...v14.3.2)

---
updated-dependencies:
- dependency-name: rich
  dependency-version: 14.3.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-09 03:03:22 +00:00
dependabot[bot] 55c3b83fa8 chore(deps): bump tqdm from 4.67.1 to 4.67.2
Bumps [tqdm](https://github.com/tqdm/tqdm) from 4.67.1 to 4.67.2.
- [Release notes](https://github.com/tqdm/tqdm/releases)
- [Commits](https://github.com/tqdm/tqdm/compare/v4.67.1...v4.67.2)

---
updated-dependencies:
- dependency-name: tqdm
  dependency-version: 4.67.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-09 03:03:14 +00:00
Matthias 348afa46f0 chore: update api_version to 2.47 2026-02-08 19:41:59 +01:00
Matthias a7890a964f test: add test for /strategy live mode 2026-02-08 13:52:33 +01:00
Matthias ba57ab9a1b feat: add trade mode /strategy endpoint 2026-02-08 13:36:26 +01:00
Matthias ac6b396ed3 chore: improve type-safety 2026-02-08 13:30:23 +01:00
Matthias 570bfef4b3 test: /strategy/ includes random spaces 2026-02-08 13:30:23 +01:00
Matthias 100babc056 test: improve api-strategy test 2026-02-08 13:30:23 +01:00
Matthias 5ab8338c3e feat: add strategy-parameters to /strategy endpoint 2026-02-08 13:30:23 +01:00
Matthias 600b6a7d23 refactor: rename "decimal" variable in Decimal parameter 2026-02-08 13:30:23 +01:00
Matthias f6e465a0ba test: add test for paramType property 2026-02-08 13:30:23 +01:00
Matthias bea006880b feat: add paramType to Strategy Parameters 2026-02-08 13:30:23 +01:00
Matthias a7e35f5d78 chore: cleanup web_ui definition 2026-02-08 13:30:14 +01:00
onerobotband 5fb963abbf Fix regex pattern for model folder matching
Allows freqai to purge model train folders with non-alphanumeric characters in them (eg. hip3 pairs with hyphen)
2026-02-08 11:42:31 +00:00
Matthias 351fe62d18 feat: add prepend_data to download_data endpoint
part of freqtrade/frequi#2743
2026-02-07 13:51:31 +01:00
Matthias 65a713a569 fix: don't break list-strategies if one strategy has invalid parameters 2026-02-07 13:40:51 +01:00
Matthias 646531cbfc test: type ccxt_online test setups 2026-02-06 14:07:39 +01:00
Matthias 8233ca67bb chore: update timing in hopes to improve runtime 2026-02-06 13:00:16 +01:00
Matthias d991069efc Merge pull request #12793 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-02-06 12:58:57 +01:00
Freqtrade Bot d86bca9f00 chore: update pre-commit hooks 2026-02-06 07:03:20 +00:00
Matthias 82f71d8e4b chore(ci): update lev-tier-update to use UV and python 3.14 2026-02-06 08:02:36 +01:00
Matthias 315a1baf2c test: simplified test setup for compat tests 2026-02-05 20:19:06 +01:00
Matthias e5bd33061b test: limit live futures tests to actual futures exchanges 2026-02-05 19:56:04 +01:00
Matthias 06ed6e6b23 test: fix candle-limit live test 2026-02-05 19:42:23 +01:00
Robert Caulk 6814bc84aa fix: Try to fix linting 2026-02-05 17:24:17 +01:00
Robert Caulk 783c365c10 fix: Avoid circular import 2026-02-05 17:15:00 +01:00
Matthias 4a578148e2 Merge pull request #12789 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2026-02-05 09:15:12 +01:00
Matthias 2c0a029187 feat: add markpoint rotate support
closes #12787
2026-02-05 07:09:07 +01:00
Freqtrade Bot a3b83afa84 chore: update pre-commit hooks 2026-02-05 03:51:21 +00:00
Matthias 6c2a5b460e feat: use extra="forbid" in annotation Validations
this can be problematic if many users have additional data in their annotations.
2026-02-04 07:14:03 +01:00
Matthias aa302fe531 docs: improve plot-annotation example 2026-02-04 07:11:39 +01:00
Matthias f2c2e84a74 docs: update point annotation documentation
closes #12784
2026-02-04 06:55:00 +01:00
Matthias d73a173c6e fix: avoid warning for dry stoploss orders 2026-02-03 20:38:05 +01:00
Matthias 110b50a3cb test: improve test_exchangews_ohlcv test setup 2026-02-02 20:30:02 +01:00
Matthias 36f5afe910 chore: bump nbconvert to 7.17.0 2026-02-02 20:09:35 +01:00
Matthias 15f79c19a0 Merge pull request #12766 from freqtrade/dependabot/pip/develop/scipy-d123495ba6
chore(deps-dev): bump scipy-stubs from 1.17.0.1 to 1.17.0.2 in the scipy group
2026-02-02 14:40:56 +01:00
Matthias 7135466092 chore: bump scipy-stubs in pre-commit config 2026-02-02 14:25:06 +01:00
dependabot[bot] e4c25ed07e chore(deps-dev): bump scipy-stubs in the scipy group
Bumps the scipy group with 1 update: [scipy-stubs](https://github.com/scipy/scipy-stubs).


Updates `scipy-stubs` from 1.17.0.1 to 1.17.0.2
- [Release notes](https://github.com/scipy/scipy-stubs/releases)
- [Commits](https://github.com/scipy/scipy-stubs/compare/v1.17.0.1...v1.17.0.2)

---
updated-dependencies:
- dependency-name: scipy-stubs
  dependency-version: 1.17.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: scipy
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 13:20:39 +00:00
Matthias 273ac9a9c0 Merge pull request #12777 from freqtrade/dependabot/pip/develop/sqlalchemy-2.0.46
chore(deps): bump sqlalchemy from 2.0.45 to 2.0.46
2026-02-02 11:23:35 +01:00
Matthias 7007e71dcf chore: bump sqlalchemy in pre-commit config 2026-02-02 10:32:49 +01:00
dependabot[bot] 14247854ce chore(deps): bump sqlalchemy from 2.0.45 to 2.0.46
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.45 to 2.0.46.
- [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases)
- [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst)
- [Commits](https://github.com/sqlalchemy/sqlalchemy/commits)

---
updated-dependencies:
- dependency-name: sqlalchemy
  dependency-version: 2.0.46
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 07:13:53 +00:00
Matthias d863adc8af Merge pull request #12772 from freqtrade/dependabot/pip/develop/ccxt-4.5.35
chore(deps): bump ccxt from 4.5.34 to 4.5.35
2026-02-02 08:11:38 +01:00
Matthias 2e33b1dc56 Merge pull request #12765 from freqtrade/dependabot/pip/develop/types-a0ed531c1e
chore(deps-dev): bump types-python-dateutil from 2.9.0.20251115 to 2.9.0.20260124 in the types group
2026-02-02 07:27:07 +01:00
Matthias d56ae991c2 Merge pull request #12774 from freqtrade/dependabot/pip/develop/packaging-26.0
chore(deps): bump packaging from 25.0 to 26.0
2026-02-02 07:20:47 +01:00
Matthias 2913af90ca Merge pull request #12776 from freqtrade/dependabot/pip/develop/rich-14.3.1
chore(deps): bump rich from 14.2.0 to 14.3.1
2026-02-02 07:10:19 +01:00
Matthias 553e45c948 Merge pull request #12773 from freqtrade/dependabot/pip/develop/torch-2.10.0
chore(deps): bump torch from 2.9.1 to 2.10.0
2026-02-02 06:48:05 +01:00
dependabot[bot] 2364a08fd6 chore(deps): bump ccxt from 4.5.34 to 4.5.35
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.34 to 4.5.35.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.34...v4.5.35)

---
updated-dependencies:
- dependency-name: ccxt
  dependency-version: 4.5.35
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 05:43:06 +00:00
Matthias eed5de4045 Merge pull request #12771 from freqtrade/dependabot/github_actions/develop/peter-evans/create-pull-request-8.1.0
chore(deps): bump peter-evans/create-pull-request from 8.0.0 to 8.1.0
2026-02-02 06:41:01 +01:00
Matthias 71a4f88c8b Merge pull request #12768 from freqtrade/dependabot/pip/develop/optuna-4.7.0
chore(deps): bump optuna from 4.6.0 to 4.7.0
2026-02-02 06:38:06 +01:00
Matthias db1162e0a1 Merge pull request #12775 from freqtrade/dependabot/pip/develop/markdown-3.10.1
chore(deps): bump markdown from 3.10 to 3.10.1
2026-02-02 06:36:29 +01:00
Matthias 40a791985e Merge pull request #12767 from freqtrade/dependabot/pip/develop/pymdown-extensions-10.20.1
chore(deps): bump pymdown-extensions from 10.20 to 10.20.1
2026-02-02 06:36:11 +01:00
Matthias 157669b775 Merge pull request #12769 from freqtrade/dependabot/pip/develop/cachetools-6.2.5
chore(deps): bump cachetools from 6.2.4 to 6.2.5
2026-02-02 06:35:57 +01:00
Matthias 3d8d101bfc chore: bump types-python-dateutil in pre-commit config 2026-02-02 06:35:22 +01:00
Matthias 7e3c8fc8ab Merge pull request #12779 from freqtrade/dependabot/pip/develop/ruff-0.14.14
chore(deps-dev): bump ruff from 0.14.13 to 0.14.14
2026-02-02 06:34:30 +01:00
Matthias c58ac19adf Merge pull request #12778 from freqtrade/dependabot/pip/develop/python-telegram-bot-22.6
chore(deps): bump python-telegram-bot from 22.5 to 22.6
2026-02-02 06:34:19 +01:00
Matthias 35d038cbf7 Merge pull request #12770 from freqtrade/dependabot/github_actions/develop/actions-f50382bc57
chore(deps): bump actions/setup-python from 6.1.0 to 6.2.0 in the actions group
2026-02-02 06:33:31 +01:00
dependabot[bot] 13a5c54338 chore(deps-dev): bump ruff from 0.14.13 to 0.14.14
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.14.13 to 0.14.14.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.14.13...0.14.14)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.14.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 03:04:58 +00:00
dependabot[bot] c0a439fb5f chore(deps): bump python-telegram-bot from 22.5 to 22.6
Bumps [python-telegram-bot](https://github.com/python-telegram-bot/python-telegram-bot) from 22.5 to 22.6.
- [Release notes](https://github.com/python-telegram-bot/python-telegram-bot/releases)
- [Commits](https://github.com/python-telegram-bot/python-telegram-bot/compare/v22.5...v22.6)

---
updated-dependencies:
- dependency-name: python-telegram-bot
  dependency-version: '22.6'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 03:04:48 +00:00
dependabot[bot] 5ce2203786 chore(deps): bump rich from 14.2.0 to 14.3.1
Bumps [rich](https://github.com/Textualize/rich) from 14.2.0 to 14.3.1.
- [Release notes](https://github.com/Textualize/rich/releases)
- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Textualize/rich/compare/v14.2.0...v14.3.1)

---
updated-dependencies:
- dependency-name: rich
  dependency-version: 14.3.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 03:04:32 +00:00
dependabot[bot] f3931c8587 chore(deps): bump markdown from 3.10 to 3.10.1
Bumps [markdown](https://github.com/Python-Markdown/markdown) from 3.10 to 3.10.1.
- [Release notes](https://github.com/Python-Markdown/markdown/releases)
- [Changelog](https://github.com/Python-Markdown/markdown/blob/master/docs/changelog.md)
- [Commits](https://github.com/Python-Markdown/markdown/compare/3.10.0...3.10.1)

---
updated-dependencies:
- dependency-name: markdown
  dependency-version: 3.10.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 03:04:22 +00:00
dependabot[bot] 828abf6326 chore(deps): bump packaging from 25.0 to 26.0
Bumps [packaging](https://github.com/pypa/packaging) from 25.0 to 26.0.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/25.0...26.0)

---
updated-dependencies:
- dependency-name: packaging
  dependency-version: '26.0'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 03:04:16 +00:00
dependabot[bot] 33ebbab6a8 chore(deps): bump torch from 2.9.1 to 2.10.0
Bumps [torch](https://github.com/pytorch/pytorch) from 2.9.1 to 2.10.0.
- [Release notes](https://github.com/pytorch/pytorch/releases)
- [Changelog](https://github.com/pytorch/pytorch/blob/main/RELEASE.md)
- [Commits](https://github.com/pytorch/pytorch/compare/v2.9.1...v2.10.0)

---
updated-dependencies:
- dependency-name: torch
  dependency-version: 2.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 03:04:12 +00:00
dependabot[bot] 0a49816b24 chore(deps): bump peter-evans/create-pull-request from 8.0.0 to 8.1.0
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 8.0.0 to 8.1.0.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/98357b18bf14b5342f975ff684046ec3b2a07725...c0f553fe549906ede9cf27b5156039d195d2ece0)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-version: 8.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 03:04:00 +00:00
dependabot[bot] c77ac9f101 chore(deps): bump actions/setup-python in the actions group
Bumps the actions group with 1 update: [actions/setup-python](https://github.com/actions/setup-python).


Updates `actions/setup-python` from 6.1.0 to 6.2.0
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/83679a892e2d95755f2dac6acb0bfd1e9ac5d548...a309ff8b426b58ec0e2a45f0f869d46889d02405)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 03:03:50 +00:00
dependabot[bot] 820a13f37a chore(deps): bump cachetools from 6.2.4 to 6.2.5
Bumps [cachetools](https://github.com/tkem/cachetools) from 6.2.4 to 6.2.5.
- [Changelog](https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tkem/cachetools/compare/v6.2.4...v6.2.5)

---
updated-dependencies:
- dependency-name: cachetools
  dependency-version: 6.2.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 03:03:48 +00:00
dependabot[bot] 2a29fccd1d chore(deps): bump optuna from 4.6.0 to 4.7.0
Bumps [optuna](https://github.com/optuna/optuna) from 4.6.0 to 4.7.0.
- [Release notes](https://github.com/optuna/optuna/releases)
- [Commits](https://github.com/optuna/optuna/compare/v4.6.0...v4.7.0)

---
updated-dependencies:
- dependency-name: optuna
  dependency-version: 4.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 03:03:40 +00:00
dependabot[bot] b857e19392 chore(deps): bump pymdown-extensions from 10.20 to 10.20.1
Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 10.20 to 10.20.1.
- [Release notes](https://github.com/facelessuser/pymdown-extensions/releases)
- [Commits](https://github.com/facelessuser/pymdown-extensions/commits)

---
updated-dependencies:
- dependency-name: pymdown-extensions
  dependency-version: 10.20.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 03:03:36 +00:00
dependabot[bot] b4bdc66c39 chore(deps-dev): bump types-python-dateutil in the types group
Bumps the types group with 1 update: [types-python-dateutil](https://github.com/typeshed-internal/stub_uploader).


Updates `types-python-dateutil` from 2.9.0.20251115 to 2.9.0.20260124
- [Commits](https://github.com/typeshed-internal/stub_uploader/commits)

---
updated-dependencies:
- dependency-name: types-python-dateutil
  dependency-version: 2.9.0.20260124
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 03:02:51 +00:00
Robert Caulk 455954e0e3 feat: Add tensorboard callback to lightgbm 2026-02-01 15:14:48 +01:00
230 changed files with 55118 additions and 42691 deletions
+13 -5
View File
@@ -1,8 +1,10 @@
version: 2
updates:
- package-ecosystem: docker
cooldown:
default-days: 7
- package-ecosystem: docker # zizmor: ignore[dependabot-cooldown] Docker does not support cooldowns at the moment.
# Docker does not support cooldowns at the moment.
# https://github.com/dependabot/dependabot-core/issues/14044
# cooldown:
# default-days: 7
directories:
- "/"
- "/docker"
@@ -47,7 +49,11 @@ updates:
patterns:
- "scipy"
- "scipy-stubs"
gymnasium:
patterns:
- "gymnasium"
- "stable-baselines3"
- "sb3-contrib"
- package-ecosystem: "github-actions"
directory: "/"
cooldown:
@@ -61,5 +67,7 @@ updates:
groups:
actions:
patterns:
# Combine updates for github provided actions
- "actions/*"
docker:
patterns:
- "docker/*"
@@ -2,7 +2,7 @@ name: Binance Leverage tiers update
on:
schedule:
- cron: "0 3 * * 4"
- cron: "25 2 * * 4"
# on demand
workflow_dispatch:
@@ -24,12 +24,15 @@ jobs:
with:
persist-credentials: false
- uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
- name: Install uv and Python 🐍
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
with:
python-version: "3.12"
activate-environment: true
enable-cache: false
python-version: "3.14"
- name: Install ccxt
run: pip install ccxt
run: uv pip install $(grep -E "^ccxt==" requirements.txt) $(grep -E "^orjson==" requirements.txt)
- name: Run leverage tier update
env:
@@ -39,7 +42,7 @@ jobs:
run: python build_helpers/binance_update_lev_tiers.py
- uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 # v8.0.0
- uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
with:
token: ${{ secrets.REPO_SCOPED_TOKEN }}
add-paths: freqtrade/exchange/binance_leverage_tiers.json
@@ -48,7 +51,7 @@ jobs:
Dependencies
branch: update/binance-leverage-tiers
title: Update Binance Leverage Tiers
commit-message: "chore: update pre-commit hooks"
commit-message: "chore: update binance leverage tiers"
committer: Freqtrade Bot <154552126+freqtrade-bot@users.noreply.github.com>
author: Freqtrade Bot <154552126+freqtrade-bot@users.noreply.github.com>
body: Update binance leverage tiers.
+60 -72
View File
@@ -32,13 +32,8 @@ jobs:
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
with:
python-version: ${{ matrix.python-version }}
- name: Install uv
uses: astral-sh/setup-uv@61cb8a9741eeb8a550a1b8544337180c0fc8476b # v7.2.0
- name: Install uv and Python 🐍
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
with:
activate-environment: true
enable-cache: true
@@ -55,7 +50,6 @@ jobs:
- name: Installation (python)
run: |
uv pip install --upgrade wheel
uv pip install -r requirements-dev.txt
uv pip install -e ft_client/
uv pip install -e .
@@ -74,11 +68,11 @@ jobs:
run: |
pytest --random-order --cov=freqtrade --cov=freqtrade_client --cov-config=.coveragerc
- uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
- uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
if: (runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-24.04')
with:
fail_ci_if_error: true
token: ${{ secrets.CODECOV_TOKEN }}
token: ${{ secrets.CODECOV_TOKEN }} # zizmor: ignore[secrets-outside-env] Intentionally not using environment variable.
- name: Cleanup codecov dirty state files
if: (runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-24.04')
@@ -137,10 +131,6 @@ jobs:
freqtrade create-userdir --userdir user_data
freqtrade hyperopt --datadir tests/testdata -e 6 --strategy SampleStrategy --hyperopt-loss SharpeHyperOptLossDaily --print-all
- name: Sort imports (isort)
run: |
isort --check .
- name: Run Ruff
run: |
ruff check --output-format=github
@@ -160,19 +150,22 @@ jobs:
run: |
$PSVersionTable
Get-PSRepository | Format-List *
Set-PSRepository psgallery -InstallationPolicy trusted
Install-Module -Name Pester -RequiredVersion 5.3.1 -Confirm:$false -Force -SkipPublisherCheck
if (-not (Get-PSRepository -Name PSGallery -ErrorAction SilentlyContinue)) {
Register-PSRepository -Default
}
Set-PSRepository PSGallery -InstallationPolicy Trusted
Install-Module -Name Pester -RequiredVersion 5.7.1 -Confirm:$false -Force -SkipPublisherCheck
$Error.clear()
Invoke-Pester -Path "tests" -CI
if ($Error.Length -gt 0) {exit 1}
- name: Discord notification
uses: rjstone/discord-webhook-notify@c2597273488aeda841dd1e891321952b51f7996f #v2.2.1
uses: sarisia/actions-status-discord@eb045afee445dc055c18d3d90bd0f244fd062708 # v1.16.0
if: ${{ failure() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) }}
with:
severity: error
details: Freqtrade CI failed on ${{ matrix.os }} with Python ${{ matrix.python-version }}!
webhookUrl: ${{ secrets.DISCORD_WEBHOOK }}
color: '#FF0000' # red
title: Freqtrade CI failed on ${{ matrix.os }} with Python ${{ matrix.python-version }}!
webhook: ${{ secrets.DISCORD_WEBHOOK }} # zizmor: ignore[secrets-outside-env] Intentionally not using environment variable.
mypy-version-check:
name: "Mypy Version Check"
@@ -182,14 +175,15 @@ jobs:
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 #v6.1.0
- name: Install uv and Python 🐍
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
with:
python-version: "3.12"
activate-environment: true
python-version: "3.13"
- name: pre-commit dependencies
run: |
pip install pyaml
uv pip install $(grep -E "^pyyaml==" requirements-dev.txt)
python build_helpers/pre_commit_update.py
pre-commit:
@@ -200,9 +194,11 @@ jobs:
with:
persist-credentials: false
- uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
- name: Set up Python 🐍
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: "3.12"
python-version: "3.13"
- uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1
docs-check:
@@ -217,51 +213,49 @@ jobs:
run: |
./tests/test_docs.sh
- name: Set up Python
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
- name: Install uv and Python 🐍
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
with:
python-version: "3.12"
activate-environment: true
python-version: "3.13"
- name: Documentation build
run: |
pip install -r docs/requirements-docs.txt
uv pip install -r docs/requirements-docs.txt
mkdocs build
- name: Discord notification
uses: rjstone/discord-webhook-notify@c2597273488aeda841dd1e891321952b51f7996f #v2.2.1
uses: sarisia/actions-status-discord@eb045afee445dc055c18d3d90bd0f244fd062708 # v1.16.0
if: failure() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false)
with:
severity: error
details: Freqtrade doc test failed!
webhookUrl: ${{ secrets.DISCORD_WEBHOOK }}
color: '#FF0000' # red
title: Freqtrade doc test failed!
webhook: ${{ secrets.DISCORD_WEBHOOK }} # zizmor: ignore[secrets-outside-env] Intentionally not using environment variable.
build-linux-online:
# Run pytest with "live" checks
name: "Tests and Linting - Online tests"
name: "Online / live tests"
runs-on: ubuntu-24.04
strategy:
matrix:
python-version: ["3.12"]
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
with:
python-version: "3.12"
- name: Install uv
uses: astral-sh/setup-uv@61cb8a9741eeb8a550a1b8544337180c0fc8476b # v7.2.0
- name: Install uv and Python 🐍
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
with:
activate-environment: true
enable-cache: true
python-version: "3.12"
python-version: "${{ matrix.python-version }}"
cache-dependency-glob: "requirements**.txt"
cache-suffix: "3.12"
- name: Installation - *nix
run: |
uv pip install --upgrade wheel
uv pip install -r requirements-dev.txt
uv pip install -e ft_client/
uv pip install -e .
@@ -285,22 +279,13 @@ jobs:
if: github.event_name != 'schedule' && github.repository == 'freqtrade/freqtrade'
steps:
- name: Check user permission
id: check
continue-on-error: true
uses: prince-chrismc/check-actor-permissions-action@d504e74ba31658f4cdf4fcfeb509d4c09736d88e # v3.0.2
with:
permission: "write"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Discord notification
uses: rjstone/discord-webhook-notify@c2597273488aeda841dd1e891321952b51f7996f #v2.2.1
if: steps.check.outputs.permitted == 'true' && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false)
uses: sarisia/actions-status-discord@eb045afee445dc055c18d3d90bd0f244fd062708 # v1.16.0
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false
with:
severity: info
details: Test Completed!
webhookUrl: ${{ secrets.DISCORD_WEBHOOK }}
color: '#00FF00' # green
title: Test Completed!
webhook: ${{ secrets.DISCORD_WEBHOOK }} # zizmor: ignore[secrets-outside-env] Intentionally not using environment variable.
build:
if: always()
@@ -312,6 +297,9 @@ jobs:
pre-commit,
]
runs-on: ubuntu-22.04
strategy:
matrix:
python-version: ["3.13"]
steps:
@@ -324,18 +312,19 @@ jobs:
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
- name: Install uv and Python 🐍
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
with:
python-version: "3.12"
activate-environment: true
python-version: "${{ matrix.python-version }}"
- name: Build distribution
run: |
pip install -U build
uv pip install $(grep -E "^build==" requirements-dev.txt)
python -m build --sdist --wheel
- name: Upload artifacts 📦
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.1.0
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: freqtrade-build
path: |
@@ -344,11 +333,10 @@ jobs:
- name: Build Client distribution
run: |
pip install -U build
python -m build --sdist --wheel ft_client
- name: Upload artifacts 📦
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.1.0
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: freqtrade-client-build
path: |
@@ -372,14 +360,14 @@ jobs:
persist-credentials: false
- name: Download artifact 📦
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: freqtrade*-build
path: dist
merge-multiple: true
- name: Publish to PyPI (Test)
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
with:
repository-url: https://test.pypi.org/legacy/
@@ -401,14 +389,14 @@ jobs:
persist-credentials: false
- name: Download artifact 📦
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: freqtrade*-build
path: dist
merge-multiple: true
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
docker-build:
@@ -422,9 +410,9 @@ jobs:
packages: write # Needed to push package versions
contents: read
secrets:
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} # zizmor: ignore[secrets-outside-env] Intentionally not using environment variable.
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
packages-cleanup:
+5 -5
View File
@@ -26,15 +26,15 @@ jobs:
with:
persist-credentials: true
- name: Set up Python
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
- name: Install uv and Python 🐍
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
with:
python-version: '3.12'
activate-environment: true
python-version: '3.13'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r docs/requirements-docs.txt
uv pip install -r docs/requirements-docs.txt
- name: Fetch gh-pages branch
run: |
+2 -2
View File
@@ -31,13 +31,13 @@ jobs:
with:
persist-credentials: false
- name: Login to GitHub Container Registry
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Pre-build dev container image
uses: devcontainers/ci@8bf61b26e9c3a98f69cb6ce2f88d24ff59b785c6 # v0.3.19
uses: devcontainers/ci@b63b30de439b47a52267f241112c5b453b673db5 # v0.3.1900000449
with:
subFolder: .github
imageName: ghcr.io/${{ github.repository }}-devcontainer
+18 -15
View File
@@ -3,9 +3,9 @@ name: Docker Build and Deploy
on:
workflow_call:
secrets:
DOCKER_PASSWORD:
DOCKERHUB_USERNAME:
required: true
DOCKER_USERNAME:
DOCKERHUB_TOKEN:
required: true
DISCORD_WEBHOOK:
required: false
@@ -35,6 +35,8 @@ jobs:
name: "Deploy Docker x64 and armv7l"
runs-on: ubuntu-22.04
if: github.repository == 'freqtrade/freqtrade'
environment:
name: docker
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -57,19 +59,19 @@ jobs:
uses: ./.github/actions/docker-tags
- name: Login to Docker Hub
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
with:
cache-image: false
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f #v3.12.0
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd #v4.0.0
- name: Available platforms
run: echo ${PLATFORMS}
@@ -168,6 +170,8 @@ jobs:
# Only run on 64bit machines
runs-on: [self-hosted, linux, ARM64]
if: github.repository == 'freqtrade/freqtrade'
environment:
name: docker
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -179,13 +183,13 @@ jobs:
uses: ./.github/actions/docker-tags
- name: Login to Docker Hub
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to github
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ghcr.io
username: ${{ github.actor }}
@@ -306,9 +310,8 @@ jobs:
docker image prune -a --force --filter "until=24h"
- name: Discord notification
uses: rjstone/discord-webhook-notify@c2597273488aeda841dd1e891321952b51f7996f #v2.2.1
uses: sarisia/actions-status-discord@eb045afee445dc055c18d3d90bd0f244fd062708 # v1.16.0
if: always() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) && (github.event_name != 'schedule')
with:
severity: info
details: Deploy Succeeded!
webhookUrl: ${{ secrets.DISCORD_WEBHOOK }}
title: Deploy Succeeded!
webhook: ${{ secrets.DISCORD_WEBHOOK }}
+5 -2
View File
@@ -3,6 +3,7 @@ on:
push:
branches:
- stable
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}
@@ -15,6 +16,8 @@ jobs:
dockerHubDescription:
name: "Update Docker Hub Description"
runs-on: ubuntu-latest
environment:
name: docker
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
@@ -23,6 +26,6 @@ jobs:
- name: Docker Hub Description
uses: peter-evans/dockerhub-description@1b9a80c056b620d92cedb9d9b5a223409c68ddfa # v5.0.0
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
repository: freqtradeorg/freqtrade
@@ -0,0 +1,53 @@
name: Pre-commit Types update
on:
pull_request:
branches:
- "develop"
concurrency:
group: "${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}"
cancel-in-progress: true
permissions: {}
jobs:
mypy-version-update:
name: "Pre-commit mypy type versions update"
runs-on: ubuntu-24.04
# Only run this job for pull requests created by dependabot[bot]
if: >
github.event.pull_request.user.login == 'dependabot[bot]' &&
github.repository == github.event.pull_request.head.repo.full_name &&
github.event_name == 'pull_request' &&
startsWith(github.head_ref, 'dependabot/')
environment:
name: dependabot-pulls
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: true
token: ${{ secrets.REPO_SCOPED_TOKEN_DEP }}
ref: ${{ github.head_ref || github.ref }}
- name: Install uv and Python 🐍
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
with:
activate-environment: true
python-version: "3.13"
- name: Install PyYAML
run: |
- name: pre-commit dependencies
run: |
uv pip install $(grep -E "^pyyaml==" requirements-dev.txt)
python build_helpers/pre_commit_update.py --update
- uses: stefanzweifel/git-auto-commit-action@04702edda442b2e678b25b537cec683a1493fcb9 # v7
with:
commit_message: "chore(deps): Apply pre-commit types update"
commit_user_name: Freqtrade Bot
commit_user_email: 154552126+freqtrade-bot@users.noreply.github.com
commit_author: Freqtrade Bot <154552126+freqtrade-bot@users.noreply.github.com>
+10 -6
View File
@@ -2,7 +2,7 @@ name: Pre-commit auto-update
on:
schedule:
- cron: "0 3 * * 2"
- cron: "13 1 * * 2"
# on demand
workflow_dispatch:
@@ -17,23 +17,27 @@ jobs:
auto-update:
name: Auto-update pre-commit hooks
runs-on: ubuntu-latest
environment:
name: develop
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
- name: Install uv and Python 🐍
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
with:
python-version: "3.12"
activate-environment: true
python-version: "3.13"
- name: Install pre-commit
run: pip install pre-commit
run: uv pip install $(grep -E "^pre-commit==" requirements-dev.txt)
- name: Run auto-update
run: pre-commit autoupdate
- uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 # v8.0.0
- uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
with:
token: ${{ secrets.REPO_SCOPED_TOKEN }}
add-paths: .pre-commit-config.yaml
+1 -1
View File
@@ -31,4 +31,4 @@ jobs:
persist-credentials: false
- name: Run zizmor 🌈
uses: zizmorcore/zizmor-action@135698455da5c3b3e55f73f4419e481ab68cdd95 # v0.4.1
uses: zizmorcore/zizmor-action@5f14fd08f7cf1cb1609c1e344975f152c7ee938d # v0.5.6
+10 -23
View File
@@ -13,38 +13,25 @@ repos:
pass_filenames: false
additional_dependencies: ["python-rapidjson", "jsonschema"]
- repo: https://github.com/pycqa/flake8
rev: "7.3.0"
hooks:
- id: flake8
additional_dependencies: [Flake8-pyproject]
# stages: [push]
- repo: https://github.com/pre-commit/mirrors-mypy
rev: "v1.19.1"
rev: "v2.1.0"
hooks:
- id: mypy
exclude: build_helpers
additional_dependencies:
- types-cachetools==6.2.0.20251022
- types-cachetools==7.0.0.20260518
- types-filelock==3.2.7
- types-requests==2.32.4.20260107
- types-tabulate==0.9.0.20241207
- types-python-dateutil==2.9.0.20251115
- scipy-stubs==1.17.0.1
- SQLAlchemy==2.0.45
# stages: [push]
- repo: https://github.com/pycqa/isort
rev: "7.0.0"
hooks:
- id: isort
name: isort (python)
- types-requests==2.33.0.20260518
- types-tabulate==0.10.0.20260508
- types-python-dateutil==2.9.0.20260518
- scipy-stubs==1.17.1.4
- SQLAlchemy==2.0.49
# stages: [push]
- repo: https://github.com/charliermarsh/ruff-pre-commit
# Ruff version.
rev: 'v0.14.14'
rev: 'v0.15.13'
hooks:
- id: ruff
- id: ruff-format
@@ -75,7 +62,7 @@ repos:
- id: strip-exif
- repo: https://github.com/codespell-project/codespell
rev: v2.4.1
rev: v2.4.2
hooks:
- id: codespell
additional_dependencies:
@@ -83,6 +70,6 @@ repos:
# Ensure github actions remain safe
- repo: https://github.com/woodruffw/zizmor-pre-commit
rev: v1.22.0
rev: v1.24.1
hooks:
- id: zizmor
+3 -3
View File
@@ -12,7 +12,8 @@ Few pointers for contributions:
- Stick to english in both commit messages, PR descriptions and code comments and variable names.
- New features need to contain unit tests, must pass CI (run pre-commit and pytest to get an early feedback) and should be documented with the introduction PR.
- PR's can be declared as draft - signaling Work in Progress for Pull Requests (which are not finished). We'll still aim to provide feedback on draft PR's in a timely manner.
- If you're using AI for your PR, please both mention it in the PR description and do a thorough review of the generated code. The final responsibility for the code with the PR author, not with the AI.
- If you're using AI for your PR, please both mention it in the PR description and do a thorough review of the generated code yourself.
The final responsibility for the code with the PR author, not with the AI, which also means that commits must be linked to your (human) account, not some generic AI account.
If you are unsure, discuss the feature on our [discord server](https://discord.gg/p7nuUNVfP7) or in a [issue](https://github.com/freqtrade/freqtrade/issues) before a Pull Request.
@@ -24,8 +25,7 @@ Best start by reading the [documentation](https://www.freqtrade.io/) to get a fe
### 1. Run unit tests
All unit tests must pass. If a unit test is broken, change your code to
make it pass. It means you have introduced a regression.
All unit tests must pass. If a unit test is broken, change your code to make it pass. It means you have introduced a regression.
#### Test the whole project
+1 -1
View File
@@ -1,4 +1,4 @@
FROM python:3.13.11-slim-trixie AS base
FROM python:3.14.5-slim-trixie AS base
# Setup env
ENV LANG=C.UTF-8
+6 -4
View File
@@ -2,8 +2,9 @@
[![Freqtrade CI](https://github.com/freqtrade/freqtrade/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/freqtrade/freqtrade/actions/workflows/ci.yml)
[![DOI](https://joss.theoj.org/papers/10.21105/joss.04864/status.svg)](https://doi.org/10.21105/joss.04864)
[![Coverage Status](https://coveralls.io/repos/github/freqtrade/freqtrade/badge.svg?branch=develop&service=github)](https://coveralls.io/github/freqtrade/freqtrade?branch=develop)
[![codecov](https://codecov.io/gh/freqtrade/freqtrade/branch/develop/graph/badge.svg?token=AD5BG3ATKI)](https://codecov.io/gh/freqtrade/freqtrade)
[![Documentation](https://readthedocs.org/projects/freqtrade/badge/)](https://www.freqtrade.io)
[![Discord Server](https://img.shields.io/badge/Freqtrade_Discord-4E4E4E?logo=discord)](https://discord.gg/p7nuUNVfP7)
Freqtrade is a free and open source crypto trading bot written in Python. It is designed to support all major exchanges and be controlled via Telegram or webUI. It contains backtesting, plotting and money management tools as well as strategy optimization by machine learning.
@@ -24,7 +25,7 @@ hesitate to read the source code and understand the mechanism of this bot.
## Supported Exchange marketplaces
Please read the [exchange-specific notes](docs/exchanges.md) to learn about special configurations that maybe needed for each exchange.
Please read the [exchange-specific notes](https://www.freqtrade.io/en/stable/exchanges/) to learn about special configurations that maybe needed for each exchange.
### Supported Spot Exchanges
@@ -49,8 +50,9 @@ Please read the [exchange-specific notes](docs/exchanges.md) to learn about spec
- [X] [Hyperliquid](https://hyperliquid.xyz/) (A decentralized exchange, or DEX)
- [X] [OKX](https://okx.com/)
- [X] [Bybit](https://bybit.com/)
- [X] [Kraken](https://www.kraken.com/features/futures)
Please make sure to read the [exchange specific notes](docs/exchanges.md), as well as the [trading with leverage](docs/leverage.md) documentation before diving in.
Please make sure to read the [exchange specific notes](https://www.freqtrade.io/en/stable/exchanges/), as well as the [trading with leverage](https://www.freqtrade.io/en/stable/leverage/) documentation before diving in.
### Community tested
@@ -142,7 +144,7 @@ options:
### Telegram RPC commands
Telegram is not mandatory. However, this is a great way to control your bot. More details and the full command list on the [documentation](https://www.freqtrade.io/en/latest/telegram-usage/)
Telegram is not mandatory. However, this is a great way to control your bot. More details and the full command list on the [documentation](https://www.freqtrade.io/en/stable/telegram-usage/)
- `/start`: Starts the trader.
- `/stop`: Stops the trader.
+1 -1
View File
@@ -87,7 +87,7 @@ def extract_command_partials():
help_output = _get_help_output(subparser)
_write_partial_file(f"docs/commands/{command}.md", help_output)
else:
print(f" Warning: subcommand '{command}' not found in parser")
print(f" Warning: subcommand '{command}' not found in parser")
# freqtrade-client still uses subprocess as requested
print("Running for freqtrade-client")
+42 -2
View File
@@ -1,5 +1,7 @@
# File used in CI to ensure pre-commit dependencies are kept up-to-date.
import argparse
import re
import sys
from pathlib import Path
@@ -10,6 +12,24 @@ pre_commit_file = Path(".pre-commit-config.yaml")
require_dev = Path("requirements-dev.txt")
require = Path("requirements.txt")
parser = argparse.ArgumentParser()
parser.add_argument("--update", action="store_true")
args = parser.parse_args()
def replace_dependency_version(pre_commit_text: str, dependency: str) -> tuple[str, bool]:
"""
Regex-based replacement of a dependency version in the pre-commit config file.
using regex here ensures we only replace the version of the dependency while
keeping the overall file intact.
"""
package_name = dependency.split("==", 1)[0]
pattern = re.compile(rf"^(\s*-\s+){re.escape(package_name)}==.*$", re.MULTILINE)
updated_text, replacements = pattern.subn(rf"\1{dependency}", pre_commit_text, count=1)
return updated_text, replacements > 0 and updated_text != pre_commit_text
with require_dev.open("r") as rfile:
requirements = rfile.readlines()
@@ -23,6 +43,18 @@ supported = ("types-", "SQLAlchemy", "scipy-stubs")
# Only keep the first part of the line up to the first space
type_reqs = [r.strip("\n").split()[0] for r in requirements if r.startswith(supported)]
with pre_commit_file.open("r") as file:
pre_commit_text = file.read()
updated = False
for req in type_reqs:
pre_commit_text, req_updated = replace_dependency_version(pre_commit_text, req)
updated = updated or req_updated
if args.update and updated:
with pre_commit_file.open("w") as file:
file.write(pre_commit_text)
with pre_commit_file.open("r") as file:
f = yaml.load(file, Loader=yaml.SafeLoader)
@@ -40,12 +72,20 @@ for hook in hooks:
for req in type_reqs:
if req not in hooks:
errors.append(f"{req} is missing in pre-config file.")
errors.append(f"{req} is missing in pre-commit config file.")
if updated:
if args.update:
errors.append(".pre-commit-config.yaml was updated to match the requirements files.")
else:
errors.append(
".pre-commit-config.yaml is outdated. Run build_helpers/pre_commit_update.py --update."
)
if errors:
for e in errors:
print(e)
sys.exit(1)
sys.exit(1 if not (args.update and updated) else 0)
sys.exit(0)
+10 -2
View File
@@ -283,6 +283,10 @@
"month"
]
},
"skip_wallet_history_migration": {
"description": "Disable wallet history migration.",
"type": "boolean"
},
"hyperopt_path": {
"description": "Specify additional lookup path for Hyperopt Loss functions.",
"type": "string"
@@ -649,6 +653,7 @@
"ProducerPairList",
"RemotePairList",
"MarketCapPairList",
"CrossMarketPairList",
"AgeFilter",
"DelistFilter",
"FullTradesFilter",
@@ -1057,7 +1062,9 @@
},
"jwt_secret_key": {
"description": "Secret key for JWT authentication.",
"type": "string"
"type": "string",
"default": "somethingRandomSomethingRandom123",
"minLength": 32
},
"CORS_origins": {
"description": "List of allowed CORS origins.",
@@ -1080,7 +1087,8 @@
"listen_ip_address",
"listen_port",
"username",
"password"
"password",
"jwt_secret_key"
]
},
"db_url": {
+1 -1
View File
@@ -70,7 +70,7 @@
"listen_ip_address": "127.0.0.1",
"listen_port": 8080,
"verbosity": "error",
"jwt_secret_key": "somethingrandom",
"jwt_secret_key": "somethingRandomSomethingRandom123",
"CORS_origins": [],
"username": "freqtrader",
"password": "SuperSecurePassword"
+2 -2
View File
@@ -177,7 +177,7 @@
"listen_port": 8080,
"verbosity": "error",
"enable_openapi": false,
"jwt_secret_key": "somethingrandom",
"jwt_secret_key": "somethingRandomSomethingRandom123",
"CORS_origins": [],
"username": "freqtrader",
"password": "SuperSecurePassword",
@@ -215,4 +215,4 @@
"reduce_df_footprint": false,
"dataformat_ohlcv": "feather",
"dataformat_trades": "feather"
}
}
+1 -1
View File
@@ -75,7 +75,7 @@
"listen_ip_address": "127.0.0.1",
"listen_port": 8080,
"verbosity": "error",
"jwt_secret_key": "somethingrandom",
"jwt_secret_key": "somethingRandomSomethingRandom123",
"CORS_origins": [],
"username": "freqtrader",
"password": "SuperSecurePassword"
+1 -1
View File
@@ -1,4 +1,4 @@
FROM python:3.11.14-slim-bookworm AS base
FROM python:3.11.15-slim-bookworm AS base
# Setup env
ENV LANG=C.UTF-8
+2 -2
View File
@@ -73,7 +73,7 @@ services:
volumes:
- "./user_data:/freqtrade/user_data"
# Expose api on port 8080 (localhost only)
# Please read the https://www.freqtrade.io/en/latest/rest-api/ documentation
# Please read the https://www.freqtrade.io/en/stable/rest-api/ documentation
# before enabling this.
ports:
- "127.0.0.1:8080:8080"
@@ -100,7 +100,7 @@ services:
volumes:
- "./user_data:/freqtrade/user_data"
# Expose api on port 8080 (localhost only)
# Please read the https://www.freqtrade.io/en/latest/rest-api/ documentation
# Please read the https://www.freqtrade.io/en/stable/rest-api/ documentation
# before enabling this.
ports:
- "127.0.0.1:8081:8080"
+203 -162
View File
@@ -160,117 +160,131 @@ The most important in the backtesting is to understand the result.
A backtesting result will look like that:
```
BACKTESTING REPORT
┏━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ LTC/USDT:USDT │ 16 │ 1.0 │ 56.176 │ 5.62 │ 16:16:00 │ 16 0 0 100 │
│ ETC/USDT:USDT │ 12 │ 0.72 30.936 │ 3.09 │ 9:55:00 │ 11 0 1 91.7 │
│ ETH/USDT:USDT │ 8 │ 0.66 17.864 │ 1.79 │ 1 day, 13:55:00 │ 7 0 1 87.5 │
│ XLM/USDT:USDT │ 10 │ 0.31 11.054 │ 1.11 │ 12:08:00 │ 9 0 1 90.0 │
│ BTC/USDT:USDT │ 8 │ 0.21 7.289 │ 0.73 │ 3 days, 1:24:00 │ 6 0 2 75.0 │
│ XRP/USDT:USDT │ 9 │ -0.14 -7.261 │ -0.73 │ 21:18:00 │ 8 0 1 88.9 │
│ DOT/USDT:USDT │ 6 │ -0.4 │ -9.187 │ -0.92 │ 5:35:00 │ 4 0 2 66.7 │
│ ADA/USDT:USDT │ 8 │ -1.76 -52.098 │ -5.21 │ 11:38:00 │ 6 0 2 75.0 │
│ TOTAL │ 77 │ 0.22 54.774 │ 5.48 │ 22:12:00 │ 67 0 10 87.0 │
└───────────────┴────────┴──────────────┴─────────────────┴──────────────┴─────────────────┴────────────────────────┘
LEFT OPEN TRADES REPORT
┏━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ BTC/USDT:USDT │ 1 │ -4.14 │ -9.930 │ -0.99 │ 17 days, 8:00:00 │ 0 0 1 0 │
│ ETC/USDT:USDT │ 1 │ -4.24 │ -15.365 │ -1.54 │ 10:40:00 │ 0 0 1 0 │
│ DOT/USDT:USDT │ 1 │ -5.29 │ -19.125 │ -1.91 │ 11:30:00 │ 0 0 1 0 │
│ TOTAL │ 3 │ -4.56 │ -44.420 │ -4.44 │ 6 days, 2:03:00 │ 0 0 3 0 │
└───────────────┴────────┴──────────────┴─────────────────┴──────────────┴──────────────────┴────────────────────────┘
ENTER TAG STATS
┏━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Enter Tag ┃ Entries ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ OTHER │ 77 │ 0.22 54.774 │ 5.48 │ 22:12:00 │ 67 0 10 87.0 │
│ TOTAL │ 77 │ 0.22 54.774 │ 5.48 │ 22:12:00 │ 67 0 10 87.0 │
└───────────┴─────────┴──────────────┴─────────────────┴──────────────┴──────────────┴────────────────────────┘
EXIT REASON STATS
┏━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Exit Reason ┃ Exits ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ roi │ 67 │ 1.05 242.179 │ 24.22 │ 15:49:00 │ 67 0 0 100 │
│ exit_signal │ 4 │ -2.23 │ -31.217 │ -3.12 │ 1 day, 8:38:00 │ 0 0 4 0 │
│ force_exit │ 3 │ -4.56 │ -44.420 │ -4.44 │ 6 days, 2:03:00 │ 0 0 3 0 │
│ stop_loss │ 3 │ -10.14 │ -111.768 │ -11.18 │ 1 day, 3:05:00 │ 0 0 3 0 │
│ TOTAL │ 77 │ 0.22 54.774 │ 5.48 │ 22:12:00 │ 67 0 10 87.0 │
└─────────────┴───────┴──────────────┴─────────────────┴──────────────┴─────────────────┴────────────────────────┘
MIXED TAG STATS
┏━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Enter Tag ┃ Exit Reason ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ │ roi │ 67 │ 1.05 242.179 │ 24.22 │ 15:49:00 │ 67 0 0 100 │
│ │ exit_signal │ 4 │ -2.23 │ -31.217 │ -3.12 │ 1 day, 8:38:00 │ 0 0 4 0 │
│ │ force_exit │ 3 │ -4.56 │ -44.420 │ -4.44 │ 6 days, 2:03:00 │ 0 0 3 0 │
│ │ stop_loss │ 3 │ -10.14 │ -111.768 │ -11.18 │ 1 day, 3:05:00 │ 0 0 3 0 │
│ TOTAL │ │ 77 │ 0.22 54.774 │ 5.48 │ 22:12:00 │ 67 0 10 87.0 │
└───────────┴─────────────┴────────┴──────────────┴─────────────────┴──────────────┴─────────────────┴────────────────────────┘
SUMMARY METRICS
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Metric ┃ Value
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Backtesting from │ 2025-07-01 00:00:00 │
│ Backtesting to │ 2025-08-01 00:00:00 │
│ Trading Mode │ Isolated Futures │
│ Max open trades │ 3
│ Total/Daily Avg Trades │ 77 / 2.48 │
│ Starting balance │ 1000 USDT │
│ Final balance │ 1054.774 USDT
│ Absolute profit │ 54.774 USDT
│ Total profit % │ 5.48%
│ CAGR % │ 87.36%
│ Sortino 2.48
│ Sharpe 3.75
│ Calmar │ 40.99
│ SQN │ 0.69
│ Profit factor │ 1.29
│ Expectancy (Ratio) │ 0.71 (0.04) │
│ Avg. daily profit │ 1.767 USDT │
│ Avg. stake amount │ 345.016 USDT │
Total trade volume │ 53316.954 USDT
Long / Short trades │ 67 / 10
│ Long / Short profit % │ 8.94% / -3.47%
│ Long / Short profit USDT89.425 / -34.651
Best Pair │ LTC/USDT:USDT 5.62%
Worst Pair │ ADA/USDT:USDT -5.21%
Best tradeETC/USDT:USDT 2.00%
Worst trade │ ADA/USDT:USDT -10.17%
Best day26.91 USDT
Worst day │ -47.741 USDT
Days win/draw/lose │ 20 / 6 / 5
Min/Max/Avg. Duration Winners │ 0d 00:35 / 5d 18:15 / 0d 15:49
│ Min/Max/Avg. Duration Losers │ 0d 10:40 / 17d 08:00 / 2d 17:00
│ Max Consecutive Wins / Loss │ 36 / 3
Rejected Entry signals │ 258
Entry/Exit Timeouts │ 0 / 0
│ │
Min balance │ 1003.168 USDT
│ Max balance │ 1149.421 USDT
│ Max % of account underwater │ 8.23%
│ Absolute drawdown │ 94.647 USDT (8.23%)
│ Drawdown duration │ 9 days 08:50:00 │
│ Profit at drawdown start │ 149.421 USDT │
│ Profit at drawdown end │ 54.774 USDT
│ Drawdown start │ 2025-07-22 15:10:00 │
│ Drawdown end │ 2025-08-01 00:00:00 │
Market change30.51%
└───────────────────────────────┴─────────────────────────────────┘
BACKTESTING REPORT
┏━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ LTC/USDT:USDT │ 16 │ 1.01 │ 56.882 │ 5.69 │ 16:16:00 │ 16 0 0 100 │
│ ETC/USDT:USDT │ 12 │ 0.7331.513 │ 3.15 │ 9:55:00 │ 11 0 1 91.7 │
│ ETH/USDT:USDT │ 8 │ 0.6918.659 │ 1.87 │ 1 day, 13:55:00 │ 7 0 1 87.5 │
│ XLM/USDT:USDT │ 10 │ 0.3 │ 10.694 │ 1.07 │ 12:08:00 │ 9 0 1 90.0 │
│ BTC/USDT:USDT │ 8 │ 0.22 │ 7.502 │ 0.75 │ 3 days, 1:24:00 │ 6 0 2 75.0 │
│ XRP/USDT:USDT │ 9 │ -0.13-6.837 │ -0.68 │ 21:18:00 │ 8 0 1 88.9 │
│ DOT/USDT:USDT │ 6 │ -0.39 │ -9.169 │ -0.92 │ 5:35:00 │ 4 0 2 66.7 │
│ ADA/USDT:USDT │ 8 │ -1.75 │ -52.089 │ -5.21 │ 11:38:00 │ 6 0 2 75.0 │
│ TOTAL │ 77 │ 0.2357.157 │ 5.72 │ 22:12:00 │ 67 0 10 87.0 │
└───────────────┴────────┴──────────────┴─────────────┴──────────────┴─────────────────┴────────────────────────┘
LEFT OPEN TRADES REPORT
┏━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ BTC/USDT:USDT │ 1 │ -4.14 │ -9.930 │ -0.99 │ 17 days, 8:00:00 │ 0 0 1 0 │
│ ETC/USDT:USDT │ 1 │ -4.24 │ -15.365 │ -1.54 │ 10:40:00 │ 0 0 1 0 │
│ DOT/USDT:USDT │ 1 │ -5.29 │ -19.166 │ -1.92 │ 11:30:00 │ 0 0 1 0 │
│ TOTAL │ 3 │ -4.56 │ -44.461 │ -4.45 │ 6 days, 2:03:00 │ 0 0 3 0 │
└───────────────┴────────┴──────────────┴─────────────┴──────────────┴──────────────────┴────────────────────────┘
ENTER TAG STATS
┏━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Enter Tag ┃ Entries ┃ Avg Profit % ┃ Tot Profit ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ OTHER │ 77 │ 0.2357.157 │ 5.72 │ 22:12:00 │ 67 0 10 87.0 │
│ TOTAL │ 77 │ 0.2357.157 │ 5.72 │ 22:12:00 │ 67 0 10 87.0 │
└───────────┴─────────┴──────────────┴─────────────┴──────────────┴──────────────┴────────────────────────┘
EXIT REASON STATS
┏━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Exit Reason ┃ Exits ┃ Avg Profit % ┃ Tot Profit ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ roi │ 67 │ 1.06245.117 │ 24.51 │ 15:49:00 │ 67 0 0 100 │
│ exit_signal │ 4 │ -2.23 │ -31.226 │ -3.12 │ 1 day, 8:38:00 │ 0 0 4 0 │
│ force_exit │ 3 │ -4.56 │ -44.461 │ -4.45 │ 6 days, 2:03:00 │ 0 0 3 0 │
│ stop_loss │ 3 │ -10.14 │ -112.273 │ -11.23 │ 1 day, 3:05:00 │ 0 0 3 0 │
│ TOTAL │ 77 │ 0.2357.157 │ 5.72 │ 22:12:00 │ 67 0 10 87.0 │
└─────────────┴───────┴──────────────┴─────────────┴──────────────┴─────────────────┴────────────────────────┘
MIXED TAG STATS
┏━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Enter Tag ┃ Exit Reason ┃ Trades ┃ Avg Profit % ┃ Tot Profit ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ │ roi │ 67 │ 1.06245.117 │ 24.51 │ 15:49:00 │ 67 0 0 100 │
│ │ exit_signal │ 4 │ -2.23 │ -31.226 │ -3.12 │ 1 day, 8:38:00 │ 0 0 4 0 │
│ │ force_exit │ 3 │ -4.56 │ -44.461 │ -4.45 │ 6 days, 2:03:00 │ 0 0 3 0 │
│ │ stop_loss │ 3 │ -10.14 │ -112.273 │ -11.23 │ 1 day, 3:05:00 │ 0 0 3 0 │
│ TOTAL │ │ 77 │ 0.2357.157 │ 5.72 │ 22:12:00 │ 67 0 10 87.0 │
└───────────┴─────────────┴────────┴──────────────┴─────────────┴──────────────┴─────────────────┴────────────────────────┘
SUMMARY METRICS
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Metric ┃ Value
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Backtesting from │ 2025-07-01 00:00:00
│ Backtesting to │ 2025-08-01 00:00:00
│ Trading Mode │ Isolated Futures
│ Max open trades │ 3
│ Total/Daily Avg Trades │ 77 / 2.48
│ Starting balance │ 1000 USDT
│ Final balance │ 1057.157 USDT
│ Absolute profit │ 57.157 USDT
│ Total profit % │ 5.72%
│ CAGR % │ 92.41%
│ Sharpe (closed trades)3.89
│ Sortino (closed trades)2.57
│ Calmar (closed trades) │ 43.03
│ SQN │ 0.71
│ Profit factor │ 1.30
│ Expectancy (Ratio) │ 0.74 (0.04)
│ Avg. daily profit │ 1.844 USDT
│ Avg. stake amount │ 345.478 USDT
Market change │ 30.51%
Total trade volume │ 53390.788 USDT
│ Long / Short trades │ 67 / 10
│ Long / Short profit % │ 9.19% / -3.48%
Long / Short profit USDT │ 91.940 / -34.783
Best Pair │ LTC/USDT:USDT 5.69%
Worst Pair ADA/USDT:USDT -5.21%
Best trade │ XRP/USDT:USDT 2.00%
Worst trade ADA/USDT:USDT -10.17%
Best day │ 27.031 USDT
Worst day │ -47.826 USDT
Days win/draw/lose │ 20 / 6 / 5
│ Min/Max/Avg. Duration Winners │ 0d 00:35 / 5d 18:15 / 0d 15:49
│ Min/Max/Avg. Duration Losers │ 0d 10:40 / 17d 08:00 / 2d 17:00
Max Consecutive Wins / Loss │ 36 / 3
Rejected Entry signals │ 258
Entry/Exit Timeouts 0 / 0
Min/Max balance (closed trades) │ 1003.205 USDT / 1151.425 USDT │
│ Max % of account underwater │ 8.19%
│ Absolute drawdown │ 94.268 USDT (8.19%)
│ Drawdown duration │ 9 days 08:50:00
│ Profit at drawdown start │ 151.425 USDT
│ Profit at drawdown end │ 57.157 USDT
│ Drawdown start │ 2025-07-22 15:10:00
│ Drawdown end │ 2025-08-01 00:00:00
│ Wallet based Metrics │ │
│ Min/Max balance (wallet balance) │ 1000 USDT / 1151.425 USDT │
│ Min/Max balance dates (wallet balance) │ 2025-07-01 00:05:00 / 2025-07-22 15:15:00 │
│ Max % of account underwater (balance) │ 5.01% │
│ Absolute drawdown (wallet balance) │ 54.76 USDT (4.76%) │
│ Drawdown duration │ 7 days 20:35:00 │
│ Profit at drawdown start │ 151.425 USDT │
│ Profit at drawdown end │ 96.664 USDT │
│ Drawdown start │ 2025-07-22 15:15:00 │
│ Drawdown end │ 2025-07-30 11:50:00 │
│ Sharpe (daily wallet balance) │ 4.42 │
│ Sortino (daily wallet balance) │ 4.35 │
│ Calmar (daily wallet balance) │ 136.07 │
└────────────────────────────────────────┴───────────────────────────────────────────┘
Backtested 2025-07-01 00:00:00 -> 2025-08-01 00:00:00 | Max open trades : 3
STRATEGY SUMMARY
┏━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━
┃ Strategy ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ Drawdown ┃
┡━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━
│ SampleStrategy │ 77 │ 0.22 54.774 │ 5.48 │ 22:12:00 │ 67 0 10 87.0 │ 94.647 USDT 8.23% │
└────────────────┴────────┴──────────────┴─────────────────┴──────────────┴──────────────┴────────────────────────┴────────────────────
STRATEGY SUMMARY
┏━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ Strategy ┃ Trades ┃ Avg Profit % ┃ Tot Profit ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ Drawdown ┃
┡━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ SampleStrategy │ 77 │ 0.2357.157 │ 5.72 │ 22:12:00 │ 67 0 10 87.0 │ 94.268 8.19% │
└────────────────┴────────┴──────────────┴─────────────┴──────────────┴──────────────┴────────────────────────┴────────────────┘
```
### Backtesting report table
@@ -329,54 +343,72 @@ The last element of the backtest report is the summary metrics table.
It contains key metrics about the performance of your strategy on backtesting data.
```
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Metric ┃ Value ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Backtesting from │ 2025-07-01 00:00:00 │
│ Backtesting to │ 2025-08-01 00:00:00 │
Trading Mode │ Isolated Futures
Max open trades3
│ │
Total/Daily Avg Trades │ 72 / 2.32
Starting balance │ 1000 USDT
Final balance │ 1106.734 USDT
Absolute profit │ 106.734 USDT
Total profit %10.67%
CAGR % │ 230.04%
Sortino4.99
│ Sharpe │ 8.00
Calmar │ 77.76
SQN 1.52
Profit factor1.79
Expectancy (Ratio) │ 1.48 (0.07)
Avg. daily profit │ 3.443 USDT
│ Avg. stake amount363.133 USDT
Total trade volume │ 52466.174 USDT
│ │
Best PairLTC/USDT:USDT 4.48%
Worst Pair │ ADA/USDT:USDT -1.78%
Best trade │ ETC/USDT:USDT 2.00%
Worst trade ADA/USDT:USDT -10.17%
Best day │ 23.535 USDT
Worst day-49.813 USDT
Days win/draw/lose │ 21 / 6 / 4
Min/Max/Avg. Duration Winners │ 0d 00:35 / 5d 18:15 / 0d 15:30
Min/Max/Avg. Duration Losers │ 0d 12:00 / 17d 08:00 / 3d 23:28
Max Consecutive Wins / Loss │ 58 / 4
Rejected Entry signals │ 254
Entry/Exit Timeouts │ 0 / 0
│ │
│ Min balance │ 1003.168 USDT
│ Max balance │ 1209 USDT
│ Max % of account underwater │ 8.46%
Absolute drawdown │ 102.266 USDT (8.46%)
Drawdown duration │ 9 days 08:50:00
Profit at drawdown start │ 209 USDT
Profit at drawdown end │ 106.734 USDT
Drawdown start │ 2025-07-22 15:10:00
Drawdown end2025-08-01 00:00:00
Market change30.51%
└───────────────────────────────┴─────────────────────────────────┘
SUMMARY METRICS
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Metric ┃ Value ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Backtesting from │ 2025-07-01 00:00:00
Backtesting to │ 2025-08-01 00:00:00
Trading Mode Isolated Futures
Max open trades 3
Total/Daily Avg Trades │ 77 / 2.48
Starting balance │ 1000 USDT
Final balance │ 1057.157 USDT
Absolute profit 57.157 USDT
Total profit % 5.72%
CAGR % 92.41%
│ Sharpe (closed trades) │ 3.89
Sortino (closed trades) │ 2.57
Calmar (closed trades)43.03
SQN 0.71
Profit factor │ 1.30
Expectancy (Ratio) │ 0.74 (0.04)
│ Avg. daily profit 1.844 USDT
Avg. stake amount │ 345.478 USDT
Market change 30.51%
Total trade volume53390.788 USDT
Long / Short trades67 / 10
Long / Short profit %9.19% / -3.48%
Long / Short profit USDT │ 91.940 / -34.783
Best Pair │ LTC/USDT:USDT 5.69%
Worst Pair │ ADA/USDT:USDT -5.21%
Best trade │ XRP/USDT:USDT 2.00%
Worst trade │ ADA/USDT:USDT -10.17%
Best day │ 27.031 USDT
Worst day │ -47.826 USDT
Days win/draw/lose20 / 6 / 5
│ Min/Max/Avg. Duration Winners │ 0d 00:35 / 5d 18:15 / 0d 15:49
│ Min/Max/Avg. Duration Losers │ 0d 10:40 / 17d 08:00 / 2d 17:00
│ Max Consecutive Wins / Loss │ 36 / 3
Rejected Entry signals │ 258
Entry/Exit Timeouts │ 0 / 0
Min/Max balance (closed trades) │ 1003.205 USDT / 1151.425 USDT
Max % of account underwater │ 8.19%
Absolute drawdown 94.268 USDT (8.19%)
Drawdown duration 9 days 08:50:00
│ Profit at drawdown start │ 151.425 USDT │
│ Profit at drawdown end │ 57.157 USDT │
│ Drawdown start │ 2025-07-22 15:10:00 │
│ Drawdown end │ 2025-08-01 00:00:00 │
│ │ │
│ Wallet based Metrics │ │
│ Min/Max balance (wallet balance) │ 1000 USDT / 1151.425 USDT │
│ Min/Max balance dates (wallet balance) │ 2025-07-01 00:05:00 / 2025-07-22 15:15:00 │
│ Max % of account underwater (balance) │ 5.01% │
│ Absolute drawdown (wallet balance) │ 54.76 USDT (4.76%) │
│ Drawdown duration │ 7 days 20:35:00 │
│ Profit at drawdown start │ 151.425 USDT │
│ Profit at drawdown end │ 96.664 USDT │
│ Drawdown start │ 2025-07-22 15:15:00 │
│ Drawdown end │ 2025-07-30 11:50:00 │
│ Sharpe (daily wallet balance) │ 4.42 │
│ Sortino (daily wallet balance) │ 4.35 │
│ Calmar (daily wallet balance) │ 136.07 │
└────────────────────────────────────────┴───────────────────────────────────────────┘
```
- `Backtesting from` / `Backtesting to`: Backtesting range (usually defined with the `--timerange` option).
@@ -388,14 +420,15 @@ It contains key metrics about the performance of your strategy on backtesting da
- `Absolute profit`: Profit made in stake currency.
- `Total profit %`: Total profit. Aligned to the `TOTAL` row's `Tot Profit %` from the first table. Calculated as `(End capital Starting capital) / Starting capital`.
- `CAGR %`: Compound annual growth rate.
- `Sortino`: Annualized Sortino ratio.
- `Sharpe`: Annualized Sharpe ratio.
- `Calmar`: Annualized Calmar ratio.
- `Sharpe (closed trades)`: Annualized Sharpe ratio including only closed trades (ignoring open trades with profits or losses).
- `Sortino (closed trades)`: Annualized Sortino ratio including only closed trades (ignoring open trades with profits or losses).
- `Calmar (closed trades)`: Annualized Calmar ratio including only closed trades (ignoring open trades with profits or losses).
- `SQN`: System Quality Number (SQN) - by Van Tharp.
- `Profit factor`: Sum of the profits of all winning trades divided by the sum of the losses of all losing trades.
- `Expectancy (Ratio)`: Expectancy ratio, which is the average profit or loss per trade. A negative expectancy ratio means that your strategy is not profitable.
- `Avg. daily profit`: Average profit per day, calculated as `(Total Profit / Backtest Days)`.
- `Avg. stake amount`: Average stake amount, either `stake_amount` or the average when using dynamic stake amount.
- `Market change`: Change of the market during the backtest period. Calculated as the average of all pairs' changes from the first to the last candle using the "close" column.
- `Total trade volume`: Volume generated on the exchange to reach the above profit.
- `Long / Short trades`: Split long/short trade counts (only shown when short trades were made).
- `Long / Short profit %`: Profit percentage for long and short trades (only shown when short trades were made).
@@ -409,13 +442,21 @@ It contains key metrics about the performance of your strategy on backtesting da
- `Max Consecutive Wins / Loss`: Maximum consecutive wins/losses in a row.
- `Rejected Entry signals`: Trade entry signals that could not be acted upon due to `max_open_trades` being reached.
- `Entry/Exit Timeouts`: Entry/exit orders which did not fill (only applicable if custom pricing is used).
- `Min balance` / `Max balance`: Lowest and Highest Wallet balance during the backtest period.
- `Min/Max balance (closed trades)`: Lowest and Highest Wallet balance during the backtest period based on closed trades trades.
- `Max % of account underwater`: Maximum percentage your account has decreased from the top since the simulation started. Calculated as the maximum of `(Max Balance - Current Balance) / (Max Balance)`.
- `Absolute drawdown`: Maximum absolute drawdown experienced, including percentage relative to the account calculated as `(Absolute Drawdown) / (DrawdownHigh + startingBalance)`..
- `Absolute drawdown (wallet balance)`: Maximum absolute drawdown experienced based on the unrealized balance, including percentage relative to the account calculated as `(Absolute Drawdown) / (DrawdownHigh + startingBalance)`.
- `Drawdown duration`: Duration of the largest drawdown period.
- `Profit at drawdown start` / `Profit at drawdown end`: Profit at the beginning and end of the largest drawdown period.
- `Drawdown start` / `Drawdown end`: Start and end datetime for the largest drawdown (can also be visualized via the `plot-dataframe` sub-command).
- `Market change`: Change of the market during the backtest period. Calculated as the average of all pairs' changes from the first to the last candle using the "close" column.
- `Min/Max balance (wallet balance)`: Lowest and Highest Wallet balance during the backtest period - including capital tied in open trades.
- `Min/Max balance dates (wallet balance)`: Dates when the minimum and maximum unrealized balance occurred.
- `Sharpe (wallet balance)` Annualized Sharpe ratio calculation including unrealized profits.
- `Sortino (wallet balance)` Annualized Sortino ratio calculation including unrealized profits.
- `Calmar (wallet balance)` Annualized Calmar ratio calculation including unrealized profits.
!!! Tip "Wallet based Metrics"
The metrics under the "Wallet based Metrics" section are calculated based on the unrealized balance, which includes the capital tied in open trades. This provides a more comprehensive view of the strategy's performance, as it accounts for both realized and unrealized profits and losses.
### Daily / Weekly / Monthly / Yearly breakdown
+6 -9
View File
@@ -64,18 +64,15 @@ options:
--strategy-list STRATEGY_LIST [STRATEGY_LIST ...]
Provide a space-separated list of strategies to
backtest. Please note that timeframe needs to be set
either in config or via command line. When using this
together with `--export trades`, the strategy-name is
injected into the filename (so `backtest-data.json`
becomes `backtest-data-SampleStrategy.json`
either in config or via command line.
--export {none,trades,signals}
Export backtest results (default: trades).
--backtest-filename, --export-filename PATH
Use this filename for backtest results.Example:
`--backtest-
filename=backtest_results_2020-09-27_16-20-48.json`.
Assumes either `user_data/backtest_results/` or
`--export-directory` as base directory.
DEPRECATED: This option is deprecated for backtesting
and will be removed in a future release. Using a
custom filename for backtest results is no longer
supported. Use `--backtest-directory` to specify the
directory.
--backtest-directory, --export-directory PATH
Directory to use for backtest results. Example:
`--export-directory=user_data/backtest_results/`.
+1 -4
View File
@@ -62,10 +62,7 @@ options:
--strategy-list STRATEGY_LIST [STRATEGY_LIST ...]
Provide a space-separated list of strategies to
backtest. Please note that timeframe needs to be set
either in config or via command line. When using this
together with `--export trades`, the strategy-name is
injected into the filename (so `backtest-data.json`
becomes `backtest-data-SampleStrategy.json`
either in config or via command line.
--export {none,trades,signals}
Export backtest results (default: trades).
--backtest-filename, --export-filename PATH
+1 -4
View File
@@ -10,10 +10,7 @@ options:
--strategy-list STRATEGY_LIST [STRATEGY_LIST ...]
Provide a space-separated list of strategies to
backtest. Please note that timeframe needs to be set
either in config or via command line. When using this
together with `--export trades`, the strategy-name is
injected into the filename (so `backtest-data.json`
becomes `backtest-data-SampleStrategy.json`
either in config or via command line.
--strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search
Recursively search for a strategy in the strategies
+5 -5
View File
@@ -191,7 +191,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi
| | **Unfilled timeout**
| `unfilledtimeout.entry` | **Required.** How long (in minutes or seconds) the bot will wait for an unfilled entry order to complete, after which the order will be cancelled. [Strategy Override](#parameters-in-the-strategy).<br> **Datatype:** Integer
| `unfilledtimeout.exit` | **Required.** How long (in minutes or seconds) the bot will wait for an unfilled exit order to complete, after which the order will be cancelled and repeated at current (new) price, as long as there is a signal. [Strategy Override](#parameters-in-the-strategy).<br> **Datatype:** Integer
| `unfilledtimeout.unit` | Unit to use in unfilledtimeout setting. Note: If you set unfilledtimeout.unit to "seconds", "internals.process_throttle_secs" must be inferior or equal to timeout [Strategy Override](#parameters-in-the-strategy). <br> *Defaults to `"minutes"`.* <br> **Datatype:** String
| `unfilledtimeout.unit` | Unit to use in unfilledtimeout setting. Note: If you set `unfilledtimeout.unit` to "seconds", "internals.process_throttle_secs" must be inferior or equal to timeout [Strategy Override](#parameters-in-the-strategy). <br> *Defaults to `"minutes"`.* <br> **Datatype:** String
| `unfilledtimeout.exit_timeout_count` | How many times can exit orders time out. Once this number of timeouts is reached, an emergency exit is triggered. 0 to disable and allow unlimited order cancels. [Strategy Override](#parameters-in-the-strategy).<br>*Defaults to `0`.* <br> **Datatype:** Integer
| | **Pricing**
| `entry_pricing.price_side` | Select the side of the spread the bot should look at to get the entry rate. [More information below](#entry-price).<br> *Defaults to `"same"`.* <br> **Datatype:** String (either `ask`, `bid`, `same` or `other`).
@@ -229,7 +229,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi
| `exchange.enable_ws` | Enable the usage of Websockets for the exchange. <br>[More information](#consuming-exchange-websockets).<br>*Defaults to `true`.* <br> **Datatype:** Boolean
| `exchange.markets_refresh_interval` | The interval in minutes in which markets are reloaded. <br>*Defaults to `60` minutes.* <br> **Datatype:** Positive Integer
| `exchange.skip_open_order_update` | Skips open order updates on startup should the exchange cause problems. Only relevant in live conditions.<br>*Defaults to `false`*<br> **Datatype:** Boolean
| `exchange.unknown_fee_rate` | Fallback value to use when calculating trading fees. This can be useful for exchanges which have fees in non-tradable currencies. The value provided here will be multiplied with the "fee cost".<br>*Defaults to `None`<br> **Datatype:** float
| `exchange.unknown_fee_rate` | Fallback value to use when calculating trading fees. This can be useful for exchanges which have fees in non-tradable currencies. The value provided here will be multiplied with the "fee cost".<br>*Defaults to `None`*<br> **Datatype:** float
| `exchange.log_responses` | Log relevant exchange responses. For debug mode only - use with care.<br>*Defaults to `false`*<br> **Datatype:** Boolean
| `exchange.only_from_ccxt` | Prevent data-download from data.binance.vision. Leaving this as false can greatly speed up downloads, but may be problematic if the site is not available.<br>*Defaults to `false`*<br> **Datatype:** Boolean
| `experimental.block_bad_exchanges` | Block exchanges known to not work with freqtrade. Leave on default unless you want to test if that exchange works now. <br>*Defaults to `true`.* <br> **Datatype:** Boolean
@@ -240,7 +240,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi
| `telegram.token` | Your Telegram bot token. Only required if `telegram.enabled` is `true`. <br>**Keep it in secret, do not disclose publicly.** <br> **Datatype:** String
| `telegram.chat_id` | Your personal Telegram account id. Only required if `telegram.enabled` is `true`. <br>**Keep it in secret, do not disclose publicly.** <br> **Datatype:** String
| `telegram.balance_dust_level` | Dust-level (in stake currency) - currencies with a balance below this will not be shown by `/balance`. <br> **Datatype:** float
| `telegram.reload` | Allow "reload" buttons on telegram messages. <br>*Defaults to `true`.<br> **Datatype:** boolean
| `telegram.reload` | Allow "reload" buttons on telegram messages. <br>*Defaults to `true`.*<br> **Datatype:** boolean
| `telegram.notification_settings.*` | Detailed notification settings. Refer to the [telegram documentation](telegram-usage.md) for details.<br> **Datatype:** dictionary
| `telegram.allow_custom_messages` | Enable the sending of Telegram messages from strategies via the dataprovider.send_msg() function. <br> **Datatype:** Boolean
| | **Webhook**
@@ -280,8 +280,8 @@ Mandatory parameters are marked as **Required**, which means that they are requi
| `add_config_files` | Additional config files. These files will be loaded and merged with the current config file. The files are resolved relative to the initial file.<br> *Defaults to `[]`*. <br> **Datatype:** List of strings
| `dataformat_ohlcv` | Data format to use to store historical candle (OHLCV) data. <br> *Defaults to `feather`*. <br> **Datatype:** String
| `dataformat_trades` | Data format to use to store historical trades data. <br> *Defaults to `feather`*. <br> **Datatype:** String
| `reduce_df_footprint` | Recast all numeric columns to float32/int32, with the objective of reducing ram/disk usage (and decreasing train/inference timing backtesting/hyperopt and in FreqAI). <br> **Datatype:** Boolean. <br> Default: `False`.
| `log_config` | Dictionary containing the log config for python logging. [more info](advanced-setup.md#advanced-logging) <br> **Datatype:** dict. <br> Default: `FtRichHandler`
| `reduce_df_footprint` | Recast all numeric columns to float32/int32, with the objective of reducing ram/disk usage (and decreasing train/inference timing backtesting/hyperopt and in FreqAI). <br> Default: `False`. <br> **Datatype:** Boolean.
| `log_config` | Dictionary containing the log config for python logging. [more info](advanced-setup.md#advanced-logging) <br> Default: `FtRichHandler` <br> **Datatype:** dict.
### Parameters in the strategy
+2
View File
@@ -269,6 +269,8 @@ If `--convert` is also provided, the resample step will happen automatically and
!!! Note "Kraken user"
Kraken users should read [this](exchanges.md#historic-kraken-data) before starting to download data.
Kraken Futures uses standard OHLCV downloads and does not require `--dl-trades`.
Example call:
```bash
+72 -11
View File
@@ -217,6 +217,32 @@ freqtrade download-data --exchange kraken --dl-trades -p BTC/EUR BCH/EUR
Please pay attention that rateLimit configuration entry holds delay in milliseconds between requests, NOT requests/sec rate.
So, in order to mitigate Kraken API "Rate limit exceeded" exception, this configuration should be increased, NOT decreased.
## Kraken Futures
Kraken Futures uses the exchange id `krakenfutures` and supports isolated futures mode.
```jsonc
"exchange": {
"name": "krakenfutures",
"key": "your_exchange_key",
"secret": "your_exchange_secret"
},
"trading_mode": "futures",
"margin_mode": "isolated",
"stake_currency": "USD"
```
!!! Tip "Stoploss on Exchange"
Kraken Futures supports `stoploss_on_exchange` with both `limit` and `market` stop orders.
Use `order_types.stoploss_price_type` to select the trigger price source (`mark`, `last`, or `index`).
!!! Note "Collateral"
Kraken Futures is USD-settled. Use USD as your stake currency.
!!! Note "Flex (Multi-collateral) Accounts"
Kraken Futures flex accounts allow collateral in multiple currencies, while trading remains USD-settled.
Freqtrade derives the `USD` balance from Kraken margin fields, so keep `stake_currency` set to `USD`.
## Kucoin
Kucoin requires a passphrase for each api key, you will therefore need to add this key into the configuration so your exchange section looks as follows:
@@ -239,7 +265,7 @@ Kucoin supports [time_in_force](configuration.md#understand-order_time_in_force)
### Kucoin Blacklists
For Kucoin, it is suggested to add `"KCS/<STAKE>"` to your blacklist to avoid issues, unless you are willing to maintain enough extra `KCS` on the account or unless you're willing to disable using `KCS` for fees.
For Kucoin, it is suggested to add `"KCS/<STAKE>"` to your blacklist to avoid issues, unless you are willing to maintain enough extra `KCS` on the account or unless you're willing to disable using `KCS` for fees.
Kucoin accounts may use `KCS` for fees, and if a trade happens to be on `KCS`, further trades may consume this position and make the initial `KCS` trade unsellable as the expected amount is not there anymore.
## HTX
@@ -319,6 +345,14 @@ API Keys for live futures trading must have the following permissions:
We do strongly recommend to limit all API keys to the IP you're going to use it from.
### Bybit Demo Mode
Bybit has a [demo mode](https://learn.bybit.com/en/bybit-guide/how-to-use-bybit-demo-trading) - which can be activated by setting `exchange.demo_trading` to `true` in the configuration.
Bybit uses live markets to simulate your trades (without market impact) - making it work very similar to freqtrade's dry-run mode.
You'll need to use separate API keys for demo trading, which you can create on bybit's demo page.
Demo mode is incompatible with dry-run.
## Bitmart
@@ -369,6 +403,11 @@ On startup, freqtrade will set the position mode to "One-way Mode" for the whole
!!! Tip "Stoploss on Exchange"
Hyperliquid supports `stoploss_on_exchange` and uses `stop-loss-limit` orders. It provides great advantages, so we recommend to benefit from it.
!!! Warning "Unified accounts"
Hyperliquid unified accounts are supported - though this relies freqtrade's assumption of "owning" the account, and being the only one trading on it (in this case, extended to both spot and futures).
We hence recommend the usage of subaccounts where possible, and to avoid manual trading on the same account while the bot is running.
Freqtrade will attempt to detect the account type on startup - changing the account type mid-trading is not supported and may lead to exceptions and errors.
Hyperliquid is a Decentralized Exchange (DEX). Decentralized exchanges work a bit different compared to normal exchanges. Instead of authenticating private API calls using an API key, private API calls need to be signed with the private key of your wallet (We recommend using an api Wallet for this, generated either on Hyperliquid or in your wallet of choice).
This needs to be configured like this:
@@ -399,30 +438,50 @@ Hyperliquid handles deposits and withdrawals on the Arbitrum One chain, a Layer
* Create a different software wallet, only transfer the funds you want to trade with to that wallet, and use that wallet to trade on Hyperliquid.
* If you have funds you don't want to use for trading (after making a profit for example), transfer them back to your hardware wallet.
### Hyperliquid Vault / Subaccount
Hyperliquid allows you to create either a vault or a subaccount.
To use these with Freqtrade, you will need to use the following configuration pattern:
!!! Warning "Vaults and Subaccounts"
You can only use either a vault or a subaccount - not both at the same time.
### Hyperliquid Subaccount
Hyperliquid allows you to create subaccounts with sufficient previous trading volume.
To use subaccounts with Freqtrade, you will need to use the following configuration pattern:
``` json
"exchange": {
"name": "hyperliquid",
"walletAddress": "your_master_wallet_address", // Your master wallet address (not the API wallet address and not the vault/subaccount address).
"walletAddress": "your_master_wallet_address", // Your master wallet address (not the API wallet or vault address - but not subaccount address).
"privateKey": "your_api_private_key", // API wallet private key (see https://app.hyperliquid.xyz/API). You'll only need the private key.
"ccxt_config": {
"options": {
"vaultAddress": "your_vault_address", // Optional, only if you want to use a vault ...
"subAccountAddress": "your_subaccount_address" // OR optional, only if you want to use a subaccount
"subAccountAddress": "your_subaccount_address" // Required if you want to use a subaccount.
}
},
// ...
}
```
Your balance and trades will now be used from your vault / subaccount - and no longer from your main account.
Your balance and trades will now be used from your subaccount - and no longer from your main account.
!!! Note
You can only use either a vault or a subaccount - not both at the same time.
### Hyperliquid Vault
Hyperliquid allows you to create vaults. To use vaults with Freqtrade, you will need to use the following configuration pattern:
``` json
"exchange": {
"name": "hyperliquid",
"walletAddress": "your_vault_address", // Your vault wallet address (Must also be added below in the ccxt_config.options.vaultAddress field)
"privateKey": "your_api_private_key", // API wallet private key (see https://app.hyperliquid.xyz/API). You'll only need the private key.
"ccxt_config": {
"options": {
"vaultAddress": "your_vault_address", // Optional, only if you want to use a vault ... (vault address must also be added to walletAdress)
}
},
// ...
}
```
Your balance and trades will now be used from your vault - and no longer from your main account.
### Historic Hyperliquid data
@@ -458,6 +517,8 @@ Replace `"dex_name_1"` and `"dex_name_2"` with the actual names of the HIP-3 DEX
!!! Note
HIP-3 DEXes share the same wallet and free amount of collateral as your main Hyperliquid account. Trades on different DEXes will affect your overall account balance and margin.
The pair name for HIP-3 pairs will be slightly different than non HIP-3 pairs. Please use `list-pairs` subcommand to get the correct pair naming for all pairs for the specified dexes.
## Bitvavo
If your account is required to use an operatorId, you can set it in the configuration file as follows:
@@ -521,5 +582,5 @@ For example, to test the order type `FOK` with Kraken, and modify candle limit t
!!! Warning
Please make sure to fully understand the impacts of these settings before modifying them.
Using `_ft_has_params` overrides may lead to unexpected behavior, and may even break your bot.
Using `_ft_has_params` overrides may lead to unexpected behavior, and may even break your bot.
We will not be able to provide support for issues caused by custom settings in `_ft_has_params`.
+2 -2
View File
@@ -2,7 +2,7 @@
## Supported Markets
Freqtrade supports spot trading, as well as futures trading for some selected exchanges. Please refer to the [documentation start page](index.md#supported-futures-exchanges-experimental) for an up-to-date list of supported exchanges.
Freqtrade supports spot trading, as well as futures trading for some selected exchanges. Please refer to the [documentation start page](index.md#supported-futures-exchanges) for an up-to-date list of supported exchanges.
### Can my bot open short positions?
@@ -14,7 +14,7 @@ In spot markets, you can in some cases use leveraged spot tokens, which reflect
### Can my bot trade options or futures?
Futures trading is supported for selected exchanges. Please refer to the [documentation start page](index.md#supported-futures-exchanges-experimental) for an up-to-date list of supported exchanges.
Futures trading is supported for selected exchanges. Please refer to the [documentation start page](index.md#supported-futures-exchanges) for an up-to-date list of supported exchanges.
## Beginner Tips & Tricks
+17
View File
@@ -46,6 +46,23 @@ On this page, you can also interact with the bot by starting and stopping it and
![FreqUI - trade view](assets/freqUI-trade-pane-dark.png#only-dark)
![FreqUI - trade view](assets/freqUI-trade-pane-light.png#only-light)
### Dashboard
The dashboard view provides an overview of the bot's performance and status.
If multiple bots are connected, the dashboard will show an overview of all connected bots, allowing you to easily switch between them or show just a subset of available bots.
#### Wallet Balance
New in freqtrade 2026.4: This shows the balance of the bot over time.
Compared to the "cumulative Profit" chart, this chart will show the actual balance of the bot over time, including unrealized profit and losses, as well as deposits and withdrawals.
Historic data has re-populated based on available exchange data - however is assumed to be best-effort and may not be 100% accurate.
More specifically, it won't cover deposits and withdrawals, and will assume a starting balance of current balance - profit/losses.
For clarity - a "Capture start" marker line is shown on the chart, which indicates the point at which the migration to the new wallet balance tracking system happened.
Only beyond this point, the wallet balance is expected to be accurate.
### Plot Configurator
FreqUI Plots can be configured either via a `plot_config` configuration object in the strategy (which can be loaded via "from strategy" button) or via the UI.
+5 -1
View File
@@ -166,7 +166,7 @@ Below are the values you can expect to include/use inside a typical strategy dat
| `df['do_predict']` | Indication of an outlier data point. The return value is integer between -2 and 2, which lets you know if the prediction is trustworthy or not. `do_predict==1` means that the prediction is trustworthy. If the Dissimilarity Index (DI, see details [here](freqai-feature-engineering.md#identifying-outliers-with-the-dissimilarity-index-di)) of the input data point is above the threshold defined in the config, FreqAI will subtract 1 from `do_predict`, resulting in `do_predict==0`. If `use_SVM_to_remove_outliers` is active, the Support Vector Machine (SVM, see details [here](freqai-feature-engineering.md#identifying-outliers-using-a-support-vector-machine-svm)) may also detect outliers in training and prediction data. In this case, the SVM will also subtract 1 from `do_predict`. If the input data point was considered an outlier by the SVM but not by the DI, or vice versa, the result will be `do_predict==0`. If both the DI and the SVM considers the input data point to be an outlier, the result will be `do_predict==-1`. As with the SVM, if `use_DBSCAN_to_remove_outliers` is active, DBSCAN (see details [here](freqai-feature-engineering.md#identifying-outliers-with-dbscan)) may also detect outliers and subtract 1 from `do_predict`. Hence, if both the SVM and DBSCAN are active and identify a datapoint that was above the DI threshold as an outlier, the result will be `do_predict==-2`. A particular case is when `do_predict == 2`, which means that the model has expired due to exceeding `expired_hours`. <br> **Datatype:** Integer between -2 and 2.
| `df['DI_values']` | Dissimilarity Index (DI) values are proxies for the level of confidence FreqAI has in the prediction. A lower DI means the prediction is close to the training data, i.e., higher prediction confidence. See details about the DI [here](freqai-feature-engineering.md#identifying-outliers-with-the-dissimilarity-index-di). <br> **Datatype:** Float.
| `df['%*']` | Any dataframe column prepended with `%` in `feature_engineering_*()` is treated as a training feature. For example, you can include the RSI in the training feature set (similar to in `templates/FreqaiExampleStrategy.py`) by setting `df['%-rsi']`. See more details on how this is done [here](freqai-feature-engineering.md). <br> **Note:** Since the number of features prepended with `%` can multiply very quickly (10s of thousands of features are easily engineered using the multiplictative functionality of, e.g., `include_shifted_candles` and `include_timeframes` as described in the [parameter table](freqai-parameter-table.md)), these features are removed from the dataframe that is returned from FreqAI to the strategy. To keep a particular type of feature for plotting purposes, you would prepend it with `%%` (see details below). <br> **Datatype:** Depends on the feature created by the user.
| `df['%%*']` | Any dataframe column prepended with `%%` in `feature_engineering_*()` is treated as a training feature, just the same as the above `%` prepend. However, in this case, the features are returned back to the strategy for FreqUI/plot-dataframe plotting and monitoring in Dry/Live/Backtesting <br> **Datatype:** Depends on the feature created by the user. Please note that features created in `feature_engineering_expand()` will have automatic FreqAI naming schemas depending on the expansions that you configured (i.e. `include_timeframes`, `include_corr_pairlist`, `indicators_periods_candles`, `include_shifted_candles`). So if you want to plot `%%-rsi` from `feature_engineering_expand_all()`, the final naming scheme for your plotting config would be: `%%-rsi-period_10_ETH/USDT:USDT_1h` for the `rsi` feature with `period=10`, `timeframe=1h`, and `pair=ETH/USDT:USDT` (the `:USDT` is added if you are using futures pairs). It is useful to simply add `print(dataframe.columns)` in your `populate_indicators()` after `self.freqai.start()` to see the full list of available features that are returned to the strategy for plotting purposes.
| `df['%%*']` | Any dataframe column prepended with `%%` in `feature_engineering_*()` is treated as a training feature, just the same as the above `%` prepend. However, in this case, the features are returned back to the strategy for FreqUI/plot-dataframe plotting and monitoring in Dry/Live/Backtesting <br> **Datatype:** Depends on the feature created by the user. <br>*Please note* that features created in `feature_engineering_expand()` will have automatic FreqAI naming schemas depending on the expansions that you configured (i.e. `include_timeframes`, `include_corr_pairlist`, `indicators_periods_candles`, `include_shifted_candles`). So if you want to plot `%%-rsi` from `feature_engineering_expand_all()`, the final naming scheme for your plotting config would be: `%%-rsi-period_10_ETH/USDT:USDT_1h` for the `rsi` feature with `period=10`, `timeframe=1h`, and `pair=ETH/USDT:USDT` (the `:USDT` is added if you are using futures pairs). It is useful to simply add `print(dataframe.columns)` in your `populate_indicators()` after `self.freqai.start()` to see the full list of available features that are returned to the strategy for plotting purposes.
## Setting the `startup_candle_count`
@@ -260,6 +260,10 @@ freqtrade trade --config config_examples/config_freqai.example.json --strategy F
PyTorch dropped support for macOS x64 (intel based Apple devices) in version 2.3. Subsequently, freqtrade also dropped support for PyTorch on this platform.
!!! Danger "Security notice"
Loading saved models from disk can cause security issues if using remote model files (files you downloaded from the internet or received from an untrusted source) due to having the necessity to have `weights_only=False`, which can cause security problems.
As long as you only load models that you have trained yourself, there is no risk.
### Structure
#### Model
+1
View File
@@ -106,6 +106,7 @@ Mandatory parameters are marked as **Required** and have to be set in one of the
| `n_epochs` | The `n_epochs` parameter is a crucial setting in the PyTorch training loop that determines the number of times the entire training dataset will be used to update the model's parameters. An epoch represents one full pass through the entire training dataset. Overrides `n_steps`. Either `n_epochs` or `n_steps` must be set. <br><br> **Datatype:** int. optional. <br> Default: `10`.
| `n_steps` | An alternative way of setting `n_epochs` - the number of training iterations to run. Iteration here refer to the number of times we call `optimizer.step()`. Ignored if `n_epochs` is set. A simplified version of the function: <br><br> n_epochs = n_steps / (n_obs / batch_size) <br><br> The motivation here is that `n_steps` is easier to optimize and keep stable across different n_obs - the number of data points. <br> <br> **Datatype:** int. optional. <br> Default: `None`.
| `batch_size` | The size of the batches to use during training. <br><br> **Datatype:** int. <br> Default: `64`.
| `early_stopping_patience` | Number of epochs with no improvement in validation loss before training is stopped early. This helps prevent overfitting by halting training when the model stops improving. Set to `0` to disable early stopping. Requires a test/validation split (`test_size > 0`). <br><br> **Datatype:** int. <br> Default: `0` (disabled).
### Additional parameters
+1 -1
View File
@@ -45,7 +45,7 @@ where `ReinforcementLearner` will use the templated `ReinforcementLearner` from
More details about feature engineering available:
https://www.freqtrade.io/en/latest/freqai-feature-engineering
https://www.freqtrade.io/en/stable/freqai-feature-engineering
:param df: strategy dataframe which will receive the targets
usage example: dataframe["&-target"] = dataframe["close"].shift(-1) / dataframe["close"]
+4
View File
@@ -87,6 +87,10 @@ To save the models generated during a particular backtest so that you can start
To ensure that the model can be reused, freqAI will call your strategy with a dataframe of length 1.
If your strategy requires more data than this to generate the same features, you can't reuse backtest predictions for live deployment and need to update your `identifier` for each new backtest.
!!! Danger "Security notice"
Loading saved models from disk can cause security issues if using remote model files (files you downloaded from the internet or received from an untrusted source) due to having the necessity to have `weights_only=False`, which can cause security problems.
As long as you only load models that you have trained yourself, there is no risk.
### Backtest live collected predictions
FreqAI allow you to reuse live historic predictions through the backtest parameter `--freqai-backtest-live-models`. This can be useful when you want to reuse predictions generated in dry/run for comparison or other study.
+1 -1
View File
@@ -7,7 +7,7 @@
FreqAI is a software designed to automate a variety of tasks associated with training a predictive machine learning model to generate market forecasts given a set of input signals. In general, FreqAI aims to be a sandbox for easily deploying robust machine learning libraries on real-time data ([details](#freqai-position-in-open-source-machine-learning-landscape)).
!!! Note
FreqAI is, and always will be, a not-for-profit, open source project. FreqAI does *not* have a crypto token, FreqAI does *not* sell signals, and FreqAI does not have a domain besides the present [freqtrade documentation](https://www.freqtrade.io/en/latest/freqai/).
FreqAI is, and always will be, a not-for-profit, open source project. FreqAI does *not* have a crypto token, FreqAI does *not* sell signals, and FreqAI does not have a domain besides the present [freqtrade documentation](https://www.freqtrade.io/en/stable/freqai/).
Features include:
+2 -2
View File
@@ -15,7 +15,7 @@ Assuming your application is deployed as `https://frequi.freqtrade.io/home/` - t
```jsonc
{
//...
"jwt_secret_key": "somethingrandom",
"jwt_secret_key": "somethingRandomSomethingRandom123",
"CORS_origins": ["https://frequi.freqtrade.io"],
//...
}
@@ -29,7 +29,7 @@ The correct configuration for this case is `http://localhost:8080` - the main pa
```jsonc
{
//...
"jwt_secret_key": "somethingrandom",
"jwt_secret_key": "somethingRandomSomethingRandom123",
"CORS_origins": ["http://localhost:8080"],
//...
}
+1
View File
@@ -15,6 +15,7 @@
| [Hyperliquid](exchanges.md#hyperliquid) | spot | | ❌ (not supported) |
| [Hyperliquid](exchanges.md#hyperliquid) | futures | isolated, cross | limit |
| [Kraken](exchanges.md#kraken) | spot | | market, limit |
| [Kraken](exchanges.md#kraken-futures) | futures | isolated | market, limit |
| [OKX](exchanges.md#okx) | spot | | limit |
| [OKX](exchanges.md#okx) | futures | isolated | limit |
| [Bitvavo](exchanges.md#bitvavo) | spot | | ❌ (not supported) |
+11 -2
View File
@@ -2,11 +2,11 @@
Pairlist Handlers define the list of pairs (pairlist) that the bot should trade. They are configured in the `pairlists` section of the configuration settings.
In your configuration, you can use Static Pairlist (defined by the [`StaticPairList`](#static-pair-list) Pairlist Handler) and Dynamic Pairlist (defined by the [`VolumePairList`](#volume-pair-list) and [`PercentChangePairList`](#percent-change-pair-list) Pairlist Handlers).
In your configuration, you can use Static Pairlist (defined by the [`StaticPairList`](#static-pair-list) Pairlist Handler) and Dynamic Pairlist (defined by the [`VolumePairList`](#volume-pair-list), [`CrossMarketPairList`](#crossmarketpairlist), [`MarketCapPairlist`](#marketcappairlist) and [`PercentChangePairList`](#percent-change-pair-list) Pairlist Handlers).
Additionally, [`AgeFilter`](#agefilter), [`DelistFilter`](#delistfilter), [`PrecisionFilter`](#precisionfilter), [`PriceFilter`](#pricefilter), [`ShuffleFilter`](#shufflefilter), [`SpreadFilter`](#spreadfilter) and [`VolatilityFilter`](#volatilityfilter) act as Pairlist Filters, removing certain pairs and/or moving their positions in the pairlist.
If multiple Pairlist Handlers are used, they are chained and a combination of all Pairlist Handlers forms the resulting pairlist the bot uses for trading and backtesting. Pairlist Handlers are executed in the sequence they are configured. You can define either `StaticPairList`, `VolumePairList`, `ProducerPairList`, `RemotePairList`, `MarketCapPairList` or `PercentChangePairList` as the starting Pairlist Handler.
If multiple Pairlist Handlers are used, they are chained and a combination of all Pairlist Handlers forms the resulting pairlist the bot uses for trading and backtesting. Pairlist Handlers are executed in the sequence they are configured. You can define either `StaticPairList`, `VolumePairList`, `ProducerPairList`, `RemotePairList`, `MarketCapPairList`, `PercentChangePairList` or `CrossMarketPairList` as the starting Pairlist Handler.
Inactive markets are always removed from the resulting pairlist. Explicitly blacklisted pairs (those in the `pair_blacklist` configuration setting) are also always removed from the resulting pairlist.
@@ -26,6 +26,7 @@ You may also use something like `.*DOWN/BTC` or `.*UP/BTC` to exclude leveraged
* [`ProducerPairList`](#producerpairlist)
* [`RemotePairList`](#remotepairlist)
* [`MarketCapPairList`](#marketcappairlist)
* [`CrossMarketPairList`](#crossmarketpairlist)
* [`AgeFilter`](#agefilter)
* [`DelistFilter`](#delistfilter)
* [`FullTradesFilter`](#fulltradesfilter)
@@ -303,6 +304,8 @@ The optional `mode` option specifies if the pairlist should be used as a `blackl
The optional `processing_mode` option in the RemotePairList configuration determines how the retrieved pairlist is processed. It can have two values: "filter" or "append". The default value is "filter".
The optional `number_assets` option in the RemotePairList configuration determines how many pairs will be returned if used in whitelist `mode`. By default, all pairs will be returned. In blacklist `mode`, this option will be ignored.
In "filter" mode, the retrieved pairlist is used as a filter. Only the pairs present in both the original pairlist and the retrieved pairlist are included in the final pairlist. Other pairs are filtered out.
In "append" mode, the retrieved pairlist is added to the original pairlist. All pairs from both lists are included in the final pairlist without any filtering.
@@ -402,6 +405,12 @@ Coins like 1000PEPE/USDT or KPEPE/USDT:USDT are detected on a best effort basis,
!!! Danger "Duplicate symbols in coingecko"
Coingecko often has duplicate symbols, where the same symbol is used for different coins. Freqtrade will use the symbol as is and try to search for it on the exchange. If the symbol exists - it will be used. Freqtrade will however not check if the _intended_ symbol is the one coingecko meant. This can sometimes lead to unexpected results, especially on low volume coins or with meme coin categories.
#### CrossMarketPairList
Generate or filter pairs based of their availability on the opposite market.
The `pairs_exist_on` setting defines whether the pairs should exists on both spot and futures market (`both_markets`) or only exist on the specified trading mode (`current_market_only`). By default, the plugin will be in `both_markets` setting, which means whitelisted pairs have to exists on both spot and futures markets.
#### AgeFilter
Removes pairs that have been listed on the exchange for less than `min_days_listed` days (defaults to `10`) or more than `max_days_listed` days (defaults `None` mean infinity).
+22 -10
View File
@@ -20,15 +20,15 @@ All protection end times are rounded up to the next candle to avoid sudden, unex
### Common settings to all Protections
| Parameter| Description |
|------------|-------------|
| `method` | Protection name to use. <br> **Datatype:** String, selected from [available Protections](#available-protections)
| `stop_duration_candles` | For how many candles should the lock be set? <br> **Datatype:** Positive integer (in candles)
| `stop_duration` | how many minutes should protections be locked. <br>Cannot be used together with `stop_duration_candles`. <br> **Datatype:** Float (in minutes)
| `lookback_period_candles` | Only trades that completed within the last `lookback_period_candles` candles will be considered. This setting may be ignored by some Protections. <br> **Datatype:** Positive integer (in candles).
| `lookback_period` | Only trades that completed after `current_time - lookback_period` will be considered. <br>Cannot be used together with `lookback_period_candles`. <br>This setting may be ignored by some Protections. <br> **Datatype:** Float (in minutes)
| `trade_limit` | Number of trades required at minimum (not used by all Protections). <br> **Datatype:** Positive integer
| `unlock_at` | Time when trading will be unlocked regularly (not used by all Protections). <br> **Datatype:** string <br>**Input Format:** "HH:MM" (24-hours)
| Parameter | Description |
| --------- | ---------- |
| `method` | Protection name to use. <br> **Datatype:** String, selected from [available Protections](#available-protections) |
| `stop_duration_candles` | For how many candles should the lock be set? <br> **Datatype:** Positive integer (in candles) |
| `stop_duration` | how many minutes should protections be locked. <br>Cannot be used together with `stop_duration_candles`. <br> **Datatype:** Float (in minutes) |
| `lookback_period_candles` | Only trades that completed within the last `lookback_period_candles` candles will be considered. This setting may be ignored by some Protections. <br> **Datatype:** Positive integer (in candles). |
| `lookback_period` | Only trades that completed after `current_time - lookback_period` will be considered. <br>Cannot be used together with `lookback_period_candles`. <br>This setting may be ignored by some Protections. <br> **Datatype:** Float (in minutes) |
| `trade_limit` | Number of trades required at minimum (not used by all Protections). <br> **Datatype:** Positive integer |
| `unlock_at` | Time when trading will be unlocked regularly (not used by all Protections). <br> **Datatype:** string <br>**Input Format:** "HH:MM" (24-hours) |
!!! Note "Durations"
Durations (`stop_duration*` and `lookback_period*` can be defined in either minutes or candles).
@@ -69,7 +69,17 @@ def protections(self):
#### MaxDrawdown
`MaxDrawdown` uses all trades within `lookback_period` in minutes (or in candles when using `lookback_period_candles`) to determine the maximum drawdown. If the drawdown is below `max_allowed_drawdown`, trading will stop for `stop_duration` in minutes (or in candles when using `stop_duration_candles`) after the last trade - assuming that the bot needs some time to let markets recover.
The `MaxDrawdown` protection evaluates trades that closed within the current `lookback_period` (or `lookback_period_candles`).
It supports 2 calculation modes:
- `calculation_mode: "ratios"` (default): Legacy approximation based on cumulative profit ratios.
- `calculation_mode: "equity"`: Standard peak-to-trough drawdown on the account equity curve, using starting balance and cumulative absolute profit.
With `calculation_mode: "ratios"`, drawdown is derived from cumulative trade profit ratios, not from the account equity curve. This is kept for backward compatibility and can differ from account-level drawdown when position sizing changes over time.
For new setups, `calculation_mode: "equity"` is recommended. Prefer `calculation_mode: "ratios"` only when you intentionally rely on legacy behavior, especially with fixed stake amount configurations where ratio-based behavior is easier to reason about.
If the observed drawdown exceeds `max_allowed_drawdown`, trading will stop for `stop_duration` after the last trade - assuming that the bot needs some time to let markets recover.
The below sample stops trading for 12 candles if max-drawdown is > 20% considering all pairs - with a minimum of `trade_limit` trades - within the last 48 candles. If desired, `lookback_period` and/or `stop_duration` can be used.
@@ -79,6 +89,7 @@ def protections(self):
return [
{
"method": "MaxDrawdown",
"calculation_mode": "equity",
"lookback_period_candles": 48,
"trade_limit": 20,
"stop_duration_candles": 12,
@@ -160,6 +171,7 @@ class AwesomeStrategy(IStrategy)
},
{
"method": "MaxDrawdown",
"calculation_mode": "equity",
"lookback_period_candles": 48,
"trade_limit": 20,
"stop_duration_candles": 4,
+4 -1
View File
@@ -2,7 +2,9 @@
[![Freqtrade CI](https://github.com/freqtrade/freqtrade/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/freqtrade/freqtrade/actions/workflows/ci.yml)
[![DOI](https://joss.theoj.org/papers/10.21105/joss.04864/status.svg)](https://doi.org/10.21105/joss.04864)
[![Coverage Status](https://coveralls.io/repos/github/freqtrade/freqtrade/badge.svg?branch=develop&service=github)](https://coveralls.io/github/freqtrade/freqtrade?branch=develop)
[![codecov](https://codecov.io/gh/freqtrade/freqtrade/branch/develop/graph/badge.svg?token=AD5BG3ATKI)](https://codecov.io/gh/freqtrade/freqtrade)
[![Documentation](https://readthedocs.org/projects/freqtrade/badge/)](https://www.freqtrade.io)
[![Discord Server](https://img.shields.io/badge/Freqtrade_Discord-4E4E4E?logo=discord)](https://discord.gg/p7nuUNVfP7)
<!-- GitHub action buttons -->
[:octicons-star-16: Star](https://github.com/freqtrade/freqtrade){ .md-button .md-button--sm }
@@ -60,6 +62,7 @@ Please read the [exchange specific notes](exchanges.md) to learn about eventual,
- [X] [Gate.io](https://www.gate.io/ref/6266643)
- [X] [Hyperliquid](https://hyperliquid.xyz/) (A decentralized exchange, or DEX)
- [X] [OKX](https://okx.com/)
- [X] [Kraken](https://www.kraken.com/features/futures)
Please make sure to read the [exchange specific notes](exchanges.md), as well as the [trading with leverage](leverage.md) documentation before diving in.
+4 -4
View File
@@ -111,10 +111,10 @@ It also allows multiple subplots to display both MACD and RSI at the same time.
Plot type can be configured using `type` key. Possible types are:
* `scatter` corresponding to `plotly.graph_objects.Scatter` class (default).
* `bar` corresponding to `plotly.graph_objects.Bar` class.
* `scatter` corresponding a scatter plot.
* `bar` corresponding to a bar plot.
Extra parameters to `plotly.graph_objects.*` constructor can be specified in `plotly` dict.
Extra parameters to `plotly.graph_objects.*` constructor can be specified in `plotly` dict - these are only supported when using plotly as plotting library and will be ignored when using freq-ui.
Sample configuration with inline comments explaining the process:
@@ -163,7 +163,7 @@ def plot_config(self):
```
??? Note "As attribute (former method)"
Assigning plot_config is also possible as Attribute (this used to be the default way).
Assigning `plot_config` is also possible as Attribute (this used to be the default way).
This has the disadvantage that strategy parameters are not available, preventing certain configurations from working.
``` python
+4 -4
View File
@@ -1,7 +1,7 @@
markdown==3.10
markdown==3.10.2
mkdocs==1.6.1
mkdocs-material==9.7.1
mkdocs-material==9.7.6
mdx_truly_sane_lists==1.3
pymdown-extensions==10.20
pymdown-extensions==10.21.3
jinja2==3.1.6
mike==2.1.3
mike==2.2.0
+12 -12
View File
@@ -17,7 +17,7 @@ Sample configuration:
"listen_port": 8080,
"verbosity": "error",
"enable_openapi": false,
"jwt_secret_key": "somethingrandom",
"jwt_secret_key": "somethingRandomSomethingRandom123",
"CORS_origins": [],
"username": "Freqtrader",
"password": "SuperSecret1!",
@@ -56,7 +56,7 @@ secrets.token_hex()
!!! Danger "Password selection"
Please make sure to select a very strong, unique password to protect your bot from unauthorized access.
Also change `jwt_secret_key` to something random (no need to remember this, but it'll be used to encrypt your session, so it better be something unique!).
Also change `jwt_secret_key` to something random (no need to remember this, but it'll be used to encrypt your session, so it better be something unique!). This value should also be 32 characters or longer to be safe.
### Configuration with docker
@@ -202,20 +202,20 @@ All endpoints in the below table need to be prefixed with the base URL of the AP
| `/blacklist` | GET | Show the current blacklist.
| `/blacklist` | POST | Adds the specified pair to the blacklist.<br/>*Params:*<br/>- `blacklist` (`str`)
| `/blacklist` | DELETE | Deletes the specified list of pairs from the blacklist.<br/>*Params:*<br/>- `[pair,pair]` (`list[str]`)
| `/pair_candles` | GET | Returns dataframe for a pair / timeframe combination while the bot is running. **Alpha**
| `/pair_candles` | POST | Returns dataframe for a pair / timeframe combination while the bot is running, filtered by a provided list of columns to return. **Alpha**<br/>*Params:*<br/>- `<column_list>` (`list[str]`)
| `/pair_history` | GET | Returns an analyzed dataframe for a given timerange, analyzed by a given strategy. **Alpha**
| `/pair_history` | POST | Returns an analyzed dataframe for a given timerange, analyzed by a given strategy, filtered by a provided list of columns to return. **Alpha**<br/>*Params:*<br/>- `<column_list>` (`list[str]`)
| `/plot_config` | GET | Get plot config from the strategy (or nothing if not configured). **Alpha**
| `/strategies` | GET | List strategies in strategy directory. **Alpha**
| `/strategy/<strategy>` | GET | Get specific Strategy content by strategy class name. **Alpha**<br/>*Params:*<br/>- `<strategy>` (`str`)
| `/available_pairs` | GET | List available backtest data. **Alpha**
| `/pair_candles` | GET | Returns dataframe for a pair / timeframe combination while the bot is running.
| `/pair_candles` | POST | Returns dataframe for a pair / timeframe combination while the bot is running, filtered by a provided list of columns to return.<br/>*Params:*<br/>- `<column_list>` (`list[str]`)
| `/pair_history` | GET | Returns an analyzed dataframe for a given timerange, analyzed by a given strategy.
| `/pair_history` | POST | Returns an analyzed dataframe for a given timerange, analyzed by a given strategy, filtered by a provided list of columns to return.<br/>*Params:*<br/>- `<column_list>` (`list[str]`)
| `/plot_config` | GET | Get plot config from the strategy (or nothing if not configured).
| `/strategies` | GET | List strategies in strategy directory.
| `/strategy/<strategy>` | GET | Get specific Strategy content by strategy class name.<br/>*Params:*<br/>- `<strategy>` (`str`)
| `/available_pairs` | GET | List available backtest data.
| `/version` | GET | Show version.
| `/sysinfo` | GET | Show information about the system load.
| `/health` | GET | Show bot health (last bot loop).
!!! Warning "Alpha status"
Endpoints labeled with *Alpha status* above may change at any time without notice.
Endpoints labeled with *Alpha status* or *Beta status* above may change at any time without notice.
### Message WebSocket
@@ -245,7 +245,7 @@ You would then add that token under `ws_token` in your `api_server` config. Like
"listen_port": 8080,
"verbosity": "error",
"enable_openapi": false,
"jwt_secret_key": "somethingrandom",
"jwt_secret_key": "somethingRandomSomethingRandom123",
"CORS_origins": [],
"username": "Freqtrader",
"password": "SuperSecret1!",
+7 -2
View File
@@ -104,7 +104,7 @@ WHERE id=31;
### Remove trade from the database
!!! Tip "Use RPC Methods to delete trades"
Consider using `/delete <tradeid>` via telegram or rest API. That's the recommended way to deleting trades.
Consider using `/delete <tradeid>` via telegram or rest API. That's the recommended way to deleting trades, as it will also remove the corresponding orders and custom data, and it will also trigger the necessary events in the bot to keep everything in sync.
If you'd still like to remove a trade from the database directly, you can use the below query.
@@ -113,9 +113,14 @@ If you'd still like to remove a trade from the database directly, you can use th
```sql
DELETE FROM trades WHERE id = <tradeid>;
DELETE FROM orders WHERE ft_trade_id = <tradeid>;
DELETE FROM trade_custom_data WHERE ft_trade_id = <tradeid>;
DELETE FROM trades WHERE id = 31;
DELETE FROM orders WHERE ft_trade_id = 31;
DELETE FROM trade_custom_data WHERE ft_trade_id = 31;
```
!!! Warning
This will remove this trade from the database. Please make sure you got the correct id and **NEVER** run this query without the `where` clause.
This will remove the specified trade from the database. Please make sure you got the correct id and **NEVER** run this query without the `where` clause.
+19 -2
View File
@@ -39,6 +39,22 @@ The Order-type will be ignored if only one mode is available.
In that case, the bot will fallback to using the `emergency_exit` order type to place a market order as placing the stoploss order failed.
Freqtrade currently does not implement a limitation to avoid this situation, so please ensure your stoploss values are within reasonable limits for your exchange or disable stoploss on exchange.
### Which order type is used for stoploss on exchange?
The order type used for stoploss on exchange is determined by the `stoploss` value and the exchange capabilities.
If your selected exchange supports both stop-limit and stop-market orders, then the `stoploss` value will determine which order type is used for stoploss on exchange.
If your exchange only supports one of the two order types, you must configure your `stoploss` value accordingly, otherwise the bot will fail to start.
### Which order type should i use for stoploss on exchange?
If we translate the two stoploss order types into human words - they would be something like this:
* **stoploss-market** -> "when stop triggers, get me the hell out of here at whatever price".
* **stoploss-limit** -> "when stop triggers, place a limit order x% below the stoploss price. I accept a loss of "stoploss + 1%" at worst - but if price jumps further - i accept to wait for price to get back down to me, potentially resulting in a much bigger loss than "stoploss + 1%".
As a consequence, we recommend using stoploss-market orders whenever possible, as the main point of a stoploss is to get you out of a position when the market is crashing, and in such situations, you'll want to exit the position immediately at the best available price, rather than risking a limit order not getting filled and potentially incurring even greater losses.
The choice is ultimately up to you, but please be aware of the risk of using stoploss-limit orders, especially in volatile markets.
### stoploss_on_exchange and stoploss_on_exchange_limit_ratio
Enable or Disable stop loss on exchange.
@@ -66,9 +82,10 @@ This same logic will reapply a stoploss order on the exchange should you cancel
### stoploss_price_type
!!! Warning "Only applies to futures"
`stoploss_price_type` only applies to futures markets (on exchanges where it's available).
`stoploss_price_type` only applies to futures markets (on exchanges where it's available).
Freqtrade will perform a validation of this setting on startup, failing to start if an invalid setting for your exchange has been selected.
Supported price types are gonna differs between each exchanges. Please check with your exchange on which price types it supports.
Supported price types are gonna differs between each exchanges. Please check with your exchange on which price types it supports.
In spot markets, this setting is ignored and not validated, as most exchanges only support one price type for stoploss orders on spot markets.
Stoploss on exchange on futures markets can trigger on different price types.
The naming for these prices in exchange terminology often varies, but is usually something around "last" (or "contract price" ), "mark" and "index".
+1 -1
View File
@@ -33,7 +33,7 @@ class AwesomeStrategy(IStrategy):
trade_entry_type = trade.get_custom_data(key='entry_type')
if trade_entry_type is None:
trade_entry_type = 'breakout' if 'entry_1' in trade.enter_tag else 'dip'
elif fills > 1:
elif len(fills) > 1:
trade_entry_type = 'buy_up'
trade.set_custom_data(key='entry_type', value=trade_entry_type)
return super().bot_loop_start(**kwargs)
+11 -7
View File
@@ -225,7 +225,7 @@ class AwesomeStrategy(IStrategy):
e.g. returning -0.05 would create a stoploss 5% below current_rate.
The custom stoploss can never be below self.stoploss, which serves as a hard maximum loss.
For full documentation please go to https://www.freqtrade.io/en/latest/strategy-advanced/
For full documentation please go to https://www.freqtrade.io/en/stable/strategy-advanced/
When not implemented by a strategy, returns the initial stoploss value.
Only called when use_custom_stoploss is set to True.
@@ -696,6 +696,9 @@ However, freqtrade also offers a custom callback for both order types, which all
Backtesting fills orders if their price falls within the candle's low/high range.
The below callbacks will be called once per (detail) candle for orders that don't fill immediately (which use custom pricing).
!!! Tip "Replacing orders"
If you'd like to replace an order with a different price instead of just cancelling it, you might want to look at [`adjust_order_price()`](#adjust-order-price) instead, which will allow you to both cancel the order, as well as replace it with a new price.
### Custom order timeout example
Called for every open order until that order is either filled or cancelled.
@@ -805,7 +808,7 @@ class AwesomeStrategy(IStrategy):
Timing for this function is critical, so avoid doing heavy computations or
network requests in this method.
For full documentation please go to https://www.freqtrade.io/en/latest/strategy-advanced/
For full documentation please go to https://www.freqtrade.io/en/stable/strategy-advanced/
When not implemented by a strategy, returns True (always confirming).
@@ -853,7 +856,7 @@ class AwesomeStrategy(IStrategy):
Timing for this function is critical, so avoid doing heavy computations or
network requests in this method.
For full documentation please go to https://www.freqtrade.io/en/latest/strategy-advanced/
For full documentation please go to https://www.freqtrade.io/en/stable/strategy-advanced/
When not implemented by a strategy, returns True (always confirming).
@@ -991,7 +994,7 @@ class DigDeeperStrategy(IStrategy):
This means extra entry or exit orders with additional fees.
Only called when `position_adjustment_enable` is set to True.
For full documentation please go to https://www.freqtrade.io/en/latest/strategy-advanced/
For full documentation please go to https://www.freqtrade.io/en/stable/strategy-advanced/
When not implemented by a strategy, returns None
@@ -1118,7 +1121,7 @@ class AwesomeStrategy(IStrategy):
This only executes when a order was already placed, still open (unfilled fully or partially)
and not timed out on subsequent candles after entry trigger.
For full documentation please go to https://www.freqtrade.io/en/latest/strategy-callbacks/
For full documentation please go to https://www.freqtrade.io/en/stable/strategy-callbacks/
When not implemented by a strategy, returns current_order_rate as default.
If current_order_rate is returned then the existing order is maintained.
@@ -1303,7 +1306,8 @@ Currently two types of annotations are supported, `area` and `line`.
"z_level": 5, // z-level, higher values are drawn on top of lower values. Positions relative to the Chart elements need to be set in freqUI.
"label": "some label",
"size": 2, // Optional, line width in pixels. Defaults to 10
"symbol": "circle", // Optional, can be "circle", "rect", "roundRect", "triangle", "pin", "arrow", "none".
"shape": "circle", // Optional, can be "circle", "rect", "roundRect", "triangle", "pin", "arrow", "none".
"rotate": 0, // Optional, rotation of the shape/symbol in degrees. Defaults to 0
}
```
@@ -1385,7 +1389,7 @@ Entries will be validated, and won't be passed to the UI if they don't correspon
}
)
elif (start_dt.hour % 2) == 0:
price = dataframe.loc[dataframe["date"] == start_dt, ["close"]].mean()
price = dataframe.loc[dataframe["date"] == start_dt, "close"].mean()
annotations.append(
{
"type": "area",
+2
View File
@@ -910,6 +910,8 @@ if self.dp.runmode.value in ('live', 'dry_run'):
### *check_delisting(pair)*
Return Datetime of the pair delisting schedule if any, otherwise return None
```python
def custom_exit(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, **kwargs):
if self.dp.runmode.value in ('live', 'dry_run'):
+6 -6
View File
@@ -594,9 +594,9 @@ Features will now expand automatically. As such, the expansion loops, as well as
More details on how these config defined parameters accelerate feature engineering
in the documentation at:
https://www.freqtrade.io/en/latest/freqai-parameter-table/#feature-parameters
https://www.freqtrade.io/en/stable/freqai-parameter-table/#feature-parameters
https://www.freqtrade.io/en/latest/freqai-feature-engineering/#defining-the-features
https://www.freqtrade.io/en/stable/freqai-feature-engineering/#defining-the-features
:param df: strategy dataframe which will receive the features
:param period: period of the indicator - usage example:
@@ -657,9 +657,9 @@ Basic features. Make sure to remove the `{pair}` part from your features.
More details on how these config defined parameters accelerate feature engineering
in the documentation at:
https://www.freqtrade.io/en/latest/freqai-parameter-table/#feature-parameters
https://www.freqtrade.io/en/stable/freqai-parameter-table/#feature-parameters
https://www.freqtrade.io/en/latest/freqai-feature-engineering/#defining-the-features
https://www.freqtrade.io/en/stable/freqai-feature-engineering/#defining-the-features
:param df: strategy dataframe which will receive the features
dataframe["%-pct-change"] = dataframe["close"].pct_change()
@@ -690,7 +690,7 @@ Basic features. Make sure to remove the `{pair}` part from your features.
More details about feature engineering available:
https://www.freqtrade.io/en/latest/freqai-feature-engineering
https://www.freqtrade.io/en/stable/freqai-feature-engineering
:param df: strategy dataframe which will receive the features
usage example: dataframe["%-day_of_week"] = (dataframe["date"].dt.dayofweek + 1) / 7
@@ -713,7 +713,7 @@ Targets now get their own, dedicated method.
More details about feature engineering available:
https://www.freqtrade.io/en/latest/freqai-feature-engineering
https://www.freqtrade.io/en/stable/freqai-feature-engineering
:param df: strategy dataframe which will receive the targets
usage example: dataframe["&-target"] = dataframe["close"].shift(-1) / dataframe["close"]
+1 -1
View File
@@ -416,6 +416,6 @@ Your original strategy will remain available in the `user_data/strategies_orig_u
!!! Warning "Conversion results"
Strategy updater will work on a "best effort" approach. Please do your due diligence and verify the results of the conversion.
We also recommend to run a python formatter (e.g. `black`) to format results in a sane manner.
We also recommend to run a python formatter (e.g. `ruff format`) to format results in a sane manner.
--8<-- "commands/strategy-updater.md"
+1 -1
View File
@@ -1,6 +1,6 @@
"""Freqtrade bot"""
__version__ = "2026.2-dev"
__version__ = "2026.5-dev"
if "dev" in __version__:
from pathlib import Path
+9 -3
View File
@@ -215,9 +215,7 @@ AVAILABLE_CLI_OPTIONS = {
"--strategy-list",
help="Provide a space-separated list of strategies to backtest. "
"Please note that timeframe needs to be set either in config "
"or via command line. When using this together with `--export trades`, "
"the strategy-name is injected into the filename "
"(so `backtest-data.json` becomes `backtest-data-SampleStrategy.json`",
"or via command line. ",
nargs="+",
),
"backtest_notes": Arg(
@@ -240,6 +238,14 @@ AVAILABLE_CLI_OPTIONS = {
"exportfilename": Arg(
"--backtest-filename",
"--export-filename",
fthelp={
"freqtrade backtesting": (
"DEPRECATED: This option is deprecated for backtesting and will be removed "
"in a future release. "
"Using a custom filename for backtest results is no longer supported. "
"Use `--backtest-directory` to specify the directory."
),
},
help="Use this filename for backtest results."
"Example: `--backtest-filename=backtest_results_2020-09-27_16-20-48.json`. "
"Assumes either `user_data/backtest_results/` or `--export-directory` as base directory.",
+1 -1
View File
@@ -223,7 +223,7 @@ def start_list_trades_data(args: dict[str, Any]) -> None:
end.strftime(DATETIME_PRINT_FORMAT),
str(length),
)
for pair, start, end, length in sorted(paircombs1, key=lambda x: (x[0]))
for pair, start, end, length in sorted(paircombs1, key=lambda x: x[0])
],
("Pair", "Type", "From", "To", "Trades"),
summary=title,
+3 -37
View File
@@ -8,13 +8,10 @@ logger = logging.getLogger(__name__)
def start_convert_db(args: dict[str, Any]) -> None:
from sqlalchemy import func, select
from sqlalchemy.orm import make_transient
from freqtrade.configuration.config_setup import setup_utils_configuration
from freqtrade.persistence import Order, Trade, init_db
from freqtrade.persistence.migrations import set_sequence_ids
from freqtrade.persistence.pairlock import PairLock
from freqtrade.persistence import Trade, init_db
from freqtrade.persistence.db_migration import migrate_db
config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)
@@ -22,35 +19,4 @@ def start_convert_db(args: dict[str, Any]) -> None:
session_target = Trade.session
init_db(config["db_url_from"])
logger.info("Starting db migration.")
trade_count = 0
pairlock_count = 0
for trade in Trade.get_trades():
trade_count += 1
make_transient(trade)
for o in trade.orders:
make_transient(o)
session_target.add(trade)
session_target.commit()
for pairlock in PairLock.get_all_locks():
pairlock_count += 1
make_transient(pairlock)
session_target.add(pairlock)
session_target.commit()
# Update sequences
max_trade_id = session_target.scalar(select(func.max(Trade.id)))
max_order_id = session_target.scalar(select(func.max(Order.id)))
max_pairlock_id = session_target.scalar(select(func.max(PairLock.id)))
set_sequence_ids(
session_target.get_bind(),
trade_id=max_trade_id,
order_id=max_order_id,
pairlock_id=max_pairlock_id,
)
logger.info(f"Migrated {trade_count} Trades, and {pairlock_count} Pairlocks.")
migrate_db(session_target)
+10 -3
View File
@@ -4,7 +4,7 @@ import sys
from typing import Any
from freqtrade.enums import RunMode
from freqtrade.exceptions import ConfigurationError, OperationalException
from freqtrade.exceptions import ConfigurationError, DependencyException, OperationalException
logger = logging.getLogger(__name__)
@@ -166,7 +166,14 @@ def start_list_strategies(args: dict[str, Any]) -> None:
strategy_objs = sorted(strategy_objs, key=lambda x: x["name"])
for obj in strategy_objs:
if obj["class"]:
obj["hyperoptable"] = detect_all_parameters(obj["class"])
try:
obj["hyperoptable"] = detect_all_parameters(obj["class"])
except DependencyException as e:
logger.warning(
f"Cannot detect hyperoptable parameters for strategy {obj['name']}. Reason: {e}"
)
obj["hyperoptable"] = {}
else:
obj["hyperoptable"] = {}
@@ -386,7 +393,7 @@ def start_show_trades(args: dict[str, Any]) -> None:
tfilter = []
if config.get("trade_ids"):
tfilter.append(Trade.id.in_(config["trade_ids"]))
tfilter.append(Trade.id.in_(int(tid) for tid in config["trade_ids"]))
trades = Trade.get_trades(tfilter).all()
logger.info(f"Printing {len(trades)} Trades: ")
+14 -1
View File
@@ -236,6 +236,10 @@ CONF_SCHEMA = {
"type": "string",
"enum": BACKTEST_CACHE_AGE,
},
"skip_wallet_history_migration": {
"description": "Disable wallet history migration.",
"type": "boolean",
},
# Hyperopt
"hyperopt_path": {
"description": "Specify additional lookup path for Hyperopt Loss functions.",
@@ -752,6 +756,8 @@ CONF_SCHEMA = {
"jwt_secret_key": {
"description": "Secret key for JWT authentication.",
"type": "string",
"default": "somethingRandomSomethingRandom123",
"minLength": 32,
},
"CORS_origins": {
"description": "List of allowed CORS origins.",
@@ -764,7 +770,14 @@ CONF_SCHEMA = {
"enum": ["error", "info"],
},
},
"required": ["enabled", "listen_ip_address", "listen_port", "username", "password"],
"required": [
"enabled",
"listen_ip_address",
"listen_port",
"username",
"password",
"jwt_secret_key",
],
},
# end of RPC section
"db_url": {
@@ -92,6 +92,7 @@ def validate_config_consistency(conf: dict[str, Any], *, preliminary: bool = Fal
_validate_consumers(conf)
validate_migrated_strategy_settings(conf)
_validate_orderflow(conf)
_validate_demo_trading(conf)
# validate configuration before returning
logger.info("Validating configuration ...")
@@ -413,6 +414,11 @@ def _validate_orderflow(conf: dict[str, Any]) -> None:
)
def _validate_demo_trading(conf: dict[str, Any]) -> None:
if conf.get("exchange", {}).get("demo_trading", False) and conf.get("dry_run", False):
raise ConfigurationError("Demo trading cannot be used together with dry_run.")
def _strategy_settings(conf: dict[str, Any]) -> None:
process_deprecated_setting(conf, None, "use_sell_signal", None, "use_exit_signal")
process_deprecated_setting(conf, None, "sell_profit_only", None, "exit_profit_only")
+25 -18
View File
@@ -221,30 +221,30 @@ class Configuration:
config, argname="exportfilename", logstring="Storing backtest results to {} ..."
)
config["exportfilename"] = Path(config["exportfilename"])
if config.get("exportdirectory") and Path(config["exportdirectory"]).is_dir():
logger.warning(
"DEPRECATED: Using `--export-filename` with directories is deprecated, "
"use `--backtest-directory` instead."
)
if config.get("exportdirectory") is None:
# Fallback - assign export-directory directly.
config["exportdirectory"] = config["exportfilename"]
if config.get("exportfilename"):
if Path(config["exportfilename"]).is_dir():
logger.warning(
"DEPRECATED: Using `--export-filename` with directories is deprecated, "
"use `--backtest-directory` instead."
)
if config.get("exportdirectory") is None:
# Fallback - assign export-directory directly.
config["exportdirectory"] = config["exportfilename"]
elif config.get("runmode") == RunMode.BACKTEST:
logger.warning(
"DEPRECATED: Using `--export-filename` has no impact when backtesting. "
"Please use `--notes` to annotate backtest results and "
"`--backtest-directory` to specify the output directory. "
)
if not config.get("exportdirectory"):
config["exportdirectory"] = config["user_data_dir"] / "backtest_results"
if not config.get("exportfilename"):
config["exportfilename"] = None
config["exportfilename"] = config.get("exportfilename", None)
if config.get("exportfilename"):
# ensure exportfilename is a Path object
config["exportfilename"] = Path(config["exportfilename"])
config["exportdirectory"] = Path(config["exportdirectory"])
if self.args.get("show_sensitive"):
logger.warning(
"Sensitive information will be shown in the upcoming output. "
"Please make sure to never share this output without redacting "
"the information yourself."
)
def _process_optimize_options(self, config: Config) -> None:
# This will override the strategy configuration
self._args_to_config(
@@ -312,6 +312,13 @@ class Configuration:
self._process_datadir_options(config)
if self.args.get("show_sensitive"):
logger.warning(
"Sensitive information will be shown in the upcoming output. "
"Please make sure to never share this output without redacting "
"the information yourself."
)
self._args_to_config(
config,
argname="strategy_list",
@@ -403,7 +410,7 @@ class Configuration:
("include_inactive", "Detected --include-inactive-pairs: {}"),
("no_parallel_download", "Detected --no-parallel-download: {}"),
("download_trades", "Detected --dl-trades: {}"),
("convert_trades", "Detected --convert: {} - Converting Trade data to OHCV {}"),
("convert_trades", "Detected --convert: {} - Converting trade data to OHLCV."),
("dataformat_ohlcv", 'Using "{}" to store OHLCV data.'),
("dataformat_trades", 'Using "{}" to store trades data.'),
("show_timerange", "Detected --show-timerange"),
+4
View File
@@ -61,6 +61,7 @@ AVAILABLE_PAIRLISTS = [
"ProducerPairList",
"RemotePairList",
"MarketCapPairList",
"CrossMarketPairList",
"AgeFilter",
"DelistFilter",
"FullTradesFilter",
@@ -239,3 +240,6 @@ IntOrInf = float
EntryExecuteMode = Literal["initial", "pos_adjust", "replace"]
# Prefixes for low-priced coins like 1000PEPE/USDDT:USDT or KPEPE/USDC (hyperliquid)
PairPrefixes = ["1000", "1000000", "1M", "K"]
+1
View File
@@ -7,6 +7,7 @@ from .bt_fileutils import (
get_backtest_market_change,
get_backtest_result,
get_backtest_resultlist,
get_backtest_wallet_change,
get_latest_backtest_filename,
get_latest_hyperopt_file,
get_latest_hyperopt_filename,
+27 -4
View File
@@ -10,7 +10,6 @@ from io import BytesIO, StringIO
from pathlib import Path
from typing import Any, Literal
import numpy as np
import pandas as pd
from freqtrade.constants import LAST_BT_RESULT_FN
@@ -308,10 +307,31 @@ def get_backtest_market_change(filename: Path, include_ts: bool = True) -> pd.Da
else:
df = pd.read_feather(filename)
if include_ts:
df.loc[:, "__date_ts"] = df.loc[:, "date"].astype(np.int64) // 1000 // 1000
df.loc[:, "__date_ts"] = df.loc[:, "date"].dt.as_unit("ms").astype("int64")
return df
def get_backtest_wallet_change(filename: Path, strategy_name: str) -> pd.DataFrame | None:
"""
Read backtest wallet change file.
:param filename: Path to the backtest result zip file
:param strategy_name: Name of the strategy to load
:return: DataFrame with wallet change data
"""
if filename.suffix != ".zip":
return None
try:
data = load_file_from_zip(filename, f"{filename.stem}_{strategy_name}_wallet.feather")
df = pd.read_feather(BytesIO(data))
df.loc[:, "__date_ts"] = df.loc[:, "date"].dt.as_unit("ms").astype("int64")
return df
except ValueError:
pass
return None
def find_existing_backtest_stats(
dirname: Path | str, run_ids: dict[str, str], min_backtest_date: datetime | None = None
) -> dict[str, Any]:
@@ -503,13 +523,16 @@ def load_backtest_analysis_data(
return None
def trade_list_to_dataframe(trades: list[Trade] | list[LocalTrade]) -> pd.DataFrame:
def trade_list_to_dataframe(
trades: list[Trade] | list[LocalTrade], *, minified: bool = True
) -> pd.DataFrame:
"""
Convert list of Trade objects to pandas Dataframe
:param trades: List of trade objects
:param minified: Whether to use minified version of trade JSON
:return: Dataframe with BT_DATA_COLUMNS
"""
df = pd.DataFrame.from_records([t.to_json(True) for t in trades], columns=BT_DATA_COLUMNS)
df = pd.DataFrame.from_records([t.to_json(minified) for t in trades], columns=BT_DATA_COLUMNS)
if len(df) > 0:
df["close_date"] = pd.to_datetime(df["close_timestamp"], unit="ms", utc=True)
df["open_date"] = pd.to_datetime(df["open_timestamp"], unit="ms", utc=True)
@@ -1,3 +1,4 @@
from numpy import format_float_positional
from pandas import DataFrame, Series
@@ -11,7 +12,10 @@ def get_tick_size_over_time(candles: DataFrame) -> Series:
# count the number of significant digits for the open and close prices
for col in ["open", "high", "low", "close"]:
candles[f"{col}_count"] = (
candles[col].round(14).apply("{:.15f}".format).str.extract(r"\.(\d*[1-9])")[0].str.len()
candles[col]
.apply(format_float_positional, precision=14, unique=False, fractional=False, trim="-")
.str.extract(r"\.(\d*[1-9])")[0]
.str.len()
)
candles["max_count"] = candles[["open_count", "close_count", "high_count", "low_count"]].max(
axis=1
@@ -1,9 +1,15 @@
import logging
from datetime import datetime
import numpy as np
import pandas as pd
from freqtrade.constants import IntOrInf
from freqtrade.exchange import (
timeframe_to_prev_date,
timeframe_to_resample_freq,
)
from freqtrade.util import dt_from_ts
logger = logging.getLogger(__name__)
@@ -58,3 +64,95 @@ def evaluate_result_multi(
"""
df_final = analyze_trade_parallelism(trades, timeframe)
return df_final[df_final["open_trades"] > max_open_trades]
def balance_distribution_over_time(
trades: pd.DataFrame,
min_date: datetime,
max_date: datetime,
timeframe: str,
stake_currency: str,
start_balance: float,
pairlist: list[str],
) -> pd.DataFrame:
"""
Return a dataframe with stake_currency and the pairlist as columns
Each column will contain the amount of the currency at the given time
Columns added are:
- stake_currency: amount of stake currency
- <pair>: amount of base currency in the pair
- <pair>_leverage: leverage used for the pair at the time (NaN if no open trade)
- <pair>_is_short: 1 if the open trade is short, 0 if long (NaN if no open trade)
- <pair>_collateral: amount of stake currency used as collateral for open trades
:param trades: Trades Dataframe - can be loaded from backtest, or created
via trade_list_to_dataframe
:param timeframe: Frequency to use for the resulting dataframe
:param min_date: start date
:param max_date: End date (will be rounded down to timeframe)
:param stake_currency: The stake currency
:param start_balance: Starting balance in stake currency
:param pairlist: List of trading pairs to include in the dataframe
Can be obtained via trade_df["pair"].unique()
For pairs without trades, the column will be all zeros
:return: Dataframe with balance distribution over time
"""
min_date_res = timeframe_to_prev_date(timeframe, min_date)
max_date_res = timeframe_to_prev_date(timeframe, max_date)
index = pd.date_range(min_date_res, max_date_res, freq=timeframe_to_resample_freq(timeframe))
pairs_lev = [f"{pair}_leverage" for pair in pairlist]
pairs_is_short = [f"{pair}_is_short" for pair in pairlist]
pairs_collateral = [f"{pair}_collateral" for pair in pairlist]
pairs_lev += pairs_is_short
df = pd.DataFrame(
index=index, columns=[stake_currency] + pairlist + pairs_lev + pairs_collateral, dtype=float
)
# Initialize variables to starting values
df[stake_currency] = float(start_balance)
df[pairlist + pairs_collateral] = 0.0
df[pairs_lev] = np.nan
for trade in trades.sort_values(by=["open_date"]).itertuples():
pair = trade.pair
end_date = trade.close_date if trade.close_date is not pd.NaT else None
# Exclude open orders - these won't have order_filled_timestamp set.
df.loc[trade.open_date : end_date, f"{pair}_leverage"] = trade.leverage
df.loc[trade.open_date : end_date, f"{pair}_is_short"] = 1 if trade.is_short else 0
orders = [o for o in trade.orders if o["order_filled_timestamp"]]
current_position = 0
current_collateral = 0
for order in sorted(orders, key=lambda x: x["order_filled_timestamp"]):
filled_at = pd.Timestamp(dt_from_ts(order["order_filled_timestamp"]))
real_amount = order.get("filled", order["amount"])
stake = order["safe_price"] * real_amount
stake_no_lev = stake / trade.leverage
if order["ft_is_entry"]:
# Entry order: lock collateral and pay fee
# For both long and short: balance decreases by collateral + fee
fee_open = stake * trade.fee_open
current_position += real_amount
current_collateral += stake_no_lev
df.loc[filled_at:end_date, pair] += real_amount
df.loc[filled_at:end_date, f"{pair}_collateral"] += stake_no_lev
df.loc[filled_at:, stake_currency] -= stake_no_lev + fee_open
else:
# Exit order: release collateral and realize profit/loss
fee_close = stake * trade.fee_close
if trade.is_short:
# For SHORT
df.loc[filled_at:, stake_currency] += (
current_collateral * (1 + trade.leverage) - stake
) - fee_close
else:
# For LONG
df.loc[filled_at:, stake_currency] += (
stake - current_collateral * (trade.leverage - 1) - fee_close
)
df.loc[filled_at:end_date, pair] -= real_amount
df.loc[filled_at:end_date, f"{pair}_collateral"] -= stake_no_lev
current_position -= real_amount
current_collateral -= stake_no_lev
# Round to avoid floating point issues
df = df.round(14)
return df
+11 -7
View File
@@ -39,7 +39,11 @@ def ohlcv_to_dataframe(
df = DataFrame(ohlcv, columns=cols)
# Floor date to seconds to account for exchange imprecisions
df["date"] = to_datetime(df["date"], unit="ms", utc=True).dt.floor("s")
from freqtrade.exchange import timeframe_to_floor_freq
resample_interval = timeframe_to_floor_freq(timeframe)
df["date"] = to_datetime(df["date"], unit="ms", utc=True).dt.floor(resample_interval)
# Some exchanges return int values for Volume and even for OHLC.
# Convert them since TA-LIB indicators used in the strategy assume floats
@@ -59,14 +63,14 @@ def ohlcv_to_dataframe(
def clean_ohlcv_dataframe(
data: DataFrame, timeframe: str, pair: str, *, fill_missing: bool, drop_incomplete: bool
dataframe: DataFrame, timeframe: str, pair: str, *, fill_missing: bool, drop_incomplete: bool
) -> DataFrame:
"""
Cleanse a OHLCV dataframe by
* Grouping it by date (removes duplicate tics)
* dropping last candles if requested
* Filling up missing data (if requested)
:param data: DataFrame containing candle (OHLCV) data.
:param dataframe: DataFrame containing candle (OHLCV) data.
:param timeframe: timeframe (e.g. 5m). Used to fill up eventual missing data
:param pair: Pair this data is for (used to warn if fillup was necessary)
:param fill_missing: fill up missing candles with 0 candles
@@ -75,7 +79,7 @@ def clean_ohlcv_dataframe(
:return: DataFrame
"""
# group by index and aggregate results to eliminate duplicate ticks
data = data.groupby(by="date", as_index=False, sort=True).agg(
dataframe = dataframe.groupby(by="date", as_index=False, sort=True).agg(
{
"open": "first",
"high": "max",
@@ -86,13 +90,13 @@ def clean_ohlcv_dataframe(
)
# eliminate partial candle
if drop_incomplete:
data.drop(data.tail(1).index, inplace=True)
dataframe.drop(dataframe.tail(1).index, inplace=True)
logger.debug("Dropping last candle")
if fill_missing:
return ohlcv_fill_up_missing_data(data, timeframe, pair)
return ohlcv_fill_up_missing_data(dataframe, timeframe, pair)
else:
return data
return dataframe
def ohlcv_fill_up_missing_data(dataframe: DataFrame, timeframe: str, pair: str) -> DataFrame:
@@ -1,6 +1,6 @@
import logging
from pandas import DataFrame, read_feather, to_datetime
from pandas import DataFrame, read_feather
from pyarrow import dataset
from freqtrade.configuration import TimeRange
@@ -71,7 +71,7 @@ class FeatherDataHandler(IDataHandler):
"volume": "float",
}
)
pairdata["date"] = to_datetime(pairdata["date"], unit="ms", utc=True)
pairdata["date"] = pairdata["date"].dt.as_unit("ms")
return pairdata
except Exception as e:
logger.exception(
@@ -31,8 +31,8 @@ logger = logging.getLogger(__name__)
class IDataHandler(ABC):
_OHLCV_REGEX = r"^([a-zA-Z_\d-]+)\-(\d+[a-zA-Z]{1,2})\-?([a-zA-Z_]*)?(?=\.)"
_TRADES_REGEX = r"^([a-zA-Z_\d-]+)\-(trades)?(?=\.)"
_OHLCV_REGEX = r"^([\w-]+)\-(\d+[a-zA-Z]{1,2})\-?([a-zA-Z_]*)?(?=\.)"
_TRADES_REGEX = r"^([\w-]+)\-(trades)?(?=\.)"
def __init__(self, datadir: Path) -> None:
self._datadir = datadir
@@ -70,28 +70,6 @@ class IDataHandler(ABC):
if match and len(match.groups()) > 1
]
@classmethod
def ohlcv_get_pairs(cls, datadir: Path, timeframe: str, candle_type: CandleType) -> list[str]:
"""
Returns a list of all pairs with ohlcv data available in this datadir
for the specified timeframe
:param datadir: Directory to search for ohlcv files
:param timeframe: Timeframe to search pairs for
:param candle_type: Any of the enum CandleType (must match trading mode!)
:return: List of Pairs
"""
candle = ""
if candle_type != CandleType.SPOT:
datadir = datadir.joinpath("futures")
candle = f"-{candle_type}"
ext = cls._get_file_extension()
_tmp = [
re.search(r"^(\S+)(?=\-" + timeframe + candle + f".{ext})", p.name)
for p in datadir.glob(f"*{timeframe}{candle}.{ext}")
]
# Check if regex found something and only return these results
return [cls.rebuild_pair_from_filename(match[0]) for match in _tmp if match]
@abstractmethod
def ohlcv_store(
self, pair: str, timeframe: str, data: DataFrame, candle_type: CandleType
@@ -358,11 +336,10 @@ class IDataHandler(ABC):
def rebuild_pair_from_filename(pair: str) -> str:
"""
Rebuild pair name from filename
Assumes a asset name of max. 7 length to also support BTC-PERP and BTC-PERP:USD names.
Replaces the first '_' with '/' and the second '_' (if present) with ':'.
e.g. BTC_USDT -> BTC/USDT, BTC_USDT_USDT -> BTC/USDT:USDT
"""
res = re.sub(r"^(([A-Za-z\d]{1,10})|^([A-Za-z\-]{1,6}))(_)", r"\g<1>/", pair, count=1)
res = re.sub("_", ":", res, count=1)
return res
return pair.replace("_", "/", 1).replace("_", ":", 1)
def ohlcv_load(
self,
@@ -1,6 +1,5 @@
import logging
import numpy as np
from pandas import DataFrame, read_json, to_datetime
from freqtrade import misc
@@ -35,8 +34,8 @@ class JsonDataHandler(IDataHandler):
filename = self._pair_data_filename(self._datadir, pair, timeframe, candle_type)
self.create_dir_if_needed(filename)
_data = data.copy()
# Convert date to int
_data["date"] = _data["date"].astype(np.int64) // 1000 // 1000
# Convert date to int (milliseconds)
_data["date"] = _data["date"].dt.as_unit("ms").astype("int64")
# Reset index, select only appropriate columns and save as json
_data.reset_index(drop=True).loc[:, self._columns].to_json(
@@ -81,7 +80,7 @@ class JsonDataHandler(IDataHandler):
"volume": "float",
}
)
pairdata["date"] = to_datetime(pairdata["date"], unit="ms", utc=True)
pairdata["date"] = to_datetime(pairdata["date"], unit="ms", utc=True).dt.as_unit("ms")
return pairdata
def ohlcv_append(
@@ -105,6 +104,9 @@ class JsonDataHandler(IDataHandler):
:param trading_mode: Trading mode to use (used to determine the filename)
"""
filename = self._pair_trades_filename(self._datadir, pair, trading_mode)
# Convert StringDtype columns to object to avoid NaN serialization issues
for col in data.select_dtypes(include="string").columns:
data[col] = data[col].astype(object).where(data[col].notna(), other=None)
trades = data.values.tolist()
misc.file_dump_json(filename, trades, is_zip=self._use_zip)
@@ -1,6 +1,6 @@
import logging
from pandas import DataFrame, read_parquet, to_datetime
from pandas import DataFrame, read_parquet
from freqtrade.configuration import TimeRange
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS
@@ -68,7 +68,7 @@ class ParquetDataHandler(IDataHandler):
"volume": "float",
}
)
pairdata["date"] = to_datetime(pairdata["date"], unit="ms", utc=True)
pairdata["date"] = pairdata["date"].dt.as_unit("ms")
return pairdata
except Exception as e:
logger.exception(
+197 -26
View File
@@ -140,7 +140,7 @@ def _calc_drawdown_series(
max_drawdown_df["drawdown_relative"] = (max_balance - cumulative_balance) / max_balance
else:
# NOTE: This is not completely accurate,
# but might good enough if starting_balance is not available
# but will be good enough if starting_balance is not available
max_drawdown_df["drawdown_relative"] = (
max_drawdown_df["high_value"] - max_drawdown_df["cumulative"]
) / max_drawdown_df["high_value"]
@@ -296,7 +296,7 @@ def calculate_cagr(days_passed: int, starting_balance: float, final_balance: flo
:param final_balance: Final balance to calculate CAGR against
:return: CAGR
"""
if final_balance < 0:
if (final_balance < 0) or (starting_balance <= 0) or (days_passed <= 0):
# With leveraged trades, final_balance can become negative.
return 0
return (final_balance / starting_balance) ** (1 / (days_passed / 365)) - 1
@@ -333,6 +333,72 @@ def calculate_expectancy(trades: pd.DataFrame) -> tuple[float, float]:
return expectancy, expectancy_ratio
def _calculate_annualized_ratio(
expected_returns_mean: float,
denominator: float,
annualization_factor: int = 365,
) -> float:
"""
Helper function to calculate annualized ratios like Sharpe and Sortino.
:param expected_returns_mean: Mean of the returns (expected returns)
:param denominator: Denominator of the ratio (e.g. standard deviation for Sharpe)
:param annualization_factor: Factor to annualize the ratio (default is 365 for daily returns)
:return: Annualized ratio, or -100.0 if denominator is zero or NaN to indicate this is
not optimal.
"""
if denominator != 0 and not np.isnan(denominator):
return float(expected_returns_mean / denominator * np.sqrt(annualization_factor))
# Define high (negative) ratio to be clear that this is NOT optimal.
return -100.0
def _calculate_daily_returns_from_balance(
balance_history: pd.DataFrame,
date_col: str,
balance_col: str,
) -> pd.Series:
wallet = _prepare_balance_history(balance_history, date_col, balance_col)
if len(wallet) == 0:
return pd.DataFrame(columns=[date_col, balance_col])
# Sample balance to daily end-of-day values to normalize variable snapshot frequency.
daily_balance = (
wallet.set_index(date_col)[balance_col].resample("1D").last().dropna().rename(balance_col)
)
daily_balance = daily_balance.reset_index()
if len(daily_balance) < 2:
return pd.Series(dtype=float)
return daily_balance[balance_col].pct_change().dropna()
def _prepare_balance_history(
balance_history: pd.DataFrame,
date_col: str,
balance_col: str,
) -> pd.DataFrame:
"""
Prepare balance history for calculations by filtering out rows with
missing date or balance values.
"""
if (
len(balance_history) == 0
or date_col not in balance_history
or balance_col not in balance_history
):
return pd.DataFrame(columns=[date_col, balance_col])
wallet = balance_history.loc[:, [date_col, balance_col]].copy()
wallet = wallet.dropna(subset=[date_col, balance_col]).sort_values(date_col)
if len(wallet) == 0:
return pd.DataFrame(columns=[date_col, balance_col])
return wallet
def calculate_sortino(
trades: pd.DataFrame,
min_date: datetime | None,
@@ -354,14 +420,31 @@ def calculate_sortino(
down_stdev = np.std(trades.loc[trades["profit_abs"] < 0, "profit_abs"] / starting_balance)
if down_stdev != 0 and not np.isnan(down_stdev):
sortino_ratio = expected_returns_mean / down_stdev * np.sqrt(365)
else:
# Define high (negative) sortino ratio to be clear that this is NOT optimal.
sortino_ratio = -100
return _calculate_annualized_ratio(expected_returns_mean, down_stdev)
# print(expected_returns_mean, down_stdev, sortino_ratio)
return sortino_ratio
def calculate_sortino_from_balance(
balance_history: pd.DataFrame,
date_col: str = "date",
balance_col: str = "total_quote",
) -> float:
"""
Calculate sortino ratio from historical balance snapshots.
:param balance_history: DataFrame containing at least date and balance columns
:param date_col: Column containing timestamps
:param balance_col: Column containing historical balance values
:return: sortino
"""
daily_returns = _calculate_daily_returns_from_balance(balance_history, date_col, balance_col)
if len(daily_returns) == 0:
return 0.0
expected_returns_mean = daily_returns.mean()
downside_returns = daily_returns[daily_returns < 0]
down_stdev = downside_returns.std(ddof=0)
return _calculate_annualized_ratio(expected_returns_mean, down_stdev)
def calculate_sharpe(
@@ -384,14 +467,67 @@ def calculate_sharpe(
expected_returns_mean = total_profit.sum() / days_period
up_stdev = np.std(total_profit)
if up_stdev != 0:
sharp_ratio = expected_returns_mean / up_stdev * np.sqrt(365)
else:
# Define high (negative) sharpe ratio to be clear that this is NOT optimal.
sharp_ratio = -100
return _calculate_annualized_ratio(expected_returns_mean, up_stdev)
# print(expected_returns_mean, up_stdev, sharp_ratio)
return sharp_ratio
def calculate_sharpe_from_balance(
balance_history: pd.DataFrame,
date_col: str = "date",
balance_col: str = "total_quote",
) -> float:
"""
Calculate sharpe ratio from historical balance snapshots.
:param balance_history: DataFrame containing at least date and balance columns
:param date_col: Column containing timestamps
:param balance_col: Column containing historical balance values
:return: sharpe
"""
daily_returns = _calculate_daily_returns_from_balance(balance_history, date_col, balance_col)
if len(daily_returns) == 0:
return 0.0
expected_returns_mean = daily_returns.mean()
up_stdev = daily_returns.std(ddof=0)
return _calculate_annualized_ratio(expected_returns_mean, up_stdev)
def calculate_max_drawdown_from_balance(
balance_history: pd.DataFrame,
date_col: str = "date",
balance_col: str = "total_quote",
relative: bool = False,
) -> DrawDownResult:
"""
Calculate max drawdown from historical balance snapshots.
:param balance_history: DataFrame containing at least date and balance columns
:param date_col: Column containing timestamps
:param balance_col: Column containing historical balance values
:param relative: If True, use relative drawdown for max calculation instead of absolute
:return: DrawDownResult object
:raise: ValueError if balance-history dataframe was found empty.
"""
wallet = _prepare_balance_history(
balance_history=balance_history,
date_col=date_col,
balance_col=balance_col,
)
if len(wallet) < 2:
raise ValueError("Balance-history dataframe empty.")
starting_balance = float(wallet[balance_col].iloc[0])
wallet.loc[:, "total_balance"] = wallet[balance_col].diff().fillna(0.0)
return calculate_max_drawdown(
wallet,
date_col=date_col,
value_col="total_balance",
starting_balance=starting_balance,
relative=relative,
)
def calculate_calmar(
@@ -401,12 +537,12 @@ def calculate_calmar(
starting_balance: float,
) -> float:
"""
Calculate calmar
Calculate calmar from trades data.
:param trades: DataFrame containing trades (requires columns close_date and profit_abs)
:return: calmar
"""
if (len(trades) == 0) or (min_date is None) or (max_date is None) or (min_date == max_date):
return 0
return 0.0
total_profit = trades["profit_abs"].sum() / starting_balance
days_period = max(1, (max_date - min_date).days)
@@ -422,16 +558,51 @@ def calculate_calmar(
)
max_drawdown = drawdown.relative_account_drawdown
except ValueError:
max_drawdown = 0
return 0.0
if max_drawdown != 0:
calmar_ratio = expected_returns_mean / max_drawdown * math.sqrt(365)
else:
# Define high (negative) calmar ratio to be clear that this is NOT optimal.
calmar_ratio = -100
return _calculate_annualized_ratio(expected_returns_mean, max_drawdown)
# print(expected_returns_mean, max_drawdown, calmar_ratio)
return calmar_ratio
def calculate_calmar_from_balance(
balance_history: pd.DataFrame,
date_col: str = "date",
balance_col: str = "total_quote",
) -> float:
"""
Calculate calmar ratio from historical balance snapshots.
:param balance_history: DataFrame containing at least date and balance columns
:param date_col: Column containing timestamps
:param balance_col: Column containing historical balance values
:return: calmar
"""
wallet = _prepare_balance_history(
balance_history=balance_history,
date_col=date_col,
balance_col=balance_col,
)
if len(wallet) < 2:
return 0.0
starting_balance = float(wallet[balance_col].iloc[0])
final_balance = float(wallet[balance_col].iloc[-1])
days_period = max(1, (wallet[date_col].iloc[-1] - wallet[date_col].iloc[0]).days)
total_profit = (final_balance - starting_balance) / starting_balance
expected_returns_mean = total_profit / days_period * 100
try:
drawdown = calculate_max_drawdown_from_balance(
wallet,
date_col=date_col,
balance_col=balance_col,
)
max_drawdown = drawdown.relative_account_drawdown
except ValueError:
return 0.0
return _calculate_annualized_ratio(expected_returns_mean, max_drawdown)
def calculate_sqn(trades: pd.DataFrame, starting_balance: float) -> float:
+2 -5
View File
@@ -1,7 +1,7 @@
from enum import Enum
from enum import StrEnum
class CandleType(str, Enum):
class CandleType(StrEnum):
"""Enum to distinguish candle types"""
SPOT = "spot"
@@ -14,9 +14,6 @@ class CandleType(str, Enum):
FUNDING_RATE = "funding_rate"
# BORROW_RATE = "borrow_rate" # * unimplemented
def __str__(self):
return f"{self.name.lower()}"
@staticmethod
def from_string(value: str) -> "CandleType":
if not value:
+2 -5
View File
@@ -1,7 +1,7 @@
from enum import Enum
from enum import StrEnum
class MarginMode(str, Enum):
class MarginMode(StrEnum):
"""
Enum to distinguish between
cross margin/futures margin_mode and
@@ -11,6 +11,3 @@ class MarginMode(str, Enum):
CROSS = "cross"
ISOLATED = "isolated"
NONE = ""
def __str__(self):
return f"{self.value.lower()}"
+2 -2
View File
@@ -1,6 +1,6 @@
from enum import Enum
from enum import StrEnum
class OrderTypeValues(str, Enum):
class OrderTypeValues(StrEnum):
limit = "limit"
market = "market"
+2 -2
View File
@@ -1,7 +1,7 @@
from enum import Enum
from enum import StrEnum
class PriceType(str, Enum):
class PriceType(StrEnum):
"""Enum to distinguish possible trigger prices for stoplosses"""
LAST = "last"
+4 -9
View File
@@ -1,7 +1,7 @@
from enum import Enum
from enum import StrEnum
class RPCMessageType(str, Enum):
class RPCMessageType(StrEnum):
STATUS = "status"
WARNING = "warning"
EXCEPTION = "exception"
@@ -25,21 +25,16 @@ class RPCMessageType(str, Enum):
NEW_CANDLE = "new_candle"
def __repr__(self):
return self.value
def __str__(self):
# TODO: do we still need to overwrite __repr__? Impact needs to be looked at in detail
return self.value
# Enum for parsing requests from ws consumers
class RPCRequestType(str, Enum):
class RPCRequestType(StrEnum):
SUBSCRIBE = "subscribe"
WHITELIST = "whitelist"
ANALYZED_DF = "analyzed_df"
def __str__(self):
return self.value
NO_ECHO_MESSAGES = (RPCMessageType.ANALYZED_DF, RPCMessageType.WHITELIST, RPCMessageType.NEW_CANDLE)
+2 -2
View File
@@ -1,7 +1,7 @@
from enum import Enum
from enum import StrEnum
class RunMode(str, Enum):
class RunMode(StrEnum):
"""
Bot running mode (backtest, hyperopt, ...)
can be "live", "dry-run", "backtest", "hyperopt".
+4 -13
View File
@@ -1,7 +1,7 @@
from enum import Enum
from enum import StrEnum
class SignalType(Enum):
class SignalType(StrEnum):
"""
Enum to distinguish between enter and exit signals
"""
@@ -11,11 +11,8 @@ class SignalType(Enum):
ENTER_SHORT = "enter_short"
EXIT_SHORT = "exit_short"
def __str__(self):
return f"{self.name.lower()}"
class SignalTagType(Enum):
class SignalTagType(StrEnum):
"""
Enum for signal columns
"""
@@ -23,13 +20,7 @@ class SignalTagType(Enum):
ENTER_TAG = "enter_tag"
EXIT_TAG = "exit_tag"
def __str__(self):
return f"{self.name.lower()}"
class SignalDirection(str, Enum):
class SignalDirection(StrEnum):
LONG = "long"
SHORT = "short"
def __str__(self):
return f"{self.name.lower()}"
+2 -5
View File
@@ -1,7 +1,7 @@
from enum import Enum
from enum import StrEnum
class TradingMode(str, Enum):
class TradingMode(StrEnum):
"""
Enum to distinguish between
spot, margin, futures or any other trading method
@@ -10,6 +10,3 @@ class TradingMode(str, Enum):
SPOT = "spot"
MARGIN = "margin"
FUTURES = "futures"
def __str__(self):
return f"{self.name.lower()}"
+2
View File
@@ -30,6 +30,7 @@ from freqtrade.exchange.exchange_utils import (
validate_exchange,
)
from freqtrade.exchange.exchange_utils_timeframe import (
timeframe_to_floor_freq,
timeframe_to_minutes,
timeframe_to_msecs,
timeframe_to_next_date,
@@ -43,6 +44,7 @@ from freqtrade.exchange.htx import Htx
from freqtrade.exchange.hyperliquid import Hyperliquid
from freqtrade.exchange.idex import Idex
from freqtrade.exchange.kraken import Kraken
from freqtrade.exchange.krakenfutures import Krakenfutures
from freqtrade.exchange.kucoin import Kucoin
from freqtrade.exchange.lbank import Lbank
from freqtrade.exchange.luno import Luno
+6 -1
View File
@@ -46,8 +46,13 @@ class Binance(Exchange):
"l2_limit_range": [5, 10, 20, 50, 100, 500, 1000],
"ws_enabled": True,
"has_delisting": True,
# Demo trading
# https://www.binance.com/en/support/faq/detail/9be58f73e5e14338809e3b705b9687dd
# Intentionally Disabled as it's a separate market - not a simulated live market.
"supports_demo_trading": False,
}
_ft_has_futures: FtHas = {
"ohlcv_candle_limit": 499,
"funding_fee_candle_limit": 1000,
"stoploss_order_types": {"limit": "stop", "market": "stop_market"},
"stoploss_blocks_assets": False, # Stoploss orders do not block assets
@@ -554,7 +559,7 @@ class Binance(Exchange):
class Binanceusdm(Binance):
"""Binacne USDM Exchange
"""Binance USDM Exchange
Same as Binance - only futures trading is supported (via ccxt).
Not actually necessary, binance should be preferred.
File diff suppressed because it is too large Load Diff
+52 -31
View File
@@ -4,9 +4,10 @@ from datetime import datetime, timedelta
import ccxt
from freqtrade.constants import BuySell
from freqtrade.enums import OPTIMIZE_MODES, CandleType, MarginMode, TradingMode
from freqtrade.enums import OPTIMIZE_MODES, CandleType, MarginMode, PriceType, TradingMode
from freqtrade.exceptions import (
DDosProtection,
InvalidOrderException,
OperationalException,
RetryableOrderError,
TemporaryError,
@@ -38,6 +39,13 @@ class Bitget(Exchange):
_ft_has_futures: FtHas = {
"funding_fee_candle_limit": 100,
"has_delisting": True,
"stop_price_param": "stopLossPrice",
"stop_price_prop": "stopLossPrice",
"stop_price_type_field": "triggerType",
"stop_price_type_value_mapping": {
PriceType.LAST: "fill_price",
PriceType.MARK: "mark_price",
},
}
_supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [
@@ -94,30 +102,36 @@ class Bitget(Exchange):
return order
def _fetch_stop_order_fallback(self, order_id: str, pair: str) -> CcxtOrder:
params2 = {
"stop": True,
}
for method in (
self._api.fetch_open_orders,
self._api.fetch_canceled_and_closed_orders,
):
try:
orders = method(pair, params=params2)
orders_f = [order for order in orders if order["id"] == order_id]
if orders_f:
order = orders_f[0]
self._log_exchange_response("get_stop_order_fallback", order)
return self._convert_stop_order(pair, order_id, order)
except (ccxt.OrderNotFound, ccxt.InvalidOrder):
pass
except ccxt.DDoSProtection as e:
raise DDosProtection(e) from e
except (ccxt.OperationFailed, ccxt.ExchangeError) as e:
raise TemporaryError(
f"Could not get order due to {e.__class__.__name__}. Message: {e}"
) from e
except ccxt.BaseError as e:
raise OperationalException(e) from e
# old stoploss orders
paramsold = {"stop": True}
# new stoploss orders with stopLossPrice (used in futures starting 2026.4)
paramsnew = {"planType": "profit_loss"}
params_to_try = (
(paramsnew, paramsold) if self.trading_mode == TradingMode.FUTURES else (paramsold,)
)
for params2 in params_to_try:
for method in (
self._api.fetch_open_orders,
self._api.fetch_canceled_and_closed_orders,
):
try:
orders = method(pair, params=params2)
orders_f = [order for order in orders if order["id"] == order_id]
if orders_f:
order = orders_f[0]
self._log_exchange_response("get_stop_order_fallback", order)
return self._convert_stop_order(pair, order_id, order)
except (ccxt.OrderNotFound, ccxt.InvalidOrder):
pass
except ccxt.DDoSProtection as e:
raise DDosProtection(e) from e
except (ccxt.OperationFailed, ccxt.ExchangeError) as e:
raise TemporaryError(
f"Could not get order due to {e.__class__.__name__}. Message: {e}"
) from e
except ccxt.BaseError as e:
raise OperationalException(e) from e
raise RetryableOrderError(f"StoplossOrder not found (pair: {pair} id: {order_id}).")
@retrier(retries=API_RETRY_COUNT)
@@ -129,6 +143,19 @@ class Bitget(Exchange):
return self._fetch_stop_order_fallback(order_id, pair)
def cancel_stoploss_order(self, order_id: str, pair: str, params: dict | None = None) -> dict:
cancel_params = params.copy() if params else {}
cancel_params["stop"] = True
if self.trading_mode != TradingMode.FUTURES:
return self.cancel_order(order_id, pair, cancel_params)
try:
return self.cancel_order(order_id, pair, {**cancel_params, "planType": "pos_loss"})
except (InvalidOrderException, IndexError):
# Keep compatibility with stoploss orders created by older versions.
return self.cancel_order(order_id, pair, cancel_params)
@retrier
def additional_exchange_init(self) -> None:
"""
@@ -150,12 +177,6 @@ class Bitget(Exchange):
except ccxt.BaseError as e:
raise OperationalException(e) from e
def _lev_prep(self, pair: str, leverage: float, side: BuySell, accept_fail: bool = False):
if self.trading_mode != TradingMode.SPOT:
# Explicitly setting margin_mode is not necessary as marginMode can be set per order.
# self.set_margin_mode(pair, self.margin_mode, accept_fail)
self._set_leverage(leverage, pair, accept_fail)
def _get_params(
self,
side: BuySell,
+3
View File
@@ -35,6 +35,9 @@ class Bybit(Exchange):
# TODO: Can be removed once bybit fully forces all accounts to unified mode.
"fetchOrder": False,
},
# Demo trading
# https://learn.bybit.com/en/bybit-guide/how-to-use-bybit-demo-trading
"supports_demo_trading": True,
}
_ft_has_futures: FtHas = {
"ohlcv_has_history": True,
+2 -4
View File
@@ -51,12 +51,10 @@ def check_exchange(config: Config, check_for_bad: bool = True) -> bool:
if not valid:
if check_for_bad:
raise OperationalException(
f'Exchange "{exchange}" will not work with Freqtrade. Reason: {reason}.'
f'Exchange "{exchange}" will not work with Freqtrade. Reason: {reason}.'
)
else:
logger.warning(
f'Exchange "{exchange}" will not work with Freqtrade. Reason: {reason}.'
)
logger.warning(f'Exchange "{exchange}" will not work with Freqtrade. Reason: {reason}.')
if MAP_EXCHANGE_CHILDCLASS.get(exchange, exchange) in SUPPORTED_EXCHANGES:
logger.info(
+1 -1
View File
@@ -39,7 +39,6 @@ BAD_EXCHANGES = {
"bitmex": "Various reasons",
"probit": "Requires additional, regular calls to `signIn()`",
"poloniex": "Does not provide fetch_order endpoint to fetch both open and closed orders",
"krakenfutures": "Unsupported futures exchange",
"kucoinfutures": "Unsupported futures exchange",
"poloniexfutures": "Unsupported futures exchange",
"binancecoinm": "Unsupported futures exchange",
@@ -63,6 +62,7 @@ SUPPORTED_EXCHANGES = [
"htx",
"hyperliquid",
"kraken",
"krakenfutures",
"okx",
"myokx",
]
+53 -19
View File
@@ -13,6 +13,7 @@ from datetime import UTC, datetime, timedelta
from math import floor, isnan
from threading import Lock
from typing import Any, Literal, TypeGuard, TypeVar
from uuid import uuid4
import ccxt
import ccxt.pro as ccxt_pro
@@ -106,6 +107,7 @@ from freqtrade.misc import (
file_dump_json,
file_load_json,
safe_value_fallback,
safe_value_nested,
)
from freqtrade.util import FtTTLCache, PeriodicCache, dt_from_ts, dt_now
from freqtrade.util.datetime_helpers import dt_humanize_delta, dt_ts, format_ms_time
@@ -207,7 +209,7 @@ class Exchange:
self._config.get("trading_mode", self._supported_trading_mode_margin_pairs[0][0])
)
self.margin_mode: MarginMode = MarginMode(
MarginMode(self._config.get("margin_mode"))
self._config["margin_mode"]
if self._config.get("margin_mode")
else self._supported_trading_mode_margin_pairs[0][1]
)
@@ -248,7 +250,7 @@ class Exchange:
# Holds all open sell orders for dry_run
self._dry_run_open_orders: dict[str, Any] = {}
self._is_demo_trading = exchange_conf.get("demo_trading", False)
if self._config["dry_run"]:
logger.info("Instance is running with dry_run enabled")
logger.info(f"Using CCXT {ccxt.__version__}")
@@ -313,10 +315,19 @@ class Exchange:
if self._exchange_ws:
self._exchange_ws.cleanup()
logger.debug("Exchange object destroyed, closing async loop")
try:
generic_loop = asyncio.get_running_loop()
except RuntimeError:
generic_loop = None
loop_running = (getattr(self, "loop", None) and self.loop.is_running()) or (
generic_loop is not None and generic_loop.is_running()
)
if (
getattr(self, "_api_async", None)
and inspect.iscoroutinefunction(self._api_async.close)
and self._api_async.session
and not loop_running
):
logger.debug("Closing async ccxt session.")
self.loop.run_until_complete(self._api_async.close())
@@ -324,6 +335,7 @@ class Exchange:
self._ws_async
and inspect.iscoroutinefunction(self._ws_async.close)
and self._ws_async.session
and not loop_running
):
logger.debug("Closing ws ccxt session.")
self.loop.run_until_complete(self._ws_async.close())
@@ -354,6 +366,7 @@ class Exchange:
self.validate_pricing(config["exit_pricing"])
self.validate_pricing(config["entry_pricing"])
self.validate_orderflow(config["exchange"])
self.validate_demo_trading(config["exchange"])
self.validate_freqai(config)
self._set_startup_candle_count(config)
@@ -407,6 +420,9 @@ class Exchange:
except ccxt.BaseError as e:
raise OperationalException(f"Initialization of ccxt failed. Reason: {e}") from e
if self.get_option("supports_demo_trading") and exchange_config.get("demo_trading", False):
api.enable_demo_trading(True)
return api
@property
@@ -422,12 +438,12 @@ class Exchange:
@property
def name(self) -> str:
"""exchange Name (from ccxt)"""
return self._api.name
return self._api.name if not self._is_demo_trading else f"{self._api.name} (Demo)"
@property
def id(self) -> str:
"""exchange ccxt id"""
return self._api.id
return self._api.id if not self._is_demo_trading else f"{self._api.id}_demo"
@property
def timeframes(self) -> list[str]:
@@ -814,7 +830,8 @@ class Exchange:
and order_types["stoploss_price_type"] not in price_mapping
):
raise ConfigurationError(
f"On exchange stoploss price type is not supported for {self.name}."
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:
@@ -858,6 +875,16 @@ class Exchange:
"fetching historic OHLCV data, otherwise freqAI will not work."
)
def validate_demo_trading(self, exchange_conf: dict) -> None:
"""Validate demo trading configuration
Prevents accidental configuration with wrong expectations.
"""
if exchange_conf.get("demo_trading", False):
if not self.get_option("supports_demo_trading"):
raise ConfigurationError(f"Demo trading is not supported for {self.name}.")
else:
logger.info(f"Demo trading enabled for {self.name}")
def validate_required_startup_candles(self, startup_candles: int, timeframe: str) -> int:
"""
Checks if required startup_candles is more than ohlcv_candle_limit().
@@ -982,12 +1009,12 @@ class Exchange:
swap.linear.fetchOHLCV.limit
"""
feat = (
self._api_async.features.get("spot", {})
safe_value_nested(self._api_async.features, "spot", {})
if market_type == "spot"
else self._api_async.features.get("swap", {}).get("linear", {})
else safe_value_nested(self._api_async.features, "swap.linear", {})
)
return feat.get(endpoint, {}).get(attribute, default)
return safe_value_nested(feat, f"{endpoint}.{attribute}", default)
def get_precision_amount(self, pair: str) -> float | None:
"""
@@ -1126,7 +1153,7 @@ class Exchange:
stop_price: float | None = None,
) -> CcxtOrder:
now = dt_now()
order_id = f"dry_run_{side}_{pair}_{now.timestamp()}"
order_id = f"dry_run_{side}_{pair}_{uuid4()}"
# Rounding here must respect to contract sizes
_amount = self._contracts_to_amount(
pair, self.amount_to_precision(pair, self._amount_to_contracts(pair, amount))
@@ -1156,7 +1183,7 @@ class Exchange:
orderbook: OrderBook | None = None
if self.exchange_has("fetchL2OrderBook"):
orderbook = self.fetch_l2_order_book(pair, 20)
if ordertype == "limit" and orderbook:
if not stop_loss and ordertype == "limit" and orderbook:
# Allow a 1% price difference
allowed_diff = 0.01
if self._dry_is_price_crossed(pair, side, rate, orderbook, allowed_diff):
@@ -1293,6 +1320,7 @@ class Exchange:
Check dry-run limit order fill and update fee (if it filled).
"""
if order["status"] != "closed" and order.get("ft_order_type") == "stoploss":
# Stoploss branch
pair = order["symbol"]
if not orderbook and self.exchange_has("fetchL2OrderBook"):
orderbook = self.fetch_l2_order_book(pair, 20)
@@ -1300,6 +1328,11 @@ class Exchange:
crossed = self._dry_is_price_crossed(
pair, order["side"], price, orderbook, is_stop=True
)
if crossed and immediate:
raise InvalidOrderException(
"Could not create dry stoploss order. Stoploss would trigger immediately."
)
if crossed:
average = self.get_dry_market_fill_price(
pair,
@@ -1879,9 +1912,12 @@ class Exchange:
orders = []
if self.exchange_has("fetchClosedOrders"):
orders = self._api.fetch_closed_orders(pair, since=since_ms)
if self.exchange_has("fetchOpenOrders"):
orders_open = self._api.fetch_open_orders(pair, since=since_ms)
orders.extend(orders_open)
if self.exchange_has("fetchCanceledOrders"):
orders_canceled = self._api.fetch_canceled_orders(pair, since=since_ms)
orders.extend(orders_canceled)
if self.exchange_has("fetchOpenOrders"):
orders_open = self._api.fetch_open_orders(pair, since=since_ms)
orders.extend(orders_open)
return orders
@retrier(retries=0)
@@ -2634,11 +2670,11 @@ class Exchange:
if self._can_use_websocket(self._exchange_ws, pair, timeframe, candle_type):
candle_ts = dt_ts(timeframe_to_prev_date(timeframe))
prev_candle_ts = dt_ts(date_minus_candles(timeframe, 1))
candles = self._exchange_ws.ohlcvs(pair, timeframe)
half_candle = int(candle_ts - (candle_ts - prev_candle_ts) * 0.5)
last_refresh_time = int(
self._exchange_ws.klines_last_refresh.get((pair, timeframe, candle_type), 0)
candles, last_refresh_time = self._exchange_ws.get_ohlcv_with_refresh(
pair, timeframe, candle_type
)
last_refresh_time = int(last_refresh_time)
half_candle = int(candle_ts - (candle_ts - prev_candle_ts) * 0.5)
if (
candles
@@ -3914,7 +3950,6 @@ class Exchange:
is_short: bool,
open_date: datetime,
close_date: datetime,
time_in_ratio: float | None = None,
) -> float:
"""
calculates the sum of all funding fees that occurred for a pair during a futures trade
@@ -3924,7 +3959,6 @@ class Exchange:
:param is_short: trade direction
:param open_date: The date and time that the trade started
:param close_date: The date and time that the trade ended
:param time_in_ratio: Not used by most exchange classes
"""
fees: float = 0
+2
View File
@@ -67,6 +67,8 @@ class FtHas(TypedDict, total=False):
# Delisting check
has_delisting: bool
# Demo mode - this is not sandbox but an exchange-provided demo mode.
supports_demo_trading: bool
class Ticker(TypedDict):
@@ -29,6 +29,21 @@ def timeframe_to_msecs(timeframe: str) -> int:
return ccxt.Exchange.parse_timeframe(timeframe) * 1000
def timeframe_to_floor_freq(timeframe: str) -> str:
"""
Translates the timeframe interval value written in the human readable
form ('1m', '5m', '1h', '1d', '1w', etc.) to the desired floor frequency used by pandas
("1m", "5m", "1h", "1d", "1w", etc.).
Will use minute for most higher timeframes.
"""
timeframe_seconds = timeframe_to_seconds(timeframe)
timeframe_minutes = timeframe_seconds // 60
if timeframe_minutes <= 1:
return "1s"
else:
return "1min"
def timeframe_to_resample_freq(timeframe: str) -> str:
"""
Translates the timeframe interval value written in the human readable
+147 -76
View File
@@ -1,9 +1,8 @@
import asyncio
import logging
import time
from copy import deepcopy
from functools import partial
from threading import Thread
from threading import Event, RLock, Thread
import ccxt
@@ -24,49 +23,71 @@ class ExchangeWS:
self.config = config
self._ccxt_object = ccxt_object
self._background_tasks: set[asyncio.Task] = set()
self._state_lock = RLock()
self._loop_ready = Event()
self._klines_watching: set[PairWithTimeframe] = set()
self._klines_scheduled: set[PairWithTimeframe] = set()
self.klines_last_refresh: dict[PairWithTimeframe, float] = {}
self.klines_last_request: dict[PairWithTimeframe, float] = {}
self._klines_last_refresh: dict[PairWithTimeframe, float] = {}
self._klines_last_request: dict[PairWithTimeframe, float] = {}
self._thread = Thread(name="ccxt_ws", target=self._start_forever)
self._thread.start()
self.__cleanup_called = False
def _start_forever(self) -> None:
self._loop = asyncio.new_event_loop()
self._loop_ready.set()
try:
self._loop.run_forever()
finally:
if self._loop.is_running():
self._loop.stop()
if not self._loop.is_closed():
# Cancel remaining tasks and close the loop in the owning thread.
pending = asyncio.all_tasks(self._loop)
for task in pending:
task.cancel()
if pending:
self._loop.run_until_complete(asyncio.gather(*pending, return_exceptions=True))
self._loop.run_until_complete(self._loop.shutdown_asyncgens())
self._loop.close()
self._loop_ready.clear()
def _wait_for_loop(self, timeout: float = 1.0) -> bool:
"""
Wait for the event loop to be ready
Returns True once the loop is ready.
Will probably only return false during startup/shutdown.
"""
if hasattr(self, "_loop"):
return True
return self._loop_ready.wait(timeout=timeout) and hasattr(self, "_loop")
def cleanup(self) -> None:
logger.debug("Cleanup called - stopping")
self._klines_watching.clear()
for task in self._background_tasks:
with self._state_lock:
self._klines_watching.clear()
tasks = list(self._background_tasks)
for task in tasks:
task.cancel()
if hasattr(self, "_loop") and not self._loop.is_closed():
self.reset_connections()
if self._wait_for_loop(timeout=0.2) and not self._loop.is_closed():
self.reset_connections(cleanup=True)
self._loop.call_soon_threadsafe(self._loop.stop)
time.sleep(0.1)
if not self._loop.is_closed():
self._loop.close()
self._thread.join()
self._thread.join(timeout=5)
if self._thread.is_alive():
logger.warning("Websocket loop thread did not stop within timeout.")
logger.debug("Stopped")
def reset_connections(self) -> None:
def reset_connections(self, cleanup: bool = False) -> None:
"""
Reset all connections - avoids "connection-reset" errors that happen after ~9 days
"""
if hasattr(self, "_loop") and not self._loop.is_closed():
logger.info("Resetting WS connections.")
asyncio.run_coroutine_threadsafe(self._cleanup_async(), loop=self._loop)
while not self.__cleanup_called:
time.sleep(0.1)
self.__cleanup_called = False
if self._wait_for_loop() and not self._loop.is_closed():
logger.info(f"{'Cleaning up' if cleanup else 'Resetting'} exchange WS connections.")
try:
fut = asyncio.run_coroutine_threadsafe(self._cleanup_async(), loop=self._loop)
fut.result(timeout=10)
except TimeoutError:
logger.warning("Timed out while resetting websocket connections.")
except Exception:
logger.exception("Exception while resetting websocket connections")
async def _cleanup_async(self) -> None:
try:
@@ -76,15 +97,14 @@ class ExchangeWS:
self._ccxt_object.ohlcvs.clear()
except Exception:
logger.exception("Exception in _cleanup_async")
finally:
self.__cleanup_called = True
def _pop_history(self, paircomb: PairWithTimeframe) -> None:
"""
Remove history for a pair/timeframe combination from ccxt cache
"""
self._ccxt_object.ohlcvs.get(paircomb[0], {}).pop(paircomb[1], None)
self.klines_last_refresh.pop(paircomb, None)
with self._state_lock:
self._ccxt_object.ohlcvs.get(paircomb[0], {}).pop(paircomb[1], None)
self._klines_last_refresh.pop(paircomb, None)
@retrier(retries=3)
def ohlcvs(self, pair: str, timeframe: str) -> list[list]:
@@ -100,81 +120,129 @@ class ExchangeWS:
# TemporaryError does not cause backoff - so we're essentially retrying immediately
raise TemporaryError(f"Error deepcopying: {e}") from e
def get_ohlcv_with_refresh(
self, pair: str, timeframe: str, candle_type: CandleType
) -> tuple[list[list], float]:
"""
Get deepcopied klines and update the last refresh time
"""
ohlcvs = self.ohlcvs(pair, timeframe)
with self._state_lock:
last_refresh = self._klines_last_refresh.get((pair, timeframe, candle_type), 0)
return ohlcvs, last_refresh
def cleanup_expired(self) -> None:
"""
Remove pairs from watchlist if they've not been requested within
the last timeframe (+ offset)
"""
changed = False
for p in list(self._klines_watching):
_, timeframe, _ = p
timeframe_s = timeframe_to_seconds(timeframe)
last_refresh = self.klines_last_request.get(p, 0)
if last_refresh > 0 and (dt_ts() - last_refresh) > ((timeframe_s + 20) * 1000):
logger.info(f"Removing {p} from websocket watchlist.")
self._klines_watching.discard(p)
# Pop history to avoid getting stale data
self._pop_history(p)
changed = True
with self._state_lock:
for p in list(self._klines_watching):
_, timeframe, _ = p
timeframe_s = timeframe_to_seconds(timeframe)
last_refresh = self._klines_last_request.get(p, 0)
if last_refresh > 0 and (dt_ts() - last_refresh) > ((timeframe_s + 20) * 1000):
logger.info(f"Removing {p} from websocket watchlist.")
self._klines_watching.discard(p)
# Pop history to avoid getting stale data
self._pop_history(p)
changed = True
if changed:
logger.info(f"Removal done: new watch list ({len(self._klines_watching)})")
async def _schedule_while_true(self) -> None:
# For the ones we should be watching
for p in self._klines_watching:
with self._state_lock:
pairs_to_check = list(self._klines_watching)
for p in pairs_to_check:
# Check if they're already scheduled
if p not in self._klines_scheduled:
with self._state_lock:
if p in self._klines_scheduled:
continue
self._klines_scheduled.add(p)
pair, timeframe, candle_type = p
task = asyncio.create_task(
self._continuously_async_watch_ohlcv(pair, timeframe, candle_type)
)
pair, timeframe, candle_type = p
task = asyncio.create_task(
self._continuously_async_watch_ohlcv(pair, timeframe, candle_type)
)
with self._state_lock:
self._background_tasks.add(task)
task.add_done_callback(
partial(
self._continuous_stopped,
pair=pair,
timeframe=timeframe,
candle_type=candle_type,
)
task.add_done_callback(
partial(
self._continuous_stopped,
pair=pair,
timeframe=timeframe,
candle_type=candle_type,
)
)
def exchange_has(self, endpoint: str) -> bool:
"""
Checks if exchange implements a specific API endpoint.
Wrapper around ccxt 'has' attribute
:param endpoint: Name of endpoint (e.g. 'fetchOHLCV', 'fetchTickers')
:return: bool
"""
return endpoint in self._ccxt_object.has and self._ccxt_object.has[endpoint]
async def _unwatch_ohlcv(self, pair: str, timeframe: str, candle_type: CandleType) -> None:
try:
await self._ccxt_object.un_watch_ohlcv_for_symbols([[pair, timeframe]])
if self.exchange_has("unWatchOHLCVForSymbols"):
await self._ccxt_object.un_watch_ohlcv_for_symbols([[pair, timeframe]])
elif self.exchange_has("unWatchOHLCV"):
await self._ccxt_object.un_watch_ohlcv(pair, timeframe)
else:
logger.debug("un_watch_ohlcv not supported for %s, %s", pair, timeframe)
except ccxt.NotSupported as e:
logger.debug("un_watch_ohlcv_for_symbols not supported: %s", e)
pass
except ccxt.NetworkError as e:
# Network errors are common on shutdown so we can ignore them.
# It's a network error - which most likely means that the connection is already closed.
logger.debug("Network error during unwatch for %s, %s: %s", pair, timeframe, e)
except Exception:
logger.exception("Exception in _unwatch_ohlcv")
logger.exception(f"Exception in _unwatch_ohlcv for {pair}, {timeframe},")
def _continuous_stopped(
self, task: asyncio.Task, pair: str, timeframe: str, candle_type: CandleType
):
self._background_tasks.discard(task)
) -> None:
with self._state_lock:
self._background_tasks.discard(task)
result = "done"
if task.cancelled():
result = "cancelled"
else:
if (result1 := task.result()) is not None:
result = str(result1)
try:
if task.cancelled():
result = "cancelled"
else:
if (result1 := task.result()) is not None:
result = str(result1)
except Exception:
result = "error"
logger.exception(f"Unhandled exception in watch task callback for {pair}, {timeframe}")
finally:
logger.info(f"{pair}, {timeframe}, {candle_type} - Task finished - {result}")
if hasattr(self, "_loop") and not self._loop.is_closed():
asyncio.run_coroutine_threadsafe(
self._unwatch_ohlcv(pair, timeframe, candle_type), loop=self._loop
)
logger.info(f"{pair}, {timeframe}, {candle_type} - Task finished - {result}")
asyncio.run_coroutine_threadsafe(
self._unwatch_ohlcv(pair, timeframe, candle_type), loop=self._loop
)
self._klines_scheduled.discard((pair, timeframe, candle_type))
self._pop_history((pair, timeframe, candle_type))
with self._state_lock:
self._klines_scheduled.discard((pair, timeframe, candle_type))
self._pop_history((pair, timeframe, candle_type))
async def _continuously_async_watch_ohlcv(
self, pair: str, timeframe: str, candle_type: CandleType
) -> None:
try:
while (pair, timeframe, candle_type) in self._klines_watching:
while True:
with self._state_lock:
if (pair, timeframe, candle_type) not in self._klines_watching:
break
start = dt_ts()
data = await self._ccxt_object.watch_ohlcv(pair, timeframe)
self.klines_last_refresh[(pair, timeframe, candle_type)] = dt_ts()
with self._state_lock:
self._klines_last_refresh[(pair, timeframe, candle_type)] = dt_ts()
logger.debug(
f"watch done {pair}, {timeframe}, data {len(data)} "
f"in {(dt_ts() - start) / 1000:.3f}s"
@@ -184,14 +252,19 @@ class ExchangeWS:
except ccxt.BaseError:
logger.exception(f"Exception in continuously_async_watch_ohlcv for {pair}, {timeframe}")
finally:
self._klines_watching.discard((pair, timeframe, candle_type))
with self._state_lock:
self._klines_watching.discard((pair, timeframe, candle_type))
def schedule_ohlcv(self, pair: str, timeframe: str, candle_type: CandleType) -> None:
"""
Schedule a pair/timeframe combination to be watched
"""
self._klines_watching.add((pair, timeframe, candle_type))
self.klines_last_request[(pair, timeframe, candle_type)] = dt_ts()
if not self._wait_for_loop():
logger.warning(f"Websocket loop not ready. Could not schedule {pair}, {timeframe}.")
return
with self._state_lock:
self._klines_watching.add((pair, timeframe, candle_type))
self._klines_last_request[(pair, timeframe, candle_type)] = dt_ts()
# asyncio.run_coroutine_threadsafe(self.schedule_schedule(), loop=self._loop)
asyncio.run_coroutine_threadsafe(self._schedule_while_true(), loop=self._loop)
self.cleanup_expired()
@@ -207,12 +280,10 @@ class ExchangeWS:
Returns cached klines from ccxt's "watch" cache.
:param candle_ts: timestamp of the end-time of the candle we expect.
"""
# Deepcopy the response - as it might be modified in the background as new messages arrive
candles = self.ohlcvs(pair, timeframe)
refresh_date = self.klines_last_refresh[(pair, timeframe, candle_type)]
candles, refresh_date = self.get_ohlcv_with_refresh(pair, timeframe, candle_type)
received_ts = candles[-1][0] if candles else 0
drop_hint = received_ts >= candle_ts
if received_ts > refresh_date:
if refresh_date and received_ts > refresh_date:
logger.warning(
f"{pair}, {timeframe} - Candle date > last refresh "
f"({format_ms_time(received_ts)} > {format_ms_time_det(refresh_date)}). "
+67 -19
View File
@@ -5,11 +5,20 @@ from copy import deepcopy
from datetime import datetime
from typing import Any
import ccxt
from freqtrade.constants import BuySell
from freqtrade.enums import MarginMode, TradingMode
from freqtrade.enums.runmode import NON_UTIL_MODES
from freqtrade.exceptions import ConfigurationError, ExchangeError, OperationalException
from freqtrade.exceptions import (
ConfigurationError,
DDosProtection,
ExchangeError,
OperationalException,
TemporaryError,
)
from freqtrade.exchange import Exchange
from freqtrade.exchange.common import retrier
from freqtrade.exchange.exchange_types import CcxtBalances, CcxtOrder, CcxtPosition, FtHas
from freqtrade.util.datetime_helpers import dt_from_ts
@@ -22,6 +31,8 @@ class Hyperliquid(Exchange):
Contains adjustments needed for Freqtrade to work with this exchange.
"""
unified_account = False
_ft_has: FtHas = {
"ohlcv_has_history": False,
"l2_limit_range": [20],
@@ -58,6 +69,38 @@ class Hyperliquid(Exchange):
config.update(super()._ccxt_config)
return config
@retrier
def additional_exchange_init(self) -> None:
"""
Additional exchange initialization logic.
.api will be available at this point.
Query User account Account Type to determine unified account status
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#query-a-users-abstraction-state
"""
try:
if self.trading_mode == TradingMode.FUTURES and not self._config["dry_run"]:
# Determine account status
# Unified accounts must use the spot endpoint for balances
request = {
"type": "userAbstraction",
"user": self._api.walletAddress,
}
response = self._api.publicPostInfo(request)
self.unified_account = response in ('"unifiedAccount"', '"portfolioMargin"')
if self.unified_account:
logger.info("Unified Hyperliquid account detected.")
except ccxt.DDoSProtection as e:
raise DDosProtection(e) from e
except (ccxt.OperationFailed, ccxt.ExchangeError) as e:
raise TemporaryError(
f"Error in additional_exchange_init due to {e.__class__.__name__}. Message: {e}"
) from e
except ccxt.BaseError as e:
raise OperationalException(e) from e
def _get_configured_hip3_dexes(self) -> list[str]:
"""Get list of configured HIP-3 DEXes."""
return self._config.get("exchange", {}).get("hip3_dexes", [])
@@ -122,28 +165,33 @@ class Hyperliquid(Exchange):
This override is not absolutely necessary and is only there for correct used / total values
which are however not used by Freqtrade in futures mode at the moment.
"""
balances = super().get_balances()
dexes = self._get_configured_hip3_dexes()
for dex in dexes:
try:
dex_balance = super().get_balances(params={"dex": dex})
params = params or {}
if self.unified_account:
params["type"] = "spot"
balances = super().get_balances(params)
if not self.unified_account:
# In unified accounts, the balance already includes all DEXes
dexes = self._get_configured_hip3_dexes()
for dex in dexes:
try:
dex_balance = super().get_balances(params={"dex": dex})
for currency, amount_info in dex_balance.items():
if currency in ["info", "free", "used", "total", "datetime", "timestamp"]:
continue
for currency, amount_info in dex_balance.items():
if currency in ["info", "free", "used", "total", "datetime", "timestamp"]:
continue
if currency not in balances:
balances[currency] = amount_info
else:
balances[currency]["free"] += amount_info["free"]
balances[currency]["used"] += amount_info["used"]
balances[currency]["total"] += amount_info["total"]
if currency not in balances:
balances[currency] = amount_info
else:
balances[currency]["free"] += amount_info["free"]
balances[currency]["used"] += amount_info["used"]
balances[currency]["total"] += amount_info["total"]
except Exception as e:
logger.error(f"Could not fetch balance for HIP-3 DEX '{dex}': {e}")
except Exception as e:
logger.error(f"Could not fetch balance for HIP-3 DEX '{dex}': {e}")
if dexes:
self._log_exchange_response("fetch_balance", balances, add_info="combined")
if dexes:
self._log_exchange_response("fetch_balance", balances, add_info="combined")
return balances
def fetch_positions(
-50
View File
@@ -1,11 +1,9 @@
"""Kraken exchange subclass"""
import logging
from datetime import datetime
from typing import Any
import ccxt
from pandas import DataFrame
from freqtrade.constants import BuySell
from freqtrade.enums import MarginMode, TradingMode
@@ -40,7 +38,6 @@ class Kraken(Exchange):
_supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [
(TradingMode.SPOT, MarginMode.NONE),
# (TradingMode.MARGIN, MarginMode.CROSS),
# (TradingMode.FUTURES, MarginMode.CROSS)
]
def market_is_tradable(self, market: dict[str, Any]) -> bool:
@@ -114,18 +111,6 @@ class Kraken(Exchange):
except ccxt.BaseError as e:
raise OperationalException(e) from e
def _set_leverage(
self,
leverage: float,
pair: str | None = None,
accept_fail: bool = False,
):
"""
Kraken set's the leverage as an option in the order object, so we need to
add it to params
"""
return
def _get_params(
self,
side: BuySell,
@@ -148,41 +133,6 @@ class Kraken(Exchange):
params["postOnly"] = True
return params
def calculate_funding_fees(
self,
df: DataFrame,
amount: float,
is_short: bool,
open_date: datetime,
close_date: datetime,
time_in_ratio: float | None = None,
) -> float:
"""
# ! This method will always error when run by Freqtrade because time_in_ratio is never
# ! passed to _get_funding_fee. For kraken futures to work in dry run and backtesting
# ! functionality must be added that passes the parameter time_in_ratio to
# ! _get_funding_fee when using Kraken
calculates the sum of all funding fees that occurred for a pair during a futures trade
:param df: Dataframe containing combined funding and mark rates
as `open_fund` and `open_mark`.
:param amount: The quantity of the trade
:param is_short: trade direction
:param open_date: The date and time that the trade started
:param close_date: The date and time that the trade ended
:param time_in_ratio: Not used by most exchange classes
"""
if not time_in_ratio:
raise OperationalException(
f"time_in_ratio is required for {self.name}._get_funding_fee"
)
fees: float = 0
if not df.empty:
df = df[(df["date"] >= open_date) & (df["date"] <= close_date)]
fees = sum(df["open_fund"] * df["open_mark"] * amount * time_in_ratio)
return fees if is_short else -fees
def _get_trade_pagination_next_value(self, trades: list[dict]):
"""
Extract pagination id for the next "from_id" value
+300
View File
@@ -0,0 +1,300 @@
"""Kraken Futures exchange subclass"""
import logging
from datetime import datetime
from typing import Any
import ccxt
from freqtrade.enums import MarginMode, PriceType, TradingMode
from freqtrade.exceptions import (
DDosProtection,
ExchangeError,
InvalidOrderException,
OperationalException,
TemporaryError,
)
from freqtrade.exchange.common import API_FETCH_ORDER_RETRY_COUNT, retrier
from freqtrade.exchange.exchange import Exchange
from freqtrade.exchange.exchange_types import CcxtBalances, CcxtOrder, FtHas
from freqtrade.misc import safe_value_nested
from freqtrade.util.datetime_helpers import dt_from_ts
logger = logging.getLogger(__name__)
class Krakenfutures(Exchange):
"""Kraken Futures exchange class.
Contains adjustments needed for Freqtrade to work with this exchange.
Key differences from spot Kraken:
- Stop orders use triggerPrice/triggerSignal instead of stopPrice
- Flex (multi-collateral) accounts need USD balance synthesis
"""
_supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [
(TradingMode.FUTURES, MarginMode.ISOLATED),
]
_ft_has: FtHas = {
"tickers_have_quoteVolume": False,
"stoploss_on_exchange": True,
"stoploss_order_types": {
"limit": "limit",
"market": "market",
},
"stoploss_query_requires_stop_flag": True,
"stop_price_param": "triggerPrice",
"stop_price_prop": "stopPrice",
"stop_price_type_field": "triggerSignal",
"stop_price_type_value_mapping": {
PriceType.LAST: "last",
PriceType.MARK: "mark",
PriceType.INDEX: "index",
},
"exchange_has_overrides": {"fetchOrders": False},
}
@retrier
def get_balances(self, params: dict | None = None) -> CcxtBalances:
"""
Fetch balances with USD synthesis for flex (multi-collateral) accounts.
Kraken Futures flex accounts hold multiple currencies as collateral.
CCXT returns per-currency balances but doesn't expose margin values
as a USD balance. This override synthesizes a USD entry from flex account data
when stake_currency is USD.
Field mapping (margin-centric for internal consistency):
- free: availableMargin (margin available for new positions)
- total: marginEquity (haircut-adjusted collateral + unrealized P&L)
- used: total - free (margin currently in use)
Fallback chain for total: marginEquity -> portfolioValue -> balanceValue
"""
try:
balances = self._api.fetch_balance(params or {})
# Only synthesize USD if stake_currency is USD
stake = str(self._config.get("stake_currency", "")).upper()
if stake == "USD":
# Only synthesize if USD stake - flex only applies for these currencies.
# For flex accounts, synthesize USD balance from margin values
info = balances.get("info", {})
accounts = info.get("accounts", {}) if isinstance(info, dict) else {}
flex = accounts.get("flex", {}) if isinstance(accounts, dict) else {}
if flex:
usd_free = self._safe_float(flex.get("availableMargin"))
# Prefer marginEquity for consistency (same basis as availableMargin)
raw_total = (
flex.get("marginEquity")
or flex.get("portfolioValue")
or flex.get("balanceValue")
)
usd_total = self._safe_float(raw_total)
if usd_free is not None or usd_total is not None:
# Use available value for both if only one is present
usd_free_value = usd_free if usd_free is not None else usd_total
usd_total_value = usd_total if usd_total is not None else usd_free
if usd_free_value is not None and usd_total_value is not None:
usd_used = max(0.0, usd_total_value - usd_free_value)
balances["USD"] = {
"free": usd_free_value,
"used": usd_used,
"total": usd_total_value,
}
# Remove additional info from ccxt results (same as base class)
balances.pop("info", None)
balances.pop("free", None)
balances.pop("total", None)
balances.pop("used", None)
self._log_exchange_response("fetch_balance", balances, add_info=params)
return balances
except ccxt.DDoSProtection as e:
raise DDosProtection(e) from e
except (ccxt.OperationFailed, ccxt.ExchangeError) as e:
raise TemporaryError(
f"Could not get balance due to {e.__class__.__name__}. Message: {e}"
) from e
except ccxt.BaseError as e:
raise OperationalException(e) from e
@staticmethod
def _safe_float(value: Any) -> float | None:
"""Convert value to float, returning None if conversion fails."""
if value is None:
return None
try:
return float(value)
except (ValueError, TypeError):
return None
def _order_contracts_to_amount(self, order: CcxtOrder) -> CcxtOrder:
"""Normalize order and apply Kraken Futures-specific order corrections."""
order = super()._order_contracts_to_amount(order)
return self._adjust_krakenfutures_order(order)
def _adjust_krakenfutures_order(self, order: CcxtOrder) -> CcxtOrder:
"""Apply Kraken Futures-specific order corrections.
For filled terminal orders, always fetch trades and compute VWAP because
CCXT's average is still unreliable.
See: https://github.com/ccxt/ccxt/issues/27996
"""
if order.get("status") == "canceled" and order.get("filled") is None:
# Workaround for missing filled parsing - https://github.com/ccxt/ccxt/issues/28210
order["filled"] = safe_value_nested(order, "info.order.filled", default_value=None)
filled = self._safe_float(order.get("filled")) or 0.0
if order.get("status") in ("canceled", "closed") and filled > 0:
# Compute VWAP and cost for filled orders.
trades = self.get_trades_for_order(
order["id"], order["symbol"], since=dt_from_ts(order["timestamp"])
)
if trades:
total_amount = sum(t["amount"] for t in trades)
if total_amount:
# Compute VWAP
order["average"] = sum(t["price"] * t["amount"] for t in trades) / total_amount
trade_costs = [t["cost"] for t in trades if t.get("cost") is not None]
if trade_costs:
order["cost"] = sum(trade_costs)
return order
def get_trades_for_order(
self, order_id: str, pair: str, since: datetime, params: dict | None = None
) -> list:
"""Fetch trades and enrich with calculated fees.
Kraken Futures' /fills endpoint does not include fee amounts — only
fillType (maker/taker). This enriches each trade with a calculated fee
using the market's fee schedule so Freqtrade's fee detection works.
"""
trades = super().get_trades_for_order(order_id, pair, since, params)
for trade in trades:
if trade.get("fee") is None or trade["fee"].get("cost") is None:
taker_or_maker = trade.get("takerOrMaker", "taker")
symbol = trade.get("symbol", pair)
market = self.markets.get(symbol, {})
fee_rate = market.get(taker_or_maker, market.get("taker", 0.0005))
cost = trade.get("cost")
if cost is not None and fee_rate is not None:
trade["fee"] = {
"cost": cost * fee_rate,
"currency": market.get("quote", "USD"),
"rate": fee_rate,
}
return trades
@retrier(retries=API_FETCH_ORDER_RETRY_COUNT)
def fetch_order(
self, order_id: str, pair: str, params: dict[str, Any] | None = None
) -> CcxtOrder:
"""Fetch order with direct CCXT call and fallback to history endpoints."""
if self._config.get("dry_run"):
return self.fetch_dry_run_order(order_id)
params = params or {}
status_params = {k: v for k, v in params.items() if k not in ("trigger", "stop")}
try:
order = self._api.fetch_order(order_id, pair, params=status_params)
self._log_exchange_response("fetch_order", order)
return self._order_contracts_to_amount(order)
except ccxt.OrderNotFound:
# Expected for older Kraken Futures orders not visible in orders/status.
pass
except ccxt.DDoSProtection as e:
raise DDosProtection(e) from e
except ccxt.InvalidOrder as e:
msg = f"Tried to get an invalid order (pair: {pair} id: {order_id}). Message: {e}"
raise InvalidOrderException(msg) from e
except (ccxt.OperationFailed, ccxt.ExchangeError):
# Fallback to history endpoints for temporary/status endpoint gaps.
pass
except ccxt.BaseError as e:
raise OperationalException(e) from e
order = self._fetch_order_fallback(order_id, pair, params)
if order is not None:
return order
# Order not in status, open, closed, or canceled endpoints - genuinely gone.
# Raise non-retrying InvalidOrderException (Kraken has limited history retention).
raise InvalidOrderException(
f"Order not found in any endpoint (pair: {pair} id: {order_id})"
)
def _fetch_order_fallback(
self, order_id: str, pair: str, params: dict[str, Any]
) -> CcxtOrder | None:
"""Search open, closed, and canceled order endpoints for order_id.
Kraken Futures' orders/status endpoint only returns currently open orders.
Older orders require querying history endpoints (closed/canceled).
For stoploss (trigger) orders, the caller should pass stop=True in params
(handled automatically via stoploss_query_requires_stop_flag in _ft_has)
so that closed/canceled queries hit the trigger history endpoint.
"""
order_id_str = str(order_id)
# Open orders include triggers by default. Avoid passing trigger/stop flags
# to prevent endpoint/filter mismatches.
open_params = {k: v for k, v in params.items() if k not in ("trigger", "stop")}
order = self._find_order_in_list(
self._api.fetch_open_orders, pair, open_params, order_id_str
)
if order is not None:
return order
# Closed/canceled: pass params through (including stop=True for stoploss orders,
# which CCXT maps to the trigger history endpoint).
for fetch_fn in (self._api.fetch_closed_orders, self._api.fetch_canceled_orders):
order = self._find_order_in_list(fetch_fn, pair, params, order_id_str)
if order is not None:
return order
return None
def _find_order_in_list(
self,
fetch_fn,
symbol: str | None,
params: dict[str, Any],
order_id_str: str,
) -> CcxtOrder | None:
"""Fetch orders and return matching order_id, or None."""
try:
orders = fetch_fn(symbol, params=params) or []
self._log_exchange_response(fetch_fn.__name__, orders)
for order in orders:
if str(order.get("id")) == order_id_str:
self._log_exchange_response("fetch_order_fallback", order)
return self._order_contracts_to_amount(order)
except (ccxt.OrderNotFound, ccxt.InvalidOrder) as e:
logger.debug(f"{fetch_fn.__name__} failed: {e}")
return None
except ccxt.DDoSProtection as e:
raise DDosProtection(e) from e
except (ccxt.OperationFailed, ccxt.ExchangeError) as e:
raise TemporaryError(
f"Could not get order due to {e.__class__.__name__}. Message: {e}"
) from e
except ccxt.BaseError as e:
raise OperationalException(e) from e
return None
def get_funding_fees(self, pair: str, amount: float, is_short: bool, open_date) -> float:
"""Fetch funding fees, returning 0.0 if retrieval fails."""
if self.trading_mode == TradingMode.FUTURES:
try:
return self._fetch_and_calculate_funding_fees(pair, amount, is_short, open_date)
except ExchangeError:
logger.warning(f"Could not update funding fees for {pair}.")
return 0.0
+9 -5
View File
@@ -361,7 +361,7 @@ class FreqaiDataDrawer:
label_loc = df.columns.get_loc(label)
pred_label_loc = predictions.columns.get_loc(label)
df.iloc[-1, label_loc] = predictions.iloc[-1, pred_label_loc]
if df[label].dtype == object:
if pd.api.types.is_string_dtype(df[label].dtype):
continue
label_mean_loc = df.columns.get_loc(f"{label}_mean")
label_std_loc = df.columns.get_loc(f"{label}_std")
@@ -446,7 +446,7 @@ class FreqaiDataDrawer:
model_folders = [x for x in self.full_path.iterdir() if x.is_dir()]
pattern = re.compile(r"sub-train-(\w+)_(\d{10})")
pattern = re.compile(r"^sub-train-(.+)_(\d{10})$")
delete_dict: dict[str, Any] = {}
@@ -614,9 +614,13 @@ class FreqaiDataDrawer:
elif self.model_type == "pytorch":
import torch
zipfile = torch.load(dk.data_path / f"{dk.model_filename}_model.zip")
model = zipfile["pytrainer"]
model = model.load_from_checkpoint(zipfile)
zipfile = torch.load(
dk.data_path / f"{dk.model_filename}_model.zip",
weights_only=False,
)
# weights_only is necessary due to pytrainer being a serialized python object.
_trainer = zipfile["pytrainer"]
model = _trainer.load_from_checkpoint(zipfile)
if not model:
raise OperationalException(
+21 -19
View File
@@ -24,8 +24,6 @@ from freqtrade.strategy import merge_informative_pair
from freqtrade.strategy.interface import IStrategy
pd.set_option("future.no_silent_downcasting", True)
SECONDS_IN_DAY = 86400
SECONDS_IN_HOUR = 3600
@@ -239,16 +237,14 @@ class FreqaiDataKitchen:
filtered_df = filtered_df.replace([np.inf, -np.inf], np.nan)
drop_index = pd.isnull(filtered_df).any(axis=1) # get the rows that have NaNs,
drop_index = drop_index.replace(True, 1).replace(False, 0).infer_objects(copy=False)
drop_index = drop_index.replace(True, 1).replace(False, 0).infer_objects()
if training_filter:
# we don't care about total row number (total no. datapoints) in training, we only care
# about removing any row with NaNs
# if labels has multiple columns (user wants to train multiple modelEs), we detect here
labels = unfiltered_df.filter(label_list or [], axis=1)
drop_index_labels = pd.isnull(labels).any(axis=1)
drop_index_labels = (
drop_index_labels.replace(True, 1).replace(False, 0).infer_objects(copy=False)
)
drop_index_labels = drop_index_labels.replace(True, 1).replace(False, 0).infer_objects()
dates = unfiltered_df["date"]
filtered_df = filtered_df[
(drop_index == 0) & (drop_index_labels == 0)
@@ -428,22 +424,28 @@ class FreqaiDataKitchen:
Get backtest prediction from current backtest period
"""
append_df = DataFrame()
# Build dict first and construct DataFrame once to avoid
# column-by-column assignment which causes DataFrame fragmentation
# and PerformanceWarning on large prediction sets.
append_dict: dict[str, Any] = {}
for label in predictions.columns:
append_df[label] = predictions[label]
if append_df[label].dtype == object:
append_dict[label] = predictions[label]
if pd.api.types.is_string_dtype(predictions[label].dtype):
continue
if "labels_mean" in self.data:
append_df[f"{label}_mean"] = self.data["labels_mean"][label]
if "labels_std" in self.data:
append_df[f"{label}_std"] = self.data["labels_std"][label]
if "labels_mean" in self.data and label in self.data["labels_mean"]:
append_dict[f"{label}_mean"] = self.data["labels_mean"][label]
if "labels_std" in self.data and label in self.data["labels_std"]:
append_dict[f"{label}_std"] = self.data["labels_std"][label]
for extra_col in self.data["extra_returns_per_train"]:
append_df[f"{extra_col}"] = self.data["extra_returns_per_train"][extra_col]
append_dict[f"{extra_col}"] = self.data["extra_returns_per_train"][extra_col]
append_df["do_predict"] = do_predict
append_dict["do_predict"] = do_predict
if self.freqai_config["feature_parameters"].get("DI_threshold", 0) > 0:
append_df["DI_values"] = self.DI_values
append_dict["DI_values"] = self.DI_values
append_df = DataFrame(append_dict)
user_cols = [col for col in dataframe_backtest.columns if col.startswith("%%")]
cols = ["date"]
@@ -873,7 +875,7 @@ class FreqaiDataKitchen:
self.data["labels_mean"], self.data["labels_std"] = {}, {}
for label in self.data_dictionary["train_labels"].columns:
if self.data_dictionary["train_labels"][label].dtype == object:
if pd.api.types.is_string_dtype(self.data_dictionary["train_labels"][label].dtype):
continue
f = spy.stats.norm.fit(self.data_dictionary["train_labels"][label])
self.data["labels_mean"][label], self.data["labels_std"][label] = f[0], f[1]
@@ -899,7 +901,7 @@ class FreqaiDataKitchen:
self.find_labels(dataframe)
for key in self.label_list:
if dataframe[key].dtype == object:
if pd.api.types.is_string_dtype(dataframe[key].dtype):
self.unique_classes[key] = dataframe[key].dropna().unique()
if self.unique_classes:
@@ -984,7 +986,7 @@ class FreqaiDataKitchen:
are populated.
The main example use is when predicting maxima and minima, the argrelextrema
function cannot know the maxima/minima at the edges of the timerange. To improve
function cannot know the maxima/minima at the edges of the timerange. To improve
model accuracy, it is best to compute argrelextrema on the full timerange
and then use this function to cut off the edges (buffer) by the kernel.
+3 -3
View File
@@ -676,7 +676,7 @@ class IFreqaiModel(ABC):
self.set_start_dry_live_date(strat_df)
for label in hist_preds_df.columns:
if hist_preds_df[label].dtype == object:
if pd.api.types.is_string_dtype(hist_preds_df[label].dtype):
continue
hist_preds_df[f"{label}_mean"] = 0
hist_preds_df[f"{label}_std"] = 0
@@ -706,7 +706,7 @@ class IFreqaiModel(ABC):
num_candles = self.freqai_info.get("fit_live_predictions_candles", 100)
dk.data["labels_mean"], dk.data["labels_std"] = {}, {}
for label in full_labels:
if self.dd.historic_predictions[dk.pair][label].dtype == object:
if pd.api.types.is_string_dtype(self.dd.historic_predictions[dk.pair][label].dtype):
continue
f = spy.stats.norm.fit(self.dd.historic_predictions[dk.pair][label].tail(num_candles))
dk.data["labels_mean"][label], dk.data["labels_std"][label] = f[0], f[1]
@@ -896,7 +896,7 @@ class IFreqaiModel(ABC):
]
self.fit_live_predictions(self.dk, self.dk.pair)
for label in label_columns:
if dk.full_df[label].dtype == object:
if pd.api.types.is_string_dtype(dk.full_df[label].dtype):
continue
if "labels_mean" in self.dk.data:
dk.full_df.at[index, f"{label}_mean"] = self.dk.data["labels_mean"][
@@ -1,10 +1,12 @@
import logging
from collections.abc import Callable
from typing import Any
from lightgbm import LGBMClassifier
from freqtrade.freqai.base_models.BaseClassifierModel import BaseClassifierModel
from freqtrade.freqai.data_kitchen import FreqaiDataKitchen
from freqtrade.freqai.tensorboard import LightGBMCallback
logger = logging.getLogger(__name__)
@@ -46,6 +48,10 @@ class LightGBMClassifier(BaseClassifierModel):
init_model = self.get_init_model(dk.pair)
model = LGBMClassifier(**self.model_training_parameters)
activate_tensorboard = self.freqai_info.get("activate_tensorboard", True)
callbacks: list[Callable[..., Any]] = []
if LightGBMCallback is not None:
callbacks = [LightGBMCallback(dk.data_path, activate_tensorboard)]
model.fit(
X=X,
y=y,
@@ -53,6 +59,7 @@ class LightGBMClassifier(BaseClassifierModel):
sample_weight=train_weights,
eval_sample_weight=[test_weights],
init_model=init_model,
callbacks=callbacks,
)
return model
@@ -6,6 +6,7 @@ from lightgbm import LGBMClassifier
from freqtrade.freqai.base_models.BaseClassifierModel import BaseClassifierModel
from freqtrade.freqai.base_models.FreqaiMultiOutputClassifier import FreqaiMultiOutputClassifier
from freqtrade.freqai.data_kitchen import FreqaiDataKitchen
from freqtrade.freqai.tensorboard import LightGBMCallback
logger = logging.getLogger(__name__)
@@ -53,6 +54,11 @@ class LightGBMClassifierMultiTarget(BaseClassifierModel):
else:
init_models = [None] * y.shape[1]
activate_tensorboard = self.freqai_info.get("activate_tensorboard", True)
callbacks = []
if LightGBMCallback is not None:
callbacks = [LightGBMCallback(dk.data_path, activate_tensorboard)]
fit_params = []
for i in range(len(eval_sets)):
fit_params.append(
@@ -60,6 +66,7 @@ class LightGBMClassifierMultiTarget(BaseClassifierModel):
"eval_set": eval_sets[i],
"eval_sample_weight": eval_weights,
"init_model": init_models[i],
"callbacks": callbacks,
}
)
@@ -1,10 +1,12 @@
import logging
from collections.abc import Callable
from typing import Any
from lightgbm import LGBMRegressor
from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel
from freqtrade.freqai.data_kitchen import FreqaiDataKitchen
from freqtrade.freqai.tensorboard import LightGBMCallback
logger = logging.getLogger(__name__)
@@ -42,6 +44,11 @@ class LightGBMRegressor(BaseRegressionModel):
model = LGBMRegressor(**self.model_training_parameters)
activate_tensorboard = self.freqai_info.get("activate_tensorboard", True)
callbacks: list[Callable[..., Any]] = []
if LightGBMCallback is not None:
callbacks = [LightGBMCallback(dk.data_path, activate_tensorboard)]
model.fit(
X=X,
y=y,
@@ -49,6 +56,7 @@ class LightGBMRegressor(BaseRegressionModel):
sample_weight=train_weights,
eval_sample_weight=[eval_weights],
init_model=init_model,
callbacks=callbacks,
)
return model
@@ -6,6 +6,7 @@ from lightgbm import LGBMRegressor
from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel
from freqtrade.freqai.base_models.FreqaiMultiOutputRegressor import FreqaiMultiOutputRegressor
from freqtrade.freqai.data_kitchen import FreqaiDataKitchen
from freqtrade.freqai.tensorboard import LightGBMCallback
logger = logging.getLogger(__name__)
@@ -55,6 +56,11 @@ class LightGBMRegressorMultiTarget(BaseRegressionModel):
else:
init_models = [None] * y.shape[1]
activate_tensorboard = self.freqai_info.get("activate_tensorboard", True)
callbacks = []
if LightGBMCallback is not None:
callbacks = [LightGBMCallback(dk.data_path, activate_tensorboard)]
fit_params = []
for i in range(len(eval_sets)):
fit_params.append(
@@ -62,6 +68,7 @@ class LightGBMRegressorMultiTarget(BaseRegressionModel):
"eval_set": eval_sets[i],
"eval_sample_weight": eval_weights,
"init_model": init_models[i],
"callbacks": callbacks,
}
)

Some files were not shown because too many files have changed in this diff Show More