Compare commits

..

402 Commits

Author SHA1 Message Date
Matthias
73dccb0780 test: Add test case for no parallel on 1 combo 2025-11-23 15:43:17 +01:00
Matthias
aa7aac3a14 feat: don't jump into parallel mode for single pair/timeframe downloads 2025-11-23 15:43:17 +01:00
Matthias
2015ccc727 test: update parallel-history test 2025-11-23 15:43:17 +01:00
Matthias
47301830b6 fix: be more selective before activating parallel download 2025-11-23 15:43:17 +01:00
Matthias
b7b280de96 Merge pull request #12542 from freqtrade/feat/no_data
Fix telegram crash during exchange downtime and improve percentage formatting
2025-11-23 15:43:07 +01:00
Matthias
7edc2e8c94 fix: improved realized profit telegram condition 2025-11-23 13:23:18 +01:00
Matthias
972e25a6a7 feat: Improve conditions to not exclude 0.0 profits 2025-11-23 08:33:11 +01:00
Matthias
649db69314 test: add tests for N/A when formatting prices 2025-11-23 08:30:24 +01:00
Matthias
d0fb4cdc37 feat: use N/A for round value 2025-11-23 08:30:10 +01:00
Matthias
efabcef330 feat: use pct formatting helper throughout telegram module 2025-11-23 08:23:05 +01:00
Matthias
a4e6ac0c7f test: update test for new status table behavior 2025-11-23 08:18:51 +01:00
Matthias
0ce9149ddd feat: use helper method to format for pct 2025-11-23 08:18:17 +01:00
Matthias
2750643e07 test: add tests for format_pct 2025-11-23 08:14:39 +01:00
Matthias
b92535deea feat: Add format_pct helper method 2025-11-23 08:13:48 +01:00
Matthias
2fa0503993 fix: telegram crash during exchange downtime 2025-11-23 08:09:37 +01:00
Matthias
3932470190 Merge pull request #12541 from stash86/main-stash
make sure the strat's startup count don't get replaced
2025-11-23 08:09:25 +01:00
Stefano
d901f4b10b make sure the strat's starupt count don't get replaced 2025-11-23 14:01:36 +09:00
Matthias
8269384077 fix: missing space in template
closes #12539
2025-11-22 19:51:16 +01:00
Matthias
b364153d02 feat: add nr_of_successful_* to api 2025-11-22 15:46:34 +01:00
Matthias
916d8324cb test: update tests with new fields 2025-11-22 13:48:57 +01:00
Matthias
60309b9e57 chore: move num_entries/exits to trade model 2025-11-22 13:40:57 +01:00
Matthias
a05d142af6 chore: remove unneeded formatting 2025-11-22 13:38:33 +01:00
Matthias
1feb11bac0 refactor: use fstring for telegram sending 2025-11-22 13:32:38 +01:00
Matthias
93936c9946 refactor: use fstrings for /order telegram message 2025-11-22 13:29:27 +01:00
Matthias
ce78039ea8 refactor: don't do delayed formatting on status message 2025-11-22 13:26:50 +01:00
Matthias
1db871e42d Merge pull request #12536 from stash86/add-liq-price
Add liq price info on telegram message
2025-11-22 13:05:01 +01:00
Matthias
1513ba9af9 chore: Move liquidation up a line 2025-11-22 12:48:51 +01:00
Stefano
22b88249ff Merge branch 'add-liq-price' of https://github.com/stash86/freqtrade into add-liq-price 2025-11-22 16:52:47 +09:00
Stefano
18f73af6e6 use get to return None on trade with no liq price 2025-11-22 16:52:43 +09:00
Stefano
b8c835e24e Merge branch 'freqtrade:develop' into add-liq-price 2025-11-22 16:40:25 +09:00
Stefano
2f392b483c add liq line 2025-11-22 16:39:35 +09:00
Matthias
220480327c test: add explicit test for dry_order_filled 2025-11-21 07:11:05 +01:00
Matthias
2c6ff3f018 docs: update supported exchanges for Delist Filter 2025-11-20 20:30:43 +01:00
Matthias
56a8fb4aae Merge pull request #12532 from stash86/bitget-delist
add delisting check for bitget futures
2025-11-20 19:51:05 +01:00
Matthias
3f782fc482 Merge pull request #12531 from stash86/bybit-delist
add delisting check for bybit futures
2025-11-20 19:48:11 +01:00
Matthias
d02e5f2b90 chore: simplify imports 2025-11-20 19:34:51 +01:00
Matthias
92fd9411e5 chore: simplify import 2025-11-20 19:31:28 +01:00
Stefano
650cdf5eb3 change to exclude optimize mode 2025-11-20 15:16:11 +09:00
Stefano
060a1543e9 change to exclude optimize mode 2025-11-20 15:13:56 +09:00
Matthias
50402c5cdc test: add explicit tests for price_crossed 2025-11-20 06:54:22 +01:00
Matthias
0835414f24 Merge pull request #12533 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2025-11-20 06:30:14 +01:00
Freqtrade Bot
6449074658 chore: update pre-commit hooks 2025-11-20 03:20:59 +00:00
Stefano
b8d558a455 remove unnecessary check because it will be catch anyway 2025-11-20 09:41:57 +09:00
Stefano
4017b010f4 add test 2025-11-20 09:36:17 +09:00
Stefano
7e178cb032 add test 2025-11-20 09:26:16 +09:00
Stefano
e17936c407 use dt_ts 2025-11-19 14:55:31 +09:00
Stefano
f437d4a55b use dt_ts 2025-11-19 14:53:57 +09:00
Stefano
a731b73457 add delisting check for bitget futures 2025-11-19 12:36:34 +09:00
Stefano
b5be462dd1 add delisting check for bybit futures 2025-11-19 12:25:35 +09:00
Matthias
b55e7bcf4e chore: Improve fetch_dry_run_order 2025-11-18 19:45:43 +01:00
Matthias
d1e71544af test: imrpove testcase 2025-11-18 19:45:32 +01:00
Matthias
6e1367fa94 test: enable gate futures test 2025-11-18 19:16:32 +01:00
Matthias
58452ebc7c chore: bump ccxt to 4.5.20
closes #12516
2025-11-18 19:15:50 +01:00
Matthias
7b1dd61ae4 Merge pull request #12530 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2025-11-18 06:28:09 +01:00
Freqtrade Bot
1321991fca chore: update pre-commit hooks 2025-11-18 03:22:24 +00:00
Matthias
8ae8b615b2 Merge pull request #12518 from freqtrade/dependabot/pip/develop/pytest-9513a616b5
chore(deps-dev): bump the pytest group with 2 updates
2025-11-17 19:23:24 +01:00
Matthias
1c96dfd58f chore: add TODO comment for pytest migration 2025-11-17 18:24:10 +01:00
Matthias
e67c2eefff test: live test "get_fee" for futures exchange 2025-11-17 07:20:44 +01:00
Matthias
2ea19f2ab0 Merge pull request #12517 from freqtrade/dependabot/pip/develop/types-ee32193104
chore(deps-dev): bump types-python-dateutil from 2.9.0.20251008 to 2.9.0.20251108 in the types group
2025-11-17 06:57:29 +01:00
Matthias
44a6d2ead7 Merge pull request #12520 from freqtrade/dependabot/pip/develop/fastapi-0.121.1
chore(deps): bump fastapi from 0.121.0 to 0.121.1
2025-11-17 06:57:00 +01:00
Matthias
5fa314e4a8 Merge pull request #12522 from freqtrade/dependabot/pip/develop/certifi-2025.11.12
chore(deps): bump certifi from 2025.10.5 to 2025.11.12
2025-11-17 06:52:58 +01:00
dependabot[bot]
89a8adcbcf chore(deps-dev): bump the pytest group with 2 updates
Bumps the pytest group with 2 updates: [pytest](https://github.com/pytest-dev/pytest) and [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio).


Updates `pytest` from 8.4.2 to 9.0.1
- [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/8.4.2...9.0.1)

Updates `pytest-asyncio` from 1.2.0 to 1.3.0
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v1.2.0...v1.3.0)

---
updated-dependencies:
- dependency-name: pytest
  dependency-version: 9.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: pytest
- dependency-name: pytest-asyncio
  dependency-version: 1.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: pytest
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-17 05:39:17 +00:00
Matthias
57f216e9c7 chore: bump dateutil in pre-commit config 2025-11-17 06:32:18 +01:00
Matthias
927a771f2e Merge pull request #12526 from freqtrade/dependabot/pip/develop/optuna-4.6.0
chore(deps): bump optuna from 4.5.0 to 4.6.0
2025-11-17 06:30:19 +01:00
Matthias
3a1fffeeb7 Merge pull request #12521 from freqtrade/dependabot/pip/develop/torch-2.9.1
chore(deps): bump torch from 2.9.0 to 2.9.1
2025-11-17 06:30:00 +01:00
Matthias
9a5622fe33 Merge pull request #12527 from freqtrade/dependabot/pip/develop/ccxt-4.5.19
chore(deps): bump ccxt from 4.5.17 to 4.5.19
2025-11-17 06:29:09 +01:00
Matthias
ec51820074 Merge pull request #12519 from freqtrade/dependabot/pip/develop/mkdocs-a50e39aa08
chore(deps): bump mkdocs-material from 9.6.23 to 9.7.0 in the mkdocs group
2025-11-17 06:28:14 +01:00
Matthias
4425e0cd40 Merge pull request #12525 from freqtrade/dependabot/pip/develop/pymdown-extensions-10.17.1
chore(deps): bump pymdown-extensions from 10.16.1 to 10.17.1
2025-11-17 06:27:34 +01:00
Matthias
97a830b4f0 Merge pull request #12523 from freqtrade/dependabot/pip/develop/pre-commit-4.4.0
chore(deps-dev): bump pre-commit from 4.3.0 to 4.4.0
2025-11-17 06:27:20 +01:00
Matthias
cb28498890 Merge pull request #12524 from freqtrade/dependabot/pip/develop/ruff-0.14.4
chore(deps-dev): bump ruff from 0.14.3 to 0.14.4
2025-11-17 06:27:09 +01:00
dependabot[bot]
1747114b57 chore(deps): bump ccxt from 4.5.17 to 4.5.19
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.17 to 4.5.19.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.17...v4.5.19)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-17 03:02:58 +00:00
dependabot[bot]
1056b2562e chore(deps): bump optuna from 4.5.0 to 4.6.0
Bumps [optuna](https://github.com/optuna/optuna) from 4.5.0 to 4.6.0.
- [Release notes](https://github.com/optuna/optuna/releases)
- [Commits](https://github.com/optuna/optuna/compare/v4.5.0...v4.6.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-17 03:02:48 +00:00
dependabot[bot]
64f680ed86 chore(deps): bump pymdown-extensions from 10.16.1 to 10.17.1
Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 10.16.1 to 10.17.1.
- [Release notes](https://github.com/facelessuser/pymdown-extensions/releases)
- [Commits](https://github.com/facelessuser/pymdown-extensions/compare/10.16.1...10.17.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-17 03:02:44 +00:00
dependabot[bot]
028c60ce5a chore(deps-dev): bump ruff from 0.14.3 to 0.14.4
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.14.3 to 0.14.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.14.3...0.14.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-17 03:02:36 +00:00
dependabot[bot]
d27ee227cb chore(deps-dev): bump pre-commit from 4.3.0 to 4.4.0
Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 4.3.0 to 4.4.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.3.0...v4.4.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-17 03:02:21 +00:00
dependabot[bot]
81c49136d1 chore(deps): bump certifi from 2025.10.5 to 2025.11.12
Bumps [certifi](https://github.com/certifi/python-certifi) from 2025.10.5 to 2025.11.12.
- [Commits](https://github.com/certifi/python-certifi/compare/2025.10.05...2025.11.12)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-17 03:02:18 +00:00
dependabot[bot]
4297207226 chore(deps): bump torch from 2.9.0 to 2.9.1
Bumps [torch](https://github.com/pytorch/pytorch) from 2.9.0 to 2.9.1.
- [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.0...v2.9.1)

---
updated-dependencies:
- dependency-name: torch
  dependency-version: 2.9.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-17 03:02:14 +00:00
dependabot[bot]
3877fb46de chore(deps): bump fastapi from 0.121.0 to 0.121.1
Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.121.0 to 0.121.1.
- [Release notes](https://github.com/fastapi/fastapi/releases)
- [Commits](https://github.com/fastapi/fastapi/compare/0.121.0...0.121.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-17 03:01:56 +00:00
dependabot[bot]
22707b8664 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.6.23 to 9.7.0
- [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.6.23...9.7.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-17 03:01:46 +00:00
dependabot[bot]
d2c380c83b 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.20251008 to 2.9.0.20251108
- [Commits](https://github.com/typeshed-internal/stub_uploader/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-17 03:01:12 +00:00
Matthias
bc516db3f8 refactor: add generic "migrate" method 2025-11-16 09:11:02 +01:00
Matthias
5c0cf8f228 chore: prevent execution of command partials on python <3.13 2025-11-16 08:41:14 +01:00
Matthias
b753231d3c Merge pull request #12512 from mrpabloyeah/fix-high_value-calculation-in-calculate_max_drawdown
Fix high_value calculation in calculate_max_drawdown()
2025-11-15 16:03:35 +01:00
Matthias
af728f8224 chore: update command partial 2025-11-15 15:50:58 +01:00
Matthias
5000927939 test: add tests for new list-timeframes behavior 2025-11-15 15:49:45 +01:00
Matthias
89274bfcdb test: update tests for new timeframe approach 2025-11-15 15:46:09 +01:00
Matthias
ef86b4113d feat: add trading-mode to list-timeframes
some exchanges provide different timeframe configurations depending on the market type
2025-11-15 13:11:10 +01:00
Matthias
38ff755533 fix: start drawdown series with a 0 row
This will account for edge-cases with no winning / losing trades
2025-11-15 09:52:24 +01:00
Matthias
70ec376657 test: further expand drawdown test 2025-11-15 09:51:27 +01:00
Matthias
1a506dc4b4 test: add tests for high/low logic 2025-11-14 19:41:52 +01:00
mrpabloyeah
47451dd989 Fix high_value calculation in calculate_max_drawdown() 2025-11-13 20:14:39 +01:00
Matthias
705849db3d Merge pull request #12511 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2025-11-13 06:55:06 +01:00
Freqtrade Bot
14d3096a22 chore: update pre-commit hooks 2025-11-13 03:22:53 +00:00
Matthias
72889e2edb Merge pull request #12504 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2025-11-11 06:32:49 +01:00
Freqtrade Bot
0f17b04b2f chore: update pre-commit hooks 2025-11-11 03:23:01 +00:00
Matthias
179a5ba6ed Merge pull request #12498 from freqtrade/dependabot/pip/develop/fastapi-0.121.0
chore(deps): bump fastapi from 0.120.2 to 0.121.0
2025-11-10 07:04:54 +01:00
Matthias
ed65b012b8 Merge pull request #12501 from freqtrade/dependabot/pip/develop/ccxt-4.5.17
chore(deps): bump ccxt from 4.5.16 to 4.5.17
2025-11-10 06:59:48 +01:00
dependabot[bot]
625629b9db chore(deps): bump fastapi from 0.120.2 to 0.121.0
Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.120.2 to 0.121.0.
- [Release notes](https://github.com/fastapi/fastapi/releases)
- [Commits](https://github.com/fastapi/fastapi/compare/0.120.2...0.121.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 05:48:14 +00:00
Matthias
9fa9f0860c chore: remove coincurve - ccxt depends directly on it 2025-11-10 06:43:05 +01:00
Matthias
5970881bb8 Merge pull request #12500 from freqtrade/dependabot/pip/develop/markdown-3.10
chore(deps): bump markdown from 3.9 to 3.10
2025-11-10 06:38:31 +01:00
Matthias
bed93429cd Merge pull request #12493 from freqtrade/dependabot/pip/develop/plotly-6.4.0
chore(deps): bump plotly from 6.3.1 to 6.4.0
2025-11-10 06:38:11 +01:00
Matthias
3af9089d51 Merge pull request #12499 from freqtrade/dependabot/pip/develop/gymnasium-1.2.2
chore(deps): bump gymnasium from 1.2.1 to 1.2.2
2025-11-10 06:37:56 +01:00
Matthias
3aed562806 Merge pull request #12497 from freqtrade/dependabot/pip/develop/pydantic-2.12.4
chore(deps): bump pydantic from 2.12.3 to 2.12.4
2025-11-10 06:36:58 +01:00
Matthias
7f32ce498b Merge pull request #12496 from freqtrade/dependabot/pip/develop/ruff-0.14.3
chore(deps-dev): bump ruff from 0.14.2 to 0.14.3
2025-11-10 06:36:30 +01:00
Matthias
9e89ba6eed Merge pull request #12495 from freqtrade/dependabot/pip/develop/psutil-7.1.3
chore(deps): bump psutil from 7.1.2 to 7.1.3
2025-11-10 06:36:12 +01:00
Matthias
82309c3f47 Merge pull request #12494 from freqtrade/dependabot/github_actions/develop/docker/setup-qemu-action-3.7.0
chore(deps): bump docker/setup-qemu-action from 3.6.0 to 3.7.0
2025-11-10 06:35:59 +01:00
Matthias
d5613cf471 Merge pull request #12492 from freqtrade/dependabot/pip/develop/mkdocs-30218cca00
chore(deps): bump mkdocs-material from 9.6.22 to 9.6.23 in the mkdocs group
2025-11-10 06:35:34 +01:00
dependabot[bot]
73f91eab15 chore(deps): bump ccxt from 4.5.16 to 4.5.17
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.16 to 4.5.17.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.16...v4.5.17)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 03:03:06 +00:00
dependabot[bot]
35fb598017 chore(deps): bump markdown from 3.9 to 3.10
Bumps [markdown](https://github.com/Python-Markdown/markdown) from 3.9 to 3.10.
- [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.9.0...3.10.0)

---
updated-dependencies:
- dependency-name: markdown
  dependency-version: '3.10'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 03:02:56 +00:00
dependabot[bot]
40b9a836eb chore(deps): bump gymnasium from 1.2.1 to 1.2.2
Bumps [gymnasium](https://github.com/Farama-Foundation/Gymnasium) from 1.2.1 to 1.2.2.
- [Release notes](https://github.com/Farama-Foundation/Gymnasium/releases)
- [Commits](https://github.com/Farama-Foundation/Gymnasium/compare/v1.2.1...v1.2.2)

---
updated-dependencies:
- dependency-name: gymnasium
  dependency-version: 1.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 03:02:44 +00:00
dependabot[bot]
7189c0ff35 chore(deps): bump pydantic from 2.12.3 to 2.12.4
Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.12.3 to 2.12.4.
- [Release notes](https://github.com/pydantic/pydantic/releases)
- [Changelog](https://github.com/pydantic/pydantic/blob/v2.12.4/HISTORY.md)
- [Commits](https://github.com/pydantic/pydantic/compare/v2.12.3...v2.12.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 03:02:34 +00:00
dependabot[bot]
0eb206c7b3 chore(deps-dev): bump ruff from 0.14.2 to 0.14.3
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.14.2 to 0.14.3.
- [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.2...0.14.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 03:02:27 +00:00
dependabot[bot]
728d2c9bcb chore(deps): bump psutil from 7.1.2 to 7.1.3
Bumps [psutil](https://github.com/giampaolo/psutil) from 7.1.2 to 7.1.3.
- [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst)
- [Commits](https://github.com/giampaolo/psutil/compare/release-7.1.2...release-7.1.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 03:02:16 +00:00
dependabot[bot]
f22feb7dee chore(deps): bump docker/setup-qemu-action from 3.6.0 to 3.7.0
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3.6.0 to 3.7.0.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](29109295f8...c7c5346462)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 03:02:07 +00:00
dependabot[bot]
c6bf0e1843 chore(deps): bump plotly from 6.3.1 to 6.4.0
Bumps [plotly](https://github.com/plotly/plotly.py) from 6.3.1 to 6.4.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.3.1...v6.4.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 03:02:04 +00:00
dependabot[bot]
68836cb7be 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.6.22 to 9.6.23
- [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.6.22...9.6.23)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 03:01:51 +00:00
Matthias
706955e5fc Merge pull request #12489 from freqtrade/partials-3.13
Partials with python 3.13
2025-11-09 09:02:37 +01:00
Matthias
9aec10b0f3 docs: update badge link to point to CI workflow directly 2025-11-09 08:43:16 +01:00
Matthias
b6b817e051 chore: re-export all command partials 2025-11-09 08:41:02 +01:00
Matthias
40107b9380 feat: format partials codeblock as outputs 2025-11-09 08:40:35 +01:00
Matthias
8804850170 refactor: extract partial-file writing 2025-11-09 08:38:32 +01:00
Matthias
d246933c28 refactor: improve partials script 2025-11-09 08:37:39 +01:00
Matthias
777ff1938e feat: extract freqtrade-client to auto-use help 2025-11-09 08:36:42 +01:00
Matthias
2846d9478e chore: fix ci condition 2025-11-09 08:30:38 +01:00
Matthias
5d494eac51 docs: update command partials to be created with python 3.13 2025-11-09 08:07:37 +01:00
Matthias
e26c3cbe5a chore: update CI to create partials on 3.13 2025-11-09 08:07:16 +01:00
Matthias
81a5056e1b fix: support ft-client help and ft-client show commands 2025-11-09 08:03:07 +01:00
Matthias
1876656afc Merge pull request #12488 from stash86/main-stash
update docs regarding forceenter endpoint
2025-11-09 07:59:37 +01:00
Stefano
889ab7ea00 update docs regarding forceenter endpoint 2025-11-09 13:33:07 +09:00
Matthias
2d4b02f7e5 refactor: align wording from category to space 2025-11-08 19:24:11 +01:00
Matthias
c5a339eaf3 refactor: improve wording from category to space 2025-11-08 16:34:12 +01:00
Matthias
1e50a2da53 refactor: simplify hyperopt-auto 2025-11-08 16:26:05 +01:00
Matthias
7d1c2d3a1b test: Update test mock approach for hyperopt 2025-11-08 16:25:07 +01:00
Matthias
a9f9b73a3a Merge pull request #12479 from freqtrade/feat/hyperopt_custom_spaces
Add support for custom hyperopt spaces
2025-11-08 16:01:42 +01:00
Matthias
236df5be6f chore: remove unnecessary pip flag
closes #12487
2025-11-07 19:45:05 +01:00
Matthias
6ea83ba0e7 docs: clarify space naming prevalence 2025-11-06 20:58:12 +01:00
Matthias
992c2f9e3e feat: improve code for list-strategies 2025-11-06 20:51:30 +01:00
Matthias
5e74700e31 chore: don't use conflicting spaces in sample strategy 2025-11-06 20:45:33 +01:00
Matthias
4a225cab23 test: update test for new "conflicting" behavior 2025-11-06 20:43:57 +01:00
Matthias
524ceebcbb fix: don't restrict spaces - explicitly defined space should win 2025-11-06 20:43:46 +01:00
Matthias
f93c906614 test: improve tests for new builtin spaces 2025-11-06 20:36:40 +01:00
Matthias
b32ba68a6e docs: at enter/exit spaces as builtin spaces 2025-11-06 20:33:09 +01:00
Matthias
649aff8076 feat: add builtin spaces enter and exit 2025-11-06 20:30:38 +01:00
Matthias
a3efba019f docs: update documentation for new hyperopt spaces 2025-11-06 20:06:52 +01:00
Matthias
ff4230af8a chore: update space parameter docstring 2025-11-06 19:43:35 +01:00
Matthias
d1014ce3ce Merge pull request #12448 from stash86/main-stash
Add blacklist mode to MarketcapPairlist
2025-11-06 07:30:37 +01:00
Matthias
3bad6d3341 chore: switch white/blacklist to option 2025-11-06 07:10:05 +01:00
Matthias
7526fd0e0d test: Add additional test
shows the difference between max_rank 2 and max_rank6 in blacklist mode.
2025-11-06 07:05:36 +01:00
Matthias
a2ec085dab Merge pull request #12484 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2025-11-06 06:28:25 +01:00
Freqtrade Bot
cce7702e9c chore: update pre-commit hooks 2025-11-06 03:23:16 +00:00
Matthias
1cf7f4f9d8 Merge pull request #12480 from freqtrade/feat/add_coincurve
Add coincurve for faster ECDSA signing
2025-11-05 21:05:45 +01:00
Matthias
1328df772b feat: ensure spaces are valid identifiers 2025-11-05 21:05:15 +01:00
Matthias
68dea691c2 chore: improve help wording 2025-11-05 20:59:39 +01:00
Matthias
f214942ff1 fix: improve error message for missing hyperopt parameters 2025-11-05 20:49:32 +01:00
Matthias
91866c1165 refactor: move lookup dictionary outside of loop 2025-11-05 20:46:53 +01:00
Matthias
f73cbed843 chore: update ccxt version to 4.5.16 2025-11-05 20:43:36 +01:00
Matthias
5ad817f59e chore: add coincurve to support faster ECDSA signing 2025-11-05 20:41:19 +01:00
Matthias
4a8f487b68 chore: update json schema 2025-11-05 20:38:55 +01:00
Matthias
d1b553cecc test: add custom parameter to test strategy 2025-11-05 20:14:28 +01:00
Matthias
1a2f261ee2 feat: support "--spaces all" with custom spaces 2025-11-05 20:12:56 +01:00
Matthias
cfd4926f47 chore: fix odd indentation error 2025-11-05 20:03:03 +01:00
Matthias
36593ec593 Merge pull request #12477 from fengyuchuanshen/develop
chore: minor improvement for docs
2025-11-05 19:42:11 +01:00
fengyuchuanshen
dc5f646f24 chore: minor improvement for docs
Signed-off-by: fengyuchuanshen <fengyuchuanshen@outlook.com>
2025-11-05 22:32:32 +08:00
Matthias
d7e4965cde feat: improve list-strategies command output 2025-11-04 07:21:43 +01:00
Matthias
e22bf5c681 chore: non-loaded strategies shouldn't show as hyperoptable 2025-11-04 07:16:57 +01:00
Matthias
007ab1b796 test: some cleanup 2025-11-04 07:14:01 +01:00
Matthias
c748ac2aa2 chore: be more precise in type 2025-11-04 07:13:07 +01:00
Matthias
c091426c44 feat: improve Auto-space detection logic 2025-11-04 07:07:55 +01:00
Matthias
ab28e43050 test: update tests to new behavior 2025-11-04 07:07:55 +01:00
Matthias
74a18bdb11 chore: improve output wording/formatting 2025-11-04 07:07:55 +01:00
Matthias
367b9fa7f6 test: fix failing test 2025-11-04 07:07:55 +01:00
Matthias
8269333d9c feat: improve output wording 2025-11-04 07:07:55 +01:00
Matthias
d83f222a13 chore: remove unused imports 2025-11-04 07:07:55 +01:00
Matthias
2ba9172526 feat: Assign all matching parameters 2025-11-04 07:07:55 +01:00
Matthias
465af62c16 feat: further updates 2025-11-04 07:07:55 +01:00
Matthias
231a145716 refactor: improve parameter storage 2025-11-04 07:07:55 +01:00
Matthias
4cabbe4d52 test: remove detect_parameters from tests 2025-11-04 07:07:55 +01:00
Matthias
72c87b7cbd chore: remove no longer used function 2025-11-04 07:07:55 +01:00
Matthias
3da6006a44 feat: improve hyperopt detection logic 2025-11-04 07:07:55 +01:00
Matthias
6f48b82297 test: slight update to test ... 2025-11-04 07:07:55 +01:00
Matthias
ac51b41fdf refactor: remove pointless wrapper 2025-11-04 07:07:55 +01:00
Matthias
4b0b306c44 fix: hyperoptable should work whenever there's any space detected. 2025-11-04 07:07:55 +01:00
Matthias
fd0acc074c feat: improve parameter detection to detect random named spaces 2025-11-04 07:07:55 +01:00
Matthias
39c37980d5 fix: improve resiliance 2025-11-04 07:07:55 +01:00
Matthias
6dc2547177 feat: Update output for random space names 2025-11-04 07:07:55 +01:00
Matthias
d1224367e5 feat: further enable dynamic hyperopt parameters 2025-11-04 07:07:55 +01:00
Matthias
c88a92b4f9 feat: allow init of random spaces 2025-11-04 07:07:55 +01:00
Matthias
ffab6c3c50 test: Add test for "no hyperopt parameters found" error 2025-11-04 07:07:55 +01:00
Matthias
cb7e04bfb0 feat: add explicit scenario testing if any parameter is selected 2025-11-04 07:07:55 +01:00
Matthias
c6a7b84684 test: update test for new init sequence 2025-11-04 07:07:55 +01:00
Matthias
97afb4a56a chore: remove no longer used helper methods 2025-11-04 07:07:55 +01:00
Matthias
886c15a7fb test: update test asserting no longer existing metric 2025-11-04 07:07:55 +01:00
Matthias
e34e84c5c6 refactor: further refactor of hyperopt spaces 2025-11-04 07:07:55 +01:00
Matthias
4cac68d774 chore: refactor buy/sell spaces slightly 2025-11-04 07:07:55 +01:00
Matthias
a792744c0d refactor: improve get_indicator space naming 2025-11-04 07:07:55 +01:00
Matthias
384ed3fafb feat: don't limit spaces to builtin spaces 2025-11-04 07:07:54 +01:00
Matthias
80ea476497 Merge pull request #12461 from freqtrade/feat/stringread_strategyload
improve strategy loading with huge strategy libraries
2025-11-04 06:37:28 +01:00
Matthias
8ddbf4ba08 Merge pull request #12476 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2025-11-04 06:29:07 +01:00
Freqtrade Bot
041d93a254 chore: update pre-commit hooks 2025-11-04 03:20:44 +00:00
Matthias
167f264bc4 Merge pull request #12470 from freqtrade/dependabot/pip/develop/ccxt-4.5.14
chore(deps): bump ccxt from 4.5.12 to 4.5.14
2025-11-03 17:12:19 +01:00
Matthias
5c036f5fcc Merge pull request #12474 from freqtrade/dependabot/pip/develop/pyarrow-22.0.0
chore(deps): bump pyarrow from 20.0.0 to 22.0.0
2025-11-03 16:54:29 +01:00
Matthias
964ed8099c chore: remove workaround dependency pin for aarch64 2025-11-03 11:59:18 +01:00
Matthias
71b169616f chore: update pyarrow armhf wheel 2025-11-03 11:58:59 +01:00
Matthias
d824755597 Merge pull request #12468 from freqtrade/dependabot/github_actions/develop/actions/upload-artifact-5
chore(deps): bump actions/upload-artifact from 4 to 5
2025-11-03 07:15:06 +01:00
Matthias
8e41699348 Merge pull request #12466 from freqtrade/dependabot/pip/develop/scipy-16e6c1b478
chore(deps): bump the scipy group with 2 updates
2025-11-03 07:13:59 +01:00
dependabot[bot]
a580ba1903 chore(deps): bump pyarrow from 20.0.0 to 22.0.0
Bumps [pyarrow](https://github.com/apache/arrow) from 20.0.0 to 22.0.0.
- [Release notes](https://github.com/apache/arrow/releases)
- [Commits](https://github.com/apache/arrow/compare/apache-arrow-20.0.0...apache-arrow-22.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 06:04:07 +00:00
Matthias
edcb3696f1 Merge pull request #12472 from freqtrade/dependabot/pip/develop/orjson-3.11.4
chore(deps): bump orjson from 3.11.3 to 3.11.4
2025-11-03 07:00:57 +01:00
dependabot[bot]
f1f07a1764 chore(deps): bump ccxt from 4.5.12 to 4.5.14
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.12 to 4.5.14.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.12...v4.5.14)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 05:38:09 +00:00
Matthias
5139ea4e1c chore: bump scipy-stubs in pre-commit config 2025-11-03 06:35:10 +01:00
dependabot[bot]
fdf9d4da81 chore(deps): bump orjson from 3.11.3 to 3.11.4
Bumps [orjson](https://github.com/ijl/orjson) from 3.11.3 to 3.11.4.
- [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.3...3.11.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 05:34:32 +00:00
Matthias
65267b2bb7 Merge pull request #12471 from freqtrade/dependabot/pip/develop/psutil-7.1.2
chore(deps): bump psutil from 7.1.1 to 7.1.2
2025-11-03 06:32:12 +01:00
Matthias
420bb720c1 Merge pull request #12473 from freqtrade/dependabot/pip/develop/aiohttp-3.13.2
chore(deps): bump aiohttp from 3.13.1 to 3.13.2
2025-11-03 06:31:54 +01:00
Matthias
bfbb6404e6 Merge pull request #12469 from freqtrade/dependabot/pip/develop/ruff-0.14.2
chore(deps-dev): bump ruff from 0.14.1 to 0.14.2
2025-11-03 06:31:39 +01:00
Matthias
6ffc88b3b3 Merge pull request #12464 from freqtrade/dependabot/github_actions/develop/actions/download-artifact-6
chore(deps): bump actions/download-artifact from 5 to 6
2025-11-03 06:31:30 +01:00
Matthias
54501b5c16 Merge pull request #12465 from freqtrade/dependabot/github_actions/develop/astral-sh/setup-uv-7.1.2
chore(deps): bump astral-sh/setup-uv from 7.1.0 to 7.1.2
2025-11-03 06:31:11 +01:00
Matthias
d7ef5e8bd2 Merge pull request #12467 from freqtrade/dependabot/pip/develop/fastapi-0.120.2
chore(deps): bump fastapi from 0.119.1 to 0.120.2
2025-11-03 06:30:28 +01:00
dependabot[bot]
c7e64360cd chore(deps): bump aiohttp from 3.13.1 to 3.13.2
---
updated-dependencies:
- dependency-name: aiohttp
  dependency-version: 3.13.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 03:03:15 +00:00
dependabot[bot]
55b66ca5e6 chore(deps): bump psutil from 7.1.1 to 7.1.2
Bumps [psutil](https://github.com/giampaolo/psutil) from 7.1.1 to 7.1.2.
- [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst)
- [Commits](https://github.com/giampaolo/psutil/compare/release-7.1.1...release-7.1.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 03:02:52 +00:00
dependabot[bot]
1fc6cf4c89 chore(deps-dev): bump ruff from 0.14.1 to 0.14.2
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.14.1 to 0.14.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.14.1...0.14.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 03:02:33 +00:00
dependabot[bot]
918e7c4bf8 chore(deps): bump actions/upload-artifact from 4 to 5
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 03:02:20 +00:00
dependabot[bot]
cfc406709c chore(deps): bump fastapi from 0.119.1 to 0.120.2
Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.119.1 to 0.120.2.
- [Release notes](https://github.com/fastapi/fastapi/releases)
- [Commits](https://github.com/fastapi/fastapi/compare/0.119.1...0.120.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 03:02:20 +00:00
dependabot[bot]
9f55dac605 chore(deps): bump the scipy group with 2 updates
Bumps the scipy group with 2 updates: [scipy](https://github.com/scipy/scipy) and [scipy-stubs](https://github.com/scipy/scipy-stubs).


Updates `scipy` from 1.16.2 to 1.16.3
- [Release notes](https://github.com/scipy/scipy/releases)
- [Commits](https://github.com/scipy/scipy/compare/v1.16.2...v1.16.3)

Updates `scipy-stubs` from 1.16.2.4 to 1.16.3.0
- [Release notes](https://github.com/scipy/scipy-stubs/releases)
- [Commits](https://github.com/scipy/scipy-stubs/compare/v1.16.2.4...v1.16.3.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 03:02:11 +00:00
dependabot[bot]
00a6575fb4 chore(deps): bump astral-sh/setup-uv from 7.1.0 to 7.1.2
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.1.0 to 7.1.2.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](3259c6206f...85856786d1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 03:02:01 +00:00
dependabot[bot]
c6eb63ab77 chore(deps): bump actions/download-artifact from 5 to 6
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 03:01:53 +00:00
Matthias
db63d433f7 chore: improve log message 2025-11-02 16:49:07 +01:00
Matthias
635af046bf test: add test for string loading skipping 2025-11-02 16:48:53 +01:00
Matthias
86381955a3 feat: use text-analysis to short-circuit strategy loading 2025-11-02 16:30:38 +01:00
Matthias
3cfa366ec9 fix: validate trading-mode support when downloading data
closes #12458
2025-11-02 09:40:15 +01:00
Matthias
baa5b1a58e feat: support validating trading mode only 2025-11-02 09:38:27 +01:00
Matthias
5be0a9c069 test: update test trading-mode validation test 2025-11-02 09:38:10 +01:00
Matthias
8978da7c20 Merge pull request #12457 from luckynick/patch-2
Update exchanges.md - clarify Hyperliquid docs on subaccounts usage
2025-11-02 09:23:05 +01:00
Matthias
b3bbb92358 docs: slight rewording of hyperliquid subaccount docs 2025-11-02 09:08:43 +01:00
luckynick
06ac40fdbb Update exchanges.md 2025-11-01 14:05:20 +01:00
Matthias
d38d8167d8 chore: update command-partials 2025-11-01 11:49:16 +01:00
Matthias
5684d0de0b chore: improve description formatting 2025-11-01 11:05:08 +01:00
Matthias
a2f887aabb chore: update config schema 2025-11-01 09:47:23 +01:00
Matthias
f72e708627 chore: move some setting-validations to config-schema 2025-11-01 09:47:23 +01:00
Stefano
781d8501cb update docs 2025-11-01 08:41:47 +09:00
Stefano
015f1055a7 add tests 2025-10-31 17:22:46 +09:00
Matthias
2466cf85a1 Merge branch 'new_release' into develop 2025-10-31 07:16:45 +01:00
Matthias
e6ddeef07f chore: update version to 2025.11-dev 2025-10-31 07:16:33 +01:00
Matthias
e23a211503 chore: bump version to 2025.10 2025-10-31 07:05:04 +01:00
Matthias
2e78440ef1 Merge branch 'stable' into new_release 2025-10-31 07:04:49 +01:00
Matthias
cbaba293b5 fix: more complete fix for #12451 2025-10-31 07:02:53 +01:00
Matthias
cdd9968831 test: use realistic arguments for tests 2025-10-31 07:02:53 +01:00
Matthias
6b4318a801 fix: trade.id must be checked as int
fixes problem with psycopg3

closes #12451
2025-10-31 07:02:53 +01:00
Matthias
95f2cc0f88 Merge pull request #12449 from stash86/develop-copy
throw error on recursive analysis on 0 startup candle
2025-10-31 06:28:56 +01:00
Stefano
1d652d1284 throw error on recursive analysis on 0 startup candle 2025-10-31 08:51:56 +09:00
Stefano
614b85e833 add blacklist mode 2025-10-30 15:49:48 +09:00
Matthias
758f1eea93 test: consistent use of "spaces" in tests 2025-10-30 06:38:43 +01:00
Matthias
f952502af5 Merge pull request #12447 from freqtrade/update/binance-leverage-tiers
Update Binance Leverage Tiers
2025-10-30 06:37:31 +01:00
Freqtrade Bot
b17a274ee8 chore: update pre-commit hooks 2025-10-30 03:21:28 +00:00
Matthias
4adab37b2a test: update test for removal of --hyperopt argument 2025-10-29 17:58:00 +01:00
Matthias
ff7b1e0edc chore: remove long-deprecated "--hyperopt" argument 2025-10-29 17:57:51 +01:00
Matthias
b2aa392a98 fix: log level setup 2025-10-28 20:00:39 +01:00
Matthias
0c1b892713 chore: add parameter descriptions to load_object 2025-10-28 19:41:35 +01:00
Matthias
ee0952a848 chore: simplify iResolver 2025-10-28 19:35:18 +01:00
Matthias
a166f452cb chore: move comment to right place 2025-10-28 19:32:57 +01:00
Matthias
a458264bc5 fix: improve resilience in strategy wrapper 2025-10-28 19:09:09 +01:00
Matthias
13919054ac Merge pull request #12439 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2025-10-28 06:20:17 +01:00
Freqtrade Bot
8e4aeb62d3 chore: update pre-commit hooks 2025-10-28 03:19:47 +00:00
Matthias
609ac560fb Merge pull request #12434 from freqtrade/dependabot/pip/develop/ccxt-4.5.12
chore(deps): bump ccxt from 4.5.11 to 4.5.12
2025-10-27 20:06:12 +01:00
Matthias
5ae0328722 chore: fix redundant import 2025-10-27 19:49:49 +01:00
Matthias
89802da1c7 test: update tests for new okx limits 2025-10-27 19:45:21 +01:00
Matthias
43be6eef67 chore: re-align okx limits with ccxt 2025-10-27 19:45:15 +01:00
Matthias
dc736da971 Merge pull request #12423 from freqtrade/dependabot/pip/develop/scipy-8c88e3b5d9
chore(deps-dev): bump scipy-stubs from 1.16.2.3 to 1.16.2.4 in the scipy group
2025-10-27 13:35:54 +01:00
Matthias
aae1731e3b chore: bump scipy-stubs in pre-commit config 2025-10-27 13:20:37 +01:00
dependabot[bot]
f39acd5585 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.16.2.3 to 1.16.2.4
- [Release notes](https://github.com/scipy/scipy-stubs/releases)
- [Commits](https://github.com/scipy/scipy-stubs/compare/v1.16.2.3...v1.16.2.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 08:05:24 +00:00
Matthias
50f32ee56a Merge pull request #12435 from samgermain/cross-docs
cross leverage docs fix
2025-10-27 09:04:07 +01:00
Matthias
7d62e97024 Merge pull request #12425 from freqtrade/dependabot/pip/develop/types-c656cdcffe
chore(deps-dev): bump types-cachetools from 6.2.0.20250827 to 6.2.0.20251022 in the types group
2025-10-27 09:02:44 +01:00
Matthias
15eb454103 Merge pull request #12433 from freqtrade/dependabot/pip/develop/pydantic-2.12.3
chore(deps): bump pydantic from 2.12.2 to 2.12.3
2025-10-27 08:37:21 +01:00
Sam
179cefa89f cross leverage docs fix 2025-10-27 00:33:33 -06:00
dependabot[bot]
c251877aba chore(deps): bump ccxt from 4.5.11 to 4.5.12
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.11 to 4.5.12.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/v4.5.11...v4.5.12)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 06:25:41 +00:00
Matthias
8352b0fe07 Merge pull request #12426 from freqtrade/dependabot/pip/develop/aiohttp-3.13.1
chore(deps): bump aiohttp from 3.13.0 to 3.13.1
2025-10-27 07:23:46 +01:00
Matthias
2a7859b3df Merge pull request #12431 from freqtrade/dependabot/pip/develop/ta-lib-0.6.8
chore(deps): bump ta-lib from 0.6.7 to 0.6.8
2025-10-27 07:18:43 +01:00
dependabot[bot]
4064586d18 chore(deps): bump pydantic from 2.12.2 to 2.12.3
Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.12.2 to 2.12.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.12.2...v2.12.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 05:46:12 +00:00
Matthias
7ddb6d3554 Merge pull request #12429 from freqtrade/dependabot/pip/develop/xgboost-3.1.1
chore(deps): bump xgboost from 3.0.5 to 3.1.1
2025-10-27 06:45:15 +01:00
Matthias
9206c0086f chore: add ta-lib armhf wheels 2025-10-27 06:43:22 +01:00
Matthias
0c6e5ace59 chore: bump types-cachetools in pre-commit config 2025-10-27 06:42:10 +01:00
Matthias
47f5b25265 Merge pull request #12430 from freqtrade/dependabot/pip/develop/uvicorn-0.38.0
chore(deps): bump uvicorn from 0.37.0 to 0.38.0
2025-10-27 06:41:13 +01:00
Matthias
e3c8ef19c3 Merge pull request #12424 from freqtrade/dependabot/pip/develop/ruff-0.14.1
chore(deps-dev): bump ruff from 0.14.0 to 0.14.1
2025-10-27 06:40:42 +01:00
Matthias
803ef41a75 Merge pull request #12427 from freqtrade/dependabot/pip/develop/psutil-7.1.1
chore(deps): bump psutil from 7.1.0 to 7.1.1
2025-10-27 06:40:30 +01:00
Matthias
984f505fa6 Merge pull request #12428 from freqtrade/dependabot/pip/develop/fastapi-0.119.1
chore(deps): bump fastapi from 0.119.0 to 0.119.1
2025-10-27 06:40:15 +01:00
Matthias
b89266225d Merge pull request #12432 from freqtrade/dependabot/pip/develop/python-rapidjson-1.22
chore(deps): bump python-rapidjson from 1.21 to 1.22
2025-10-27 06:39:58 +01:00
dependabot[bot]
a45930a5cf chore(deps): bump python-rapidjson from 1.21 to 1.22
Bumps [python-rapidjson](https://github.com/python-rapidjson/python-rapidjson) from 1.21 to 1.22.
- [Changelog](https://github.com/python-rapidjson/python-rapidjson/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-rapidjson/python-rapidjson/compare/v1.21...v1.22)

---
updated-dependencies:
- dependency-name: python-rapidjson
  dependency-version: '1.22'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 03:04:33 +00:00
dependabot[bot]
fe06a87aa2 chore(deps): bump ta-lib from 0.6.7 to 0.6.8
Bumps [ta-lib](https://github.com/ta-lib/ta-lib-python) from 0.6.7 to 0.6.8.
- [Release notes](https://github.com/ta-lib/ta-lib-python/releases)
- [Changelog](https://github.com/TA-Lib/ta-lib-python/blob/master/CHANGELOG)
- [Commits](https://github.com/ta-lib/ta-lib-python/compare/v0.6.7...v0.6.8)

---
updated-dependencies:
- dependency-name: ta-lib
  dependency-version: 0.6.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 03:04:32 +00:00
dependabot[bot]
f9940c4f1f chore(deps): bump uvicorn from 0.37.0 to 0.38.0
Bumps [uvicorn](https://github.com/Kludex/uvicorn) from 0.37.0 to 0.38.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.37.0...0.38.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 03:04:11 +00:00
dependabot[bot]
5c3ebd3761 chore(deps): bump xgboost from 3.0.5 to 3.1.1
Bumps [xgboost](https://github.com/dmlc/xgboost) from 3.0.5 to 3.1.1.
- [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.0.5...v3.1.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 03:03:53 +00:00
dependabot[bot]
9050325fda chore(deps): bump fastapi from 0.119.0 to 0.119.1
Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.119.0 to 0.119.1.
- [Release notes](https://github.com/fastapi/fastapi/releases)
- [Commits](https://github.com/fastapi/fastapi/compare/0.119.0...0.119.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 03:03:03 +00:00
dependabot[bot]
9ca2342a0b chore(deps): bump psutil from 7.1.0 to 7.1.1
Bumps [psutil](https://github.com/giampaolo/psutil) from 7.1.0 to 7.1.1.
- [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst)
- [Commits](https://github.com/giampaolo/psutil/compare/release-7.1.0...release-7.1.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 03:02:56 +00:00
dependabot[bot]
ad9bb75fd5 chore(deps): bump aiohttp from 3.13.0 to 3.13.1
---
updated-dependencies:
- dependency-name: aiohttp
  dependency-version: 3.13.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 03:02:51 +00:00
dependabot[bot]
f96dfd04f7 chore(deps-dev): bump types-cachetools in the types group
Bumps the types group with 1 update: [types-cachetools](https://github.com/typeshed-internal/stub_uploader).


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

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 03:02:40 +00:00
dependabot[bot]
d63982c32c chore(deps-dev): bump ruff from 0.14.0 to 0.14.1
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.14.0 to 0.14.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.14.0...0.14.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 03:02:36 +00:00
Matthias
14b5392d5f Merge pull request #12420 from qinhanlei/uv-pip
Add support for uv in setup.sh
2025-10-26 09:47:48 +01:00
Matthias
16dd4073ff docs: update setup script docs for uv support 2025-10-26 09:32:36 +01:00
Matthias
9595936d73 chore: fix uv only install 2025-10-26 09:04:30 +01:00
Matthias
c18a52fd2d test: update tests for new error formatting 2025-10-25 13:15:41 +02:00
Matthias
75c39d3617 feat: improve strategy error warning
closes #12418
2025-10-25 13:15:24 +02:00
Matthias
911a803a56 fix: improve error-handling for odd configurations 2025-10-25 09:49:55 +02:00
Matthias
f04315fa8f fix: gracefully handle custom stake returning string
closes #12421
2025-10-25 09:42:45 +02:00
Matthias
89e68d7d4d test: add test case for string custom stake amount 2025-10-25 09:42:45 +02:00
Hanlei Qin
4fc5f33fa1 fix an omission 2025-10-25 15:16:20 +08:00
Matthias
c2056085c9 Merge pull request #12419 from stash86/main-stash
Fix typo
2025-10-25 08:49:17 +02:00
Hanlei Qin
9f7b7ef889 Use uv instead of pip if available 2025-10-25 12:33:14 +08:00
Stefano
cdb194a363 fix typo 2025-10-25 13:13:40 +09:00
Stefano
0986350f05 fix typo 2025-10-25 13:11:11 +09:00
Hanlei Qin
119cadcb2b Replace pip with uv for package installations in setup.sh 2025-10-24 19:55:57 +08:00
Matthias
803db3b55b Merge pull request #12413 from hippocritical/develop
add np.NAN to strategy updater conversion (which worked in 1.x but not in 2.x anymore)
2025-10-24 08:41:51 +02:00
hippocritical
c2fd6e3237 NAN is sometimes used by some programmers when numpy was 1.x but now on 2.x the caps version is disallowed.
Added the caps conversion to lower case nan to fix that automatically.

Source:
https://numpy.org/doc/2.0/reference/constants.html?utm_source=chatgpt.com
NaN and NAN are aliases of nan.
2025-10-24 08:11:44 +02:00
Matthias
4c9e608a1a chore: bump version to 2025.9.1 2025-10-07 06:33:59 +02:00
Matthias
90665731c1 fix: bitvavo is now using tick-size for pricing and amount rounding 2025-10-07 06:33:35 +02:00
Matthias
7a9ea40d72 chore: bump ccxt to 4.5.7 2025-10-07 06:33:27 +02:00
Matthias
c66e221012 Merge pull request #12304 from freqtrade/new_release
New release 2025.9
2025-09-29 19:33:25 +02:00
Matthias
f38d2466df chore: bump version to 2025.9 2025-09-29 18:18:46 +02:00
Matthias
1cc92c645a Merge branch 'stable' into new_release 2025-09-29 18:18:35 +02:00
Matthias
ab764df411 chore(deps): bump ft-pandas-ta from 0.3.15 to 0.3.16 2025-09-29 18:16:35 +02:00
Matthias
9c079ccdfd Merge pull request #12182 from freqtrade/new_release
New release 2025.8
2025-08-31 08:25:25 +02:00
Matthias
5407c2efec fix: list-data --trades no longer working when used with --pairs filter 2025-08-30 19:58:37 +02:00
Matthias
cee8855dca chore: bump version to 2025.8 2025-08-30 17:45:29 +02:00
Matthias
1196237f82 Merge branch 'stable' into new_release 2025-08-30 17:45:09 +02:00
Matthias
da52ef8729 chore: hot-fix ta-lib install on windows 2025-08-14 10:12:31 +02:00
Matthias
c9dda3480d Merge pull request #12052 from freqtrade/new_release
New release 2025.7
2025-07-31 19:47:30 +02:00
Matthias
45804e1bef chore: bump version to 2025.7 2025-07-31 06:29:50 +02:00
Matthias
6dd5dc5d2c Merge branch 'stable' into new_release 2025-07-31 06:29:29 +02:00
Matthias
cc807d1cf9 Merge pull request #11945 from freqtrade/new_release
New release 2025.6
2025-07-02 21:08:03 +02:00
Matthias
5f907a4b1a chore: bump version to 2025.6 2025-07-02 20:03:29 +02:00
Matthias
a464a2fdbc Merge branch 'stable' into new_release 2025-07-02 20:03:16 +02:00
Matthias
28399aaab2 Merge pull request #11814 from freqtrade/new_release
New release 2025.5
2025-05-31 17:37:56 +02:00
Matthias
560085ab92 chore: bump version to 2025.5 2025-05-31 16:34:27 +02:00
Matthias
17c315bf4a Merge branch 'stable' into new_release 2025-05-31 16:34:04 +02:00
Matthias
b11119dbe5 Merge pull request #11698 from freqtrade/new_release
New release 2025.4
2025-04-30 18:00:04 +02:00
Matthias
cefc833ab1 chore: bump version to 2025.4 2025-04-30 06:59:57 +02:00
Matthias
5c7c3a88fb Merge branch 'stable' into new_release 2025-04-30 06:59:40 +02:00
Matthias
6ee500db4f Merge pull request #11566 from freqtrade/new_release
New release 2025.3
2025-03-27 17:56:46 +01:00
Matthias
b3296a06d9 chore: bump version to 2025.3 2025-03-27 07:04:07 +01:00
Matthias
09051fb641 Merge branch 'stable' into new_release 2025-03-27 07:03:41 +01:00
Matthias
a23409b72f Merge pull request #11436 from freqtrade/new_release
New release 2025.2
2025-02-28 10:33:14 +01:00
Matthias
186bc4d272 chore: bump version to 2025.2 2025-02-28 06:30:43 +01:00
Matthias
06fd176286 Merge branch 'stable' into develop 2025-02-28 06:30:27 +01:00
Matthias
7c8b934c1d Merge pull request #11307 from freqtrade/new_release
New release 2025.1
2025-01-31 06:22:51 +01:00
Matthias
10eef02e58 chore: bump version to 2025.1 2025-01-30 19:41:27 +01:00
Matthias
20380b616a Merge branch 'stable' into new_release 2025-01-30 19:41:09 +01:00
Matthias
13050f0d67 chore: bump version to 2024.12.1 2025-01-18 14:22:50 +01:00
Matthias
61e5b4755c chore: Bump ccxt to 4.4.48
fixes a critical issue with bybit
2025-01-18 14:22:28 +01:00
Matthias
466e834680 Merge pull request #11160 from freqtrade/new_release
New release 2024.12
2024-12-30 06:58:30 +01:00
Matthias
9e0b9962ce chore: bump version to 2024.12 2024-12-29 15:28:46 +01:00
Matthias
4d2863baf5 Merge branch 'stable' into new_release 2024-12-29 15:28:30 +01:00
Matthias
ab42f84daa Merge pull request #11011 from freqtrade/new_release
New release 2024.11
2024-12-01 20:11:57 +01:00
Matthias
f83a57ae5c chore: version bump to 2024.11 2024-12-01 19:35:02 +01:00
Matthias
56d747818d Merge branch 'stable' into new_release 2024-12-01 19:34:50 +01:00
Matthias
87c5668b14 Merge pull request #10863 from freqtrade/new_release
New release 2024.10
2024-10-31 08:04:45 +01:00
Matthias
84da133e95 chore: bump version to 2024.10 2024-10-31 07:14:12 +01:00
Matthias
80e254d46b Merge branch 'stable' into new_release 2024-10-31 07:13:50 +01:00
Matthias
157cb7d982 Merge pull request #10725 from freqtrade/new_release
New release 2024.9
2024-09-30 11:25:43 +02:00
Matthias
27af9455f5 chore: bump version to 2024.9 2024-09-29 19:53:20 +02:00
Matthias
98ff572afe Merge branch 'stable' into new_release 2024-09-29 19:53:03 +02:00
Matthias
01d10aebca Merge pull request #10599 from freqtrade/new_release
New release 2024.8
2024-08-31 16:03:49 +02:00
Matthias
5e9d2323e3 chore: bump version to 2024.8 2024-08-31 08:25:52 +02:00
Matthias
a98b5dd86e Merge branch 'stable' into new_release 2024-08-31 08:25:20 +02:00
Matthias
af462fa086 Bump version to 2024.7.1 2024-08-07 18:22:07 +02:00
Matthias
bc728d3a31 chore: Downgrade cryptography for RPI
https://github.com/piwheels/packages/issues/464
2024-08-07 18:21:43 +02:00
Matthias
8954857481 Merge pull request #10464 from freqtrade/new_release
New release 2024.7
2024-07-29 19:32:28 +02:00
Matthias
b117f085ce chore: Bump version to 2024.7 2024-07-29 06:22:00 +02:00
Matthias
c7dc908aa7 Merge branch 'stable' into new_release 2024-07-29 06:21:32 +02:00
Matthias
a55691ea7f Merge pull request #10383 from freqtrade/new_release
New release 2024.6
2024-07-01 10:45:09 +02:00
Matthias
d9b588fe59 Version bump 2024.6 2024-06-30 09:06:53 +00:00
Matthias
f20fefffa0 Merge branch 'stable' into new_release 2024-06-30 09:03:46 +00:00
Matthias
8d51a801ad Merge pull request #10271 from freqtrade/new_release
New release 2024.5
2024-05-30 18:01:26 +02:00
Matthias
8fc7056086 Bump version to 2024.5 2024-05-30 06:36:29 +02:00
Matthias
a1cfeb9a29 Merge branch 'stable' into new_release 2024-05-30 06:36:07 +02:00
Matthias
0b03e4c46c Move sql cheatsheet to advanced options
it shouldn't be highlighted, as for most operations, there's better alternatives now
2024-05-16 07:11:47 +02:00
Matthias
fe9258a208 Update site-URL mkdocs config in stable
Adds support for proper error pages
2024-05-16 07:07:50 +02:00
Matthias
2152a95451 Merge pull request #10163 from freqtrade/new_release
New release 2024.4
2024-04-30 14:01:30 +02:00
Matthias
39eda1b1dc Bump version to 2024.4 2024-04-30 11:32:00 +02:00
Matthias
ad22716374 Merge branch 'stable' into new_release 2024-04-30 11:31:48 +02:00
Matthias
569a87ca28 Fix site Url string to have a working 404 page 2024-04-03 18:10:49 +02:00
Matthias
73363d925f Update download-artifact to pattern. 2024-03-31 17:37:57 +02:00
Matthias
ad56462fa1 Merge pull request #10025 from freqtrade/new_release
New release
2024-03-31 13:36:51 +02:00
Matthias
a6bfe1a4af Bump version to 2024.3 2024-03-31 09:54:34 +02:00
Matthias
f960e343cc Merge branch 'stable' into new_release 2024-03-31 09:54:05 +02:00
Matthias
1fc69ef114 Merge pull request #9876 from freqtrade/new_release
New release 2024.2
2024-02-29 06:38:44 +01:00
Matthias
0a8719c617 Bump Version to 2024.2 2024-02-27 06:54:21 +01:00
Matthias
e1fdc0c79c Merge branch 'stable' into new_release 2024-02-27 06:54:07 +01:00
Matthias
d3b6256f8a Update extract-branch-name to new syntax using GITHUB_OUTPUT 2024-01-30 21:48:32 +01:00
Matthias
f37c4e5935 Merge pull request #9749 from freqtrade/new_release
New release 2024.1
2024-01-30 18:00:25 +01:00
Matthias
4342aa3bfd Update version number to 2024.1 2024-01-30 06:46:10 +01:00
Matthias
43188ca447 Merge branch 'stable' into new_release 2024-01-30 06:45:56 +01:00
Matthias
5c8c53cff8 Merge pull request #9607 from freqtrade/new_release
New release 2023.12
2023-12-30 08:49:40 +01:00
Matthias
846b7734e1 Bump version to 2023.12 2023-12-29 18:24:18 +01:00
Matthias
c72d18270e Merge branch 'stable' into new_release 2023-12-29 18:24:07 +01:00
Matthias
0654186400 Merge pull request #9486 from freqtrade/new_release
New release 2023.11
2023-11-30 17:25:25 +01:00
Matthias
cb01a46089 Version bump to 2023.11 2023-11-30 07:00:25 +01:00
Matthias
0bcbb28d51 Merge branch 'stable' into new_release 2023-11-30 07:00:11 +01:00
Matthias
f142abfb76 Merge pull request #9348 from freqtrade/new_release
New release 2023.10
2023-10-31 06:42:58 +01:00
Matthias
c98c6c38dc update binance leverage tiers 2023-10-30 20:10:07 +01:00
Matthias
9a73f7a7b8 Bump version to 2023.10 2023-10-29 13:51:19 +01:00
Matthias
7813d1acd6 Merge branch 'stable' into new_release 2023-10-29 13:51:10 +01:00
Matthias
e73f215a67 Merge pull request #9242 from freqtrade/new_release
New release 2023.9
2023-09-30 17:25:36 +02:00
Matthias
96c5db3e38 Bump version to 2023.9 2023-09-30 13:02:02 +02:00
Matthias
c7f248fe3b Merge branch 'stable' into new_release 2023-09-30 13:01:44 +02:00
Matthias
dbf53ce952 Merge pull request #9112 from freqtrade/new_release
New release 2023.8
2023-08-28 18:44:59 +02:00
Matthias
f6b6b5976d Bump version to 2023.8 2023-08-27 20:46:19 +02:00
128 changed files with 8846 additions and 6419 deletions

View File

@@ -38,7 +38,7 @@ jobs:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@3259c6206f993105e3a61b142c2d97bf4b9ef83d # v7.1.0 uses: astral-sh/setup-uv@85856786d1ce8acfbcc2f13a5f3fbd6b938f9f41 # v7.1.2
with: with:
activate-environment: true activate-environment: true
enable-cache: true enable-cache: true
@@ -91,12 +91,12 @@ jobs:
- name: Run command docs partials extract - name: Run command docs partials extract
# This should be kept before the repository check to ensure that the docs are up-to-date # This should be kept before the repository check to ensure that the docs are up-to-date
if: ${{ (matrix.python-version == '3.13') }}
run: | run: |
python build_helpers/create_command_partials.py python build_helpers/create_command_partials.py
- name: Check for repository changes - *nix - name: Check for repository changes - *nix
# TODO: python 3.13 slightly changed the output of argparse. if: ${{ (runner.os != 'Windows') }}
if: ${{ (matrix.python-version != '3.13') && (runner.os != 'Windows') }}
run: | run: |
if [ -n "$(git status --porcelain)" ]; then if [ -n "$(git status --porcelain)" ]; then
echo "Repository is dirty, changes detected:" echo "Repository is dirty, changes detected:"
@@ -248,7 +248,7 @@ jobs:
python-version: "3.12" python-version: "3.12"
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@3259c6206f993105e3a61b142c2d97bf4b9ef83d # v7.1.0 uses: astral-sh/setup-uv@85856786d1ce8acfbcc2f13a5f3fbd6b938f9f41 # v7.1.2
with: with:
activate-environment: true activate-environment: true
enable-cache: true enable-cache: true
@@ -324,7 +324,7 @@ jobs:
python -m build --sdist --wheel python -m build --sdist --wheel
- name: Upload artifacts 📦 - name: Upload artifacts 📦
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: freqtrade-build name: freqtrade-build
path: | path: |
@@ -337,7 +337,7 @@ jobs:
python -m build --sdist --wheel ft_client python -m build --sdist --wheel ft_client
- name: Upload artifacts 📦 - name: Upload artifacts 📦
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: freqtrade-client-build name: freqtrade-client-build
path: | path: |
@@ -361,7 +361,7 @@ jobs:
persist-credentials: false persist-credentials: false
- name: Download artifact 📦 - name: Download artifact 📦
uses: actions/download-artifact@v5 uses: actions/download-artifact@v6
with: with:
pattern: freqtrade*-build pattern: freqtrade*-build
path: dist path: dist
@@ -390,7 +390,7 @@ jobs:
persist-credentials: false persist-credentials: false
- name: Download artifact 📦 - name: Download artifact 📦
uses: actions/download-artifact@v5 uses: actions/download-artifact@v6
with: with:
pattern: freqtrade*-build pattern: freqtrade*-build
path: dist path: dist

View File

@@ -48,7 +48,7 @@ jobs:
password: ${{ secrets.DOCKER_PASSWORD }} password: ${{ secrets.DOCKER_PASSWORD }}
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0
with: with:
cache-image: false cache-image: false

View File

@@ -26,12 +26,12 @@ repos:
- id: mypy - id: mypy
exclude: build_helpers exclude: build_helpers
additional_dependencies: additional_dependencies:
- types-cachetools==6.2.0.20250827 - types-cachetools==6.2.0.20251022
- types-filelock==3.2.7 - types-filelock==3.2.7
- types-requests==2.32.4.20250913 - types-requests==2.32.4.20250913
- types-tabulate==0.9.0.20241207 - types-tabulate==0.9.0.20241207
- types-python-dateutil==2.9.0.20251008 - types-python-dateutil==2.9.0.20251108
- scipy-stubs==1.16.2.3 - scipy-stubs==1.16.3.0
- SQLAlchemy==2.0.44 - SQLAlchemy==2.0.44
# stages: [push] # stages: [push]
@@ -44,7 +44,7 @@ repos:
- repo: https://github.com/charliermarsh/ruff-pre-commit - repo: https://github.com/charliermarsh/ruff-pre-commit
# Ruff version. # Ruff version.
rev: 'v0.14.1' rev: 'v0.14.5'
hooks: hooks:
- id: ruff - id: ruff
- id: ruff-format - id: ruff-format
@@ -70,7 +70,7 @@ repos:
)$ )$
- repo: https://github.com/stefmolin/exif-stripper - repo: https://github.com/stefmolin/exif-stripper
rev: 1.1.0 rev: 1.2.0
hooks: hooks:
- id: strip-exif - id: strip-exif
@@ -83,6 +83,6 @@ repos:
# Ensure github actions remain safe # Ensure github actions remain safe
- repo: https://github.com/woodruffw/zizmor-pre-commit - repo: https://github.com/woodruffw/zizmor-pre-commit
rev: v1.15.2 rev: v1.16.3
hooks: hooks:
- id: zizmor - id: zizmor

View File

@@ -1,6 +1,6 @@
# ![freqtrade](https://raw.githubusercontent.com/freqtrade/freqtrade/develop/docs/assets/freqtrade_poweredby.svg) # ![freqtrade](https://raw.githubusercontent.com/freqtrade/freqtrade/develop/docs/assets/freqtrade_poweredby.svg)
[![Freqtrade CI](https://github.com/freqtrade/freqtrade/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/freqtrade/freqtrade/actions/) [![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) [![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) [![Coverage Status](https://coveralls.io/repos/github/freqtrade/freqtrade/badge.svg?branch=develop&service=github)](https://coveralls.io/github/freqtrade/freqtrade?branch=develop)
[![Documentation](https://readthedocs.org/projects/freqtrade/badge/)](https://www.freqtrade.io) [![Documentation](https://readthedocs.org/projects/freqtrade/badge/)](https://www.freqtrade.io)

View File

@@ -1,53 +1,71 @@
import subprocess # noqa: S404, RUF100 import subprocess # noqa: S404, RUF100
import sys
from pathlib import Path from pathlib import Path
subcommands = [ def _write_partial_file(filename: str, content: str):
"trade", with Path(filename).open("w") as f:
"create-userdir", f.write(f"``` output\n{content}\n```\n")
"new-config",
"show-config",
"new-strategy",
"download-data",
"convert-data",
"convert-trade-data",
"trades-to-ohlcv",
"list-data",
"backtesting",
"backtesting-show",
"backtesting-analysis",
"edge",
"hyperopt",
"hyperopt-list",
"hyperopt-show",
"list-exchanges",
"list-markets",
"list-pairs",
"list-strategies",
"list-hyperoptloss",
"list-freqaimodels",
"list-timeframes",
"show-trades",
"test-pairlist",
"convert-db",
"install-ui",
"plot-dataframe",
"plot-profit",
"webserver",
"strategy-updater",
"lookahead-analysis",
"recursive-analysis",
]
result = subprocess.run(["freqtrade", "--help"], capture_output=True, text=True)
with Path("docs/commands/main.md").open("w") as f:
f.write(f"```\n{result.stdout}\n```\n")
for command in subcommands: def extract_command_partials():
print(f"Running for {command}") subcommands = [
result = subprocess.run(["freqtrade", command, "--help"], capture_output=True, text=True) "trade",
"create-userdir",
"new-config",
"show-config",
"new-strategy",
"download-data",
"convert-data",
"convert-trade-data",
"trades-to-ohlcv",
"list-data",
"backtesting",
"backtesting-show",
"backtesting-analysis",
"edge",
"hyperopt",
"hyperopt-list",
"hyperopt-show",
"list-exchanges",
"list-markets",
"list-pairs",
"list-strategies",
"list-hyperoptloss",
"list-freqaimodels",
"list-timeframes",
"show-trades",
"test-pairlist",
"convert-db",
"install-ui",
"plot-dataframe",
"plot-profit",
"webserver",
"strategy-updater",
"lookahead-analysis",
"recursive-analysis",
]
with Path(f"docs/commands/{command}.md").open("w") as f: result = subprocess.run(["freqtrade", "--help"], capture_output=True, text=True)
f.write(f"```\n{result.stdout}\n```\n")
_write_partial_file("docs/commands/main.md", result.stdout)
for command in subcommands:
print(f"Running for {command}")
result = subprocess.run(["freqtrade", command, "--help"], capture_output=True, text=True)
_write_partial_file(f"docs/commands/{command}.md", result.stdout)
print("Running for freqtrade-client")
result_client = subprocess.run(["freqtrade-client", "--show"], capture_output=True, text=True)
_write_partial_file("docs/commands/freqtrade-client.md", result_client.stdout)
if __name__ == "__main__":
if sys.version_info < (3, 13): # pragma: no cover
sys.exit(
"argparse output changed in Python 3.13+. "
"To keep command partials up to date, please run this script with Python 3.13+."
)
extract_command_partials()

View File

@@ -273,6 +273,68 @@
] ]
} }
}, },
"backtest_cache": {
"description": "Load a cached backtest result no older than specified age.",
"type": "string",
"enum": [
"none",
"day",
"week",
"month"
]
},
"hyperopt_path": {
"description": "Specify additional lookup path for Hyperopt Loss functions.",
"type": "string"
},
"epochs": {
"description": "Number of training epochs for Hyperopt.",
"type": "integer",
"minimum": 1
},
"early_stop": {
"description": "Early stop hyperopt if no improvement after <epochs>. Set to 0 to disable.",
"type": "integer",
"minimum": 0
},
"spaces": {
"description": "Hyperopt parameter spaces to optimize. Default is the default set andincludes all spaces except for 'trailing', 'protection', and 'trades'.",
"type": "array",
"items": {
"type": "string"
},
"default": [
"default"
]
},
"analyze_per_epoch": {
"description": "Perform analysis after each epoch in Hyperopt.",
"type": "boolean"
},
"print_all": {
"description": "Print all hyperopt trials, not just the best ones.",
"type": "boolean",
"default": false
},
"hyperopt_jobs": {
"description": "The number of concurrently running jobs for hyperoptimization (hyperopt worker processes). If -1 (default), all CPUs are used, for -2, all CPUs but one are used, etc. If 1 is given, no parallel computing is used.",
"type": "integer",
"default": -1
},
"hyperopt_random_state": {
"description": "Random state for hyperopt trials.",
"type": "integer",
"minimum": 0
},
"hyperopt_min_trades": {
"description": "Minimum number of trades per epoch for hyperopt.",
"type": "integer",
"minimum": 0
},
"hyperopt_loss": {
"description": "The class name of the hyperopt loss function class (IHyperOptLoss). Different functions can generate completely different results, since the target for optimization is different. Built-in Hyperopt-loss-functions are: ShortTradeDurHyperOptLoss, OnlyProfitHyperOptLoss, SharpeHyperOptLoss, SharpeHyperOptLossDaily, SortinoHyperOptLoss, SortinoHyperOptLossDaily, CalmarHyperOptLoss, MaxDrawDownHyperOptLoss, MaxDrawDownRelativeHyperOptLoss, MaxDrawDownPerPairHyperOptLoss, ProfitDrawDownHyperOptLoss, MultiMetricHyperOptLoss",
"type": "string"
},
"bot_name": { "bot_name": {
"description": "Name of the trading bot. Passed via API to a client.", "description": "Name of the trading bot. Passed via API to a client.",
"type": "string" "type": "string"

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade backtesting-analysis [-h] [-v] [--no-color] [--logfile FILE] usage: freqtrade backtesting-analysis [-h] [-v] [--no-color] [--logfile FILE]
[-V] [-c PATH] [-d PATH] [-V] [-c PATH] [-d PATH]
[--userdir PATH] [--userdir PATH]
@@ -15,13 +15,13 @@ usage: freqtrade backtesting-analysis [-h] [-v] [--no-color] [--logfile FILE]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--backtest-filename PATH, --export-filename PATH --backtest-filename, --export-filename PATH
Use this filename for backtest results.Example: Use this filename for backtest results.Example:
`--backtest- `--backtest-
filename=backtest_results_2020-09-27_16-20-48.json`. filename=backtest_results_2020-09-27_16-20-48.json`.
Assumes either `user_data/backtest_results/` or Assumes either `user_data/backtest_results/` or
`--export-directory` as base directory. `--export-directory` as base directory.
--backtest-directory PATH, --export-directory PATH --backtest-directory, --export-directory PATH
Directory to use for backtest results. Example: Directory to use for backtest results. Example:
`--export-directory=user_data/backtest_results/`. `--export-directory=user_data/backtest_results/`.
--analysis-groups {0,1,2,3,4,5} [{0,1,2,3,4,5} ...] --analysis-groups {0,1,2,3,4,5} [{0,1,2,3,4,5} ...]
@@ -54,21 +54,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade backtesting-show [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade backtesting-show [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--backtest-filename PATH] [--backtest-filename PATH]
@@ -8,13 +8,13 @@ usage: freqtrade backtesting-show [-h] [-v] [--no-color] [--logfile FILE] [-V]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--backtest-filename PATH, --export-filename PATH --backtest-filename, --export-filename PATH
Use this filename for backtest results.Example: Use this filename for backtest results.Example:
`--backtest- `--backtest-
filename=backtest_results_2020-09-27_16-20-48.json`. filename=backtest_results_2020-09-27_16-20-48.json`.
Assumes either `user_data/backtest_results/` or Assumes either `user_data/backtest_results/` or
`--export-directory` as base directory. `--export-directory` as base directory.
--backtest-directory PATH, --export-directory PATH --backtest-directory, --export-directory PATH
Directory to use for backtest results. Example: Directory to use for backtest results. Example:
`--export-directory=user_data/backtest_results/`. `--export-directory=user_data/backtest_results/`.
--show-pair-list Show backtesting pairlist sorted by profit. --show-pair-list Show backtesting pairlist sorted by profit.
@@ -26,21 +26,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade backtesting [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade backtesting [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-s NAME] [-c PATH] [-d PATH] [--userdir PATH] [-s NAME]
[--strategy-path PATH] [--strategy-path PATH]
@@ -23,7 +23,7 @@ usage: freqtrade backtesting [-h] [-v] [--no-color] [--logfile FILE] [-V]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-i TIMEFRAME, --timeframe TIMEFRAME -i, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--timerange TIMERANGE --timerange TIMERANGE
Specify what timerange of data to use. Specify what timerange of data to use.
@@ -38,7 +38,7 @@ options:
setting. setting.
--fee FLOAT Specify fee ratio. Will be applied twice (on trade --fee FLOAT Specify fee ratio. Will be applied twice (on trade
entry and exit). entry and exit).
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...] -p, --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--eps, --enable-position-stacking --eps, --enable-position-stacking
@@ -53,7 +53,7 @@ options:
pairlist will be generated for each new candle if pairlist will be generated for each new candle if
you're using a pairlist handler that supports this you're using a pairlist handler that supports this
feature, for example, ShuffleFilter. feature, for example, ShuffleFilter.
--dry-run-wallet DRY_RUN_WALLET, --starting-balance DRY_RUN_WALLET --dry-run-wallet, --starting-balance DRY_RUN_WALLET
Starting balance, used for backtesting / hyperopt and Starting balance, used for backtesting / hyperopt and
dry-runs. dry-runs.
--timeframe-detail TIMEFRAME_DETAIL --timeframe-detail TIMEFRAME_DETAIL
@@ -68,13 +68,13 @@ options:
becomes `backtest-data-SampleStrategy.json` becomes `backtest-data-SampleStrategy.json`
--export {none,trades,signals} --export {none,trades,signals}
Export backtest results (default: trades). Export backtest results (default: trades).
--backtest-filename PATH, --export-filename PATH --backtest-filename, --export-filename PATH
Use this filename for backtest results.Example: Use this filename for backtest results.Example:
`--backtest- `--backtest-
filename=backtest_results_2020-09-27_16-20-48.json`. filename=backtest_results_2020-09-27_16-20-48.json`.
Assumes either `user_data/backtest_results/` or Assumes either `user_data/backtest_results/` or
`--export-directory` as base directory. `--export-directory` as base directory.
--backtest-directory PATH, --export-directory PATH --backtest-directory, --export-directory PATH
Directory to use for backtest results. Example: Directory to use for backtest results. Example:
`--export-directory=user_data/backtest_results/`. `--export-directory=user_data/backtest_results/`.
--breakdown {day,week,month,year,weekday} [{day,week,month,year,weekday} ...] --breakdown {day,week,month,year,weekday} [{day,week,month,year,weekday} ...]
@@ -91,26 +91,24 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s NAME, --strategy NAME -s, --strategy NAME Specify strategy class name which will be used by the
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,17 +1,17 @@
``` ``` output
usage: freqtrade convert-data [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade convert-data [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[-p PAIRS [PAIRS ...]] --format-from [-p PAIRS [PAIRS ...]]
{json,jsongz,feather,parquet} --format-to --format-from {json,jsongz,feather,parquet}
{json,jsongz,feather,parquet} [--erase] --format-to {json,jsongz,feather,parquet}
[--exchange EXCHANGE] [--erase] [--exchange EXCHANGE]
[-t TIMEFRAMES [TIMEFRAMES ...]] [-t TIMEFRAMES [TIMEFRAMES ...]]
[--trading-mode {spot,margin,futures}] [--trading-mode {spot,margin,futures}]
[--candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...]] [--candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...]]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...] -p, --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--format-from {json,jsongz,feather,parquet} --format-from {json,jsongz,feather,parquet}
@@ -21,10 +21,10 @@ options:
--erase Clean all existing data for the selected --erase Clean all existing data for the selected
exchange/pairs/timeframes. exchange/pairs/timeframes.
--exchange EXCHANGE Exchange name. Only valid if no config is provided. --exchange EXCHANGE Exchange name. Only valid if no config is provided.
-t TIMEFRAMES [TIMEFRAMES ...], --timeframes TIMEFRAMES [TIMEFRAMES ...] -t, --timeframes TIMEFRAMES [TIMEFRAMES ...]
Specify which tickers to download. Space-separated Specify which tickers to download. Space-separated
list. Default: `1m 5m`. list. Default: `1m 5m`.
--trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures} --trading-mode, --tradingmode {spot,margin,futures}
Select Trading mode Select Trading mode
--candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...] --candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...]
Select candle type to convert. Defaults to all Select candle type to convert. Defaults to all
@@ -34,21 +34,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade convert-db [-h] [--db-url PATH] [--db-url-from PATH] usage: freqtrade convert-db [-h] [--db-url PATH] [--db-url-from PATH]
options: options:

View File

@@ -1,14 +1,14 @@
``` ``` output
usage: freqtrade convert-trade-data [-h] [-v] [--no-color] [--logfile FILE] usage: freqtrade convert-trade-data [-h] [-v] [--no-color] [--logfile FILE]
[-V] [-c PATH] [-d PATH] [--userdir PATH] [-V] [-c PATH] [-d PATH] [--userdir PATH]
[-p PAIRS [PAIRS ...]] --format-from [-p PAIRS [PAIRS ...]]
{json,jsongz,feather,parquet,kraken_csv} --format-from {json,jsongz,feather,parquet,kraken_csv}
--format-to {json,jsongz,feather,parquet} --format-to {json,jsongz,feather,parquet}
[--erase] [--exchange EXCHANGE] [--erase] [--exchange EXCHANGE]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...] -p, --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--format-from {json,jsongz,feather,parquet,kraken_csv} --format-from {json,jsongz,feather,parquet,kraken_csv}
@@ -23,21 +23,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,9 +1,9 @@
``` ``` output
usage: freqtrade create-userdir [-h] [--userdir PATH] [--reset] usage: freqtrade create-userdir [-h] [--userdir PATH] [--reset]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
--reset Reset sample files to their original state. --reset Reset sample files to their original state.

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade download-data [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade download-data [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[-p PAIRS [PAIRS ...]] [--pairs-file FILE] [-p PAIRS [PAIRS ...]] [--pairs-file FILE]
@@ -15,7 +15,7 @@ usage: freqtrade download-data [-h] [-v] [--no-color] [--logfile FILE] [-V]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...] -p, --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--pairs-file FILE File containing a list of pairs. Takes precedence over --pairs-file FILE File containing a list of pairs. Takes precedence over
@@ -37,7 +37,7 @@ options:
OHLCV (e.g. Kraken). If not provided, use `trades-to- OHLCV (e.g. Kraken). If not provided, use `trades-to-
ohlcv` to convert trades data to OHLCV data. ohlcv` to convert trades data to OHLCV data.
--exchange EXCHANGE Exchange name. Only valid if no config is provided. --exchange EXCHANGE Exchange name. Only valid if no config is provided.
-t TIMEFRAMES [TIMEFRAMES ...], --timeframes TIMEFRAMES [TIMEFRAMES ...] -t, --timeframes TIMEFRAMES [TIMEFRAMES ...]
Specify which tickers to download. Space-separated Specify which tickers to download. Space-separated
list. Default: `1m 5m`. list. Default: `1m 5m`.
--erase Clean all existing data for the selected --erase Clean all existing data for the selected
@@ -48,7 +48,7 @@ options:
--data-format-trades {json,jsongz,feather,parquet} --data-format-trades {json,jsongz,feather,parquet}
Storage format for downloaded trades data. (default: Storage format for downloaded trades data. (default:
`feather`). `feather`).
--trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures} --trading-mode, --tradingmode {spot,margin,futures}
Select Trading mode Select Trading mode
--prepend Allow data prepending. (Data-appending is disabled) --prepend Allow data prepending. (Data-appending is disabled)
@@ -56,21 +56,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade edge [-h] [-v] [--no-color] [--logfile FILE] [-V] [-c PATH] usage: freqtrade edge [-h] [-v] [--no-color] [--logfile FILE] [-V] [-c PATH]
[-d PATH] [--userdir PATH] [-s NAME] [-d PATH] [--userdir PATH] [-s NAME]
[--strategy-path PATH] [--recursive-strategy-search] [--strategy-path PATH] [--recursive-strategy-search]
@@ -10,7 +10,7 @@ usage: freqtrade edge [-h] [-v] [--no-color] [--logfile FILE] [-V] [-c PATH]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-i TIMEFRAME, --timeframe TIMEFRAME -i, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--timerange TIMERANGE --timerange TIMERANGE
Specify what timerange of data to use. Specify what timerange of data to use.
@@ -25,7 +25,7 @@ options:
setting. setting.
--fee FLOAT Specify fee ratio. Will be applied twice (on trade --fee FLOAT Specify fee ratio. Will be applied twice (on trade
entry and exit). entry and exit).
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...] -p, --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
@@ -33,26 +33,24 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s NAME, --strategy NAME -s, --strategy NAME Specify strategy class name which will be used by the
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -0,0 +1,197 @@
``` output
Possible commands:
available_pairs
Return available pair (backtest data) based on timeframe / stake_currency selection
:param timeframe: Only pairs with this timeframe available.
:param stake_currency: Only pairs that include this stake currency.
balance
Get the account balance.
blacklist
Show the current blacklist.
:param add: List of coins to add (example: "BNB/BTC")
cancel_open_order
Cancel open order for trade.
:param trade_id: Cancels open orders for this trade.
count
Return the amount of open trades.
daily
Return the profits for each day, and amount of trades.
delete_lock
Delete (disable) lock from the database.
:param lock_id: ID for the lock to delete
delete_trade
Delete trade from the database.
Tries to close open orders. Requires manual handling of this asset on the exchange.
:param trade_id: Deletes the trade with this ID from the database.
entries
Returns List of dicts containing all Trades, based on buy tag performance
Can either be average for all pairs or a specific pair provided
exits
Returns List of dicts containing all Trades, based on exit reason performance
Can either be average for all pairs or a specific pair provided
forcebuy
Buy an asset.
:param pair: Pair to buy (ETH/BTC)
:param price: Optional - price to buy
forceenter
Force entering a trade
:param pair: Pair to buy (ETH/BTC)
:param side: 'long' or 'short'
:param price: Optional - price to buy
:param order_type: Optional keyword argument - 'limit' or 'market'
:param stake_amount: Optional keyword argument - stake amount (as float)
:param leverage: Optional keyword argument - leverage (as float)
:param enter_tag: Optional keyword argument - entry tag (as string, default: 'force_enter')
forceexit
Force-exit a trade.
:param tradeid: Id of the trade (can be received via status command)
:param ordertype: Order type to use (must be market or limit)
:param amount: Amount to sell. Full sell if not given
health
Provides a quick health check of the running bot.
list_custom_data
List custom-data of the running bot for a specific trade.
:param trade_id: ID of the trade
:param key: str, optional - Key of the custom-data
list_open_trades_custom_data
List open trades custom-data of the running bot.
:param key: str, optional - Key of the custom-data
:param limit: limit of trades
:param offset: trades offset for pagination
lock_add
Lock pair
:param pair: Pair to lock
:param until: Lock until this date (format "2024-03-30 16:00:00Z")
:param side: Side to lock (long, short, *)
:param reason: Reason for the lock
locks
Return current locks
logs
Show latest logs.
:param limit: Limits log messages to the last <limit> logs. No limit to get the entire log.
mix_tags
Returns List of dicts containing all Trades, based on entry_tag + exit_reason performance
Can either be average for all pairs or a specific pair provided
monthly
Return the profits for each month, and amount of trades.
pair_candles
Return live dataframe for <pair><timeframe>.
:param pair: Pair to get data for
:param timeframe: Only pairs with this timeframe available.
:param limit: Limit result to the last n candles.
:param columns: List of dataframe columns to return. Empty list will return OHLCV.
pair_history
Return historic, analyzed dataframe
:param pair: Pair to get data for
:param timeframe: Only pairs with this timeframe available.
:param strategy: Strategy to analyze and get values for
:param freqaimodel: FreqAI model to use for analysis
:param timerange: Timerange to get data for (same format than --timerange endpoints)
pairlists_available
Lists available pairlist providers
performance
Return the performance of the different coins.
ping
simple ping
plot_config
Return plot configuration if the strategy defines one.
profit
Return the profit summary.
reload_config
Reload configuration.
show_config
Returns part of the configuration, relevant for trading operations.
start
Start the bot if it's in the stopped state.
stats
Return the stats report (durations, sell-reasons).
status
Get the status of open trades.
stop
Stop the bot. Use `start` to restart.
stopbuy
Stop buying (but handle sells gracefully). Use `reload_config` to reset.
strategies
Lists available strategies
strategy
Get strategy details
:param strategy: Strategy class name
sysinfo
Provides system information (CPU, RAM usage)
trade
Return specific trade
:param trade_id: Specify which trade to get.
trades
Return trades history, sorted by id (or by latest timestamp if order_by_id=False)
:param limit: Limits trades to the X last trades. Max 500 trades.
:param offset: Offset by this amount of trades.
:param order_by_id: Sort trades by id (default: True). If False, sorts by latest timestamp.
version
Return the version of the bot.
weekly
Return the profits for each week, and amount of trades.
whitelist
Show the current whitelist.
```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade hyperopt-list [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade hyperopt-list [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [--best] [-c PATH] [-d PATH] [--userdir PATH] [--best]
[--profitable] [--min-trades INT] [--profitable] [--min-trades INT]
@@ -44,21 +44,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade hyperopt-show [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade hyperopt-show [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [--best] [-c PATH] [-d PATH] [--userdir PATH] [--best]
[--profitable] [-n INT] [--print-json] [--profitable] [-n INT] [--print-json]
@@ -10,7 +10,7 @@ options:
-h, --help show this help message and exit -h, --help show this help message and exit
--best Select only best epochs. --best Select only best epochs.
--profitable Select only profitable epochs. --profitable Select only profitable epochs.
-n INT, --index INT Specify the index of the epoch to print details for. -n, --index INT Specify the index of the epoch to print details for.
--print-json Print output in JSON format. --print-json Print output in JSON format.
--hyperopt-filename FILENAME --hyperopt-filename FILENAME
Hyperopt result filename.Example: `--hyperopt- Hyperopt result filename.Example: `--hyperopt-
@@ -26,21 +26,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade hyperopt [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade hyperopt [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-s NAME] [-c PATH] [-d PATH] [--userdir PATH] [-s NAME]
[--strategy-path PATH] [--recursive-strategy-search] [--strategy-path PATH] [--recursive-strategy-search]
@@ -11,16 +11,15 @@ usage: freqtrade hyperopt [-h] [-v] [--no-color] [--logfile FILE] [-V]
[--eps] [--enable-protections] [--eps] [--enable-protections]
[--dry-run-wallet DRY_RUN_WALLET] [--dry-run-wallet DRY_RUN_WALLET]
[--timeframe-detail TIMEFRAME_DETAIL] [-e INT] [--timeframe-detail TIMEFRAME_DETAIL] [-e INT]
[--spaces {all,buy,sell,roi,stoploss,trailing,protection,trades,default} [{all,buy,sell,roi,stoploss,trailing,protection,trades,default} ...]] [--spaces SPACES [SPACES ...]] [--print-all]
[--print-all] [--print-json] [-j JOBS] [--print-json] [-j JOBS] [--random-state INT]
[--random-state INT] [--min-trades INT] [--min-trades INT] [--hyperopt-loss NAME]
[--hyperopt-loss NAME] [--disable-param-export] [--disable-param-export] [--ignore-missing-spaces]
[--ignore-missing-spaces] [--analyze-per-epoch] [--analyze-per-epoch] [--early-stop INT]
[--early-stop INT]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-i TIMEFRAME, --timeframe TIMEFRAME -i, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--timerange TIMERANGE --timerange TIMERANGE
Specify what timerange of data to use. Specify what timerange of data to use.
@@ -35,7 +34,7 @@ options:
setting. setting.
--fee FLOAT Specify fee ratio. Will be applied twice (on trade --fee FLOAT Specify fee ratio. Will be applied twice (on trade
entry and exit). entry and exit).
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...] -p, --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--hyperopt-path PATH Specify additional lookup path for Hyperopt Loss --hyperopt-path PATH Specify additional lookup path for Hyperopt Loss
@@ -47,19 +46,23 @@ options:
Enable protections for backtesting. Will slow Enable protections for backtesting. Will slow
backtesting down by a considerable amount, but will backtesting down by a considerable amount, but will
include configured protections include configured protections
--dry-run-wallet DRY_RUN_WALLET, --starting-balance DRY_RUN_WALLET --dry-run-wallet, --starting-balance DRY_RUN_WALLET
Starting balance, used for backtesting / hyperopt and Starting balance, used for backtesting / hyperopt and
dry-runs. dry-runs.
--timeframe-detail TIMEFRAME_DETAIL --timeframe-detail TIMEFRAME_DETAIL
Specify detail timeframe for backtesting (`1m`, `5m`, Specify detail timeframe for backtesting (`1m`, `5m`,
`30m`, `1h`, `1d`). `30m`, `1h`, `1d`).
-e INT, --epochs INT Specify number of epochs (default: 100). -e, --epochs INT Specify number of epochs (default: 100).
--spaces {all,buy,sell,roi,stoploss,trailing,protection,trades,default} [{all,buy,sell,roi,stoploss,trailing,protection,trades,default} ...] --spaces SPACES [SPACES ...]
Specify which parameters to hyperopt. Space-separated Specify which parameters to hyperopt. Space-separated
list. list. Available builtin options (custom spaces will
not be listed here): default, all, buy, sell, enter,
exit, roi, stoploss, trailing, protection, trades.
Default: `default` - which includes all spaces except
for 'trailing', 'protection', and 'trades'.
--print-all Print all results, not only the best ones. --print-all Print all results, not only the best ones.
--print-json Print output in JSON format. --print-json Print output in JSON format.
-j JOBS, --job-workers JOBS -j, --job-workers JOBS
The number of concurrently running jobs for The number of concurrently running jobs for
hyperoptimization (hyperopt worker processes). If -1 hyperoptimization (hyperopt worker processes). If -1
(default), all CPUs are used, for -2, all CPUs but one (default), all CPUs are used, for -2, all CPUs but one
@@ -69,7 +72,7 @@ options:
reproducible hyperopt results. reproducible hyperopt results.
--min-trades INT Set minimal desired number of trades for evaluations --min-trades INT Set minimal desired number of trades for evaluations
in the hyperopt optimization path (default: 1). in the hyperopt optimization path (default: 1).
--hyperopt-loss NAME, --hyperoptloss NAME --hyperopt-loss, --hyperoptloss NAME
Specify the class name of the hyperopt loss function Specify the class name of the hyperopt loss function
class (IHyperOptLoss). Different functions can class (IHyperOptLoss). Different functions can
generate completely different results, since the generate completely different results, since the
@@ -95,26 +98,24 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s NAME, --strategy NAME -s, --strategy NAME Specify strategy class name which will be used by the
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade install-ui [-h] [--erase] [--prerelease] usage: freqtrade install-ui [-h] [--erase] [--prerelease]
[--ui-version UI_VERSION] [--ui-version UI_VERSION]

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade list-data [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade list-data [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--exchange EXCHANGE] [--exchange EXCHANGE]
@@ -18,10 +18,10 @@ options:
Storage format for downloaded trades data. (default: Storage format for downloaded trades data. (default:
`feather`). `feather`).
--trades Work on trades data instead of OHLCV data. --trades Work on trades data instead of OHLCV data.
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...] -p, --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures} --trading-mode, --tradingmode {spot,margin,futures}
Select Trading mode Select Trading mode
--show-timerange Show timerange available for available data. (May take --show-timerange Show timerange available for available data. (May take
a while to calculate). a while to calculate).
@@ -30,21 +30,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade list-exchanges [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade list-exchanges [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-1] [-a] [-c PATH] [-d PATH] [--userdir PATH] [-1] [-a]
[--trading-mode {spot,margin,futures}] [--trading-mode {spot,margin,futures}]
@@ -8,7 +8,7 @@ options:
-h, --help show this help message and exit -h, --help show this help message and exit
-1, --one-column Print output in one column. -1, --one-column Print output in one column.
-a, --all Print all exchanges known to the ccxt library. -a, --all Print all exchanges known to the ccxt library.
--trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures} --trading-mode, --tradingmode {spot,margin,futures}
Select Trading mode Select Trading mode
--dex-exchanges Print only DEX exchanges. --dex-exchanges Print only DEX exchanges.
@@ -16,21 +16,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade list-freqaimodels [-h] [-v] [--no-color] [--logfile FILE] usage: freqtrade list-freqaimodels [-h] [-v] [--no-color] [--logfile FILE]
[-V] [-c PATH] [-d PATH] [--userdir PATH] [-V] [-c PATH] [-d PATH] [--userdir PATH]
[--freqaimodel-path PATH] [-1] [--freqaimodel-path PATH] [-1]
@@ -13,21 +13,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade list-hyperoptloss [-h] [-v] [--no-color] [--logfile FILE] usage: freqtrade list-hyperoptloss [-h] [-v] [--no-color] [--logfile FILE]
[-V] [-c PATH] [-d PATH] [--userdir PATH] [-V] [-c PATH] [-d PATH] [--userdir PATH]
[--hyperopt-path PATH] [-1] [--hyperopt-path PATH] [-1]
@@ -13,21 +13,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade list-markets [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade list-markets [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--exchange EXCHANGE] [--print-list] [--exchange EXCHANGE] [--print-list]
@@ -21,28 +21,27 @@ options:
Specify quote currency(-ies). Space-separated list. Specify quote currency(-ies). Space-separated list.
-a, --all Print all pairs or market symbols. By default only -a, --all Print all pairs or market symbols. By default only
active ones are shown. active ones are shown.
--trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures} --trading-mode, --tradingmode {spot,margin,futures}
Select Trading mode Select Trading mode
Common arguments: Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade list-pairs [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade list-pairs [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--exchange EXCHANGE] [--print-list] [--exchange EXCHANGE] [--print-list]
@@ -21,28 +21,27 @@ options:
Specify quote currency(-ies). Space-separated list. Specify quote currency(-ies). Space-separated list.
-a, --all Print all pairs or market symbols. By default only -a, --all Print all pairs or market symbols. By default only
active ones are shown. active ones are shown.
--trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures} --trading-mode, --tradingmode {spot,margin,futures}
Select Trading mode Select Trading mode
Common arguments: Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade list-strategies [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade list-strategies [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--strategy-path PATH] [-1] [--strategy-path PATH] [-1]
@@ -16,21 +16,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,32 +1,34 @@
``` ``` output
usage: freqtrade list-timeframes [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade list-timeframes [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--exchange EXCHANGE] [-1] [--exchange EXCHANGE] [-1]
[--trading-mode {spot,margin,futures}]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--exchange EXCHANGE Exchange name. Only valid if no config is provided. --exchange EXCHANGE Exchange name. Only valid if no config is provided.
-1, --one-column Print output in one column. -1, --one-column Print output in one column.
--trading-mode, --tradingmode {spot,margin,futures}
Select Trading mode
Common arguments: Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade lookahead-analysis [-h] [-v] [--no-color] [--logfile FILE] usage: freqtrade lookahead-analysis [-h] [-v] [--no-color] [--logfile FILE]
[-V] [-c PATH] [-d PATH] [--userdir PATH] [-V] [-c PATH] [-d PATH] [--userdir PATH]
[-s NAME] [--strategy-path PATH] [-s NAME] [--strategy-path PATH]
@@ -26,7 +26,7 @@ usage: freqtrade lookahead-analysis [-h] [-v] [--no-color] [--logfile FILE]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-i TIMEFRAME, --timeframe TIMEFRAME -i, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--timerange TIMERANGE --timerange TIMERANGE
Specify what timerange of data to use. Specify what timerange of data to use.
@@ -41,7 +41,7 @@ options:
setting. setting.
--fee FLOAT Specify fee ratio. Will be applied twice (on trade --fee FLOAT Specify fee ratio. Will be applied twice (on trade
entry and exit). entry and exit).
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...] -p, --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--enable-protections, --enableprotections --enable-protections, --enableprotections
@@ -53,7 +53,7 @@ options:
pairlist will be generated for each new candle if pairlist will be generated for each new candle if
you're using a pairlist handler that supports this you're using a pairlist handler that supports this
feature, for example, ShuffleFilter. feature, for example, ShuffleFilter.
--dry-run-wallet DRY_RUN_WALLET, --starting-balance DRY_RUN_WALLET --dry-run-wallet, --starting-balance DRY_RUN_WALLET
Starting balance, used for backtesting / hyperopt and Starting balance, used for backtesting / hyperopt and
dry-runs. dry-runs.
--timeframe-detail TIMEFRAME_DETAIL --timeframe-detail TIMEFRAME_DETAIL
@@ -68,13 +68,13 @@ options:
becomes `backtest-data-SampleStrategy.json` becomes `backtest-data-SampleStrategy.json`
--export {none,trades,signals} --export {none,trades,signals}
Export backtest results (default: trades). Export backtest results (default: trades).
--backtest-filename PATH, --export-filename PATH --backtest-filename, --export-filename PATH
Use this filename for backtest results.Example: Use this filename for backtest results.Example:
`--backtest- `--backtest-
filename=backtest_results_2020-09-27_16-20-48.json`. filename=backtest_results_2020-09-27_16-20-48.json`.
Assumes either `user_data/backtest_results/` or Assumes either `user_data/backtest_results/` or
`--export-directory` as base directory. `--export-directory` as base directory.
--backtest-directory PATH, --export-directory PATH --backtest-directory, --export-directory PATH
Directory to use for backtest results. Example: Directory to use for backtest results. Example:
`--export-directory=user_data/backtest_results/`. `--export-directory=user_data/backtest_results/`.
--freqai-backtest-live-models --freqai-backtest-live-models
@@ -93,26 +93,24 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s NAME, --strategy NAME -s, --strategy NAME Specify strategy class name which will be used by the
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,7 +1,6 @@
``` ``` output
usage: freqtrade [-h] [-V] usage: freqtrade [-h] [-V]
{trade,create-userdir,new-config,show-config,new-strategy,download-data,convert-data,convert-trade-data,trades-to-ohlcv,list-data,backtesting,backtesting-show,backtesting-analysis,edge,hyperopt,hyperopt-list,hyperopt-show,list-exchanges,list-markets,list-pairs,list-strategies,list-hyperoptloss,list-freqaimodels,list-timeframes,show-trades,test-pairlist,convert-db,install-ui,plot-dataframe,plot-profit,webserver,strategy-updater,lookahead-analysis,recursive-analysis} {trade,create-userdir,new-config,show-config,new-strategy,download-data,convert-data,convert-trade-data,trades-to-ohlcv,list-data,backtesting,backtesting-show,backtesting-analysis,edge,hyperopt,hyperopt-list,hyperopt-show,list-exchanges,list-markets,list-pairs,list-strategies,list-hyperoptloss,list-freqaimodels,list-timeframes,show-trades,test-pairlist,convert-db,install-ui,plot-dataframe,plot-profit,webserver,strategy-updater,lookahead-analysis,recursive-analysis} ...
...
Free, open source crypto trading bot Free, open source crypto trading bot

View File

@@ -1,12 +1,11 @@
``` ``` output
usage: freqtrade new-config [-h] [-c PATH] usage: freqtrade new-config [-h] [-c PATH]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default: `userdir/config.json` or `config.json` whichever exists).
`userdir/config.json` or `config.json` whichever Multiple --config options may be used. Can be set to `-`
exists). Multiple --config options may be used. Can be to read config from stdin.
set to `-` to read config from stdin.
``` ```

View File

@@ -1,14 +1,13 @@
``` ``` output
usage: freqtrade new-strategy [-h] [--userdir PATH] [-s NAME] usage: freqtrade new-strategy [-h] [--userdir PATH] [-s NAME]
[--strategy-path PATH] [--strategy-path PATH]
[--template {full,minimal,advanced}] [--template {full,minimal,advanced}]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
-s NAME, --strategy NAME -s, --strategy NAME Specify strategy class name which will be used by the
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--template {full,minimal,advanced} --template {full,minimal,advanced}

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade plot-dataframe [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade plot-dataframe [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-s NAME] [-c PATH] [-d PATH] [--userdir PATH] [-s NAME]
[--strategy-path PATH] [--strategy-path PATH]
@@ -16,7 +16,7 @@ usage: freqtrade plot-dataframe [-h] [-v] [--no-color] [--logfile FILE] [-V]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...] -p, --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--indicators1 INDICATORS1 [INDICATORS1 ...] --indicators1 INDICATORS1 [INDICATORS1 ...]
@@ -38,7 +38,7 @@ options:
(backtest file)) Default: file (backtest file)) Default: file
--export {none,trades,signals} --export {none,trades,signals}
Export backtest results (default: trades). Export backtest results (default: trades).
--backtest-filename PATH, --export-filename PATH --backtest-filename, --export-filename PATH
Use this filename for backtest results.Example: Use this filename for backtest results.Example:
`--backtest- `--backtest-
filename=backtest_results_2020-09-27_16-20-48.json`. filename=backtest_results_2020-09-27_16-20-48.json`.
@@ -46,7 +46,7 @@ options:
`--export-directory` as base directory. `--export-directory` as base directory.
--timerange TIMERANGE --timerange TIMERANGE
Specify what timerange of data to use. Specify what timerange of data to use.
-i TIMEFRAME, --timeframe TIMEFRAME -i, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--no-trades Skip using trades from backtesting file and DB. --no-trades Skip using trades from backtesting file and DB.
@@ -54,26 +54,24 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s NAME, --strategy NAME -s, --strategy NAME Specify strategy class name which will be used by the
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade plot-profit [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade plot-profit [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-s NAME] [-c PATH] [-d PATH] [--userdir PATH] [-s NAME]
[--strategy-path PATH] [--strategy-path PATH]
@@ -12,14 +12,14 @@ usage: freqtrade plot-profit [-h] [-v] [--no-color] [--logfile FILE] [-V]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...] -p, --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--timerange TIMERANGE --timerange TIMERANGE
Specify what timerange of data to use. Specify what timerange of data to use.
--export {none,trades,signals} --export {none,trades,signals}
Export backtest results (default: trades). Export backtest results (default: trades).
--backtest-filename PATH, --export-filename PATH --backtest-filename, --export-filename PATH
Use this filename for backtest results.Example: Use this filename for backtest results.Example:
`--backtest- `--backtest-
filename=backtest_results_2020-09-27_16-20-48.json`. filename=backtest_results_2020-09-27_16-20-48.json`.
@@ -32,7 +32,7 @@ options:
--trade-source {DB,file} --trade-source {DB,file}
Specify the source for trades (Can be DB or file Specify the source for trades (Can be DB or file
(backtest file)) Default: file (backtest file)) Default: file
-i TIMEFRAME, --timeframe TIMEFRAME -i, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--auto-open Automatically open generated plot. --auto-open Automatically open generated plot.
@@ -40,26 +40,24 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s NAME, --strategy NAME -s, --strategy NAME Specify strategy class name which will be used by the
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade recursive-analysis [-h] [-v] [--no-color] [--logfile FILE] usage: freqtrade recursive-analysis [-h] [-v] [--no-color] [--logfile FILE]
[-V] [-c PATH] [-d PATH] [--userdir PATH] [-V] [-c PATH] [-d PATH] [--userdir PATH]
[-s NAME] [--strategy-path PATH] [-s NAME] [--strategy-path PATH]
@@ -12,14 +12,14 @@ usage: freqtrade recursive-analysis [-h] [-v] [--no-color] [--logfile FILE]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-i TIMEFRAME, --timeframe TIMEFRAME -i, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--timerange TIMERANGE --timerange TIMERANGE
Specify what timerange of data to use. Specify what timerange of data to use.
--data-format-ohlcv {json,jsongz,feather,parquet} --data-format-ohlcv {json,jsongz,feather,parquet}
Storage format for downloaded candle (OHLCV) data. Storage format for downloaded candle (OHLCV) data.
(default: `feather`). (default: `feather`).
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...] -p, --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
--startup-candle STARTUP_CANDLE [STARTUP_CANDLE ...] --startup-candle STARTUP_CANDLE [STARTUP_CANDLE ...]
@@ -30,26 +30,24 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s NAME, --strategy NAME -s, --strategy NAME Specify strategy class name which will be used by the
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,13 +1,12 @@
``` ``` output
usage: freqtrade show-config [-h] [--userdir PATH] [-c PATH] usage: freqtrade show-config [-h] [--userdir PATH] [-c PATH]
[--show-sensitive] [--show-sensitive]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade show-trades [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade show-trades [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--db-url PATH] [--db-url PATH]
@@ -19,21 +19,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade strategy-updater [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade strategy-updater [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[--strategy-list STRATEGY_LIST [STRATEGY_LIST ...]] [--strategy-list STRATEGY_LIST [STRATEGY_LIST ...]]
@@ -23,21 +23,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,15 +1,14 @@
``` ``` output
usage: freqtrade test-pairlist [-h] [--userdir PATH] [-v] [-c PATH] usage: freqtrade test-pairlist [-h] [--userdir PATH] [-v] [-c PATH]
[--quote QUOTE_CURRENCY [QUOTE_CURRENCY ...]] [--quote QUOTE_CURRENCY [QUOTE_CURRENCY ...]]
[-1] [--print-json] [--exchange EXCHANGE] [-1] [--print-json] [--exchange EXCHANGE]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade trade [-h] [-v] [--no-color] [--logfile FILE] [-V] [-c PATH] usage: freqtrade trade [-h] [-v] [--no-color] [--logfile FILE] [-V] [-c PATH]
[-d PATH] [--userdir PATH] [-s NAME] [-d PATH] [--userdir PATH] [-s NAME]
[--strategy-path PATH] [--recursive-strategy-search] [--strategy-path PATH] [--recursive-strategy-search]
@@ -15,7 +15,7 @@ options:
--sd-notify Notify systemd service manager. --sd-notify Notify systemd service manager.
--dry-run Enforce dry-run for trading (removes Exchange secrets --dry-run Enforce dry-run for trading (removes Exchange secrets
and simulates trades). and simulates trades).
--dry-run-wallet DRY_RUN_WALLET, --starting-balance DRY_RUN_WALLET --dry-run-wallet, --starting-balance DRY_RUN_WALLET
Starting balance, used for backtesting / hyperopt and Starting balance, used for backtesting / hyperopt and
dry-runs. dry-runs.
--fee FLOAT Specify fee ratio. Will be applied twice (on trade --fee FLOAT Specify fee ratio. Will be applied twice (on trade
@@ -25,26 +25,24 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
Strategy arguments: Strategy arguments:
-s NAME, --strategy NAME -s, --strategy NAME Specify strategy class name which will be used by the
Specify strategy class name which will be used by the
bot. bot.
--strategy-path PATH Specify additional strategy lookup path. --strategy-path PATH Specify additional strategy lookup path.
--recursive-strategy-search --recursive-strategy-search

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade trades-to-ohlcv [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade trades-to-ohlcv [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
[-p PAIRS [PAIRS ...]] [-p PAIRS [PAIRS ...]]
@@ -10,10 +10,10 @@ usage: freqtrade trades-to-ohlcv [-h] [-v] [--no-color] [--logfile FILE] [-V]
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...] -p, --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space- Limit command to these pairs. Pairs are space-
separated. separated.
-t TIMEFRAMES [TIMEFRAMES ...], --timeframes TIMEFRAMES [TIMEFRAMES ...] -t, --timeframes TIMEFRAMES [TIMEFRAMES ...]
Specify which tickers to download. Space-separated Specify which tickers to download. Space-separated
list. Default: `1m 5m`. list. Default: `1m 5m`.
--exchange EXCHANGE Exchange name. Only valid if no config is provided. --exchange EXCHANGE Exchange name. Only valid if no config is provided.
@@ -23,28 +23,27 @@ options:
--data-format-trades {json,jsongz,feather,parquet} --data-format-trades {json,jsongz,feather,parquet}
Storage format for downloaded trades data. (default: Storage format for downloaded trades data. (default:
`feather`). `feather`).
--trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures} --trading-mode, --tradingmode {spot,margin,futures}
Select Trading mode Select Trading mode
Common arguments: Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -1,4 +1,4 @@
``` ``` output
usage: freqtrade webserver [-h] [-v] [--no-color] [--logfile FILE] [-V] usage: freqtrade webserver [-h] [-v] [--no-color] [--logfile FILE] [-V]
[-c PATH] [-d PATH] [--userdir PATH] [-c PATH] [-d PATH] [--userdir PATH]
@@ -9,21 +9,20 @@ Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be --no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file. useful if you are redirecting output to a file.
--logfile FILE, --log-file FILE --logfile, --log-file FILE
Log to the file specified. Special values are: Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more 'syslog', 'journald'. See the documentation for more
details. details.
-V, --version show program's version number and exit -V, --version show program's version number and exit
-c PATH, --config PATH -c, --config PATH Specify configuration file (default:
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever `userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin. set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH -d, --datadir, --data-dir PATH
Path to the base directory of the exchange with Path to the base directory of the exchange with
historical backtesting data. To see futures data, use historical backtesting data. To see futures data, use
trading-mode additionally. trading-mode additionally.
--userdir PATH, --user-data-dir PATH --userdir, --user-data-dir PATH
Path to userdata directory. Path to userdata directory.
``` ```

View File

@@ -407,11 +407,12 @@ To use these with Freqtrade, you will need to use the following configuration pa
``` json ``` json
"exchange": { "exchange": {
"name": "hyperliquid", "name": "hyperliquid",
"walletAddress": "your_vault_address", // Vault or subaccount address "walletAddress": "your_master_wallet_address", // Your master wallet address (not the API wallet address and not the vault/subaccount address).
"privateKey": "your_api_private_key", "privateKey": "your_api_private_key", // API wallet private key (see https://app.hyperliquid.xyz/API). You'll only need the private key.
"ccxt_config": { "ccxt_config": {
"options": { "options": {
"vaultAddress": "your_vault_address" // Optional, only if you want to use a vault or subaccount "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
} }
}, },
// ... // ...
@@ -420,6 +421,9 @@ To use these with Freqtrade, you will need to use the following configuration pa
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 vault / 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.
### Historic Hyperliquid data ### Historic Hyperliquid data
The Hyperliquid API does not provide historic data beyond the single call to fetch current data, so downloading data is not possible, as the downloaded data would not constitute proper historic data. The Hyperliquid API does not provide historic data beyond the single call to fetch current data, so downloading data is not possible, as the downloaded data would not constitute proper historic data.

View File

@@ -46,10 +46,17 @@ Depending on the space you want to optimize, only some of the below are required
* define parameters with `space='buy'` - for entry signal optimization * define parameters with `space='buy'` - for entry signal optimization
* define parameters with `space='sell'` - for exit signal optimization * define parameters with `space='sell'` - for exit signal optimization
* define parameters with `space='enter'` - for entry signal optimization
* define parameters with `space='exit'` - for exit signal optimization
* define parameters with `space='protection'` - for protection optimization
* define parameters with `space='random_spacename'` - for better control over which parameters are optimized together
Pick the space name that suits the parameter best. We recommend to use either `buy` / `sell` or `enter` / `exit` for clarity (however there's no technical limitation in this regard).
!!! Note !!! Note
`populate_indicators` needs to create all indicators any of the spaces may use, otherwise hyperopt will not work. `populate_indicators` needs to create all indicators any of the spaces may use, otherwise hyperopt will not work.
Rarely you may also need to create a [nested class](advanced-hyperopt.md#overriding-pre-defined-spaces) named `HyperOpt` and implement Rarely you may also need to create a [nested class](advanced-hyperopt.md#overriding-pre-defined-spaces) named `HyperOpt` and implement
* `roi_space` - for custom ROI optimization (if you need the ranges for the ROI parameters in the optimization hyperspace that differ from default) * `roi_space` - for custom ROI optimization (if you need the ranges for the ROI parameters in the optimization hyperspace that differ from default)
@@ -79,15 +86,15 @@ Based on the loss function result, hyperopt will determine the next set of param
### Configure your Guards and Triggers ### Configure your Guards and Triggers
There are two places you need to change in your strategy file to add a new buy hyperopt for testing: There are two places you need to change in your strategy file to add a new hyperopt parameter for optimization:
* Define the parameters at the class level hyperopt shall be optimizing. * Define the parameters at the class level hyperopt shall be optimizing.
* Within `populate_entry_trend()` - use defined parameter values instead of raw constants. * Within `populate_entry_trend()` - use defined parameter values instead of raw constants.
There you have two different types of indicators: 1. `guards` and 2. `triggers`. There you have two different types of indicators: 1. `guards` and 2. `triggers`.
1. Guards are conditions like "never buy if ADX < 10", or never buy if current price is over EMA10. 1. Guards are conditions like "never enter if ADX < 10", or never enter if current price is over EMA10.
2. Triggers are ones that actually trigger buy in specific moment, like "buy when EMA5 crosses over EMA10" or "buy when close price touches lower Bollinger band". 2. Triggers are ones that actually trigger entry in specific moment, like "enter when EMA5 crosses over EMA10" or "enter when close price touches lower Bollinger band".
!!! Hint "Guards and Triggers" !!! Hint "Guards and Triggers"
Technically, there is no difference between Guards and Triggers. Technically, there is no difference between Guards and Triggers.
@@ -160,9 +167,11 @@ We use these to either enable or disable the ADX and RSI guards.
The last one we call `trigger` and use it to decide which buy trigger we want to use. The last one we call `trigger` and use it to decide which buy trigger we want to use.
!!! Note "Parameter space assignment" !!! Note "Parameter space assignment"
Parameters must either be assigned to a variable named `buy_*` or `sell_*` - or contain `space='buy'` | `space='sell'` to be assigned to a space correctly. - Parameters must either be assigned to a variable named `buy_*`, `sell_*`, `enter_*` or `exit_*` or `protection_*` - or contain have a space assigned explicitly via parameter (`space='buy'`, `space='sell'`, `space='protection'`).
If no parameter is available for a space, you'll receive the error that no space was found when running hyperopt. - Parameters with conflicting assignments (e.g. `buy_adx = IntParameter(4, 24, default=14, space='sell')`) will use the explicit space assignment.
- If no parameter is available for a space, you'll receive the error that no space was found when running hyperopt.
Parameters with unclear space (e.g. `adx_period = IntParameter(4, 24, default=14)` - no explicit nor implicit space) will not be detected and will therefore be ignored. Parameters with unclear space (e.g. `adx_period = IntParameter(4, 24, default=14)` - no explicit nor implicit space) will not be detected and will therefore be ignored.
Spaces can also be custom named (e.g. `space='my_custom_space'`), with the only limitation that the space name cannot be `all`, `default` - and must result in a valid python identifier.
So let's write the buy strategy using these values: So let's write the buy strategy using these values:
@@ -520,21 +529,24 @@ freqtrade hyperopt --strategy <strategyname> --timerange 20210101-20210201
### Running Hyperopt with Smaller Search Space ### Running Hyperopt with Smaller Search Space
Use the `--spaces` option to limit the search space used by hyperopt. Use the `--spaces` option to limit the search space used by hyperopt.
Letting Hyperopt optimize everything is a huuuuge search space. Letting Hyperopt optimize everything is often a huuuuge search space.
Often it might make more sense to start by just searching for initial buy algorithm. Often it might make more sense to start by just searching for initial entry algorithm.
Or maybe you just want to optimize your stoploss or roi table for that awesome new buy strategy you have. Or maybe you just want to optimize your stoploss or roi table for that awesome new strategy you have.
Legal values are: Legal values are:
* `all`: optimize everything * `all`: optimize everything (including custom spaces)
* `buy`: just search for a new buy strategy * `buy`: just search for a new buy strategy
* `sell`: just search for a new sell strategy * `sell`: just search for a new sell strategy
* `enter`: just search for a new entry logic
* `exit`: just search for a new entry logic
* `roi`: just optimize the minimal profit table for your strategy * `roi`: just optimize the minimal profit table for your strategy
* `stoploss`: search for the best stoploss value * `stoploss`: search for the best stoploss value
* `trailing`: search for the best trailing stop values * `trailing`: search for the best trailing stop values
* `trades`: search for the best max open trades values * `trades`: search for the best max open trades values
* `protection`: search for the best protection parameters (read the [protections section](#optimizing-protections) on how to properly define these) * `protection`: search for the best protection parameters (read the [protections section](#optimizing-protections) on how to properly define these)
* `default`: `all` except `trailing`, `trades` and `protection` * `default`: `all` except `trailing`, `trades` and `protection`
* `custom_space_name`: any custom space used by any parameter in your strategy
* space-separated list of any of the above values for example `--spaces roi stoploss` * space-separated list of any of the above values for example `--spaces roi stoploss`
The default Hyperopt Search Space, used when no `--space` command line option is specified, does not include the `trailing` hyperspace. We recommend you to run optimization for the `trailing` hyperspace separately, when the best parameters for other hyperspaces were found, validated and pasted into your custom strategy. The default Hyperopt Search Space, used when no `--space` command line option is specified, does not include the `trailing` hyperspace. We recommend you to run optimization for the `trailing` hyperspace separately, when the best parameters for other hyperspaces were found, validated and pasted into your custom strategy.

View File

@@ -367,7 +367,7 @@ The optional `bearer_token` will be included in the requests Authorization Heade
#### MarketCapPairList #### MarketCapPairList
`MarketCapPairList` employs sorting/filtering of pairs by their marketcap rank based of CoinGecko. The returned pairlist will be sorted based of their marketcap ranks. `MarketCapPairList` employs sorting/filtering of pairs by their marketcap rank based of CoinGecko. The returned pairlist will be sorted based of their marketcap ranks if used in whitelist `mode`.
```json ```json
"pairlists": [ "pairlists": [
@@ -376,16 +376,21 @@ The optional `bearer_token` will be included in the requests Authorization Heade
"number_assets": 20, "number_assets": 20,
"max_rank": 50, "max_rank": 50,
"refresh_period": 86400, "refresh_period": 86400,
"mode": "whitelist",
"categories": ["layer-1"] "categories": ["layer-1"]
} }
] ]
``` ```
`number_assets` defines the maximum number of pairs returned by the pairlist. `max_rank` will determine the maximum rank used in creating/filtering the pairlist. It's expected that some coins within the top `max_rank` marketcap will not be included in the resulting pairlist since not all pairs will have active trading pairs in your preferred market/stake/exchange combination. `number_assets` defines the maximum number of pairs returned by the pairlist if used in whitelist `mode`. In blacklist `mode`, this setting will be ignored.
`max_rank` will determine the maximum rank used in creating/filtering the pairlist. It's expected that some coins within the top `max_rank` marketcap will not be included in the resulting pairlist since not all pairs will have active trading pairs in your preferred market/stake/exchange combination.
While using a `max_rank` bigger than 250 is supported, it's not recommended, as it'll cause multiple API calls to CoinGecko, which can lead to rate limit issues. While using a `max_rank` bigger than 250 is supported, it's not recommended, as it'll cause multiple API calls to CoinGecko, which can lead to rate limit issues.
The `refresh_period` setting defines the interval (in seconds) at which the marketcap rank data will be refreshed. The default is 86,400 seconds (1 day). The pairlist cache (`refresh_period`) applies to both generating pairlists (when in the first position in the list) and filtering instances (when not in the first position in the list). The `refresh_period` setting defines the interval (in seconds) at which the marketcap rank data will be refreshed. The default is 86,400 seconds (1 day). The pairlist cache (`refresh_period`) applies to both generating pairlists (when in the first position in the list) and filtering instances (when not in the first position in the list).
The `mode` setting defines whether the plugin will filters in (whitelist `mode`) or filters out (blacklist `mode`) top marketcap ranked coins. By default, the plugin will be in whitelist mode.
The `categories` setting specifies the [coingecko categories](https://www.coingecko.com/en/categories) from which to select coins from. The default is an empty list `[]`, meaning no category filtering is applied. The `categories` setting specifies the [coingecko categories](https://www.coingecko.com/en/categories) from which to select coins from. The default is an empty list `[]`, meaning no category filtering is applied.
If an incorrect category string is chosen, the plugin will print the available categories from CoinGecko and fail. The category should be the ID of the category, for example, for `https://www.coingecko.com/en/categories/layer-1`, the category ID would be `layer-1`. You can pass multiple categories such as `["layer-1", "meme-token"]` to select from several categories. If an incorrect category string is chosen, the plugin will print the available categories from CoinGecko and fail. The category should be the ID of the category, for example, for `https://www.coingecko.com/en/categories/layer-1`, the category ID would be `layer-1`. You can pass multiple categories such as `["layer-1", "meme-token"]` to select from several categories.
@@ -412,7 +417,7 @@ This filter allows freqtrade to ignore pairs until they have been listed for at
Removes pairs that will be delisted on the exchange maximum `max_days_from_now` days from now (defaults to `0` which remove all future delisted pairs no matter how far from now). Currently this filter only supports following exchanges: Removes pairs that will be delisted on the exchange maximum `max_days_from_now` days from now (defaults to `0` which remove all future delisted pairs no matter how far from now). Currently this filter only supports following exchanges:
!!! Note "Available exchanges" !!! Note "Available exchanges"
Delist filter is only available on Binance, where Binance Futures will work for both dry and live modes, while Binance Spot is limited to live mode (for technical reasons). Delist filter is available on Bybit Futures, Bitget Futures and Binance, where Binance Futures will work for both dry and live modes, while Binance Spot is limited to live mode (for technical reasons).
!!! Warning "Backtesting" !!! Warning "Backtesting"
`DelistFilter` does not support backtesting mode. `DelistFilter` does not support backtesting mode.

View File

@@ -1,6 +1,6 @@
![freqtrade](assets/freqtrade_poweredby.svg) ![freqtrade](assets/freqtrade_poweredby.svg)
[![Freqtrade CI](https://github.com/freqtrade/freqtrade/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/freqtrade/freqtrade/actions/) [![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) [![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) [![Coverage Status](https://coveralls.io/repos/github/freqtrade/freqtrade/badge.svg?branch=develop&service=github)](https://coveralls.io/github/freqtrade/freqtrade?branch=develop)

View File

@@ -24,7 +24,7 @@ The easiest way to install and run Freqtrade is to clone the bot Github reposito
The `stable` branch contains the code of the last release (done usually once per month on an approximately one week old snapshot of the `develop` branch to prevent packaging bugs, so potentially it's more stable). The `stable` branch contains the code of the last release (done usually once per month on an approximately one week old snapshot of the `develop` branch to prevent packaging bugs, so potentially it's more stable).
!!! Note !!! Note
Python3.11 or higher and the corresponding `pip` are assumed to be available. The install-script will warn you and stop if that's not the case. `git` is also needed to clone the Freqtrade repository. Either [uv](https://docs.astral.sh/uv/), or Python3.11 or higher and the corresponding `pip` are assumed to be available. The install-script will warn you and stop if that's not the case. `git` is also needed to clone the Freqtrade repository.
Also, python headers (`python<yourversion>-dev` / `python<yourversion>-devel`) must be available for the installation to complete successfully. Also, python headers (`python<yourversion>-dev` / `python<yourversion>-devel`) must be available for the installation to complete successfully.
!!! Warning "Up-to-date clock" !!! Warning "Up-to-date clock"

View File

@@ -17,7 +17,7 @@ If you already have an existing strategy, please read the [strategy migration gu
## Shorting ## Shorting
Shorting is not possible when trading with [`trading_mode`](#leverage-trading-modes) set to `spot`. To short trade, `trading_mode` must be set to `margin`(currently unavailable) or [`futures`](#futures), with [`margin_mode`](#margin-mode) set to `cross`(currently unavailable) or [`isolated`](#isolated-margin-mode) Shorting is not possible when trading with [`trading_mode`](#leverage-trading-modes) set to `spot`. To short trade, `trading_mode` must be set to `margin`(currently unavailable) or [`futures`](#futures), with [`margin_mode`](#margin-mode) set to [`cross`](#cross-margin-mode) or [`isolated`](#isolated-margin-mode)
For a strategy to short, the strategy class must set the class variable `can_short = True` For a strategy to short, the strategy class must set the class variable `can_short = True`
@@ -72,7 +72,7 @@ A futures pair will therefore have the naming of `base/quote:settle` (e.g. `ETH/
On top of `trading_mode` - you will also have to configure your `margin_mode`. On top of `trading_mode` - you will also have to configure your `margin_mode`.
While freqtrade currently only supports one margin mode, this will change, and by configuring it now you're all set for future updates. While freqtrade currently only supports one margin mode, this will change, and by configuring it now you're all set for future updates.
The possible values are: `isolated`, or `cross`(*currently unavailable*). The possible values are: `isolated`, or `cross`.
#### Isolated margin mode #### Isolated margin mode

View File

@@ -1,7 +1,7 @@
markdown==3.9 markdown==3.10
mkdocs==1.6.1 mkdocs==1.6.1
mkdocs-material==9.6.22 mkdocs-material==9.7.0
mdx_truly_sane_lists==1.3 mdx_truly_sane_lists==1.3
pymdown-extensions==10.16.1 pymdown-extensions==10.17.1
jinja2==3.1.6 jinja2==3.1.6
mike==2.1.3 mike==2.1.3

View File

@@ -150,184 +150,16 @@ This method will work for all arguments - check the "show" command for a list of
For a full list of available commands, please refer to the list below. For a full list of available commands, please refer to the list below.
#### Freqtrade client- available commands
Possible commands can be listed from the rest-client script using the `help` command. Possible commands can be listed from the rest-client script using the `help` command.
``` bash ``` bash
freqtrade-client help freqtrade-client help
``` ```
``` output --8<-- "commands/freqtrade-client.md"
Possible commands:
available_pairs
Return available pair (backtest data) based on timeframe / stake_currency selection
:param timeframe: Only pairs with this timeframe available.
:param stake_currency: Only pairs that include this timeframe
balance
Get the account balance.
blacklist
Show the current blacklist.
:param add: List of coins to add (example: "BNB/BTC")
cancel_open_order
Cancel open order for trade.
:param trade_id: Cancels open orders for this trade.
count
Return the amount of open trades.
daily
Return the profits for each day, and amount of trades.
delete_lock
Delete (disable) lock from the database.
:param lock_id: ID for the lock to delete
delete_trade
Delete trade from the database.
Tries to close open orders. Requires manual handling of this asset on the exchange.
:param trade_id: Deletes the trade with this ID from the database.
forcebuy
Buy an asset.
:param pair: Pair to buy (ETH/BTC)
:param price: Optional - price to buy
forceenter
Force entering a trade
:param pair: Pair to buy (ETH/BTC)
:param side: 'long' or 'short'
:param price: Optional - price to buy
forceexit
Force-exit a trade.
:param tradeid: Id of the trade (can be received via status command)
:param ordertype: Order type to use (must be market or limit)
:param amount: Amount to sell. Full sell if not given
health
Provides a quick health check of the running bot.
lock_add
Manually lock a specific pair
:param pair: Pair to lock
:param until: Lock until this date (format "2024-03-30 16:00:00Z")
:param side: Side to lock (long, short, *)
:param reason: Reason for the lock
locks
Return current locks
logs
Show latest logs.
:param limit: Limits log messages to the last <limit> logs. No limit to get the entire log.
pair_candles
Return live dataframe for <pair><timeframe>.
:param pair: Pair to get data for
:param timeframe: Only pairs with this timeframe available.
:param limit: Limit result to the last n candles.
pair_history
Return historic, analyzed dataframe
:param pair: Pair to get data for
:param timeframe: Only pairs with this timeframe available.
:param strategy: Strategy to analyze and get values for
:param timerange: Timerange to get data for (same format than --timerange endpoints)
performance
Return the performance of the different coins.
ping
simple ping
plot_config
Return plot configuration if the strategy defines one.
profit
Return the profit summary.
reload_config
Reload configuration.
show_config
Returns part of the configuration, relevant for trading operations.
start
Start the bot if it's in the stopped state.
pause
Pause the bot if it's in the running state. If triggered on stopped state will handle open positions.
stats
Return the stats report (durations, sell-reasons).
status
Get the status of open trades.
stop
Stop the bot. Use `start` to restart.
stopbuy
Stop buying (but handle sells gracefully). Use `reload_config` to reset.
strategies
Lists available strategies
strategy
Get strategy details
:param strategy: Strategy class name
sysinfo
Provides system information (CPU, RAM usage)
trade
Return specific trade
:param trade_id: Specify which trade to get.
trades
Return trades history, sorted by id
:param limit: Limits trades to the X last trades. Max 500 trades.
:param offset: Offset by this amount of trades.
list_open_trades_custom_data
Return a dict containing open trades custom-datas
:param key: str, optional - Key of the custom-data
:param limit: Limits trades to X trades.
:param offset: Offset by this amount of trades.
list_custom_data
Return a dict containing custom-datas of a specified trade
:param trade_id: int - ID of the trade
:param key: str, optional - Key of the custom-data
version
Return the version of the bot.
whitelist
Show the current whitelist.
```
### Available endpoints ### Available endpoints
@@ -359,7 +191,7 @@ All endpoints in the below table need to be prefixed with the base URL of the AP
| `/locks/<lockid>` | DELETE | Deletes (disables) the lock by id.<br/>*Params:*<br/>- `lockid` (`int`) | `/locks/<lockid>` | DELETE | Deletes (disables) the lock by id.<br/>*Params:*<br/>- `lockid` (`int`)
| `/profit` | GET | Display a summary of your profit/loss from close trades and some stats about your performance. | `/profit` | GET | Display a summary of your profit/loss from close trades and some stats about your performance.
| `/forceexit` | POST | Instantly exits the given trade (ignoring `minimum_roi`), using the given order type ("market" or "limit", uses your config setting if not specified), and the chosen amount (full sell if not specified). If `all` is supplied as the `tradeid`, then all currently open trades will be forced to exit.<br/>*Params:*<br/>- `<tradeid>` (`int` or `str`)<br/>- `<ordertype>` (`str`)<br/>- `[amount]` (`float`) | `/forceexit` | POST | Instantly exits the given trade (ignoring `minimum_roi`), using the given order type ("market" or "limit", uses your config setting if not specified), and the chosen amount (full sell if not specified). If `all` is supplied as the `tradeid`, then all currently open trades will be forced to exit.<br/>*Params:*<br/>- `<tradeid>` (`int` or `str`)<br/>- `<ordertype>` (`str`)<br/>- `[amount]` (`float`)
| `/forceenter` | POST | Instantly enters the given pair. Side is optional and is either `long` or `short` (default is `long`). Rate is optional. (`force_entry_enable` must be set to True)<br/>*Params:*<br/>- `<pair>` (`str`)<br/>- `<side>` (`str`)<br/>- `[rate]` (`float`) | `/forceenter` | POST | Instantly enters the given pair. Side is optional and is either `long` or `short` (default is `long`). Price, stake amount, entry tag and leverage are optional. Order type is optional and is either `market` or `long` (default using the value set in config). (`force_entry_enable` must be set to True)<br/>*Params:*<br/>- `<pair>` (`str`)<br/>- `<side>` (`str`)<br/>- `[price]` (`float`)<br/>- `[ordertype]` (`str`)<br/>- `[stakeamount]` (`float`)<br/>- `[entry_tag]` (`str`)<br/>- `[leverage]` (`float`)
| `/performance` | GET | Show performance of each finished trade grouped by pair. | `/performance` | GET | Show performance of each finished trade grouped by pair.
| `/balance` | GET | Show account balance per currency. | `/balance` | GET | Show account balance per currency.
| `/daily` | GET | Shows profit or loss per day, over the last n days (n defaults to 7).<br/>*Params:*<br/>- `timescale` (`int`) | `/daily` | GET | Shows profit or loss per day, over the last n days (n defaults to 7).<br/>*Params:*<br/>- `timescale` (`int`)

View File

@@ -1,6 +1,6 @@
"""Freqtrade bot""" """Freqtrade bot"""
__version__ = "2025.10-dev" __version__ = "2025.11-dev"
if "dev" in __version__: if "dev" in __version__:
from pathlib import Path from pathlib import Path

View File

@@ -64,7 +64,6 @@ ARGS_BACKTEST = [
ARGS_HYPEROPT = [ ARGS_HYPEROPT = [
*ARGS_COMMON_OPTIMIZE, *ARGS_COMMON_OPTIMIZE,
"hyperopt",
"hyperopt_path", "hyperopt_path",
"position_stacking", "position_stacking",
"enable_protections", "enable_protections",
@@ -105,7 +104,7 @@ ARGS_BACKTEST_SHOW = [
ARGS_LIST_EXCHANGES = ["print_one_column", "list_exchanges_all", "trading_mode", "dex_exchanges"] ARGS_LIST_EXCHANGES = ["print_one_column", "list_exchanges_all", "trading_mode", "dex_exchanges"]
ARGS_LIST_TIMEFRAMES = ["exchange", "print_one_column"] ARGS_LIST_TIMEFRAMES = ["exchange", "print_one_column", "trading_mode"]
ARGS_LIST_PAIRS = [ ARGS_LIST_PAIRS = [
"exchange", "exchange",

View File

@@ -2,10 +2,13 @@
Definition of cli arguments used in arguments.py Definition of cli arguments used in arguments.py
""" """
from argparse import SUPPRESS, ArgumentTypeError from argparse import ArgumentTypeError
from freqtrade import constants from freqtrade import constants
from freqtrade.constants import HYPEROPT_LOSS_BUILTIN from freqtrade.constants import (
HYPEROPT_BUILTIN_SPACE_OPTIONS,
HYPEROPT_LOSS_BUILTIN,
)
from freqtrade.enums import CandleType from freqtrade.enums import CandleType
@@ -256,12 +259,6 @@ AVAILABLE_CLI_OPTIONS = {
choices=constants.BACKTEST_CACHE_AGE, choices=constants.BACKTEST_CACHE_AGE,
), ),
# Hyperopt # Hyperopt
"hyperopt": Arg(
"--hyperopt",
help=SUPPRESS,
metavar="NAME",
required=False,
),
"hyperopt_path": Arg( "hyperopt_path": Arg(
"--hyperopt-path", "--hyperopt-path",
help="Specify additional lookup path for Hyperopt Loss functions.", help="Specify additional lookup path for Hyperopt Loss functions.",
@@ -284,26 +281,18 @@ AVAILABLE_CLI_OPTIONS = {
), ),
"spaces": Arg( "spaces": Arg(
"--spaces", "--spaces",
help="Specify which parameters to hyperopt. Space-separated list.", help=(
choices=[ "Specify which parameters to hyperopt. Space-separated list. "
"all", "Available builtin options (custom spaces will not be listed here): "
"buy", f"{', '.join(HYPEROPT_BUILTIN_SPACE_OPTIONS)}. Default: `default` - "
"sell", "which includes all spaces except for 'trailing', 'protection', and 'trades'."
"roi", ),
"stoploss",
"trailing",
"protection",
"trades",
"default",
],
nargs="+", nargs="+",
default="default",
), ),
"analyze_per_epoch": Arg( "analyze_per_epoch": Arg(
"--analyze-per-epoch", "--analyze-per-epoch",
help="Run populate_indicators once per epoch.", help="Run populate_indicators once per epoch.",
action="store_true", action="store_true",
default=False,
), ),
"print_all": Arg( "print_all": Arg(
"--print-all", "--print-all",

View File

@@ -101,7 +101,7 @@ def _print_objs_tabular(objs: list, print_colorized: bool) -> None:
names = [s["name"] for s in objs] names = [s["name"] for s in objs]
objs_to_print: list[dict[str, Text | str]] = [ objs_to_print: list[dict[str, Text | str]] = [
{ {
"name": Text(s["name"] if s["name"] else "--"), "Strategy name": Text(s["name"] if s["name"] else "--"),
"location": s["location_rel"], "location": s["location_rel"],
"status": ( "status": (
Text("LOAD FAILED", style="bold red") Text("LOAD FAILED", style="bold red")
@@ -115,11 +115,19 @@ def _print_objs_tabular(objs: list, print_colorized: bool) -> None:
] ]
for idx, s in enumerate(objs): for idx, s in enumerate(objs):
if "hyperoptable" in s: if "hyperoptable" in s:
custom_params = [
f"{space}: {len(params)}"
for space, params in s["hyperoptable"].items()
if space not in ["buy", "sell", "protection"]
]
hyp = s["hyperoptable"]
objs_to_print[idx].update( objs_to_print[idx].update(
{ {
"hyperoptable": "Yes" if s["hyperoptable"]["count"] > 0 else "No", "hyperoptable": "Yes" if len(hyp) > 0 else "No",
"buy-Params": str(len(s["hyperoptable"].get("buy", []))), "buy-Params": str(len(hyp.get("buy", []))),
"sell-Params": str(len(s["hyperoptable"].get("sell", []))), "sell-Params": str(len(hyp.get("sell", []))),
"protection-Params": str(len(hyp.get("protection", []))),
"custom-Params": ", ".join(custom_params) if custom_params else "",
} }
) )
table = Table() table = Table()
@@ -140,6 +148,7 @@ def start_list_strategies(args: dict[str, Any]) -> None:
""" """
from freqtrade.configuration import setup_utils_configuration from freqtrade.configuration import setup_utils_configuration
from freqtrade.resolvers import StrategyResolver from freqtrade.resolvers import StrategyResolver
from freqtrade.strategy.hyper import detect_all_parameters
config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE) config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)
@@ -153,9 +162,9 @@ def start_list_strategies(args: dict[str, Any]) -> None:
strategy_objs = sorted(strategy_objs, key=lambda x: x["name"]) strategy_objs = sorted(strategy_objs, key=lambda x: x["name"])
for obj in strategy_objs: for obj in strategy_objs:
if obj["class"]: if obj["class"]:
obj["hyperoptable"] = obj["class"].detect_all_parameters() obj["hyperoptable"] = detect_all_parameters(obj["class"])
else: else:
obj["hyperoptable"] = {"count": 0} obj["hyperoptable"] = {}
if args["print_one_column"]: if args["print_one_column"]:
print("\n".join([s["name"] for s in strategy_objs])) print("\n".join([s["name"] for s in strategy_objs]))

View File

@@ -1,11 +1,14 @@
# Required json-schema for user specified config # Required json-schema for user specified config
from freqtrade.constants import ( from freqtrade.constants import (
AVAILABLE_DATAHANDLERS, AVAILABLE_DATAHANDLERS,
AVAILABLE_PAIRLISTS, AVAILABLE_PAIRLISTS,
BACKTEST_BREAKDOWNS, BACKTEST_BREAKDOWNS,
BACKTEST_CACHE_AGE,
DRY_RUN_WALLET, DRY_RUN_WALLET,
EXPORT_OPTIONS, EXPORT_OPTIONS,
HYPEROPT_LOSS_BUILTIN,
MARGIN_MODES, MARGIN_MODES,
ORDERTIF_POSSIBILITIES, ORDERTIF_POSSIBILITIES,
ORDERTYPE_POSSIBILITIES, ORDERTYPE_POSSIBILITIES,
@@ -228,6 +231,76 @@ CONF_SCHEMA = {
"type": "array", "type": "array",
"items": {"type": "string", "enum": BACKTEST_BREAKDOWNS}, "items": {"type": "string", "enum": BACKTEST_BREAKDOWNS},
}, },
"backtest_cache": {
"description": "Load a cached backtest result no older than specified age.",
"type": "string",
"enum": BACKTEST_CACHE_AGE,
},
# Hyperopt
"hyperopt_path": {
"description": "Specify additional lookup path for Hyperopt Loss functions.",
"type": "string",
},
"epochs": {
"description": "Number of training epochs for Hyperopt.",
"type": "integer",
"minimum": 1,
},
"early_stop": {
"description": (
"Early stop hyperopt if no improvement after <epochs>. Set to 0 to disable."
),
"type": "integer",
"minimum": 0,
},
"spaces": {
"description": (
"Hyperopt parameter spaces to optimize. Default is the default set and"
"includes all spaces except for 'trailing', 'protection', and 'trades'."
),
"type": "array",
"items": {"type": "string"},
"default": ["default"],
},
"analyze_per_epoch": {
"description": "Perform analysis after each epoch in Hyperopt.",
"type": "boolean",
},
"print_all": {
"description": "Print all hyperopt trials, not just the best ones.",
"type": "boolean",
"default": False,
},
"hyperopt_jobs": {
"description": (
"The number of concurrently running jobs for hyperoptimization "
"(hyperopt worker processes). "
"If -1 (default), all CPUs are used, for -2, all CPUs but one are used, etc. "
"If 1 is given, no parallel computing is used."
),
"type": "integer",
"default": -1,
},
"hyperopt_random_state": {
"description": "Random state for hyperopt trials.",
"type": "integer",
"minimum": 0,
},
"hyperopt_min_trades": {
"description": "Minimum number of trades per epoch for hyperopt.",
"type": "integer",
"minimum": 0,
},
"hyperopt_loss": {
"description": (
"The class name of the hyperopt loss function class (IHyperOptLoss). "
"Different functions can generate completely different results, "
"since the target for optimization is different. "
f"Built-in Hyperopt-loss-functions are: {', '.join(HYPEROPT_LOSS_BUILTIN)}"
),
"type": "string",
},
# end hyperopt
"bot_name": { "bot_name": {
"description": "Name of the trading bot. Passed via API to a client.", "description": "Name of the trading bot. Passed via API to a client.",
"type": "string", "type": "string",

View File

@@ -336,7 +336,6 @@ class Configuration:
# Hyperopt section # Hyperopt section
configurations = [ configurations = [
("hyperopt", "Using Hyperopt class name: {}"),
("hyperopt_path", "Using additional Hyperopt lookup path: {}"), ("hyperopt_path", "Using additional Hyperopt lookup path: {}"),
("hyperoptexportfilename", "Using hyperopt file: {}"), ("hyperoptexportfilename", "Using hyperopt file: {}"),
("lookahead_analysis_exportfilename", "Saving lookahead analysis results into {} ..."), ("lookahead_analysis_exportfilename", "Saving lookahead analysis results into {} ..."),

View File

@@ -41,6 +41,19 @@ HYPEROPT_LOSS_BUILTIN = [
"ProfitDrawDownHyperOptLoss", "ProfitDrawDownHyperOptLoss",
"MultiMetricHyperOptLoss", "MultiMetricHyperOptLoss",
] ]
HYPEROPT_BUILTIN_SPACES = [
"buy",
"sell",
"enter",
"exit",
"roi",
"stoploss",
"trailing",
"protection",
"trades",
]
HYPEROPT_BUILTIN_SPACE_OPTIONS = ["default", "all"] + HYPEROPT_BUILTIN_SPACES
AVAILABLE_PAIRLISTS = [ AVAILABLE_PAIRLISTS = [
"StaticPairList", "StaticPairList",
"VolumePairList", "VolumePairList",

View File

@@ -388,8 +388,10 @@ def refresh_backtest_ohlcv_data(
for timeframe in timeframes: for timeframe in timeframes:
# Get fast candles via parallel method on first loop through per timeframe # Get fast candles via parallel method on first loop through per timeframe
# and candle type. Downloads all the pairs in the list and stores them. # and candle type. Downloads all the pairs in the list and stores them.
# Also skips if only 1 pair/timeframe combination is scheduled for download.
if ( if (
not no_parallel_download not no_parallel_download
and (len(pairs) + len(timeframes)) > 2
and exchange.get_option("download_data_parallel_quick", True) and exchange.get_option("download_data_parallel_quick", True)
and ( and (
((pair, timeframe, candle_type) not in fast_candles) ((pair, timeframe, candle_type) not in fast_candles)
@@ -474,7 +476,7 @@ def _download_all_pairs_history_parallel(
:return: Candle pairs with timeframes :return: Candle pairs with timeframes
""" """
candles: dict[PairWithTimeframe, DataFrame] = {} candles: dict[PairWithTimeframe, DataFrame] = {}
since = 0 since: int | None = None
if timerange: if timerange:
if timerange.starttype == "date": if timerange.starttype == "date":
since = timerange.startts * 1000 since = timerange.startts * 1000
@@ -482,10 +484,12 @@ def _download_all_pairs_history_parallel(
candle_limit = exchange.ohlcv_candle_limit(timeframe, candle_type) candle_limit = exchange.ohlcv_candle_limit(timeframe, candle_type)
one_call_min_time_dt = dt_ts(date_minus_candles(timeframe, candle_limit)) one_call_min_time_dt = dt_ts(date_minus_candles(timeframe, candle_limit))
# check if we can get all candles in one go, if so then we can download them in parallel # check if we can get all candles in one go, if so then we can download them in parallel
if since > one_call_min_time_dt: if since is None or since > one_call_min_time_dt:
logger.info( logger.info(
f"Downloading parallel candles for {timeframe} for all pairs " f"Downloading parallel candles for {timeframe} for all pairs"
f"since {format_ms_time(since)}" f" since {format_ms_time(since)}"
if since
else "."
) )
needed_pairs: ListPairsWithTimeframes = [ needed_pairs: ListPairsWithTimeframes = [
(p, timeframe, candle_type) for p in [p for p in pairs] (p, timeframe, candle_type) for p in [p for p in pairs]
@@ -693,6 +697,9 @@ def download_data(
""" """
Download data function. Used from both cli and API. Download data function. Used from both cli and API.
""" """
exchange.validate_trading_mode_and_margin_mode(
config.get("trading_mode", TradingMode.SPOT), None, allow_none_margin_mode=True
)
timerange = TimeRange() timerange = TimeRange()
if "days" in config and config["days"] is not None: if "days" in config and config["days"] is not None:
time_since = (datetime.now() - timedelta(days=config["days"])).strftime("%Y%m%d") time_since = (datetime.now() - timedelta(days=config["days"])).strftime("%Y%m%d")

View File

@@ -143,6 +143,20 @@ def _calc_drawdown_series(
max_drawdown_df["drawdown_relative"] = ( max_drawdown_df["drawdown_relative"] = (
max_drawdown_df["high_value"] - max_drawdown_df["cumulative"] max_drawdown_df["high_value"] - max_drawdown_df["cumulative"]
) / max_drawdown_df["high_value"] ) / max_drawdown_df["high_value"]
# Add zero row at start to account for edge-cases with no winning / losing trades - so high/low
# will be 0.0 in such cases.
zero_row = pd.DataFrame(
{
"cumulative": [0.0],
"high_value": [0.0],
"drawdown": [0.0],
"drawdown_relative": [0.0],
"date": [profit_results.loc[0, date_col]],
}
)
max_drawdown_df = pd.concat([zero_row, max_drawdown_df], ignore_index=True)
return max_drawdown_df return max_drawdown_df
@@ -215,6 +229,7 @@ def calculate_max_drawdown(
max_drawdown_df = _calc_drawdown_series( max_drawdown_df = _calc_drawdown_series(
profit_results, date_col=date_col, value_col=value_col, starting_balance=starting_balance profit_results, date_col=date_col, value_col=value_col, starting_balance=starting_balance
) )
# max_drawdown_df has an extra zero row at the start
# Calculate maximum drawdown # Calculate maximum drawdown
idxmin = ( idxmin = (
@@ -223,15 +238,15 @@ def calculate_max_drawdown(
else max_drawdown_df["drawdown"].idxmin() else max_drawdown_df["drawdown"].idxmin()
) )
high_idx = max_drawdown_df.iloc[: idxmin + 1]["high_value"].idxmax() high_idx = max_drawdown_df.iloc[: idxmin + 1]["high_value"].idxmax()
high_date = profit_results.loc[high_idx, date_col] high_date = profit_results.at[max(high_idx - 1, 0), date_col]
low_date = profit_results.loc[idxmin, date_col] low_date = profit_results.at[max(idxmin - 1, 0), date_col]
high_val = max_drawdown_df.loc[high_idx, "cumulative"] high_val = max_drawdown_df.at[high_idx, "cumulative"]
low_val = max_drawdown_df.loc[idxmin, "cumulative"] low_val = max_drawdown_df.at[idxmin, "cumulative"]
max_drawdown_rel = max_drawdown_df.loc[idxmin, "drawdown_relative"] max_drawdown_rel = max_drawdown_df.at[idxmin, "drawdown_relative"]
# Calculate current drawdown # Calculate current drawdown
current_high_idx = max_drawdown_df["high_value"].iloc[:-1].idxmax() current_high_idx = max_drawdown_df["high_value"].iloc[:-1].idxmax()
current_high_date = profit_results.loc[current_high_idx, date_col] current_high_date = profit_results.at[max(current_high_idx - 1, 0), date_col]
current_high_value = max_drawdown_df.iloc[-1]["high_value"] current_high_value = max_drawdown_df.iloc[-1]["high_value"]
current_cumulative = max_drawdown_df.iloc[-1]["cumulative"] current_cumulative = max_drawdown_df.iloc[-1]["cumulative"]
current_drawdown_abs = current_high_value - current_cumulative current_drawdown_abs = current_high_value - current_cumulative

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,10 @@
import logging import logging
from datetime import timedelta from datetime import datetime, timedelta
import ccxt import ccxt
from freqtrade.constants import BuySell from freqtrade.constants import BuySell
from freqtrade.enums import CandleType, MarginMode, TradingMode from freqtrade.enums import OPTIMIZE_MODES, CandleType, MarginMode, TradingMode
from freqtrade.exceptions import ( from freqtrade.exceptions import (
DDosProtection, DDosProtection,
OperationalException, OperationalException,
@@ -14,7 +14,7 @@ from freqtrade.exceptions import (
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.common import API_RETRY_COUNT, retrier from freqtrade.exchange.common import API_RETRY_COUNT, retrier
from freqtrade.exchange.exchange_types import CcxtOrder, FtHas from freqtrade.exchange.exchange_types import CcxtOrder, FtHas
from freqtrade.util.datetime_helpers import dt_now, dt_ts from freqtrade.util import dt_from_ts, dt_now, dt_ts
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -37,6 +37,7 @@ class Bitget(Exchange):
_ft_has_futures: FtHas = { _ft_has_futures: FtHas = {
"mark_ohlcv_timeframe": "4h", "mark_ohlcv_timeframe": "4h",
"funding_fee_candle_limit": 100, "funding_fee_candle_limit": 100,
"has_delisting": True,
} }
_supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [ _supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [
@@ -236,3 +237,35 @@ class Bitget(Exchange):
raise OperationalException( raise OperationalException(
"Freqtrade currently only supports isolated futures for bitget" "Freqtrade currently only supports isolated futures for bitget"
) )
def check_delisting_time(self, pair: str) -> datetime | None:
"""
Check if the pair gonna be delisted.
By default, it returns None.
:param pair: Market symbol
:return: Datetime if the pair gonna be delisted, None otherwise
"""
if self._config["runmode"] in OPTIMIZE_MODES:
return None
if self.trading_mode == TradingMode.FUTURES:
return self._check_delisting_futures(pair)
return None
def _check_delisting_futures(self, pair: str) -> datetime | None:
delivery_time = self.markets.get(pair, {}).get("info", {}).get("limitOpenTime", None)
if delivery_time:
if isinstance(delivery_time, str) and (delivery_time != ""):
delivery_time = int(delivery_time)
if not isinstance(delivery_time, int) or delivery_time <= 0:
return None
max_delivery = dt_ts() + (
14 * 24 * 60 * 60 * 1000
) # Assume exchange don't announce delisting more than 14 days in advance
if delivery_time < max_delivery:
return dt_from_ts(delivery_time)
return None

View File

@@ -4,12 +4,13 @@ from datetime import datetime, timedelta
import ccxt import ccxt
from freqtrade.constants import BuySell from freqtrade.constants import BuySell
from freqtrade.enums import MarginMode, PriceType, TradingMode from freqtrade.enums import OPTIMIZE_MODES, MarginMode, PriceType, TradingMode
from freqtrade.exceptions import DDosProtection, ExchangeError, OperationalException, TemporaryError from freqtrade.exceptions import DDosProtection, ExchangeError, OperationalException, TemporaryError
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.common import retrier from freqtrade.exchange.common import retrier
from freqtrade.exchange.exchange_types import CcxtOrder, FtHas from freqtrade.exchange.exchange_types import CcxtOrder, FtHas
from freqtrade.misc import deep_merge_dicts from freqtrade.misc import deep_merge_dicts
from freqtrade.util import dt_from_ts, dt_ts
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -54,6 +55,7 @@ class Bybit(Exchange):
"exchange_has_overrides": { "exchange_has_overrides": {
"fetchOrder": True, "fetchOrder": True,
}, },
"has_delisting": True,
} }
_supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [ _supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [
@@ -294,3 +296,35 @@ class Bybit(Exchange):
self.cache_leverage_tiers(tiers, self._config["stake_currency"]) self.cache_leverage_tiers(tiers, self._config["stake_currency"])
return tiers return tiers
def check_delisting_time(self, pair: str) -> datetime | None:
"""
Check if the pair gonna be delisted.
By default, it returns None.
:param pair: Market symbol
:return: Datetime if the pair gonna be delisted, None otherwise
"""
if self._config["runmode"] in OPTIMIZE_MODES:
return None
if self.trading_mode == TradingMode.FUTURES:
return self._check_delisting_futures(pair)
return None
def _check_delisting_futures(self, pair: str) -> datetime | None:
delivery_time = self.markets.get(pair, {}).get("info", {}).get("deliveryTime", 0)
if delivery_time:
if isinstance(delivery_time, str) and (delivery_time != ""):
delivery_time = int(delivery_time)
if not isinstance(delivery_time, int) or delivery_time <= 0:
return None
max_delivery = dt_ts() + (
14 * 24 * 60 * 60 * 1000
) # Assume exchange don't announce delisting more than 14 days in advance
if delivery_time < max_delivery:
return dt_from_ts(delivery_time)
return None

View File

@@ -430,7 +430,15 @@ class Exchange:
@property @property
def timeframes(self) -> list[str]: def timeframes(self) -> list[str]:
return list((self._api.timeframes or {}).keys()) market_type = (
"spot"
if self.trading_mode != TradingMode.FUTURES
else self._ft_has["ccxt_futures_name"]
)
timeframes = self._api.options.get("timeframes", {}).get(market_type)
if timeframes is None:
timeframes = self._api.timeframes
return list((timeframes or {}).keys())
@property @property
def markets(self) -> dict[str, Any]: def markets(self) -> dict[str, Any]:
@@ -891,6 +899,7 @@ class Exchange:
self, self,
trading_mode: TradingMode, trading_mode: TradingMode,
margin_mode: MarginMode | None, # Only None when trading_mode = TradingMode.SPOT margin_mode: MarginMode | None, # Only None when trading_mode = TradingMode.SPOT
allow_none_margin_mode: bool = False,
): ):
""" """
Checks if freqtrade can perform trades using the configured Checks if freqtrade can perform trades using the configured
@@ -898,7 +907,18 @@ class Exchange:
Throws OperationalException: Throws OperationalException:
If the trading_mode/margin_mode type are not supported by freqtrade on this exchange If the trading_mode/margin_mode type are not supported by freqtrade on this exchange
""" """
if trading_mode != TradingMode.SPOT and ( if trading_mode == TradingMode.SPOT:
return
if allow_none_margin_mode and margin_mode is None:
# Verify trading mode independent of margin mode
if not any(
trading_mode == pair[0] for pair in self._supported_trading_mode_margin_pairs
):
raise ConfigurationError(
f"Freqtrade does not support '{trading_mode}' on {self.name}."
)
if not allow_none_margin_mode and (
(trading_mode, margin_mode) not in self._supported_trading_mode_margin_pairs (trading_mode, margin_mode) not in self._supported_trading_mode_margin_pairs
): ):
mm_value = margin_mode and margin_mode.value mm_value = margin_mode and margin_mode.value
@@ -1283,7 +1303,7 @@ class Exchange:
return order return order
def fetch_dry_run_order(self, order_id) -> CcxtOrder: def fetch_dry_run_order(self, order_id: str) -> CcxtOrder:
""" """
Return dry-run order Return dry-run order
Only call if running in dry-run mode. Only call if running in dry-run mode.
@@ -1295,11 +1315,12 @@ class Exchange:
except KeyError as e: except KeyError as e:
from freqtrade.persistence import Order from freqtrade.persistence import Order
order = Order.order_by_id(order_id) order_obj = Order.order_by_id(order_id)
if order: if order_obj:
ccxt_order = order.to_ccxt_object(self._ft_has["stop_price_prop"]) order = order_obj.to_ccxt_object(self._ft_has["stop_price_prop"])
self._dry_run_open_orders[order_id] = ccxt_order order = self.check_dry_limit_order_filled(order)
return ccxt_order self._dry_run_open_orders[order_id] = order
return order
# Gracefully handle errors with dry-run orders. # Gracefully handle errors with dry-run orders.
raise InvalidOrderException( raise InvalidOrderException(
f"Tried to get an invalid dry-run-order (id: {order_id}). Message: {e}" f"Tried to get an invalid dry-run-order (id: {order_id}). Message: {e}"

View File

@@ -11,7 +11,7 @@ from freqtrade.exceptions import (
RetryableOrderError, RetryableOrderError,
TemporaryError, TemporaryError,
) )
from freqtrade.exchange import Exchange, date_minus_candles from freqtrade.exchange import Exchange
from freqtrade.exchange.common import API_RETRY_COUNT, retrier from freqtrade.exchange.common import API_RETRY_COUNT, retrier
from freqtrade.exchange.exchange_types import CcxtOrder, FtHas from freqtrade.exchange.exchange_types import CcxtOrder, FtHas
from freqtrade.misc import safe_value_fallback2 from freqtrade.misc import safe_value_fallback2
@@ -80,11 +80,6 @@ class Okx(Exchange):
if candle_type in (CandleType.FUTURES, CandleType.SPOT): if candle_type in (CandleType.FUTURES, CandleType.SPOT):
return 300 return 300
if candle_type in (CandleType.MARK, CandleType.PREMIUMINDEX) and (
not since_ms or since_ms > (date_minus_candles(timeframe, 300).timestamp() * 1000)
):
return 300
return super().ohlcv_candle_limit(timeframe, candle_type, since_ms) return super().ohlcv_candle_limit(timeframe, candle_type, since_ms)
@retrier @retrier

View File

@@ -301,8 +301,8 @@ class FreqaiDataDrawer:
hist_preds = self.historic_predictions[pair].copy() hist_preds = self.historic_predictions[pair].copy()
# ensure both dataframes have the same date format so they can be merged # ensure both dataframes have the same date format so they can be merged
new_pred["date_pred"] = pd.to_datetime(new_pred["date_pred"]).dt.tz_localize(None) new_pred["date_pred"] = pd.to_datetime(new_pred["date_pred"])
hist_preds["date_pred"] = pd.to_datetime(hist_preds["date_pred"]).dt.tz_localize(None) hist_preds["date_pred"] = pd.to_datetime(hist_preds["date_pred"])
# find the closest common date between new_pred and historic predictions # find the closest common date between new_pred and historic predictions
# and cut off the new_pred dataframe at that date # and cut off the new_pred dataframe at that date

View File

@@ -1,5 +1,5 @@
""" """
Freqtrade is the main module of this bot. It contains the class Freqtrade() Freqtrade is the main module of this bot. It contains the FreqtradeBot class.
""" """
import logging import logging
@@ -63,7 +63,7 @@ from freqtrade.rpc.rpc_types import (
from freqtrade.strategy.interface import IStrategy from freqtrade.strategy.interface import IStrategy
from freqtrade.strategy.strategy_wrapper import strategy_safe_wrapper from freqtrade.strategy.strategy_wrapper import strategy_safe_wrapper
from freqtrade.util import FtPrecise, MeasureTime, PeriodicCache, dt_from_ts, dt_now from freqtrade.util import FtPrecise, MeasureTime, PeriodicCache, dt_from_ts, dt_now
from freqtrade.util.migrations.binance_mig import migrate_binance_futures_names from freqtrade.util.migrations import migrate_live_content
from freqtrade.wallets import Wallets from freqtrade.wallets import Wallets
@@ -229,7 +229,7 @@ class FreqtradeBot(LoggingMixin):
Called on startup and after reloading the bot - triggers notifications and Called on startup and after reloading the bot - triggers notifications and
performs startup tasks performs startup tasks
""" """
migrate_binance_futures_names(self.config) migrate_live_content(self.config, self.exchange)
set_startup_time() set_startup_time()
self.rpc.startup_messages(self.config, self.pairlists, self.protections) self.rpc.startup_messages(self.config, self.pairlists, self.protections)

View File

@@ -92,9 +92,11 @@ def _set_log_levels(
# Set default levels for third party libraries # Set default levels for third party libraries
third_party_loggers = { third_party_loggers = {
"freqtrade": logging.INFO if verbosity <= 1 else logging.DEBUG, "freqtrade": logging.INFO if verbosity < 1 else logging.DEBUG,
"freqtrade.exchange.exchange_ws": logging.INFO if verbosity <= 1 else logging.DEBUG,
"requests": logging.INFO if verbosity <= 1 else logging.DEBUG, "requests": logging.INFO if verbosity <= 1 else logging.DEBUG,
"urllib3": logging.INFO if verbosity <= 1 else logging.DEBUG, "urllib3": logging.INFO if verbosity <= 1 else logging.DEBUG,
"asyncio": logging.INFO if verbosity <= 1 else logging.DEBUG,
"httpcore": logging.INFO if verbosity <= 1 else logging.DEBUG, "httpcore": logging.INFO if verbosity <= 1 else logging.DEBUG,
"ccxt.base.exchange": logging.INFO if verbosity <= 2 else logging.DEBUG, "ccxt.base.exchange": logging.INFO if verbosity <= 2 else logging.DEBUG,
"telegram": logging.INFO, "telegram": logging.INFO,

View File

@@ -8,6 +8,7 @@ from typing import Any
from pandas import DataFrame from pandas import DataFrame
from freqtrade.exceptions import ConfigurationError
from freqtrade.exchange import timeframe_to_minutes from freqtrade.exchange import timeframe_to_minutes
from freqtrade.loggers.set_log_levels import ( from freqtrade.loggers.set_log_levels import (
reduce_verbosity_for_bias_tester, reduce_verbosity_for_bias_tester,
@@ -38,6 +39,7 @@ class RecursiveAnalysis(BaseAnalysis):
self.dict_recursive: dict[str, Any] = dict() self.dict_recursive: dict[str, Any] = dict()
self.pair_to_used: str | None = None self.pair_to_used: str | None = None
self._strat_scc: int | None = None
# For recursive bias check # For recursive bias check
# analyzes two data frames with processed indicators and shows differences between them. # analyzes two data frames with processed indicators and shows differences between them.
@@ -150,7 +152,15 @@ class RecursiveAnalysis(BaseAnalysis):
backtesting._set_strategy(backtesting.strategylist[0]) backtesting._set_strategy(backtesting.strategylist[0])
strat = backtesting.strategy strat = backtesting.strategy
self._strat_scc = strat.startup_candle_count if self._strat_scc is None:
self._strat_scc = strat.startup_candle_count
if self._strat_scc < 1:
raise ConfigurationError(
f"The strategy defines invalid startup candle count of {self._strat_scc}. "
f"This will lead to recursive issues on some indicators. "
f"Please define a proper startup_candle_count in the strategy."
)
if self._strat_scc not in self._startup_candle: if self._strat_scc not in self._startup_candle:
self._startup_candle.append(self._strat_scc) self._startup_candle.append(self._strat_scc)

View File

@@ -18,7 +18,6 @@ from optuna.trial import FrozenTrial, Trial, TrialState
from freqtrade.constants import FTHYPT_FILEVERSION, LAST_BT_RESULT_FN, Config from freqtrade.constants import FTHYPT_FILEVERSION, LAST_BT_RESULT_FN, Config
from freqtrade.enums import HyperoptState from freqtrade.enums import HyperoptState
from freqtrade.exceptions import OperationalException
from freqtrade.misc import file_dump_json, plural from freqtrade.misc import file_dump_json, plural
from freqtrade.optimize.hyperopt.hyperopt_optimizer import INITIAL_POINTS, HyperOptimizer from freqtrade.optimize.hyperopt.hyperopt_optimizer import INITIAL_POINTS, HyperOptimizer
from freqtrade.optimize.hyperopt.hyperopt_output import HyperoptOutput from freqtrade.optimize.hyperopt.hyperopt_output import HyperoptOutput
@@ -50,12 +49,6 @@ class Hyperopt:
self.analyze_per_epoch = self.config.get("analyze_per_epoch", False) self.analyze_per_epoch = self.config.get("analyze_per_epoch", False)
HyperoptStateContainer.set_state(HyperoptState.STARTUP) HyperoptStateContainer.set_state(HyperoptState.STARTUP)
if self.config.get("hyperopt"):
raise OperationalException(
"Using separate Hyperopt files has been removed in 2021.9. Please convert "
"your existing Hyperopt file to the new Hyperoptable strategy interface"
)
time_now = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") time_now = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
strategy = str(self.config["strategy"]) strategy = str(self.config["strategy"])
self.results_file: Path = ( self.results_file: Path = (

View File

@@ -7,6 +7,7 @@ This module implements a convenience auto-hyperopt class, which can be used toge
import logging import logging
from collections.abc import Callable from collections.abc import Callable
from contextlib import suppress from contextlib import suppress
from typing import Literal
from freqtrade.exceptions import OperationalException from freqtrade.exceptions import OperationalException
@@ -37,10 +38,17 @@ def _format_exception_message(space: str, ignore_missing_space: bool) -> None:
class HyperOptAuto(IHyperOpt): class HyperOptAuto(IHyperOpt):
""" """
This class delegates functionality to Strategy(IHyperStrategy) and Strategy.HyperOpt classes. This class delegates functionality to Strategy(IHyperStrategy) and Strategy.HyperOpt classes.
Most of the time Strategy.HyperOpt class would only implement indicator_space and Most of the time Strategy.HyperOpt class would only implement indicator_space and
sell_indicator_space methods, but other hyperopt methods can be overridden as well. sell_indicator_space methods, but other hyperopt methods can be overridden as well.
""" """
def get_available_spaces(self) -> list[str]:
"""
Get list of available spaces defined in strategy.
:return: list of available spaces.
"""
return list(self.strategy._ft_hyper_params)
def _get_func(self, name) -> Callable: def _get_func(self, name) -> Callable:
""" """
Return a function defined in Strategy.HyperOpt class, or one defined in super() class. Return a function defined in Strategy.HyperOpt class, or one defined in super() class.
@@ -54,31 +62,26 @@ class HyperOptAuto(IHyperOpt):
else: else:
return default_func return default_func
def _generate_indicator_space(self, category): def get_indicator_space(
for attr_name, attr in self.strategy.enumerate_parameters(category): self, space: Literal["buy", "sell", "enter", "exit", "protection"] | str
if attr.optimize: ) -> list:
yield attr.get_space(attr_name) """
Get indicator space for a given space.
def _get_indicator_space(self, category) -> list: :param space: parameter space to get.
# TODO: is this necessary, or can we call "generate_space" directly? """
indicator_space = list(self._generate_indicator_space(category)) indicator_space = [
attr.get_space(attr_name)
for attr_name, attr in self.strategy.enumerate_parameters(space)
if attr.optimize
]
if len(indicator_space) > 0: if len(indicator_space) > 0:
return indicator_space return indicator_space
else: else:
_format_exception_message( _format_exception_message(
category, self.config.get("hyperopt_ignore_missing_space", False) space, self.config.get("hyperopt_ignore_missing_space", False)
) )
return [] return []
def buy_indicator_space(self) -> list["Dimension"]:
return self._get_indicator_space("buy")
def sell_indicator_space(self) -> list["Dimension"]:
return self._get_indicator_space("sell")
def protection_space(self) -> list["Dimension"]:
return self._get_indicator_space("protection")
def generate_roi_table(self, params: dict) -> dict[int, float]: def generate_roi_table(self, params: dict) -> dict[int, float]:
return self._get_func("generate_roi_table")(params) return self._get_func("generate_roi_table")(params)

View File

@@ -70,13 +70,7 @@ class HyperOptimizer:
""" """
def __init__(self, config: Config, data_pickle_file: Path) -> None: def __init__(self, config: Config, data_pickle_file: Path) -> None:
self.buy_space: list[DimensionProtocol] = [] self.spaces: dict[str, list[DimensionProtocol]] = {}
self.sell_space: list[DimensionProtocol] = []
self.protection_space: list[DimensionProtocol] = []
self.roi_space: list[DimensionProtocol] = []
self.stoploss_space: list[DimensionProtocol] = []
self.trailing_space: list[DimensionProtocol] = []
self.max_open_trades_space: list[DimensionProtocol] = []
self.dimensions: list[DimensionProtocol] = [] self.dimensions: list[DimensionProtocol] = []
self.o_dimensions: dict = {} self.o_dimensions: dict = {}
@@ -89,13 +83,7 @@ class HyperOptimizer:
self.custom_hyperopt: HyperOptAuto self.custom_hyperopt: HyperOptAuto
self.analyze_per_epoch = self.config.get("analyze_per_epoch", False) self.analyze_per_epoch = self.config.get("analyze_per_epoch", False)
if not self.config.get("hyperopt"): self.custom_hyperopt = HyperOptAuto(self.config)
self.custom_hyperopt = HyperOptAuto(self.config)
else:
raise OperationalException(
"Using separate Hyperopt files has been removed in 2021.9. Please convert "
"your existing Hyperopt file to the new Hyperoptable strategy interface"
)
self.backtesting._set_strategy(self.backtesting.strategylist[0]) self.backtesting._set_strategy(self.backtesting.strategylist[0])
self.custom_hyperopt.strategy = self.backtesting.strategy self.custom_hyperopt.strategy = self.backtesting.strategy
@@ -173,37 +161,39 @@ class HyperOptimizer:
""" """
result: dict = {} result: dict = {}
if HyperoptTools.has_space(self.config, "buy"): for space in self.spaces.keys():
result["buy"] = round_dict({p.name: params.get(p.name) for p in self.buy_space}, 13) if space == "protection":
if HyperoptTools.has_space(self.config, "sell"): result["protection"] = round_dict(
result["sell"] = round_dict({p.name: params.get(p.name) for p in self.sell_space}, 13) {p.name: params.get(p.name) for p in self.spaces[space]}, 13
if HyperoptTools.has_space(self.config, "protection"): )
result["protection"] = round_dict( elif space == "roi":
{p.name: params.get(p.name) for p in self.protection_space}, 13 result["roi"] = round_dict(
) {str(k): v for k, v in self.custom_hyperopt.generate_roi_table(params).items()},
if HyperoptTools.has_space(self.config, "roi"): 13,
result["roi"] = round_dict( )
{str(k): v for k, v in self.custom_hyperopt.generate_roi_table(params).items()}, 13 elif space == "stoploss":
) result["stoploss"] = round_dict(
if HyperoptTools.has_space(self.config, "stoploss"): {p.name: params.get(p.name) for p in self.spaces[space]}, 13
result["stoploss"] = round_dict( )
{p.name: params.get(p.name) for p in self.stoploss_space}, 13 elif space == "trailing":
) result["trailing"] = round_dict(
if HyperoptTools.has_space(self.config, "trailing"): self.custom_hyperopt.generate_trailing_params(params), 13
result["trailing"] = round_dict( )
self.custom_hyperopt.generate_trailing_params(params), 13 elif space == "trades":
) result["max_open_trades"] = round_dict(
if HyperoptTools.has_space(self.config, "trades"): {
result["max_open_trades"] = round_dict( "max_open_trades": (
{ self.backtesting.strategy.max_open_trades
"max_open_trades": ( if self.backtesting.strategy.max_open_trades != float("inf")
self.backtesting.strategy.max_open_trades else -1
if self.backtesting.strategy.max_open_trades != float("inf") )
else -1 },
) 13,
}, )
13, else:
) result[space] = round_dict(
{p.name: params.get(p.name) for p in self.spaces[space]}, 13
)
return result return result
@@ -232,56 +222,39 @@ class HyperOptimizer:
""" """
Assign the dimensions in the hyperoptimization space. Assign the dimensions in the hyperoptimization space.
""" """
if HyperoptTools.has_space(self.config, "protection"): spaces = ["buy", "sell", "protection", "roi", "stoploss", "trailing", "trades"]
# Protections can only be optimized when using the Parameter interface spaces += [s for s in self.custom_hyperopt.get_available_spaces() if s not in spaces]
logger.debug("Hyperopt has 'protection' space")
# Enable Protections if protection space is selected.
self.config["enable_protections"] = True
self.backtesting.enable_protections = True
self.protection_space = self.custom_hyperopt.protection_space()
if HyperoptTools.has_space(self.config, "buy"): for space in spaces:
logger.debug("Hyperopt has 'buy' space") if not HyperoptTools.has_space(self.config, space):
self.buy_space = self.custom_hyperopt.buy_indicator_space() continue
logger.debug(f"Hyperopt has '{space}' space")
if space == "protection":
# Protections can only be optimized when using the Parameter interface
# Enable Protections if protection space is selected.
self.config["enable_protections"] = True
self.backtesting.enable_protections = True
self.spaces[space] = self.custom_hyperopt.get_indicator_space(space)
elif space == "roi":
self.spaces[space] = self.custom_hyperopt.roi_space()
elif space == "stoploss":
self.spaces[space] = self.custom_hyperopt.stoploss_space()
elif space == "trailing":
self.spaces[space] = self.custom_hyperopt.trailing_space()
elif space == "trades":
self.spaces[space] = self.custom_hyperopt.max_open_trades_space()
else:
self.spaces[space] = self.custom_hyperopt.get_indicator_space(space)
if HyperoptTools.has_space(self.config, "sell"): self.dimensions = [s for space in self.spaces.values() for s in space]
logger.debug("Hyperopt has 'sell' space") if len(self.dimensions) == 0:
self.sell_space = self.custom_hyperopt.sell_indicator_space() raise OperationalException(
"No hyperopt parameters found to optimize."
if HyperoptTools.has_space(self.config, "roi"): f"Available spaces: {', '.join(spaces)}. "
logger.debug("Hyperopt has 'roi' space") "Check your strategy's parameter definitions or verify the configured spaces "
self.roi_space = self.custom_hyperopt.roi_space() "in your command."
)
if HyperoptTools.has_space(self.config, "stoploss"): self.o_dimensions = self.convert_dimensions_to_optuna_space(self.dimensions)
logger.debug("Hyperopt has 'stoploss' space")
self.stoploss_space = self.custom_hyperopt.stoploss_space()
if HyperoptTools.has_space(self.config, "trailing"):
logger.debug("Hyperopt has 'trailing' space")
self.trailing_space = self.custom_hyperopt.trailing_space()
if HyperoptTools.has_space(self.config, "trades"):
logger.debug("Hyperopt has 'trades' space")
self.max_open_trades_space = self.custom_hyperopt.max_open_trades_space()
self.dimensions = (
self.buy_space
+ self.sell_space
+ self.protection_space
+ self.roi_space
+ self.stoploss_space
+ self.trailing_space
+ self.max_open_trades_space
)
def assign_params(self, params_dict: dict[str, Any], category: str) -> None:
"""
Assign hyperoptable parameters
"""
for attr_name, attr in self.backtesting.strategy.enumerate_parameters(category):
if attr.optimize:
# noinspection PyProtectedMember
attr.value = params_dict[attr_name]
@delayed @delayed
@wrap_non_picklable_objects @wrap_non_picklable_objects
@@ -298,15 +271,9 @@ class HyperOptimizer:
HyperoptStateContainer.set_state(HyperoptState.OPTIMIZE) HyperoptStateContainer.set_state(HyperoptState.OPTIMIZE)
backtest_start_time = datetime.now(UTC) backtest_start_time = datetime.now(UTC)
# Apply parameters for attr_name, attr in self.backtesting.strategy.enumerate_parameters():
if HyperoptTools.has_space(self.config, "buy"): if attr.in_space and attr.optimize:
self.assign_params(params_dict, "buy") attr.value = params_dict[attr_name]
if HyperoptTools.has_space(self.config, "sell"):
self.assign_params(params_dict, "sell")
if HyperoptTools.has_space(self.config, "protection"):
self.assign_params(params_dict, "protection")
if HyperoptTools.has_space(self.config, "roi"): if HyperoptTools.has_space(self.config, "roi"):
self.backtesting.strategy.minimal_roi = self.custom_hyperopt.generate_roi_table( self.backtesting.strategy.minimal_roi = self.custom_hyperopt.generate_roi_table(
@@ -442,7 +409,6 @@ class HyperOptimizer:
o_sampler = self.custom_hyperopt.generate_estimator( o_sampler = self.custom_hyperopt.generate_estimator(
dimensions=self.dimensions, random_state=random_state dimensions=self.dimensions, random_state=random_state
) )
self.o_dimensions = self.convert_dimensions_to_optuna_space(self.dimensions)
if isinstance(o_sampler, str): if isinstance(o_sampler, str):
if o_sampler not in optuna_samplers_dict.keys(): if o_sampler not in optuna_samplers_dict.keys():

View File

@@ -9,7 +9,7 @@ import numpy as np
import rapidjson import rapidjson
from pandas import isna, json_normalize from pandas import isna, json_normalize
from freqtrade.constants import FTHYPT_FILEVERSION, Config from freqtrade.constants import FTHYPT_FILEVERSION, HYPEROPT_BUILTIN_SPACES, Config
from freqtrade.enums import HyperoptState from freqtrade.enums import HyperoptState
from freqtrade.exceptions import OperationalException from freqtrade.exceptions import OperationalException
from freqtrade.misc import deep_merge_dicts, round_dict, safe_value_fallback2 from freqtrade.misc import deep_merge_dicts, round_dict, safe_value_fallback2
@@ -219,21 +219,22 @@ class HyperoptTools:
print(rapidjson.dumps(result_dict, default=str, number_mode=HYPER_PARAMS_FILE_FORMAT)) print(rapidjson.dumps(result_dict, default=str, number_mode=HYPER_PARAMS_FILE_FORMAT))
else: else:
HyperoptTools._params_pretty_print( all_spaces = list(params.keys() | non_optimized.keys())
params, "buy", "Buy hyperspace params:", non_optimized # Explicitly listed to keep original sort order
) spaces = ["buy", "sell", "protection", "roi", "stoploss", "trailing", "max_open_trades"]
HyperoptTools._params_pretty_print( spaces += [s for s in all_spaces if s not in spaces]
params, "sell", "Sell hyperspace params:", non_optimized lookup = {
) "roi": "ROI",
HyperoptTools._params_pretty_print( "trailing": "Trailing stop",
params, "protection", "Protection hyperspace params:", non_optimized }
) for space in spaces:
HyperoptTools._params_pretty_print(params, "roi", "ROI table:", non_optimized) name = lookup.get(
HyperoptTools._params_pretty_print(params, "stoploss", "Stoploss:", non_optimized) space, space.capitalize() if space in HYPEROPT_BUILTIN_SPACES else space
HyperoptTools._params_pretty_print(params, "trailing", "Trailing stop:", non_optimized) )
HyperoptTools._params_pretty_print(
params, "max_open_trades", "Max Open Trades:", non_optimized HyperoptTools._params_pretty_print(
) params, space, f"{name} parameters:", non_optimized
)
@staticmethod @staticmethod
def _params_update_for_json(result_dict, params, non_optimized, space: str) -> None: def _params_update_for_json(result_dict, params, non_optimized, space: str) -> None:

View File

@@ -755,6 +755,8 @@ class LocalTrade:
"precision_mode": self.precision_mode, "precision_mode": self.precision_mode,
"precision_mode_price": self.precision_mode_price, "precision_mode_price": self.precision_mode_price,
"contract_size": self.contract_size, "contract_size": self.contract_size,
"nr_of_successful_entries": self.nr_of_successful_entries,
"nr_of_successful_exits": self.nr_of_successful_exits,
"has_open_orders": self.has_open_orders, "has_open_orders": self.has_open_orders,
"orders": orders_json, "orders": orders_json,
} }

View File

@@ -25,14 +25,16 @@ class MarketCapPairList(IPairList):
def __init__(self, *args, **kwargs) -> None: def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
if "number_assets" not in self._pairlistconfig: self._mode = self._pairlistconfig.get("mode", "whitelist")
if (self._mode == "whitelist") and ("number_assets" not in self._pairlistconfig):
raise OperationalException( raise OperationalException(
"`number_assets` not specified. Please check your configuration " "`number_assets` not specified. Please check your configuration "
'for "pairlist.config.number_assets"' 'for "pairlist.config.number_assets"'
) )
self._stake_currency = self._config["stake_currency"] self._stake_currency = self._config["stake_currency"]
self._number_assets = self._pairlistconfig["number_assets"] self._number_assets = self._pairlistconfig.get("number_assets", 30)
self._max_rank = self._pairlistconfig.get("max_rank", 30) self._max_rank = self._pairlistconfig.get("max_rank", 30)
self._refresh_period = self._pairlistconfig.get("refresh_period", 86400) self._refresh_period = self._pairlistconfig.get("refresh_period", 86400)
self._categories = self._pairlistconfig.get("categories", []) self._categories = self._pairlistconfig.get("categories", [])
@@ -78,7 +80,9 @@ class MarketCapPairList(IPairList):
""" """
num = self._number_assets num = self._number_assets
rank = self._max_rank rank = self._max_rank
msg = f"{self.name} - {num} pairs placed within top {rank} market cap." mode = self._mode
pair_text = num if (mode == "whitelist") else "blacklisting"
msg = f"{self.name} - {pair_text} pairs placed within top {rank} market cap."
return msg return msg
@staticmethod @staticmethod
@@ -115,6 +119,13 @@ class MarketCapPairList(IPairList):
"description": "Refresh period", "description": "Refresh period",
"help": "Refresh period in seconds", "help": "Refresh period in seconds",
}, },
"mode": {
"type": "option",
"default": "whitelist",
"options": ["whitelist", "blacklist"],
"description": "Mode of operation",
"help": "Mode of operation (whitelist/blacklist)",
},
} }
def get_markets_exchange(self): def get_markets_exchange(self):
@@ -186,6 +197,9 @@ class MarketCapPairList(IPairList):
:return: new whitelist :return: new whitelist
""" """
marketcap_list = self._marketcap_cache.get("marketcap") marketcap_list = self._marketcap_cache.get("marketcap")
mode = self._mode
is_whitelist_mode = mode == "whitelist"
filtered_pairlist: list[str] = []
default_kwargs = { default_kwargs = {
"vs_currency": "usd", "vs_currency": "usd",
@@ -219,12 +233,10 @@ class MarketCapPairList(IPairList):
self._marketcap_cache["marketcap"] = marketcap_list self._marketcap_cache["marketcap"] = marketcap_list
if marketcap_list: if marketcap_list:
filtered_pairlist: list[str] = []
market = self._exchange._config["trading_mode"] market = self._exchange._config["trading_mode"]
pair_format = f"{self._stake_currency.upper()}" pair_format = f"{self._stake_currency.upper()}" + (
if market == "futures": f":{self._stake_currency.upper()}" if market == "futures" else ""
pair_format += f":{self._stake_currency.upper()}" )
top_marketcap = marketcap_list[: self._max_rank :] top_marketcap = marketcap_list[: self._max_rank :]
markets = self.get_markets_exchange() markets = self.get_markets_exchange()
@@ -234,13 +246,16 @@ class MarketCapPairList(IPairList):
resolved = self.resolve_marketcap_pair(pair, pairlist, markets, filtered_pairlist) resolved = self.resolve_marketcap_pair(pair, pairlist, markets, filtered_pairlist)
if resolved: if resolved:
if not is_whitelist_mode:
pairlist.remove(resolved)
continue
filtered_pairlist.append(resolved) filtered_pairlist.append(resolved)
if len(filtered_pairlist) == self._number_assets:
break
if len(filtered_pairlist) == self._number_assets: if not is_whitelist_mode:
break return pairlist
if len(filtered_pairlist) > 0:
return filtered_pairlist
# If no pairs are found, return the original pairlist # If no pairs are found, return the original pairlist
return [] return filtered_pairlist

View File

@@ -86,13 +86,13 @@ class IResolver:
Tuple format: [Object, source] Tuple format: [Object, source]
""" """
# Generate spec based on absolute path
# Pass object_name as first argument to have logging print a reasonable name.
with PathModifier(module_path.parent): with PathModifier(module_path.parent):
module_name = module_path.stem or "" module_name = module_path.stem or ""
# Generate spec based on absolute path
# Pass object_name as first argument to have logging print a reasonable name.
spec = importlib.util.spec_from_file_location(module_name, str(module_path)) spec = importlib.util.spec_from_file_location(module_name, str(module_path))
if not spec: if not spec:
return iter([None]) return iter([])
module = importlib.util.module_from_spec(spec) module = importlib.util.module_from_spec(spec)
try: try:
@@ -148,10 +148,11 @@ class IResolver:
logger.debug("Ignoring broken symlink %s", entry) logger.debug("Ignoring broken symlink %s", entry)
continue continue
module_path = entry.resolve() module_path = entry.resolve()
if entry.read_text().find(f"class {object_name}(") == -1:
logger.debug(f"Skipping {module_path} as it does not contain class {object_name}.")
continue
obj = next(cls._get_valid_object(module_path, object_name), None) if obj := next(cls._get_valid_object(module_path, object_name), None):
if obj:
obj[0].__file__ = str(entry) obj[0].__file__ = str(entry)
if add_source: if add_source:
obj[0].__source__ = obj[1] obj[0].__source__ = obj[1]
@@ -164,6 +165,10 @@ class IResolver:
) -> Any | None: ) -> Any | None:
""" """
Try to load object from path list. Try to load object from path list.
:param paths: list of absolute paths to search
:param object_name: name of the module to import
:param add_source: add the source code as __source__ attribute to theloaded object.
:param kwargs: keyword arguments to pass to the object constructor
""" """
for _path in paths: for _path in paths:

View File

@@ -150,7 +150,9 @@ class StrategyResolver(IResolver):
# Ensure necessary migrations are performed first. # Ensure necessary migrations are performed first.
validate_migrated_strategy_settings(strategy.config) validate_migrated_strategy_settings(strategy.config)
if not all(k in strategy.order_types for k in REQUIRED_ORDERTYPES): if not strategy.order_types or not all(
k in strategy.order_types for k in REQUIRED_ORDERTYPES
):
raise ImportError( raise ImportError(
f"Impossible to load Strategy '{strategy.__class__.__name__}'. " f"Impossible to load Strategy '{strategy.__class__.__name__}'. "
f"Order-types mapping is incomplete." f"Order-types mapping is incomplete."

View File

@@ -340,6 +340,8 @@ class TradeSchema(BaseModel):
min_rate: float | None = None min_rate: float | None = None
max_rate: float | None = None max_rate: float | None = None
nr_of_successful_entries: int
nr_of_successful_exits: int
has_open_orders: bool has_open_orders: bool
orders: list[OrderSchema] orders: list[OrderSchema]

View File

@@ -47,6 +47,7 @@ from freqtrade.util import (
dt_ts, dt_ts,
dt_ts_def, dt_ts_def,
format_date, format_date,
format_pct,
shorten_date, shorten_date,
) )
from freqtrade.wallets import PositionWallet, Wallet from freqtrade.wallets import PositionWallet, Wallet
@@ -302,7 +303,7 @@ class RPC:
fiat_total_profit_sum = nan fiat_total_profit_sum = nan
for trade in self._rpc_trade_status(): for trade in self._rpc_trade_status():
# Format profit as a string with the right sign # Format profit as a string with the right sign
profit = f"{trade['profit_ratio']:.2%}" profit = f"{format_pct(trade['profit_ratio'])}"
fiat_profit = trade.get("profit_fiat", None) fiat_profit = trade.get("profit_fiat", None)
if fiat_profit is None or isnan(fiat_profit): if fiat_profit is None or isnan(fiat_profit):
fiat_profit = trade.get("profit_abs", 0.0) fiat_profit = trade.get("profit_abs", 0.0)
@@ -1009,12 +1010,16 @@ class RPC:
return {"result": "Created exit orders for all open trades."} return {"result": "Created exit orders for all open trades."}
# Query for trade # Query for trade
trade = Trade.get_trades( trade = (
trade_filter=[ Trade.get_trades(
Trade.id == trade_id, trade_filter=[
Trade.is_open.is_(True), Trade.id == int(trade_id),
] Trade.is_open.is_(True),
).first() ]
).first()
if trade_id.isdigit()
else None
)
if not trade: if not trade:
logger.warning("force_exit: Invalid argument received") logger.warning("force_exit: Invalid argument received")
raise RPCException("invalid argument") raise RPCException("invalid argument")

View File

@@ -48,6 +48,7 @@ from freqtrade.util import (
fmt_coin, fmt_coin,
fmt_coin2, fmt_coin2,
format_date, format_date,
format_pct,
round_value, round_value,
) )
@@ -481,7 +482,7 @@ class Telegram(RPCHandler):
if is_final_exit: if is_final_exit:
profit_prefix = "Sub " profit_prefix = "Sub "
cp_extra = ( cp_extra = (
f"*Final Profit:* `{msg['final_profit_ratio']:.2%} " f"*Final Profit:* `{format_pct(msg['final_profit_ratio'])} "
f"({msg['cumulative_profit']:.8f} {msg['quote_currency']}{cp_fiat})`\n" f"({msg['cumulative_profit']:.8f} {msg['quote_currency']}{cp_fiat})`\n"
) )
else: else:
@@ -497,7 +498,7 @@ class Telegram(RPCHandler):
f"{exit_wording} {msg['pair']} (#{msg['trade_id']})\n" f"{exit_wording} {msg['pair']} (#{msg['trade_id']})\n"
f"{self._add_analyzed_candle(msg['pair'])}" f"{self._add_analyzed_candle(msg['pair'])}"
f"*{f'{profit_prefix}Profit' if is_fill else f'Unrealized {profit_prefix}Profit'}:* " f"*{f'{profit_prefix}Profit' if is_fill else f'Unrealized {profit_prefix}Profit'}:* "
f"`{msg['profit_ratio']:.2%}{profit_extra}`\n" f"`{format_pct(msg['profit_ratio'])}{profit_extra}`\n"
f"{cp_extra}" f"{cp_extra}"
f"{enter_tag}" f"{enter_tag}"
f"*Exit Reason:* `{msg['exit_reason']}`\n" f"*Exit Reason:* `{msg['exit_reason']}`\n"
@@ -670,14 +671,14 @@ class Telegram(RPCHandler):
# TODO: This calculation ignores fees. # TODO: This calculation ignores fees.
price_to_1st_entry = (cur_entry_average - first_avg) / first_avg price_to_1st_entry = (cur_entry_average - first_avg) / first_avg
if is_open: if is_open:
lines.append("({})".format(dt_humanize_delta(order["order_filled_date"]))) lines.append(f"({dt_humanize_delta(order['order_filled_date'])})")
lines.append( lines.append(
f"*Amount:* {round_value(cur_entry_amount, 8)} " f"*Amount:* {round_value(cur_entry_amount, 8)} "
f"({fmt_coin(order['cost'], quote_currency)})" f"({fmt_coin(order['cost'], quote_currency)})"
) )
lines.append( lines.append(
f"*Average {wording} Price:* {round_value(cur_entry_average, 8)} " f"*Average {wording} Price:* {round_value(cur_entry_average, 8)} "
f"({price_to_1st_entry:.2%} from 1st entry rate)" f"({format_pct(price_to_1st_entry)} from 1st entry rate)"
) )
lines.append(f"*Order Filled:* {order['order_filled_date']}") lines.append(f"*Order Filled:* {order['order_filled_date']}")
@@ -701,7 +702,7 @@ class Telegram(RPCHandler):
results = self._rpc._rpc_trade_status(trade_ids=trade_ids) results = self._rpc._rpc_trade_status(trade_ids=trade_ids)
for r in results: for r in results:
lines = ["*Order List for Trade #*`{trade_id}`"] lines = [f"*Order List for Trade #*`{r['trade_id']}`"]
lines_detail = self._prepare_order_details( lines_detail = self._prepare_order_details(
r["orders"], r["quote_currency"], r["is_open"] r["orders"], r["quote_currency"], r["is_open"]
@@ -720,10 +721,10 @@ class Telegram(RPCHandler):
if (len(msg) + len(line) + 1) < MAX_MESSAGE_LENGTH: if (len(msg) + len(line) + 1) < MAX_MESSAGE_LENGTH:
msg += line + "\n" msg += line + "\n"
else: else:
await self._send_msg(msg.format(**r)) await self._send_msg(msg)
msg = "*Order List for Trade #*`{trade_id}` - continued\n" + line + "\n" msg = f"*Order List for Trade #*`{r['trade_id']}` - continued\n" + line + "\n"
await self._send_msg(msg.format(**r)) await self._send_msg(msg)
@authorized_only @authorized_only
async def _status(self, update: Update, context: CallbackContext) -> None: async def _status(self, update: Update, context: CallbackContext) -> None:
@@ -757,15 +758,7 @@ class Telegram(RPCHandler):
max_entries = self._config.get("max_entry_position_adjustment", -1) max_entries = self._config.get("max_entry_position_adjustment", -1)
for r in results: for r in results:
r["open_date_hum"] = dt_humanize_delta(r["open_date"]) r["open_date_hum"] = dt_humanize_delta(r["open_date"])
r["num_entries"] = len([o for o in r["orders"] if o["ft_is_entry"]])
r["num_exits"] = len(
[
o
for o in r["orders"]
if not o["ft_is_entry"] and not o["ft_order_side"] == "stoploss"
]
)
r["exit_reason"] = r.get("exit_reason", "")
r["stake_amount_r"] = fmt_coin(r["stake_amount"], r["quote_currency"]) r["stake_amount_r"] = fmt_coin(r["stake_amount"], r["quote_currency"])
r["max_stake_amount_r"] = fmt_coin( r["max_stake_amount_r"] = fmt_coin(
r["max_stake_amount"] or r["stake_amount"], r["quote_currency"] r["max_stake_amount"] or r["stake_amount"], r["quote_currency"]
@@ -774,26 +767,25 @@ class Telegram(RPCHandler):
r["realized_profit_r"] = fmt_coin(r["realized_profit"], r["quote_currency"]) r["realized_profit_r"] = fmt_coin(r["realized_profit"], r["quote_currency"])
r["total_profit_abs_r"] = fmt_coin(r["total_profit_abs"], r["quote_currency"]) r["total_profit_abs_r"] = fmt_coin(r["total_profit_abs"], r["quote_currency"])
lines = [ lines = [
"*Trade ID:* `{trade_id}`" + (" `(since {open_date_hum})`" if r["is_open"] else ""), f"*Trade ID:* `{r['trade_id']}`"
"*Current Pair:* {pair}", + (f" `(since {r['open_date_hum']})`" if r["is_open"] else ""),
f"*Current Pair:* {r['pair']}",
( (
f"*Direction:* {'`Short`' if r.get('is_short') else '`Long`'}" f"*Direction:* {'`Short`' if r.get('is_short') else '`Long`'}"
+ " ` ({leverage}x)`" + (f" ` ({r['leverage']}x)`" if r.get("leverage") else "")
if r.get("leverage")
else ""
), ),
"*Amount:* `{amount} ({stake_amount_r})`", f"*Amount:* `{r['amount']} ({r['stake_amount_r']})`",
"*Total invested:* `{max_stake_amount_r}`" if position_adjust else "", f"*Total invested:* `{r['max_stake_amount_r']}`" if position_adjust else "",
"*Enter Tag:* `{enter_tag}`" if r["enter_tag"] else "", f"*Enter Tag:* `{r['enter_tag']}`" if r["enter_tag"] else "",
"*Exit Reason:* `{exit_reason}`" if r["exit_reason"] else "", f"*Exit Reason:* `{r['exit_reason']}`" if r.get("exit_reason") else "",
] ]
if position_adjust: if position_adjust:
max_buy_str = f"/{max_entries + 1}" if (max_entries > 0) else "" max_buy_str = f"/{max_entries + 1}" if (max_entries > 0) else ""
lines.extend( lines.extend(
[ [
"*Number of Entries:* `{num_entries}" + max_buy_str + "`", f"*Number of Entries:* `{r['nr_of_successful_entries']}{max_buy_str}`",
"*Number of Exits:* `{num_exits}`", f"*Number of Exits:* `{r['nr_of_successful_exits']}`",
] ]
) )
@@ -801,53 +793,62 @@ class Telegram(RPCHandler):
[ [
f"*Open Rate:* `{round_value(r['open_rate'], 8)}`", f"*Open Rate:* `{round_value(r['open_rate'], 8)}`",
f"*Close Rate:* `{round_value(r['close_rate'], 8)}`" if r["close_rate"] else "", f"*Close Rate:* `{round_value(r['close_rate'], 8)}`" if r["close_rate"] else "",
"*Open Date:* `{open_date}`", f"*Open Date:* `{r['open_date']}`",
"*Close Date:* `{close_date}`" if r["close_date"] else "", f"*Close Date:* `{r['close_date']}`" if r["close_date"] else "",
( (
f" \n*Current Rate:* `{round_value(r['current_rate'], 8)}`" f" \n*Current Rate:* `{round_value(r['current_rate'], 8)}`"
if r["is_open"] if r["is_open"]
else "" else ""
), ),
("*Unrealized Profit:* " if r["is_open"] else "*Close Profit: *") ("*Unrealized Profit:* " if r["is_open"] else "*Close Profit: *")
+ "`{profit_ratio:.2%}` `({profit_abs_r})`", + f"`{format_pct(r['profit_ratio'])}` `({r['profit_abs_r']})`",
] ]
) )
if r["is_open"]: if r["is_open"]:
if r.get("realized_profit"): if (
lines.extend( r.get("realized_profit") is not None
[ and r.get("realized_profit_ratio") is not None
"*Realized Profit:* `{realized_profit_ratio:.2%} " ):
"({realized_profit_r})`", lines.append(
"*Total Profit:* `{total_profit_ratio:.2%} ({total_profit_abs_r})`", f"*Realized Profit:* `{format_pct(r['realized_profit_ratio'])} "
] f"({r['realized_profit_r']})`"
)
if r.get("total_profit_ratio") is not None:
lines.append(
f"*Total Profit:* `{format_pct(r['total_profit_ratio'])} "
f"({r['total_profit_abs_r']})`"
) )
# Append empty line to improve readability # Append empty line to improve readability
lines.append(" ") lines.append(" ")
# Adding liquidation only if it is not None
if liquidation := r.get("liquidation_price"):
lines.append(f"*Liquidation:* `{round_value(liquidation, 8)}`")
if ( if (
r["stop_loss_abs"] != r["initial_stop_loss_abs"] r["stop_loss_abs"] != r["initial_stop_loss_abs"]
and r["initial_stop_loss_ratio"] is not None and r["initial_stop_loss_ratio"] is not None
): ):
# Adding initial stoploss only if it is different from stoploss # Adding initial stoploss only if it is different from stoploss
lines.append( lines.append(
"*Initial Stoploss:* `{initial_stop_loss_abs:.8f}` " f"*Initial Stoploss:* `{r['initial_stop_loss_abs']:.8f}` "
"`({initial_stop_loss_ratio:.2%})`" f"`({format_pct(r['initial_stop_loss_ratio'])})`"
) )
# Adding stoploss and stoploss percentage only if it is not None # Adding stoploss and stoploss percentage only if it is not None
lines.append( lines.append(
f"*Stoploss:* `{round_value(r['stop_loss_abs'], 8)}` " f"*Stoploss:* `{round_value(r['stop_loss_abs'], 8)}` "
+ ("`({stop_loss_ratio:.2%})`" if r["stop_loss_ratio"] else "") + (f"`({format_pct(r['stop_loss_ratio'])})`" if r["stop_loss_ratio"] else "")
) )
lines.append( lines.append(
f"*Stoploss distance:* `{round_value(r['stoploss_current_dist'], 8)}` " f"*Stoploss distance:* `{round_value(r['stoploss_current_dist'], 8)}` "
"`({stoploss_current_dist_ratio:.2%})`" f"`({format_pct(r['stoploss_current_dist_ratio'])})`"
) )
if r.get("open_orders"): if open_orders := r.get("open_orders"):
lines.append( lines.append(
"*Open Order:* `{open_orders}`" f"*Open Order:* `{open_orders}`"
+ ("- `{exit_order_status}`" if r["exit_order_status"] else "") + (f"- `{r['exit_order_status']}`" if r["exit_order_status"] else "")
) )
await self.__send_status_msg(lines, r) await self.__send_status_msg(lines, r)
@@ -863,10 +864,10 @@ class Telegram(RPCHandler):
if (len(msg) + len(line) + 1) < MAX_MESSAGE_LENGTH: if (len(msg) + len(line) + 1) < MAX_MESSAGE_LENGTH:
msg += line + "\n" msg += line + "\n"
else: else:
await self._send_msg(msg.format(**r)) await self._send_msg(msg)
msg = "*Trade ID:* `{trade_id}` - continued\n" + line + "\n" msg = f"*Trade ID:* `{r['trade_id']}` - continued\n" + line + "\n"
await self._send_msg(msg.format(**r)) await self._send_msg(msg)
@authorized_only @authorized_only
async def _status_table(self, update: Update, context: CallbackContext) -> None: async def _status_table(self, update: Update, context: CallbackContext) -> None:
@@ -953,7 +954,7 @@ class Telegram(RPCHandler):
f"{period['date']:{val.dateformat}} ({period['trade_count']})", f"{period['date']:{val.dateformat}} ({period['trade_count']})",
f"{fmt_coin(period['abs_profit'], stats['stake_currency'])}", f"{fmt_coin(period['abs_profit'], stats['stake_currency'])}",
f"{period['fiat_value']:.2f} {stats['fiat_display_currency']}", f"{period['fiat_value']:.2f} {stats['fiat_display_currency']}",
f"{period['rel_profit']:.2%}", f"{format_pct(period['rel_profit'])}",
] ]
for period in stats["data"] for period in stats["data"]
], ],
@@ -1069,7 +1070,7 @@ class Telegram(RPCHandler):
markdown_msg = ( markdown_msg = (
f"{closed_roi_label}\n" f"{closed_roi_label}\n"
f"∙ `{fmt_coin(profit_closed_coin, stake_cur)} " f"∙ `{fmt_coin(profit_closed_coin, stake_cur)} "
f"({profit_closed_ratio_mean:.2%}) " f"({format_pct(profit_closed_ratio_mean)}) "
f"({profit_closed_percent} \N{GREEK CAPITAL LETTER SIGMA}%)`\n" f"({profit_closed_percent} \N{GREEK CAPITAL LETTER SIGMA}%)`\n"
f"{fiat_closed_trades}" f"{fiat_closed_trades}"
) )
@@ -1082,7 +1083,7 @@ class Telegram(RPCHandler):
markdown_msg += ( markdown_msg += (
f"{all_roi_label}\n" f"{all_roi_label}\n"
f"∙ `{fmt_coin(profit_all_coin, stake_cur)} " f"∙ `{fmt_coin(profit_all_coin, stake_cur)} "
f"({profit_all_ratio_mean:.2%}) " f"({format_pct(profit_all_ratio_mean)}) "
f"({profit_all_percent} \N{GREEK CAPITAL LETTER SIGMA}%)`\n" f"({profit_all_percent} \N{GREEK CAPITAL LETTER SIGMA}%)`\n"
f"{fiat_all_trades}" f"{fiat_all_trades}"
f"*Total Trade Count:* `{trade_count}`\n" f"*Total Trade Count:* `{trade_count}`\n"
@@ -1091,7 +1092,7 @@ class Telegram(RPCHandler):
f"`{first_trade_date}`\n" f"`{first_trade_date}`\n"
f"*Latest Trade opened:* `{latest_trade_date}`\n" f"*Latest Trade opened:* `{latest_trade_date}`\n"
f"*Win / Loss:* `{stats['winning_trades']} / {stats['losing_trades']}`\n" f"*Win / Loss:* `{stats['winning_trades']} / {stats['losing_trades']}`\n"
f"*Winrate:* `{winrate:.2%}`\n" f"*Winrate:* `{format_pct(winrate)}`\n"
f"*Expectancy (Ratio):* `{expectancy:.2f} ({expectancy_ratio:.2f})`" f"*Expectancy (Ratio):* `{expectancy:.2f} ({expectancy_ratio:.2f})`"
) )
@@ -1099,16 +1100,16 @@ class Telegram(RPCHandler):
markdown_msg += ( markdown_msg += (
f"\n*Avg. Duration:* `{avg_duration}`\n" f"\n*Avg. Duration:* `{avg_duration}`\n"
f"*Best Performing:* `{best_pair}: {best_pair_profit_abs} " f"*Best Performing:* `{best_pair}: {best_pair_profit_abs} "
f"({best_pair_profit_ratio:.2%})`\n" f"({format_pct(best_pair_profit_ratio)})`\n"
f"*Trading volume:* `{fmt_coin(stats['trading_volume'], stake_cur)}`\n" f"*Trading volume:* `{fmt_coin(stats['trading_volume'], stake_cur)}`\n"
f"*Profit factor:* `{stats['profit_factor']:.2f}`\n" f"*Profit factor:* `{stats['profit_factor']:.2f}`\n"
f"*Max Drawdown:* `{stats['max_drawdown']:.2%} " f"*Max Drawdown:* `{format_pct(stats['max_drawdown'])} "
f"({fmt_coin(stats['max_drawdown_abs'], stake_cur)})`\n" f"({fmt_coin(stats['max_drawdown_abs'], stake_cur)})`\n"
f" from `{stats['max_drawdown_start']} " f" from `{stats['max_drawdown_start']} "
f"({fmt_coin(stats['drawdown_high'], stake_cur)})`\n" f"({fmt_coin(stats['drawdown_high'], stake_cur)})`\n"
f" to `{stats['max_drawdown_end']} " f" to `{stats['max_drawdown_end']} "
f"({fmt_coin(stats['drawdown_low'], stake_cur)})`\n" f"({fmt_coin(stats['drawdown_low'], stake_cur)})`\n"
f"*Current Drawdown:* `{stats['current_drawdown']:.2%} " f"*Current Drawdown:* `{format_pct(stats['current_drawdown'])} "
f"({fmt_coin(stats['current_drawdown_abs'], stake_cur)})`\n" f"({fmt_coin(stats['current_drawdown_abs'], stake_cur)})`\n"
f" from `{stats['current_drawdown_start']} " f" from `{stats['current_drawdown_start']} "
f"({fmt_coin(stats['current_drawdown_high'], stake_cur)})`\n" f"({fmt_coin(stats['current_drawdown_high'], stake_cur)})`\n"
@@ -1455,7 +1456,11 @@ class Telegram(RPCHandler):
await query.answer() await query.answer()
await query.edit_message_text(text="Force exit canceled.") await query.edit_message_text(text="Force exit canceled.")
return return
trade: Trade | None = Trade.get_trades(trade_filter=Trade.id == trade_id).first() trade: Trade | None = (
Trade.get_trades(trade_filter=Trade.id == int(trade_id)).first()
if trade_id.isdigit()
else None
)
await query.answer() await query.answer()
if trade: if trade:
await query.edit_message_text( await query.edit_message_text(
@@ -1557,7 +1562,7 @@ class Telegram(RPCHandler):
dt_humanize_delta(dt_from_ts(trade["close_timestamp"])), dt_humanize_delta(dt_from_ts(trade["close_timestamp"])),
f"{trade['pair']} (#{trade['trade_id']}" f"{trade['pair']} (#{trade['trade_id']}"
f"{(' ' + ('S' if trade['is_short'] else 'L')) if nonspot else ''})", f"{(' ' + ('S' if trade['is_short'] else 'L')) if nonspot else ''})",
f"{(trade['close_profit']):.2%} ({trade['close_profit_abs']})", f"{format_pct(trade['close_profit'])} ({trade['close_profit_abs']})",
] ]
for trade in trades["trades"] for trade in trades["trades"]
], ],
@@ -1621,7 +1626,7 @@ class Telegram(RPCHandler):
stat_line = ( stat_line = (
f"{i + 1}.\t <code>{trade['pair']}\t" f"{i + 1}.\t <code>{trade['pair']}\t"
f"{fmt_coin(trade['profit_abs'], self._config['stake_currency'])} " f"{fmt_coin(trade['profit_abs'], self._config['stake_currency'])} "
f"({trade['profit_ratio']:.2%}) " f"({format_pct(trade['profit_ratio'])}) "
f"({trade['count']})</code>\n" f"({trade['count']})</code>\n"
) )
@@ -1658,7 +1663,7 @@ class Telegram(RPCHandler):
stat_line = ( stat_line = (
f"{i + 1}.\t `{trade['enter_tag']}\t" f"{i + 1}.\t `{trade['enter_tag']}\t"
f"{fmt_coin(trade['profit_abs'], self._config['stake_currency'])} " f"{fmt_coin(trade['profit_abs'], self._config['stake_currency'])} "
f"({trade['profit_ratio']:.2%}) " f"({format_pct(trade['profit_ratio'])}) "
f"({trade['count']})`\n" f"({trade['count']})`\n"
) )
@@ -1695,7 +1700,7 @@ class Telegram(RPCHandler):
stat_line = ( stat_line = (
f"{i + 1}.\t `{trade['exit_reason']}\t" f"{i + 1}.\t `{trade['exit_reason']}\t"
f"{fmt_coin(trade['profit_abs'], self._config['stake_currency'])} " f"{fmt_coin(trade['profit_abs'], self._config['stake_currency'])} "
f"({trade['profit_ratio']:.2%}) " f"({format_pct(trade['profit_ratio'])}) "
f"({trade['count']})`\n" f"({trade['count']})`\n"
) )
@@ -1732,7 +1737,7 @@ class Telegram(RPCHandler):
stat_line = ( stat_line = (
f"{i + 1}.\t `{trade['mix_tag']}\t" f"{i + 1}.\t `{trade['mix_tag']}\t"
f"{fmt_coin(trade['profit_abs'], self._config['stake_currency'])} " f"{fmt_coin(trade['profit_abs'], self._config['stake_currency'])} "
f"({trade['profit_ratio']:.2%}) " f"({format_pct(trade['profit_ratio'])}) "
f"({trade['count']})`\n" f"({trade['count']})`\n"
) )

View File

@@ -4,9 +4,9 @@ This module defines a base class for auto-hyperoptable strategies.
""" """
import logging import logging
from collections import defaultdict
from collections.abc import Iterator from collections.abc import Iterator
from pathlib import Path from pathlib import Path
from typing import Any
from freqtrade.constants import Config from freqtrade.constants import Config
from freqtrade.exceptions import OperationalException from freqtrade.exceptions import OperationalException
@@ -18,6 +18,11 @@ from freqtrade.strategy.parameters import BaseParameter
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# Type aliases
SpaceParams = dict[str, BaseParameter]
AllSpaceParams = dict[str, SpaceParams]
class HyperStrategyMixin: class HyperStrategyMixin:
""" """
A helper base class which allows HyperOptAuto class to reuse implementations of buy/sell A helper base class which allows HyperOptAuto class to reuse implementations of buy/sell
@@ -29,47 +34,22 @@ class HyperStrategyMixin:
Initialize hyperoptable strategy mixin. Initialize hyperoptable strategy mixin.
""" """
self.config = config self.config = config
self.ft_buy_params: list[BaseParameter] = [] self._ft_hyper_params: AllSpaceParams = {}
self.ft_sell_params: list[BaseParameter] = []
self.ft_protection_params: list[BaseParameter] = []
params = self.load_params_from_file() params = self.load_params_from_file()
params = params.get("params", {}) params = params.get("params", {})
self._ft_params_from_file = params self._ft_params_from_file = params
# Init/loading of parameters is done as part of ft_bot_start(). # Init/loading of parameters is done as part of ft_bot_start().
def enumerate_parameters( def enumerate_parameters(self, space: str | None = None) -> Iterator[tuple[str, BaseParameter]]:
self, category: str | None = None
) -> Iterator[tuple[str, BaseParameter]]:
""" """
Find all optimizable parameters and return (name, attr) iterator. Find all optimizable parameters and return (name, attr) iterator.
:param category: :param space: parameter space to filter for, or None for all spaces.
:return: :return:
""" """
if category not in ("buy", "sell", "protection", None): for space in [c for c in self._ft_hyper_params if space is None or c == space]:
raise OperationalException( for par in self._ft_hyper_params[space].values():
'Category must be one of: "buy", "sell", "protection", None.' yield par.name, par
)
if category is None:
params = self.ft_buy_params + self.ft_sell_params + self.ft_protection_params
else:
params = getattr(self, f"ft_{category}_params")
for par in params:
yield par.name, par
@classmethod
def detect_all_parameters(cls) -> dict:
"""Detect all parameters and return them as a list"""
params: dict[str, Any] = {
"buy": list(detect_parameters(cls, "buy")),
"sell": list(detect_parameters(cls, "sell")),
"protection": list(detect_parameters(cls, "protection")),
}
params.update({"count": len(params["buy"] + params["sell"] + params["protection"])})
return params
def ft_load_params_from_file(self) -> None: def ft_load_params_from_file(self) -> None:
""" """
@@ -110,20 +90,13 @@ class HyperStrategyMixin:
* Parameters defined in parameters objects (buy_params, sell_params, ...) * Parameters defined in parameters objects (buy_params, sell_params, ...)
* Parameter defaults * Parameter defaults
""" """
self._ft_hyper_params = detect_all_parameters(self)
buy_params = deep_merge_dicts( for space in self._ft_hyper_params.keys():
self._ft_params_from_file.get("buy", {}), getattr(self, "buy_params", {}) params_values = deep_merge_dicts(
) self._ft_params_from_file.get(space, {}), getattr(self, f"{space}_params", {})
sell_params = deep_merge_dicts( )
self._ft_params_from_file.get("sell", {}), getattr(self, "sell_params", {}) self._ft_load_params(self._ft_hyper_params[space], params_values, space, hyperopt)
)
protection_params = deep_merge_dicts(
self._ft_params_from_file.get("protection", {}), getattr(self, "protection_params", {})
)
self._ft_load_params(buy_params, "buy", hyperopt)
self._ft_load_params(sell_params, "sell", hyperopt)
self._ft_load_params(protection_params, "protection", hyperopt)
def load_params_from_file(self) -> dict: def load_params_from_file(self) -> dict:
filename_str = getattr(self, "__file__", "") filename_str = getattr(self, "__file__", "")
@@ -145,72 +118,73 @@ class HyperStrategyMixin:
return {} return {}
def _ft_load_params(self, params: dict, space: str, hyperopt: bool = False) -> None: def _ft_load_params(
self, params: SpaceParams, param_values: dict, space: str, hyperopt: bool = False
) -> None:
""" """
Set optimizable parameter values. Set optimizable parameter values.
:param params: Dictionary with new parameter values. :param params: Dictionary with new parameter values.
""" """
if not params: if not param_values:
logger.info(f"No params for {space} found, using default values.") logger.info(f"No params for {space} found, using default values.")
param_container: list[BaseParameter] = getattr(self, f"ft_{space}_params")
for attr_name, attr in detect_parameters(self, space): for param_name, param in params.items():
attr.name = attr_name param.in_space = hyperopt and HyperoptTools.has_space(self.config, space)
attr.in_space = hyperopt and HyperoptTools.has_space(self.config, space) if not param.space:
if not attr.category: param.space = space
attr.category = space
param_container.append(attr) if param_values and param_name in param_values:
if param.load:
if params and attr_name in params: param.value = param_values[param_name]
if attr.load: logger.info(f"Strategy Parameter: {param_name} = {param.value}")
attr.value = params[attr_name]
logger.info(f"Strategy Parameter: {attr_name} = {attr.value}")
else: else:
logger.warning( logger.warning(
f'Parameter "{attr_name}" exists, but is disabled. ' f'Parameter "{param_name}" exists, but is disabled. '
f'Default value "{attr.value}" used.' f'Default value "{param.value}" used.'
) )
else: else:
logger.info(f"Strategy Parameter(default): {attr_name} = {attr.value}") logger.info(f"Strategy Parameter(default): {param_name} = {param.value}")
def get_no_optimize_params(self) -> dict[str, dict]: def get_no_optimize_params(self) -> dict[str, dict]:
""" """
Returns list of Parameters that are not part of the current optimize job Returns list of Parameters that are not part of the current optimize job
""" """
params: dict[str, dict] = { params: dict[str, dict] = defaultdict(dict)
"buy": {},
"sell": {},
"protection": {},
}
for name, p in self.enumerate_parameters(): for name, p in self.enumerate_parameters():
if p.category and (not p.optimize or not p.in_space): if p.space and (not p.optimize or not p.in_space):
params[p.category][name] = p.value params[p.space][name] = p.value
return params return params
def detect_parameters( def detect_all_parameters(
obj: HyperStrategyMixin | type[HyperStrategyMixin], category: str obj: HyperStrategyMixin | type[HyperStrategyMixin],
) -> Iterator[tuple[str, BaseParameter]]: ) -> AllSpaceParams:
""" """
Detect all parameters for 'category' for "obj" Detect all hyperoptable parameters for this object.
:param obj: Strategy object or class :param obj: Strategy object or class
:param category: category - usually `'buy', 'sell', 'protection',... :return: Dictionary of detected parameters by space
""" """
auto_categories = ["buy", "sell", "enter", "exit", "protection"]
result: AllSpaceParams = defaultdict(dict)
for attr_name in dir(obj): for attr_name in dir(obj):
if not attr_name.startswith("__"): # Ignore internals, not strictly necessary. if attr_name.startswith("__"): # Ignore internals
attr = getattr(obj, attr_name) continue
if issubclass(attr.__class__, BaseParameter): attr = getattr(obj, attr_name)
if ( if not issubclass(attr.__class__, BaseParameter):
attr_name.startswith(category + "_") continue
and attr.category is not None if not attr.space:
and attr.category != category # space auto detection
): for space in auto_categories:
raise OperationalException( if attr_name.startswith(space + "_"):
f"Inconclusive parameter name {attr_name}, category: {attr.category}." attr.space = space
) break
if attr.space is None:
raise OperationalException(f"Cannot determine parameter space for {attr_name}.")
if category == attr.category or ( if attr.space in ("all", "default") or attr.space.isidentifier() is False:
attr_name.startswith(category + "_") and attr.category is None raise OperationalException(
): f"'{attr.space}' is not a valid space. Parameter: {attr_name}."
yield attr_name, attr )
attr.name = attr_name
result[attr.space][attr_name] = attr
return result

View File

@@ -32,7 +32,7 @@ class BaseParameter(ABC):
Defines a parameter that can be optimized by hyperopt. Defines a parameter that can be optimized by hyperopt.
""" """
category: str | None space: str | None
default: Any default: Any
value: Any value: Any
in_space: bool = False in_space: bool = False
@@ -49,9 +49,9 @@ class BaseParameter(ABC):
): ):
""" """
Initialize hyperopt-optimizable parameter. Initialize hyperopt-optimizable parameter.
:param space: A parameter category. Can be 'buy' or 'sell'. This parameter is optional if :param space: The parameter space. Can be 'buy', 'sell', or a string that's also a
parameter field valid python identifier.
name is prefixed with 'buy_' or 'sell_'. This parameter is optional if parameter name is prefixed with 'buy_' or 'sell_'.
:param optimize: Include parameter in hyperopt optimizations. :param optimize: Include parameter in hyperopt optimizations.
:param load: Load parameter value from {space}_params. :param load: Load parameter value from {space}_params.
:param kwargs: Extra parameters to optuna.distributions. :param kwargs: Extra parameters to optuna.distributions.
@@ -61,7 +61,7 @@ class BaseParameter(ABC):
raise OperationalException( raise OperationalException(
"Name is determined by parameter field name and can not be specified manually." "Name is determined by parameter field name and can not be specified manually."
) )
self.category = space self.space = space
self._space_params = kwargs self._space_params = kwargs
self.value = default self.value = default
self.optimize = optimize self.optimize = optimize
@@ -109,8 +109,9 @@ class NumericParameter(BaseParameter):
:param high: Upper end (inclusive) of optimization space. :param high: Upper end (inclusive) of optimization space.
Must be none of entire range is passed first parameter. Must be none of entire range is passed first parameter.
:param default: A default value. :param default: A default value.
:param space: A parameter category. Can be 'buy' or 'sell'. This parameter is optional if :param space: The parameter space. Can be 'buy', 'sell', or a string that's also a
parameter fieldname is prefixed with 'buy_' or 'sell_'. valid python identifier.
This parameter is optional if parameter name is prefixed with 'buy_' or 'sell_'.
:param optimize: Include parameter in hyperopt optimizations. :param optimize: Include parameter in hyperopt optimizations.
:param load: Load parameter value from {space}_params. :param load: Load parameter value from {space}_params.
:param kwargs: Extra parameters to optuna.distributions.*. :param kwargs: Extra parameters to optuna.distributions.*.
@@ -151,8 +152,9 @@ class IntParameter(NumericParameter):
:param high: Upper end (inclusive) of optimization space. :param high: Upper end (inclusive) of optimization space.
Must be none of entire range is passed first parameter. Must be none of entire range is passed first parameter.
:param default: A default value. :param default: A default value.
:param space: A parameter category. Can be 'buy' or 'sell'. This parameter is optional if :param space: The parameter space. Can be 'buy', 'sell', or a string that's also a
parameter fieldname is prefixed with 'buy_' or 'sell_'. valid python identifier.
This parameter is optional if parameter name is prefixed with 'buy_' or 'sell_'.
:param optimize: Include parameter in hyperopt optimizations. :param optimize: Include parameter in hyperopt optimizations.
:param load: Load parameter value from {space}_params. :param load: Load parameter value from {space}_params.
:param kwargs: Extra parameters to optuna.distributions.IntDistribution. :param kwargs: Extra parameters to optuna.distributions.IntDistribution.
@@ -205,8 +207,9 @@ class RealParameter(NumericParameter):
:param high: Upper end (inclusive) of optimization space. :param high: Upper end (inclusive) of optimization space.
Must be none if entire range is passed first parameter. Must be none if entire range is passed first parameter.
:param default: A default value. :param default: A default value.
:param space: A parameter category. Can be 'buy' or 'sell'. This parameter is optional if :param space: The parameter space. Can be 'buy', 'sell', or a string that's also a
parameter fieldname is prefixed with 'buy_' or 'sell_'. valid python identifier.
This parameter is optional if parameter name is prefixed with 'buy_' or 'sell_'.
:param optimize: Include parameter in hyperopt optimizations. :param optimize: Include parameter in hyperopt optimizations.
:param load: Load parameter value from {space}_params. :param load: Load parameter value from {space}_params.
:param kwargs: Extra parameters to optuna.distributions.FloatDistribution. :param kwargs: Extra parameters to optuna.distributions.FloatDistribution.
@@ -245,8 +248,9 @@ class DecimalParameter(NumericParameter):
Must be none if entire range is passed first parameter. Must be none if entire range is passed first parameter.
:param default: A default value. :param default: A default value.
:param decimals: A number of decimals after floating point to be included in testing. :param decimals: A number of decimals after floating point to be included in testing.
:param space: A parameter category. Can be 'buy' or 'sell'. This parameter is optional if :param space: The parameter space. Can be 'buy', 'sell', or a string that's also a
parameter fieldname is prefixed with 'buy_' or 'sell_'. valid python identifier.
This parameter is optional if parameter name is prefixed with 'buy_' or 'sell_'.
:param optimize: Include parameter in hyperopt optimizations. :param optimize: Include parameter in hyperopt optimizations.
:param load: Load parameter value from {space}_params. :param load: Load parameter value from {space}_params.
:param kwargs: Extra parameters to optuna's NumericParameter. :param kwargs: Extra parameters to optuna's NumericParameter.
@@ -310,10 +314,10 @@ class CategoricalParameter(BaseParameter):
Initialize hyperopt-optimizable parameter. Initialize hyperopt-optimizable parameter.
:param categories: Optimization space, [a, b, ...]. :param categories: Optimization space, [a, b, ...].
:param default: A default value. If not specified, first item from specified space will be :param default: A default value. If not specified, first item from specified space will be
used. used.
:param space: A parameter category. Can be 'buy' or 'sell'. This parameter is optional if :param space: The parameter space. Can be 'buy', 'sell', or a string that's also a
parameter field valid python identifier.
name is prefixed with 'buy_' or 'sell_'. This parameter is optional if parameter name is prefixed with 'buy_' or 'sell_'.
:param optimize: Include parameter in hyperopt optimizations. :param optimize: Include parameter in hyperopt optimizations.
:param load: Load parameter value from {space}_params. :param load: Load parameter value from {space}_params.
:param kwargs: Compatibility. Optuna's CategoricalDistribution does not :param kwargs: Compatibility. Optuna's CategoricalDistribution does not
@@ -361,10 +365,10 @@ class BooleanParameter(CategoricalParameter):
Initialize hyperopt-optimizable Boolean Parameter. Initialize hyperopt-optimizable Boolean Parameter.
It's a shortcut to `CategoricalParameter([True, False])`. It's a shortcut to `CategoricalParameter([True, False])`.
:param default: A default value. If not specified, first item from specified space will be :param default: A default value. If not specified, first item from specified space will be
used. used.
:param space: A parameter category. Can be 'buy' or 'sell'. This parameter is optional if :param space: The parameter space. Can be 'buy', 'sell', or a string that's also a
parameter field valid python identifier.
name is prefixed with 'buy_' or 'sell_'. This parameter is optional if parameter name is prefixed with 'buy_' or 'sell_'.
:param optimize: Include parameter in hyperopt optimizations. :param optimize: Include parameter in hyperopt optimizations.
:param load: Load parameter value from {space}_params. :param load: Load parameter value from {space}_params.
:param kwargs: Extra parameters to optuna.distributions.CategoricalDistribution. :param kwargs: Extra parameters to optuna.distributions.CategoricalDistribution.

View File

@@ -13,6 +13,21 @@ logger = logging.getLogger(__name__)
F = TypeVar("F", bound=Callable[..., Any]) F = TypeVar("F", bound=Callable[..., Any])
def __format_traceback(error: Exception) -> str:
"""Format the traceback of an exception into a formatted string."""
tb = error.__traceback__
try:
while tb:
if tb.tb_frame.f_code.co_filename == __file__:
# Skip frames from this file
tb = tb.tb_next
continue
return f"{tb.tb_frame.f_code.co_qualname}:{tb.tb_lineno}"
except Exception:
return "<unavailable>"
return ""
def strategy_safe_wrapper(f: F, message: str = "", default_retval=None, supress_error=False) -> F: def strategy_safe_wrapper(f: F, message: str = "", default_retval=None, supress_error=False) -> F:
""" """
Wrapper around user-provided methods and functions. Wrapper around user-provided methods and functions.
@@ -30,12 +45,17 @@ def strategy_safe_wrapper(f: F, message: str = "", default_retval=None, supress_
kwargs["trade"] = deepcopy(kwargs["trade"]) kwargs["trade"] = deepcopy(kwargs["trade"])
return f(*args, **kwargs) return f(*args, **kwargs)
except ValueError as error: except ValueError as error:
logger.warning(f"{message}Strategy caused the following exception: {error}{f}") traceback = __format_traceback(error)
name = f.__name__ if hasattr(f, "__name__") else str(f)
logger.warning(
f"{message}Strategy caused the following exception: {repr(error)} in "
f"{traceback}, calling {name}",
)
if default_retval is None and not supress_error: if default_retval is None and not supress_error:
raise StrategyError(str(error)) from error raise StrategyError(str(error)) from error
return default_retval return default_retval
except Exception as error: except Exception as error:
logger.exception(f"{message}Unexpected error {error} calling {f}") logger.exception(f"{message}Unexpected error {repr(error)} calling {f}")
if default_retval is None and not supress_error: if default_retval is None and not supress_error:
raise StrategyError(str(error)) from error raise StrategyError(str(error)) from error
return default_retval return default_retval

View File

@@ -46,6 +46,7 @@ class StrategyUpdater:
"aliases": set(), "aliases": set(),
"replacements": [ "replacements": [
("NaN", "nan"), ("NaN", "nan"),
("NAN", "nan"),
], ],
} }
} }

View File

@@ -34,7 +34,7 @@
"bids_to_ask_delta": 1 "bids_to_ask_delta": 1
} }
}, },
"exit_pricing":{ "exit_pricing": {
"price_side": "same", "price_side": "same",
"use_order_book": true, "use_order_book": true,
"order_book_top": 1 "order_book_top": 1

View File

@@ -96,7 +96,9 @@ class SampleStrategy(IStrategy):
buy_rsi = IntParameter(low=1, high=50, default=30, space="buy", optimize=True, load=True) buy_rsi = IntParameter(low=1, high=50, default=30, space="buy", optimize=True, load=True)
sell_rsi = IntParameter(low=50, high=100, default=70, space="sell", optimize=True, load=True) sell_rsi = IntParameter(low=50, high=100, default=70, space="sell", optimize=True, load=True)
short_rsi = IntParameter(low=51, high=100, default=70, space="sell", optimize=True, load=True) short_rsi = IntParameter(low=51, high=100, default=70, space="sell", optimize=True, load=True)
exit_short_rsi = IntParameter(low=1, high=50, default=30, space="buy", optimize=True, load=True) exit_short_rsi = IntParameter(
low=1, high=50, default=30, space="exit", optimize=True, load=True
)
# Number of candles the strategy requires before producing valid signals # Number of candles the strategy requires before producing valid signals
startup_candle_count: int = 200 startup_candle_count: int = 200

View File

@@ -18,6 +18,7 @@ from freqtrade.util.formatters import (
fmt_coin, fmt_coin,
fmt_coin2, fmt_coin2,
format_duration, format_duration,
format_pct,
round_value, round_value,
) )
from freqtrade.util.ft_precise import FtPrecise from freqtrade.util.ft_precise import FtPrecise
@@ -44,6 +45,7 @@ __all__ = [
"format_date", "format_date",
"format_ms_time", "format_ms_time",
"format_ms_time_det", "format_ms_time_det",
"format_pct",
"get_dry_run_wallet", "get_dry_run_wallet",
"FtPrecise", "FtPrecise",
"PeriodicCache", "PeriodicCache",

View File

@@ -1,5 +1,7 @@
from datetime import timedelta from datetime import timedelta
from numpy import isnan
from freqtrade.constants import DECIMAL_PER_COIN_FALLBACK, DECIMALS_PER_COIN from freqtrade.constants import DECIMAL_PER_COIN_FALLBACK, DECIMALS_PER_COIN
@@ -29,6 +31,8 @@ def round_value(value: float, decimals: int, keep_trailing_zeros=False) -> str:
:param keep_trailing_zeros: Keep trailing zeros "222.200" vs. "222.2" :param keep_trailing_zeros: Keep trailing zeros "222.200" vs. "222.2"
:return: Rounded value as string :return: Rounded value as string
""" """
if isnan(value):
return "N/A"
val = f"{value:.{decimals}f}" val = f"{value:.{decimals}f}"
if not keep_trailing_zeros: if not keep_trailing_zeros:
val = strip_trailing_zeros(val) val = strip_trailing_zeros(val)
@@ -80,3 +84,15 @@ def format_duration(td: timedelta) -> str:
h, r = divmod(td.seconds, 3600) h, r = divmod(td.seconds, 3600)
m, _ = divmod(r, 60) m, _ = divmod(r, 60)
return f"{d}d {h:02d}:{m:02d}" return f"{d}d {h:02d}:{m:02d}"
def format_pct(value: float | None) -> str:
"""
Format a float value as percentage string with 2 decimals
None and NaN values are formatted as "N/A"
:param value: Float value to format
:return: Formatted percentage string
"""
if value is None or isnan(value):
return "N/A"
return f"{value:.2%}"

View File

@@ -1,12 +1,23 @@
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.util.migrations.binance_mig import migrate_binance_futures_data from freqtrade.util.migrations.binance_mig import (
migrate_binance_futures_data,
migrate_binance_futures_names,
)
from freqtrade.util.migrations.funding_rate_mig import migrate_funding_fee_timeframe from freqtrade.util.migrations.funding_rate_mig import migrate_funding_fee_timeframe
def migrate_data(config, exchange: Exchange | None = None): def migrate_data(config, exchange: Exchange | None = None) -> None:
""" """
Migrate persisted data from old formats to new formats Migrate persisted data from old formats to new formats
""" """
migrate_binance_futures_data(config) migrate_binance_futures_data(config)
migrate_funding_fee_timeframe(config, exchange) migrate_funding_fee_timeframe(config, exchange)
def migrate_live_content(config, exchange: Exchange | None = None) -> None:
"""
Migrate database content from old formats to new formats
Used for dry/live mode.
"""
migrate_binance_futures_names(config)

View File

@@ -14,6 +14,10 @@ logger = logging.getLogger(__name__)
def migrate_binance_futures_names(config: Config): def migrate_binance_futures_names(config: Config):
"""
Migrate binance futures names in both database and data files.
This is needed because ccxt naming changed from "BTC/USDT" to "BTC/USDT:USDT"
"""
if not ( if not (
config.get("trading_mode", TradingMode.SPOT) == TradingMode.FUTURES config.get("trading_mode", TradingMode.SPOT) == TradingMode.FUTURES
and config["exchange"]["name"] == "binance" and config["exchange"]["name"] == "binance"

View File

@@ -382,7 +382,7 @@ class Wallets:
max_stake_amount: float, max_stake_amount: float,
trade_amount: float | None, trade_amount: float | None,
): ):
if not stake_amount: if not stake_amount or isinstance(stake_amount, str) or stake_amount <= 0:
self._local_log( self._local_log(
f"Stake amount is {stake_amount}, ignoring possible trade for {pair}.", f"Stake amount is {stake_amount}, ignoring possible trade for {pair}.",
level="debug", level="debug",

View File

@@ -1,7 +1,7 @@
from freqtrade_client.ft_rest_client import FtRestClient from freqtrade_client.ft_rest_client import FtRestClient
__version__ = "2025.10-dev" __version__ = "2025.11-dev"
if "dev" in __version__: if "dev" in __version__:
from pathlib import Path from pathlib import Path

View File

@@ -82,7 +82,7 @@ def print_commands():
def main_exec(parsed: dict[str, Any]): def main_exec(parsed: dict[str, Any]):
if parsed.get("show"): if parsed.get("show") or parsed.get("command") in ("show", "help"):
print_commands() print_commands()
sys.exit() sys.exit()

View File

@@ -443,13 +443,13 @@ class FtRestClient:
"""Return available pair (backtest data) based on timeframe / stake_currency selection """Return available pair (backtest data) based on timeframe / stake_currency selection
:param timeframe: Only pairs with this timeframe available. :param timeframe: Only pairs with this timeframe available.
:param stake_currency: Only pairs that include this timeframe :param stake_currency: Only pairs that include this stake currency.
:return: json object :return: json object
""" """
return self._get( return self._get(
"available_pairs", "available_pairs",
params={ params={
"stake_currency": stake_currency if timeframe else "", "stake_currency": stake_currency if stake_currency else "",
"timeframe": timeframe if timeframe else "", "timeframe": timeframe if timeframe else "",
}, },
) )

View File

@@ -1,3 +1,3 @@
# Requirements for freqtrade client library # Requirements for freqtrade client library
requests==2.32.5 requests==2.32.5
python-rapidjson==1.21 python-rapidjson==1.22

View File

@@ -183,6 +183,7 @@ skip_glob = ["**/.env*", "**/env/*", "**/.venv/*", "**/docs/*", "**/user_data/*"
known_first_party = ["freqtrade_client"] known_first_party = ["freqtrade_client"]
[tool.pytest.ini_options] [tool.pytest.ini_options]
# TODO: should be migrated to [tool.pytest] as support for this was added in 9.0
log_format = "%(asctime)s %(levelname)s %(message)s" log_format = "%(asctime)s %(levelname)s %(message)s"
log_date_format = "%Y-%m-%d %H:%M:%S" log_date_format = "%Y-%m-%d %H:%M:%S"

View File

@@ -6,11 +6,11 @@
-r requirements-freqai-rl.txt -r requirements-freqai-rl.txt
-r docs/requirements-docs.txt -r docs/requirements-docs.txt
ruff==0.14.0 ruff==0.14.4
mypy==1.18.2 mypy==1.18.2
pre-commit==4.3.0 pre-commit==4.4.0
pytest==8.4.2 pytest==9.0.1
pytest-asyncio==1.2.0 pytest-asyncio==1.3.0
pytest-cov==7.0.0 pytest-cov==7.0.0
pytest-mock==3.15.1 pytest-mock==3.15.1
pytest-random-order==1.2.0 pytest-random-order==1.2.0
@@ -24,9 +24,9 @@ time-machine==2.19.0
nbconvert==7.16.6 nbconvert==7.16.6
# mypy types # mypy types
scipy-stubs==1.16.2.3 # keep in sync with `scipy` in `requirements-hyperopt.txt` scipy-stubs==1.16.3.0 # keep in sync with `scipy` in `requirements-hyperopt.txt`
types-cachetools==6.2.0.20250827 types-cachetools==6.2.0.20251022
types-filelock==3.2.7 types-filelock==3.2.7
types-requests==2.32.4.20250913 types-requests==2.32.4.20250913
types-tabulate==0.9.0.20241207 types-tabulate==0.9.0.20241207
types-python-dateutil==2.9.0.20251008 types-python-dateutil==2.9.0.20251108

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