Compare commits

...

1133 Commits

Author SHA1 Message Date
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 02836368fb add default --dist loadscope arg to pytest options 2023-12-28 11:07:41 +01:00
Matthias d282027858 Bump CI python version to 3.11 2023-12-26 17:49:01 +01:00
Matthias d329ad28c2 Merge pull request #9590 from freqtrade/enable/xdist
add pytest-xdist to speed up tests
2023-12-25 15:57:06 +01:00
Matthias 2de86af51e Merge pull request #9601 from freqtrade/dependabot/pip/develop/pyarrow-14.0.2
Bump pyarrow from 14.0.1 to 14.0.2
2023-12-25 15:34:20 +01:00
Matthias 97780ee5bf Revert build-online to 3.9 for now 2023-12-25 15:07:06 +01:00
Matthias e162f98cf5 Update pre-built wheels for pyarrow 2023-12-25 15:02:27 +01:00
Matthias c6967b11be Align spelling of "cancelling" 2023-12-25 11:53:50 +01:00
Matthias 1e5d353cf7 use safe_value_fallback when parsing orders
closes #9591
2023-12-25 11:44:14 +01:00
Matthias 17a538b5ba Merge pull request #9596 from freqtrade/dependabot/pip/develop/lightgbm-4.2.0
Bump lightgbm from 4.1.0 to 4.2.0
2023-12-25 11:36:35 +01:00
Matthias fc746214f6 Merge pull request #9600 from freqtrade/dependabot/pip/develop/ccxt-4.1.98
Bump ccxt from 4.1.91 to 4.1.98
2023-12-25 11:32:05 +01:00
dependabot[bot] 58432c1cfa Bump lightgbm from 4.1.0 to 4.2.0
Bumps [lightgbm](https://github.com/microsoft/LightGBM) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/microsoft/LightGBM/releases)
- [Commits](https://github.com/microsoft/LightGBM/compare/v4.1.0...v4.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-25 09:08:35 +00:00
Matthias 69119764bf Merge pull request #9594 from freqtrade/dependabot/pip/develop/xgboost-2.0.3
Bump xgboost from 2.0.2 to 2.0.3
2023-12-25 10:07:51 +01:00
Matthias a20e641bcd Merge pull request #9595 from freqtrade/dependabot/pip/develop/pydantic-2.5.3
Bump pydantic from 2.5.2 to 2.5.3
2023-12-25 08:17:04 +01:00
Matthias ad68eff8f4 Merge pull request #9592 from ArturoGamRod/docs/fix-typo
fix typo in stoploss_from_absolute code example doc
2023-12-25 08:16:40 +01:00
Matthias 68552a61bd Merge pull request #9598 from freqtrade/dependabot/pip/develop/mkdocs-material-9.5.3
Bump mkdocs-material from 9.5.2 to 9.5.3
2023-12-25 07:26:35 +01:00
Matthias b7419305d4 Merge pull request #9599 from freqtrade/dependabot/pip/develop/ruff-0.1.9
Bump ruff from 0.1.8 to 0.1.9
2023-12-25 07:16:11 +01:00
dependabot[bot] 8cc2c5010a Bump pydantic from 2.5.2 to 2.5.3
Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.5.2 to 2.5.3.
- [Release notes](https://github.com/pydantic/pydantic/releases)
- [Changelog](https://github.com/pydantic/pydantic/blob/v2.5.3/HISTORY.md)
- [Commits](https://github.com/pydantic/pydantic/compare/v2.5.2...v2.5.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-25 06:15:46 +00:00
Matthias 872154a6fc Merge pull request #9597 from freqtrade/dependabot/pip/develop/nbconvert-7.13.1
Bump nbconvert from 7.12.0 to 7.13.1
2023-12-25 07:15:07 +01:00
Matthias c8ee8e82f9 Merge pull request #9593 from freqtrade/dependabot/pip/develop/uvicorn-0.25.0
Bump uvicorn from 0.24.0.post1 to 0.25.0
2023-12-25 07:14:37 +01:00
dependabot[bot] 5cbcf72501 Bump pyarrow from 14.0.1 to 14.0.2
Bumps [pyarrow](https://github.com/apache/arrow) from 14.0.1 to 14.0.2.
- [Commits](https://github.com/apache/arrow/compare/go/v14.0.1...go/v14.0.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-25 03:43:48 +00:00
dependabot[bot] 35876cf8ee Bump ccxt from 4.1.91 to 4.1.98
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.1.91 to 4.1.98.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.1.91...4.1.98)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-25 03:43:41 +00:00
dependabot[bot] ac60871ff9 Bump ruff from 0.1.8 to 0.1.9
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.8 to 0.1.9.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.8...v0.1.9)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-25 03:43:34 +00:00
dependabot[bot] 866e34a983 Bump mkdocs-material from 9.5.2 to 9.5.3
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.5.2 to 9.5.3.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.2...9.5.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-25 03:43:17 +00:00
dependabot[bot] 7107971820 Bump nbconvert from 7.12.0 to 7.13.1
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.12.0 to 7.13.1.
- [Release notes](https://github.com/jupyter/nbconvert/releases)
- [Changelog](https://github.com/jupyter/nbconvert/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jupyter/nbconvert/compare/v7.12.0...v7.13.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-25 03:43:07 +00:00
dependabot[bot] 3484590640 Bump xgboost from 2.0.2 to 2.0.3
Bumps [xgboost](https://github.com/dmlc/xgboost) from 2.0.2 to 2.0.3.
- [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/v2.0.2...v2.0.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-25 03:42:48 +00:00
dependabot[bot] 971b7d074c Bump uvicorn from 0.24.0.post1 to 0.25.0
Bumps [uvicorn](https://github.com/encode/uvicorn) from 0.24.0.post1 to 0.25.0.
- [Release notes](https://github.com/encode/uvicorn/releases)
- [Changelog](https://github.com/encode/uvicorn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/encode/uvicorn/compare/0.24.0.post1...0.25.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-25 03:42:42 +00:00
agamboa-caylent ec89aad10b fix typo in stoploss_from_absolute code example 2023-12-24 21:02:22 -06:00
Matthias fc13a99b33 Use intelligent scheduling to improve online test performance 2023-12-24 16:27:18 +01:00
Matthias 03fb204408 use Loadscope to improve parallel test performance 2023-12-24 13:57:42 +01:00
Matthias 0a96aa69b9 Only run parallel on online tests 2023-12-24 12:15:36 +01:00
Matthias ddbfce01b5 Show slowest tests 2023-12-24 12:13:02 +01:00
Matthias 12e75e849d Don't do coverge on --longrun tests 2023-12-24 12:09:46 +01:00
Matthias 916a847639 add pytest-xdist to speed up tests 2023-12-24 08:30:21 +01:00
Matthias 4769b50709 Fix RPC tests 2023-12-23 15:17:26 +01:00
Matthias 18dd9cf803 Use a trade for test that actually has an open stop order 2023-12-23 15:17:26 +01:00
Matthias def204448a Merge pull request #9589 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2023-12-23 10:06:49 +01:00
Matthias 63e652619f Bump mypy to 1.8.0 2023-12-23 09:11:40 +01:00
Matthias 3cb4b10656 Specify python version for pre-commit update 2023-12-23 09:08:55 +01:00
xmatthias 23c3757c7a chore: update pre-commit hooks 2023-12-23 08:04:51 +00:00
Matthias b20aee7653 Merge pull request #9585 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
2023-12-22 06:27:58 +01:00
Matthias 4d7c4352a7 Merge pull request #9519 from freqtrade/ci_mac_13
Add macos-13 to ci matrix
2023-12-21 20:24:08 +01:00
xmatthias a5c914951f chore: update pre-commit hooks 2023-12-21 19:18:40 +00:00
Matthias 9ab08d513a Update committer in pre-commit workflow 2023-12-21 20:13:52 +01:00
Matthias 87ce7dc02c Reduce permissions 2023-12-21 20:12:23 +01:00
Matthias 3c7c4bc02f Use repo scoped token 2023-12-21 19:54:11 +01:00
Matthias 0484b891f1 Add tech maintenance label 2023-12-21 19:39:45 +01:00
Matthias 71689d9d6f Allow write access to action to allow creating the branch 2023-12-21 19:34:21 +01:00
Matthias 881247a823 use isinstance for type checks 2023-12-21 19:26:52 +01:00
Matthias d26154f994 Import logging ... 2023-12-21 19:26:36 +01:00
Matthias 0e14dd6190 Set proper log-level for test 2023-12-21 19:20:27 +01:00
Matthias 3676514ba6 Add pre-commit auto-update workflow 2023-12-21 19:18:50 +01:00
Matthias 9ec23a0292 Improve rpc typing 2023-12-21 18:14:43 +01:00
Matthias 1272a15c35 Properly name Entry / exit types 2023-12-21 18:11:49 +01:00
Matthias a3a175e332 Reduce logging verbosity message in webhooks 2023-12-21 06:49:26 +01:00
Matthias 71b777ef34 Fix missing rm line 2023-12-19 21:51:31 +01:00
Matthias c4cd547451 Merge pull request #9579 from slimatic/develop
typo (configuration.md) fixed value USDT value  in example for clarity
2023-12-19 19:57:34 +01:00
Matthias b4e8122fd3 Attempt to properly remove 3.12 symlinks 2023-12-19 19:55:18 +01:00
slimatic b1393f1bd4 (configuration.md) fixed value USDT value in example for clarity 2023-12-19 10:58:22 -05:00
Matthias 34c5c68a91 Add macos-13 to ci matrix 2023-12-19 06:41:54 +01:00
Matthias c9a018cf0e Improve output if a strategy wasn't found in the backtest result 2023-12-19 06:30:40 +01:00
Matthias 0333abcbdc Merge pull request #9576 from freqtrade/simplify-freqai-example
Make freqai example strat *even* simpler
2023-12-18 20:01:02 +01:00
Matthias 0440b3ef75 Merge pull request #9577 from freqtrade/feat/add-random-forest-classifier
Add SKLearnRandomForestClassifier
2023-12-18 18:15:55 +01:00
Matthias d9ed8c6560 Merge pull request #9568 from freqtrade/dependabot/pip/develop/ccxt-4.1.91
Bump ccxt from 4.1.84 to 4.1.91
2023-12-18 18:14:46 +01:00
robcaulk 2f2467256c feat: add SKLearnRandomForestClassifier 2023-12-18 12:56:04 +01:00
robcaulk 26f0fe2383 make example strat *even* simpler and make sure it buys and sells a lot ;) 2023-12-18 12:38:34 +01:00
Matthias 5e3da30ab9 Fix remaining bittrex instances 2023-12-18 07:15:24 +01:00
Matthias 651d2c06b9 Update tests to use new file 2023-12-18 07:15:24 +01:00
Matthias b371593084 Move previous test config to tests 2023-12-18 07:15:24 +01:00
Matthias 3096cddbcf further remove bittrex from docs 2023-12-18 07:15:24 +01:00
Matthias 5bbe6aacfd Remove Bittrex subclass 2023-12-18 07:15:24 +01:00
Matthias fe4bf271b4 Remove futher bittrex tests 2023-12-18 07:15:24 +01:00
Matthias 0d3d1e6d9a Remove bittrex from more tests 2023-12-18 07:15:24 +01:00
dependabot[bot] 57e01329ce Bump ccxt from 4.1.84 to 4.1.91
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.1.84 to 4.1.91.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.1.84...4.1.91)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18 05:49:40 +00:00
Matthias 99359a7f85 Merge pull request #9575 from freqtrade/dependabot/github_actions/develop/actions/download-artifact-4
Bump actions/download-artifact from 3 to 4
2023-12-18 06:37:53 +01:00
Matthias 5f0932f5ed Merge pull request #9574 from freqtrade/dependabot/github_actions/develop/actions/upload-artifact-4
Bump actions/upload-artifact from 3 to 4
2023-12-18 06:37:35 +01:00
Matthias fece88e7cd Merge pull request #9570 from freqtrade/dependabot/pip/develop/fastapi-0.105.0
Bump fastapi from 0.104.1 to 0.105.0
2023-12-18 06:36:42 +01:00
Matthias c8eb2523ac Merge pull request #9564 from freqtrade/dependabot/pip/develop/torch-2.1.2
Bump torch from 2.1.1 to 2.1.2
2023-12-18 06:35:15 +01:00
Matthias 964b439119 Merge pull request #9569 from freqtrade/dependabot/pip/develop/isort-5.13.2
Bump isort from 5.13.0 to 5.13.2
2023-12-18 06:34:51 +01:00
Matthias ee4f4f2d0d Merge pull request #9566 from freqtrade/dependabot/pip/develop/ruff-0.1.8
Bump ruff from 0.1.7 to 0.1.8
2023-12-18 06:34:31 +01:00
Matthias 7c215688c0 Merge pull request #9565 from freqtrade/dependabot/pip/develop/python-rapidjson-1.14
Bump python-rapidjson from 1.13 to 1.14
2023-12-18 06:33:40 +01:00
Matthias 087ca2bd4a Merge pull request #9571 from freqtrade/dependabot/pip/develop/psutil-5.9.7
Bump psutil from 5.9.6 to 5.9.7
2023-12-18 06:33:20 +01:00
Matthias 6193df36a3 Merge pull request #9573 from freqtrade/dependabot/pip/develop/mkdocs-material-9.5.2
Bump mkdocs-material from 9.5.1 to 9.5.2
2023-12-18 06:33:08 +01:00
Matthias 893b43766f Merge pull request #9567 from freqtrade/dependabot/pip/develop/technical-1.4.2
Bump technical from 1.4.1 to 1.4.2
2023-12-18 06:32:56 +01:00
dependabot[bot] a70ca6f612 Bump actions/download-artifact from 3 to 4
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3 to 4.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v3...v4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18 03:50:19 +00:00
dependabot[bot] e5c783d2db Bump actions/upload-artifact from 3 to 4
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v3...v4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18 03:50:16 +00:00
dependabot[bot] e1b652d890 Bump mkdocs-material from 9.5.1 to 9.5.2
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.5.1 to 9.5.2.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.1...9.5.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18 03:17:18 +00:00
dependabot[bot] 4e98b5f710 Bump psutil from 5.9.6 to 5.9.7
Bumps [psutil](https://github.com/giampaolo/psutil) from 5.9.6 to 5.9.7.
- [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst)
- [Commits](https://github.com/giampaolo/psutil/compare/release-5.9.6...release-5.9.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18 03:17:09 +00:00
dependabot[bot] 901b3f6fe7 Bump fastapi from 0.104.1 to 0.105.0
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.104.1 to 0.105.0.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.104.1...0.105.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18 03:17:03 +00:00
dependabot[bot] d0a9d927dd Bump isort from 5.13.0 to 5.13.2
Bumps [isort](https://github.com/pycqa/isort) from 5.13.0 to 5.13.2.
- [Release notes](https://github.com/pycqa/isort/releases)
- [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pycqa/isort/compare/5.13.0...5.13.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18 03:16:57 +00:00
dependabot[bot] 16eb95c71d Bump technical from 1.4.1 to 1.4.2
Bumps [technical](https://github.com/freqtrade/technical) from 1.4.1 to 1.4.2.
- [Release notes](https://github.com/freqtrade/technical/releases)
- [Commits](https://github.com/freqtrade/technical/compare/1.4.1...1.4.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18 03:16:40 +00:00
dependabot[bot] 054ed0a7b6 Bump ruff from 0.1.7 to 0.1.8
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.7 to 0.1.8.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.7...v0.1.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18 03:16:36 +00:00
dependabot[bot] 82853e37a1 Bump python-rapidjson from 1.13 to 1.14
Bumps [python-rapidjson](https://github.com/python-rapidjson/python-rapidjson) from 1.13 to 1.14.
- [Changelog](https://github.com/python-rapidjson/python-rapidjson/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-rapidjson/python-rapidjson/compare/v1.13...v1.14)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18 03:16:26 +00:00
dependabot[bot] 81c6336e11 Bump torch from 2.1.1 to 2.1.2
Bumps [torch](https://github.com/pytorch/pytorch) from 2.1.1 to 2.1.2.
- [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.1.1...v2.1.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-18 03:16:14 +00:00
Matthias 6404bd8b2b Merge pull request #9561 from freqtrade/revert/9450-freqai-startup-candle-mr
Revert "Merge pull request #9450 from freqtrade/fix/startup-candle-count"
2023-12-17 19:42:06 +01:00
robcaulk 9a9a6eaa63 Revert "Merge pull request #9450 from freqtrade/fix/startup-candle-count"
This reverts commit 15771043f7, reversing
changes made to b417a0297b.
2023-12-17 17:44:15 +01:00
Matthias 67cdab6ee9 Provide strategy timeframe via API 2023-12-17 15:03:11 +01:00
Matthias 546ea430c9 Merge pull request #9558 from freqtrade/pyproject_toml
Pyproject toml, improve release CI
2023-12-17 13:10:18 +01:00
Matthias 4cc4f0ffa2 Merge pull request #9559 from stevanStevic/improve-no-hyperopt-result-log
Improve log message when no good hyperopt result is found
2023-12-17 10:03:36 +01:00
Matthias 58470ba9d0 Fix missing files in wheels 2023-12-17 09:30:09 +01:00
Stevan Stevic c580e8783f fixup 2023-12-16 22:36:56 +01:00
Stevan Stevic bc1ad3acbd Improve logging 2023-12-16 22:09:02 +01:00
Matthias d2e328b8bd Update artifact name 2023-12-16 21:32:36 +01:00
Matthias 93e9c4fa65 Update job names in ci.yml 2023-12-16 21:14:06 +01:00
Matthias 8d231dbf31 Update build-system to use "build" insead of "setup.py" 2023-12-16 20:54:30 +01:00
Matthias b178cc5f31 Migrate from setup.cfg to pyproject.toml 2023-12-16 20:51:46 +01:00
Matthias 6ee0f16e4f Migrate flake8 config to pyproject.toml 2023-12-16 20:32:37 +01:00
Matthias 1d701967b7 exclude tests from build 2023-12-16 20:27:47 +01:00
Matthias d6b43c5eed re-work deploy CI 2023-12-16 20:06:18 +01:00
Matthias 3670699ea2 Add trusted publishing for next release 2023-12-16 17:31:48 +01:00
Matthias 9b11091fc7 Merge pull request #9555 from amargedon/mapping-btc
Add FIAT mapping for BTC
2023-12-16 08:13:46 +01:00
amargedon 58dfffe87a Add FIAT mapping for BTC 2023-12-15 09:09:31 +01:00
Matthias e573409925 Add windows ta-lib 3.12 wheels 2023-12-15 07:02:56 +01:00
Matthias e3fda16d16 Don't overpopulate points at the first iteration
improves hyperopt-performance quite some.
2023-12-15 06:19:50 +01:00
Matthias 71d3572c27 Support webserver strategy without max_open_trades 2023-12-14 18:17:10 +01:00
Matthias 62667d123f Merge pull request #9540 from freqtrade/fix/issue_9538
Prevent config modification during webserver startup
2023-12-14 06:36:50 +01:00
Matthias cfd5af67ca Add max-open-trades param to get_trade_stake_amount 2023-12-13 06:51:26 +01:00
Matthias 47a952e41c Don't use config['stake_amount'] in wallets 2023-12-12 22:43:46 +01:00
Matthias c9f43587ec Bump binance leverage tiers 2023-12-12 21:30:52 +01:00
Matthias e79a58e1c4 Add test case to verify behavior in #9432 2023-12-12 19:59:56 +01:00
Matthias c62e52c759 Add test for dp_get_required_startup 2023-12-12 19:48:17 +01:00
Matthias 5ab61d9da4 Improve missing data output 2023-12-12 07:08:26 +01:00
Matthias 55efaec83d Merge pull request #9522 from freqtrade/bt/improve_futures_speed
Improve funding fee calculation
2023-12-12 06:33:57 +01:00
Matthias c5c2c8c185 Enforce kwargs for preliminary 2023-12-11 20:35:49 +01:00
Matthias 755ce3a858 Prevent config modification during webserver startup 2023-12-11 20:32:37 +01:00
Matthias 105cd99395 use max_open_trades from straetgy instead of config 2023-12-11 19:52:49 +01:00
Matthias db7799d2fb Use variable instead of config for startup_candle_count 2023-12-11 19:42:13 +01:00
Matthias 30f94ef5b7 Use LocalTrade for typehint 2023-12-11 19:12:08 +01:00
Matthias 6c259ddca1 Merge pull request #9536 from freqtrade/dependabot/pip/develop/ccxt-4.1.84
Bump ccxt from 4.1.76 to 4.1.84
2023-12-11 18:18:44 +01:00
Matthias 0f82ea8767 Merge pull request #9533 from freqtrade/dependabot/pip/develop/pre-commit-3.6.0
Bump pre-commit from 3.5.0 to 3.6.0
2023-12-11 15:45:51 +01:00
Matthias eac5d53a64 Add mock to backtest adjust position 2023-12-11 06:48:05 +01:00
dependabot[bot] 4b43ccae11 Bump ccxt from 4.1.76 to 4.1.84
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.1.76 to 4.1.84.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.1.76...4.1.84)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-11 05:29:11 +00:00
Matthias 8a2763d275 Merge pull request #9532 from freqtrade/dependabot/pip/develop/pandas-2.1.4
Bump pandas from 2.1.3 to 2.1.4
2023-12-11 06:28:16 +01:00
dependabot[bot] 4b3230689c Bump pre-commit from 3.5.0 to 3.6.0
Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 3.5.0 to 3.6.0.
- [Release notes](https://github.com/pre-commit/pre-commit/releases)
- [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pre-commit/pre-commit/compare/v3.5.0...v3.6.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-11 05:26:12 +00:00
Matthias aa86c49640 Merge pull request #9529 from freqtrade/dependabot/pip/develop/ruff-0.1.7
Bump ruff from 0.1.6 to 0.1.7
2023-12-11 06:25:25 +01:00
Matthias 1adc8836dd Merge pull request #9530 from freqtrade/dependabot/pip/develop/mkdocs-material-9.5.1
Bump mkdocs-material from 9.4.14 to 9.5.1
2023-12-11 06:22:05 +01:00
Matthias 92993c0c4c Merge pull request #9527 from freqtrade/dependabot/pip/develop/technical-1.4.1
Bump technical from 1.4.0 to 1.4.1
2023-12-11 06:21:53 +01:00
Matthias 9b2c116d9b Merge pull request #9528 from freqtrade/dependabot/pip/develop/isort-5.13.0
Bump isort from 5.12.0 to 5.13.0
2023-12-11 06:21:42 +01:00
Matthias 2ad85a6957 Merge pull request #9526 from freqtrade/dependabot/github_actions/develop/actions/setup-python-5
Bump actions/setup-python from 4 to 5
2023-12-11 06:21:20 +01:00
dependabot[bot] a0e92f5a47 Bump pandas from 2.1.3 to 2.1.4
Bumps [pandas](https://github.com/pandas-dev/pandas) from 2.1.3 to 2.1.4.
- [Release notes](https://github.com/pandas-dev/pandas/releases)
- [Commits](https://github.com/pandas-dev/pandas/compare/v2.1.3...v2.1.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-11 03:53:12 +00:00
dependabot[bot] 17f0697c43 Bump mkdocs-material from 9.4.14 to 9.5.1
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.4.14 to 9.5.1.
- [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.4.14...9.5.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-11 03:52:56 +00:00
dependabot[bot] 199e3f91f2 Bump ruff from 0.1.6 to 0.1.7
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.6 to 0.1.7.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.6...v0.1.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-11 03:52:51 +00:00
dependabot[bot] cc14cf23b1 Bump isort from 5.12.0 to 5.13.0
Bumps [isort](https://github.com/pycqa/isort) from 5.12.0 to 5.13.0.
- [Release notes](https://github.com/pycqa/isort/releases)
- [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pycqa/isort/compare/5.12.0...5.13.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-11 03:52:41 +00:00
dependabot[bot] 327f750ead Bump technical from 1.4.0 to 1.4.1
Bumps [technical](https://github.com/freqtrade/technical) from 1.4.0 to 1.4.1.
- [Release notes](https://github.com/freqtrade/technical/releases)
- [Commits](https://github.com/freqtrade/technical/compare/1.4.0...1.4.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-11 03:52:31 +00:00
dependabot[bot] a304080c08 Bump actions/setup-python from 4 to 5
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4...v5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-11 03:33:18 +00:00
Robert Caulk 020d4b5b4d Merge pull request #9523 from freqtrade/fix/freqai-append-bug
Bugfix: ensure zeros are properly appended after each inference
2023-12-10 17:29:51 +01:00
robcaulk 78cb1e608f fix: ensure we have a row of zeros appended (not the function) 2023-12-10 15:30:19 +01:00
Matthias b84a2fcac7 Merge pull request #9521 from freqtrade/robcaulk-patch-1
Ensure the documentation gets read
2023-12-10 14:21:59 +01:00
Robert Caulk c0119d7baa Merge pull request #9449 from freqtrade/dependabot/pip/develop/torch-2.1.1
Bump torch from 2.0.1 to 2.1.1
2023-12-10 14:11:01 +01:00
Matthias 0bd513012a enhance further test for funding-fee checking 2023-12-10 14:00:21 +01:00
Matthias 3f6cd9ee51 Patch funding_fee calculation for unrelated test 2023-12-10 14:00:06 +01:00
Matthias 8964c138f1 Call funding fee calculation whenever a trade is closed 2023-12-10 14:00:06 +01:00
Matthias ef23f0fcba Fix test to account for new funding_fee count 2023-12-10 14:00:06 +01:00
Matthias 074343f0f1 Don't calculate funding_fees on every iteration 2023-12-10 14:00:06 +01:00
Matthias 966eb59fd3 Extract funding fee calculation to separate method 2023-12-10 14:00:06 +01:00
Matthias 778bd7b3b0 enhance further test for funding-fee checking 2023-12-10 13:57:52 +01:00
Matthias b4cd46d6db Further improve funding_Fee test 2023-12-10 13:21:05 +01:00
Matthias 1d73b57e8c Extract some assert values from bt test 2023-12-10 12:57:55 +01:00
Robert Caulk 476703bf76 Update data_kitchen.py
Ensure our exception is raised when users dont download the data
2023-12-10 12:26:39 +01:00
Matthias cd09d3567f Add spy test on funding_fees in backtesting 2023-12-09 19:42:13 +01:00
Matthias 4c25e9d21a Merge pull request #9387 from freqtrade/dependabot/pip/develop/scikit-learn-1.3.2
Bump scikit-learn from 1.1.3 to 1.3.2
2023-12-09 14:20:15 +01:00
Matthias dd08c134b4 Remove macos 13 ci again 2023-12-09 13:40:00 +01:00
Matthias aa8bb27cf0 Merge branch 'develop' into dependabot/pip/develop/scikit-learn-1.3.2 2023-12-09 13:39:46 +01:00
Matthias d428d48393 Ease install dependencies for scikit-learn 2023-12-09 12:12:52 +01:00
Matthias 3bdfa85237 Update scikit-optimize to ft-scikit-optimize
Compatibility fork of scikit-optimize.
2023-12-09 12:12:30 +01:00
Matthias 95a824fbe7 Merge pull request #9509 from freqtrade/ci_mac_13
macos-13 CI
2023-12-09 07:55:42 +01:00
Matthias bb85efd6ad Add test for informative weekly merging
closes #9518
2023-12-08 20:41:57 +01:00
Matthias 7321a14c35 Fix generate-test-data for 1w data 2023-12-08 20:38:41 +01:00
Matthias 2745a5d334 Rename informative_pair test 2023-12-08 20:07:44 +01:00
Matthias d123d3bb82 Completely mock Torch on macos
we already skip tests - now we also need to skip it's imports.
2023-12-07 07:25:34 +01:00
Matthias b14873400d Fix odd import in freqai tests 2023-12-07 07:15:05 +01:00
Robert Caulk d9b95a4c27 Merge pull request #9514 from freqtrade/freqai/xgboost_activate
Remove "activate" kwarg to xgboost calls
2023-12-06 21:18:07 +01:00
Matthias 71178ff1d2 Remove "activate" activator
they raise warnings as they're unused.
2023-12-06 19:48:19 +01:00
Matthias d3d9f3281e Fix torch logging setup mess 2023-12-06 19:26:09 +01:00
Matthias 3b4b833dd0 Remove unused mock 2023-12-06 18:22:28 +01:00
Matthias fcc87399cd Merge pull request #9505 from freqtrade/fix/merge-warning
Fix multiple new Pandas 2.1 future warnings in FreqAI startup
2023-12-05 19:25:57 +01:00
Matthias 654f8a7573 Merge pull request #9508 from freqtrade/dependabot/pip/develop/nbconvert-7.12.0
Bump nbconvert from 7.11.0 to 7.12.0
2023-12-05 19:24:22 +01:00
Matthias 2fdb9663d7 Merge branch 'develop' into fix/merge-warning 2023-12-05 18:12:34 +01:00
dependabot[bot] 3739a10735 Bump nbconvert from 7.11.0 to 7.12.0
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.11.0 to 7.12.0.
- [Release notes](https://github.com/jupyter/nbconvert/releases)
- [Changelog](https://github.com/jupyter/nbconvert/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jupyter/nbconvert/compare/v7.11.0...v7.12.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-05 17:10:09 +00:00
Matthias 9a425af76f Remove unnecessary conditions in Ci run 2023-12-05 18:08:24 +01:00
Matthias 3c48208b31 Fix cache keys 2023-12-05 18:08:24 +01:00
Matthias 68db8d0201 install libomp 2023-12-05 18:08:24 +01:00
Matthias 2207773678 Attempt more granular cache for macos 2023-12-05 18:08:24 +01:00
Matthias cbe6d52a73 Try macos-13 CI 2023-12-05 18:08:24 +01:00
Matthias b7fc0190f7 Merge pull request #9512 from freqtrade/revert-9500-dependabot/pip/develop/tables-3.9.2
Revert "Bump tables from 3.9.1 to 3.9.2"
2023-12-05 18:04:56 +01:00
Matthias 4061eaf888 Remove online tests for bittrex 2023-12-05 18:03:55 +01:00
Matthias ef042ae5ec Remove exchange tests on bittrex 2023-12-05 18:03:48 +01:00
Matthias 6ee792069d Remove bitrex-specific section 2023-12-05 18:03:34 +01:00
Matthias 46c81d7018 Revert "Bump tables from 3.9.1 to 3.9.2" 2023-12-05 17:04:16 +01:00
Robert Caulk caac77c90b Update data_drawer.py 2023-12-05 12:16:08 +01:00
Matthias af05e3d747 Merge pull request #9506 from freqtrade/dependabot/pip/develop/ccxt-4.1.76
Bump ccxt from 4.1.75 to 4.1.76
2023-12-04 20:48:37 +01:00
dependabot[bot] 59a287106d Bump ccxt from 4.1.75 to 4.1.76
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.1.75 to 4.1.76.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.1.75...4.1.76)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-04 18:21:30 +00:00
robcaulk 8b5e6bf9be chore: fix pandas warning about merging on datetime. fix pandas warning about inconsistent key lists in concat 2023-12-04 16:23:55 +01:00
Matthias d9882978d5 Merge pull request #9500 from freqtrade/dependabot/pip/develop/tables-3.9.2
Bump tables from 3.9.1 to 3.9.2
2023-12-04 07:25:18 +01:00
Matthias 04f2b7bad6 Add support for different timeInForce for bybit 2023-12-04 07:23:52 +01:00
Matthias 8597709b2e Merge pull request #9501 from freqtrade/dependabot/pip/develop/ccxt-4.1.75
Bump ccxt from 4.1.66 to 4.1.75
2023-12-04 06:33:38 +01:00
Matthias 2fea75e312 Merge pull request #9498 from freqtrade/dependabot/github_actions/develop/pypa/gh-action-pypi-publish-1.8.11
Bump pypa/gh-action-pypi-publish from 1.8.10 to 1.8.11
2023-12-04 06:33:17 +01:00
Matthias 511e4d16d5 Merge pull request #9502 from freqtrade/dependabot/pip/develop/python-telegram-bot-20.7
Bump python-telegram-bot from 20.6 to 20.7
2023-12-04 06:32:46 +01:00
dependabot[bot] e0f780f10e Bump python-telegram-bot from 20.6 to 20.7
Bumps [python-telegram-bot](https://github.com/python-telegram-bot/python-telegram-bot) from 20.6 to 20.7.
- [Release notes](https://github.com/python-telegram-bot/python-telegram-bot/releases)
- [Changelog](https://github.com/python-telegram-bot/python-telegram-bot/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-telegram-bot/python-telegram-bot/compare/v20.6...v20.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-04 03:35:49 +00:00
dependabot[bot] 44689d058b Bump ccxt from 4.1.66 to 4.1.75
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.1.66 to 4.1.75.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.1.66...4.1.75)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-04 03:35:42 +00:00
dependabot[bot] 1431b2b44a Bump tables from 3.9.1 to 3.9.2
Bumps [tables](https://github.com/PyTables/PyTables) from 3.9.1 to 3.9.2.
- [Release notes](https://github.com/PyTables/PyTables/releases)
- [Changelog](https://github.com/PyTables/PyTables/blob/master/RELEASE_NOTES.rst)
- [Commits](https://github.com/PyTables/PyTables/compare/v3.9.1...v3.9.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-04 03:35:27 +00:00
dependabot[bot] 106bda51d4 Bump pypa/gh-action-pypi-publish from 1.8.10 to 1.8.11
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.8.10 to 1.8.11.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.8.10...v1.8.11)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-04 03:10:11 +00:00
Matthias 90e4eb59b2 Improve multi-strategy backtest docs 2023-12-03 15:27:33 +01:00
Matthias 701f6fc050 Update outdated docs
closes #9489
2023-12-03 15:27:03 +01:00
Matthias 0235db48a8 Prevent merge artifacts in "informative" pair 2023-12-03 13:31:16 +01:00
Matthias e9e7bf3caf Slight cleanup of unused comment 2023-12-03 13:31:16 +01:00
Matthias 4464b02719 Add handling to properly merge 1M data to
closes #9490
2023-12-03 13:31:16 +01:00
Matthias 4ed9ffbf31 Add test for behavior in #9490. 2023-12-03 13:31:16 +01:00
Matthias c017366086 Ensure testdata generation works for 1M data 2023-12-03 13:31:16 +01:00
Matthias 34bce4d251 Merge pull request #9493 from freqtrade/chore/future-warning-datadrawer
chore: fix future warning on pandas
2023-12-03 13:25:01 +01:00
Robert Caulk 6754072bca chore: fix future warning on pandas 2023-12-03 12:55:16 +01:00
Robert Caulk 15771043f7 Merge pull request #9450 from freqtrade/fix/startup-candle-count
Bug: freqai backtesting startup_candle_count handling
2023-12-02 21:01:11 +01:00
Robert Caulk b417a0297b Merge pull request #9468 from freqtrade/freqai/fix_dump
Use cloudpickle to pickle freqai models
2023-12-02 18:51:31 +01:00
Matthias 5daafaabc2 Add explicit test for "now_is_time_to_refresh 2023-12-01 07:05:33 +01:00
Matthias 08db2f05aa Merge pull request #9485 from stash86/bt-metrics
exposing bot_name to discord rpc field
2023-11-30 19:04:34 +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 d85518ccb2 Improve release documentation 2023-11-30 07:10:20 +01:00
Matthias c34cb9eb12 Bump version to 2023.12-dev 2023-11-30 07:04:38 +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 e2a47ee95a Merge pull request #9482 from freqtrade/bitmart
Add support for Bitmart
2023-11-30 06:49:41 +01:00
Stefano Ariestasia 36836ea803 add bot_name to discord rpc field 2023-11-30 14:11:09 +09:00
Matthias 19d9adaf9c Merge pull request #9483 from freqtrade/dependabot/pip/cryptography-41.0.6
Bump cryptography from 41.0.5 to 41.0.6
2023-11-29 12:43:15 +01:00
Matthias cf078f8093 Bump to 41.0.7 to avoid install problems 2023-11-29 06:57:00 +01:00
dependabot[bot] 5ddca4e9f9 Bump cryptography from 41.0.5 to 41.0.6
Bumps [cryptography](https://github.com/pyca/cryptography) from 41.0.5 to 41.0.6.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/41.0.5...41.0.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-29 05:27:01 +00:00
Matthias 6db66b1e58 Add bitmart to "official supported" exchanges 2023-11-28 18:18:19 +01:00
Matthias 0a903e45f2 Add Bitmart to list of supported exchnanges for spot 2023-11-28 18:14:42 +01:00
Matthias d0a2b9403e Fix typo 2023-11-28 18:14:33 +01:00
Matthias a18c85ec64 Explicitly disable stoploss on exchange for bitmart 2023-11-28 18:13:21 +01:00
Matthias 0914b8b5f4 Add note about verification on Bitmart 2023-11-28 18:13:21 +01:00
Matthias cb2a871538 Bitmart: add section in exchange docs 2023-11-28 18:13:21 +01:00
Matthias ef877b5fcc Add bitmart to ccxt compat tested exchanges 2023-11-28 18:13:21 +01:00
Matthias 2738f3e437 Add minimal Exchange class for bitmart 2023-11-28 18:13:21 +01:00
Matthias 79f765a930 Merge pull request #9472 from freqtrade/dependabot/pip/develop/ccxt-4.1.66
Bump ccxt from 4.1.57 to 4.1.66
2023-11-27 07:56:47 +01:00
Matthias 696f8b308a Merge pull request #9476 from freqtrade/dependabot/pip/develop/aiohttp-3.9.1
Bump aiohttp from 3.9.0 to 3.9.1
2023-11-27 07:40:39 +01:00
Matthias 4a2473e7e9 Merge pull request #9475 from freqtrade/dependabot/pip/develop/mkdocs-material-9.4.14
Bump mkdocs-material from 9.4.10 to 9.4.14
2023-11-27 07:02:54 +01:00
Matthias a0caa7c5a2 Merge pull request #9477 from freqtrade/dependabot/pip/develop/pydantic-2.5.2
Bump pydantic from 2.5.1 to 2.5.2
2023-11-27 07:02:25 +01:00
Matthias 388a0c605c Merge pull request #9470 from stash86/bt-metrics2
fix typo on API docs
2023-11-27 06:46:50 +01:00
Matthias 55e4d08fd8 Merge pull request #9436 from stash86/bt-metrics
Remove order list from /status, and add new /order command
2023-11-27 06:40:00 +01:00
Matthias 7c00a4ed13 Remove no longer existing exchange aliases from tests 2023-11-27 06:39:14 +01:00
dependabot[bot] 793cc1acc0 Bump mkdocs-material from 9.4.10 to 9.4.14
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.4.10 to 9.4.14.
- [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.4.10...9.4.14)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-27 05:31:12 +00:00
Matthias 33d910ccea Merge pull request #9474 from freqtrade/dependabot/pip/develop/mypy-1.7.1
Bump mypy from 1.7.0 to 1.7.1
2023-11-27 06:29:46 +01:00
Matthias 8a44337c30 Merge pull request #9473 from freqtrade/dependabot/pip/develop/pymdown-extensions-10.5
Bump pymdown-extensions from 10.4 to 10.5
2023-11-27 06:28:44 +01:00
dependabot[bot] 35871d7b4b Bump pydantic from 2.5.1 to 2.5.2
Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.5.1 to 2.5.2.
- [Release notes](https://github.com/pydantic/pydantic/releases)
- [Changelog](https://github.com/pydantic/pydantic/blob/v2.5.2/HISTORY.md)
- [Commits](https://github.com/pydantic/pydantic/compare/v2.5.1...v2.5.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-27 03:20:23 +00:00
dependabot[bot] 786d4e03fc Bump aiohttp from 3.9.0 to 3.9.1
Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.9.0 to 3.9.1.
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.9.0...v3.9.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-27 03:20:08 +00:00
dependabot[bot] 5e5b56e445 Bump mypy from 1.7.0 to 1.7.1
Bumps [mypy](https://github.com/python/mypy) from 1.7.0 to 1.7.1.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.7.0...v1.7.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-27 03:19:43 +00:00
dependabot[bot] 384ebc5b38 Bump pymdown-extensions from 10.4 to 10.5
Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 10.4 to 10.5.
- [Release notes](https://github.com/facelessuser/pymdown-extensions/releases)
- [Commits](https://github.com/facelessuser/pymdown-extensions/compare/10.4...10.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-27 03:19:35 +00:00
dependabot[bot] 8567af8d28 Bump ccxt from 4.1.57 to 4.1.66
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.1.57 to 4.1.66.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.1.57...4.1.66)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-27 03:19:22 +00:00
Stefano Ariestasia 88e818926a fix typo on API docs 2023-11-27 10:57:50 +09:00
Stefano Ariestasia 4bcb4fdd82 Merge branch 'freqtrade:develop' into bt-metrics 2023-11-27 10:46:21 +09:00
Matthias 0b3a6aa9de Merge pull request #9469 from freqtrade/ci/pi_image_3.11
Update various docker images
2023-11-26 19:23:03 +01:00
Matthias 12ea1cde80 Bump dockerfile to use bookworm (debian12) 2023-11-26 16:34:31 +01:00
Matthias df73b8288c Bump armhf image to bookworm 2023-11-26 14:53:34 +01:00
Matthias a50291cd90 RPI dockerfile - 3.11 2023-11-26 14:52:52 +01:00
Matthias be8ea685de Remove unused function in freqAI example 2023-11-26 13:37:02 +01:00
dependabot[bot] d050beb627 Bump torch from 2.0.1 to 2.1.1
Bumps [torch](https://github.com/pytorch/pytorch) from 2.0.1 to 2.1.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.0.1...v2.1.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-26 11:40:46 +00:00
Robert Caulk 1380cadf15 Merge pull request #9448 from freqtrade/dependabot/pip/develop/stable-baselines3-2.2.1
Bump stable-baselines3 from 2.1.0 to 2.2.1
2023-11-26 12:39:46 +01:00
Matthias 72eeb6561c use Cloudpickle also for reading 2023-11-25 19:37:49 +01:00
Matthias eeb460e55c Use cloudpickle throughout 2023-11-25 19:36:14 +01:00
Matthias e8d0b01991 Correctly import time 2023-11-25 16:17:43 +01:00
Matthias 94020a664b Add slight sleep to avoid random test failure on windows 2023-11-25 15:58:28 +01:00
Matthias 8c5194d5e2 force-reload markets when BadSymbol appears
closes #9463
2023-11-25 15:05:56 +01:00
Matthias 67e81c9018 Fix wrong/faulty docstring 2023-11-25 13:10:45 +01:00
Matthias 25ebdb4cb3 use strategy_wrapper for bot_loop_start in plotting
closes #9464
2023-11-25 12:51:17 +01:00
Matthias 1657fd1f0f Merge pull request #9435 from freqtrade/revisit_relative_intratrade
Improve trade close profit assertions
2023-11-23 20:02:02 +01:00
Stefano Ariestasia 63e702a3bf remove unused comments 2023-11-23 15:55:21 +09:00
Matthias e9f21d0209 Improve logging for #9460 2023-11-23 07:22:44 +01:00
Matthias a044649eef Also have "badrequest" act as InvalidOrderException
causing an emergencyexit.

closes #9456
2023-11-23 06:51:29 +01:00
dependabot[bot] 48317c2307 Bump scikit-learn from 1.1.3 to 1.3.2
Bumps [scikit-learn](https://github.com/scikit-learn/scikit-learn) from 1.1.3 to 1.3.2.
- [Release notes](https://github.com/scikit-learn/scikit-learn/releases)
- [Commits](https://github.com/scikit-learn/scikit-learn/compare/1.1.3...1.3.2)

---
updated-dependencies:
- dependency-name: scikit-learn
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-22 11:13:58 +00:00
Matthias d598c91de3 Merge pull request #9458 from freqtrade/hyperopt_tests
Improve hyperopt Tests
2023-11-22 12:13:14 +01:00
Matthias 5003c2af21 training_env is a property, also, so types can't be overridden 2023-11-22 07:22:40 +01:00
Matthias 6963a92332 Improve hyperopt Tests
ensure scikit-learn has to generate new random points by reducing initial points
this will uncover a failure in newer scikit-learn versions
2023-11-22 07:21:07 +01:00
Matthias e2863e1620 fix: logger has been converted to a property
so it can't be assigned anymore
https://github.com/DLR-RM/stable-baselines3/commit/e9f0f23ce4b4479968e40698b991b49b7f59bd90#diff-d668633497da171f21b8069c33d594b1ee2ad47c1be4848bea33292bc80b7f5c
2023-11-22 06:54:41 +01:00
Matthias 869756d87d Merge pull request #9454 from freqtrade/ci/bittrex_removal
Remove Bittrex from supported exchanges
2023-11-21 20:52:43 +01:00
Matthias 203890844b Remove non-existing pairs 2023-11-21 19:16:34 +01:00
Matthias ba76b87952 Merge pull request #9453 from chasdabigone/fixing-docs
Removed redundant 'cpu_count'
2023-11-21 18:06:24 +01:00
Matthias fbab18b081 Add missing config file 2023-11-21 18:01:18 +01:00
Matthias f7178ecd6f Update test config name and exchange 2023-11-21 07:10:23 +01:00
Matthias 59cbac7147 Merge pull request #9452 from chasdabigone/fix-hyperopt-typo
Removed redudant negative from sentence
2023-11-21 06:58:12 +01:00
Matthias fbc70a60f7 Update test with no bittrex ... 2023-11-21 06:57:18 +01:00
Matthias b45365d385 Update tests to run for binance 2023-11-21 06:47:50 +01:00
Matthias 9990780e6b Update binance config to be for usdt pairs 2023-11-21 06:44:44 +01:00
Matthias 65df2f30c1 Update some more docs with bittrex removal 2023-11-21 06:42:53 +01:00
Matthias e7aa706f73 Update samples with binance 2023-11-21 06:39:38 +01:00
Matthias 3619247123 Remove bittrex from code for suppored exchanges 2023-11-21 06:39:29 +01:00
Matthias 047dac7b7d Remove bittrex from supported exchanges 2023-11-21 06:37:58 +01:00
chas s 7646849405 Removed redundant 'cpu_count' 2023-11-20 23:25:28 -06:00
chas s 10ae0ed9c1 Removed redudant negative from sentence 2023-11-20 16:33:22 -06:00
Matthias e060e729df Merge pull request #9451 from freqtrade/remove_blosc
Remove dependency on blosc
2023-11-20 14:53:04 +01:00
Matthias d81bbba4c2 Remove dependency on blosc 2023-11-20 13:50:59 +01:00
robcaulk d52936fd42 chore: try to keep startup_candle_count behaving the same as a normal FT strat 2023-11-20 09:13:01 +01:00
robcaulk 21a5abf25d fix: make sure that get_required_startup is timeframe independent 2023-11-20 08:42:27 +01:00
Matthias c3980a2746 Merge pull request #9442 from freqtrade/dependabot/pip/develop/ccxt-4.1.57
Bump ccxt from 4.1.52 to 4.1.57
2023-11-20 07:57:19 +01:00
Matthias 2cadbd1229 Merge pull request #9443 from freqtrade/dependabot/pip/develop/ruff-0.1.6
Bump ruff from 0.1.5 to 0.1.6
2023-11-20 07:42:58 +01:00
Matthias 0f57291aa7 Merge pull request #9446 from freqtrade/dependabot/pip/develop/urllib3-2.1.0
Bump urllib3 from 2.0.7 to 2.1.0
2023-11-20 07:36:33 +01:00
Stefano 0e9169e1ec update docs 2023-11-20 15:35:06 +09:00
Stefano 8680b5faa0 fix some tests, add new tests 2023-11-20 14:48:18 +09:00
Matthias 03149cfa42 Merge pull request #9445 from freqtrade/dependabot/pip/develop/pydantic-2.5.1
Bump pydantic from 2.4.2 to 2.5.1
2023-11-20 06:37:47 +01:00
Matthias 4eb4732de7 Merge pull request #9441 from freqtrade/dependabot/pip/develop/rich-13.7.0
Bump rich from 13.6.0 to 13.7.0
2023-11-20 06:36:20 +01:00
Matthias 3a5b22c397 Merge pull request #9438 from freqtrade/dependabot/pip/develop/scipy-1.11.4
Bump scipy from 1.11.3 to 1.11.4
2023-11-20 06:35:25 +01:00
Matthias c3a5d4b4e4 Merge pull request #9439 from freqtrade/dependabot/pip/develop/mkdocs-material-9.4.10
Bump mkdocs-material from 9.4.8 to 9.4.10
2023-11-20 06:34:47 +01:00
dependabot[bot] b97ff3a784 Bump ccxt from 4.1.52 to 4.1.57
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.1.52 to 4.1.57.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.1.52...4.1.57)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-20 05:33:47 +00:00
dependabot[bot] 806af7d796 Bump urllib3 from 2.0.7 to 2.1.0
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.0.7 to 2.1.0.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/2.0.7...2.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-20 05:33:14 +00:00
Matthias 3c25737f38 Merge pull request #9440 from freqtrade/dependabot/pip/develop/aiohttp-3.9.0
Bump aiohttp from 3.8.6 to 3.9.0
2023-11-20 06:32:58 +01:00
Matthias bf98851dc1 Merge pull request #9444 from freqtrade/dependabot/pip/develop/jsonschema-4.20.0
Bump jsonschema from 4.19.2 to 4.20.0
2023-11-20 06:32:01 +01:00
dependabot[bot] 202b72fd8e Bump stable-baselines3 from 2.1.0 to 2.2.1
Bumps [stable-baselines3](https://github.com/DLR-RM/stable-baselines3) from 2.1.0 to 2.2.1.
- [Release notes](https://github.com/DLR-RM/stable-baselines3/releases)
- [Commits](https://github.com/DLR-RM/stable-baselines3/compare/v2.1.0...v2.2.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-20 03:12:31 +00:00
dependabot[bot] 6f60117319 Bump pydantic from 2.4.2 to 2.5.1
Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.4.2 to 2.5.1.
- [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.4.2...v2.5.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-20 03:12:12 +00:00
dependabot[bot] 7070ec30e4 Bump jsonschema from 4.19.2 to 4.20.0
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.19.2 to 4.20.0.
- [Release notes](https://github.com/python-jsonschema/jsonschema/releases)
- [Changelog](https://github.com/python-jsonschema/jsonschema/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/python-jsonschema/jsonschema/compare/v4.19.2...v4.20.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-20 03:12:05 +00:00
dependabot[bot] bf77019d1c Bump ruff from 0.1.5 to 0.1.6
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.5 to 0.1.6.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.5...v0.1.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-20 03:12:00 +00:00
dependabot[bot] b776e5a8e0 Bump rich from 13.6.0 to 13.7.0
Bumps [rich](https://github.com/Textualize/rich) from 13.6.0 to 13.7.0.
- [Release notes](https://github.com/Textualize/rich/releases)
- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Textualize/rich/compare/v13.6.0...v13.7.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-20 03:11:43 +00:00
dependabot[bot] ca208305a0 Bump aiohttp from 3.8.6 to 3.9.0
Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.8.6 to 3.9.0.
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.8.6...v3.9.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-20 03:11:37 +00:00
dependabot[bot] 972c5c327c Bump mkdocs-material from 9.4.8 to 9.4.10
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.4.8 to 9.4.10.
- [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.4.8...9.4.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-20 03:11:28 +00:00
dependabot[bot] 80edfd1531 Bump scipy from 1.11.3 to 1.11.4
Bumps [scipy](https://github.com/scipy/scipy) from 1.11.3 to 1.11.4.
- [Release notes](https://github.com/scipy/scipy/releases)
- [Commits](https://github.com/scipy/scipy/compare/v1.11.3...v1.11.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-20 03:11:23 +00:00
Stefano Ariestasia 58cd455642 fix unused vars 2023-11-19 20:32:28 +09:00
Stefano Ariestasia caf59d25e8 forgot comma 2023-11-19 18:07:45 +09:00
Stefano Ariestasia 7df32a34a0 remove order list from /status and add new /order 2023-11-19 18:01:32 +09:00
Matthias 48097f4a7d Update tests according to calculation update 2023-11-18 19:47:20 +01:00
Matthias ca3f349d84 Update intermediate close_profit calculation 2023-11-18 19:47:09 +01:00
Matthias 0815bb6244 Improve trade close profit assertions 2023-11-18 18:18:29 +01:00
Matthias 835cb54876 Merge pull request #9427 from froggleston/frog-bt-analysis-fix-1
Fix backtesting-analysis when no trades for a pair
2023-11-15 19:46:32 +01:00
Matthias 08c2765633 Merge pull request #9429 from froggleston/frog-hyperopt-docs-1
Clarify hyperopt docs for parameter options
2023-11-15 18:27:14 +01:00
froggleston f9202c3f6b Clarify hyperopt docs for parameter options 2023-11-15 12:11:47 +00:00
froggleston eb186e22d6 Fix backtesting-analysis when no trades for a pair 2023-11-15 11:52:25 +00:00
Matthias cbc323875b Improve contribution wording 2023-11-15 07:12:11 +01:00
Matthias 736b583ff4 Merge pull request #9425 from freqtrade/dependabot/pip/develop/ccxt-4.1.52
Bump ccxt from 4.1.40 to 4.1.52
2023-11-14 20:56:58 +01:00
dependabot[bot] 757ec53877 Bump ccxt from 4.1.40 to 4.1.52
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.1.40 to 4.1.52.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.1.40...4.1.52)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-14 19:16:20 +00:00
Matthias 7814927dd1 Merge pull request #9418 from freqtrade/dependabot/pip/develop/mypy-1.7.0
Bump mypy from 1.6.1 to 1.7.0
2023-11-13 19:28:46 +01:00
Matthias 5f8ff373ab Update mypy to v1.7.0 in pre-commit-config.yaml 2023-11-13 18:15:10 +01:00
Matthias f286cb0a90 Use BaseException in exception check 2023-11-13 18:14:18 +01:00
Matthias 59bd1a1f1f Merge pull request #9309 from freqtrade/dependabot/pip/develop/tables-3.9.1
Bump tables from 3.8.0 to 3.9.1
2023-11-13 13:49:20 +01:00
Matthias e52f6ca6c0 Merge pull request #9421 from konradbeck/patch-2
Update strategy-customization.md
2023-11-13 13:48:58 +01:00
konradbeck e6663c0304 Update strategy-customization.md
Shouldn't the timeperiod be 100 when defining a ema100?
2023-11-13 13:50:32 +02:00
dependabot[bot] ced92300e0 Bump tables from 3.8.0 to 3.9.1
Bumps [tables](https://github.com/PyTables/PyTables) from 3.8.0 to 3.9.1.
- [Release notes](https://github.com/PyTables/PyTables/releases)
- [Changelog](https://github.com/PyTables/PyTables/blob/master/RELEASE_NOTES.rst)
- [Commits](https://github.com/PyTables/PyTables/compare/v3.8.0...v3.9.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-13 09:19:19 +00:00
Matthias f9d061b648 Merge pull request #9413 from freqtrade/dependabot/pip/develop/xgboost-2.0.2
Bump xgboost from 2.0.1 to 2.0.2
2023-11-13 08:01:41 +01:00
Matthias e6661a33f9 Merge pull request #9419 from freqtrade/dependabot/pip/develop/pandas-2.1.3
Bump pandas from 2.1.2 to 2.1.3
2023-11-13 07:26:36 +01:00
Matthias d2afe281bf Add cancel order to new exchange docs 2023-11-13 07:23:50 +01:00
Matthias c237aa00b8 Remove non-used imports 2023-11-13 07:15:35 +01:00
Matthias 23efa4c9c3 Remove deprecated json_encoders key from model_config 2023-11-13 07:15:35 +01:00
dependabot[bot] 8b028734c2 Bump pandas from 2.1.2 to 2.1.3
Bumps [pandas](https://github.com/pandas-dev/pandas) from 2.1.2 to 2.1.3.
- [Release notes](https://github.com/pandas-dev/pandas/releases)
- [Commits](https://github.com/pandas-dev/pandas/compare/v2.1.2...v2.1.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-13 05:29:27 +00:00
dependabot[bot] 51feeddc5c Bump mypy from 1.6.1 to 1.7.0
Bumps [mypy](https://github.com/python/mypy) from 1.6.1 to 1.7.0.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.6.1...v1.7.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-13 05:29:25 +00:00
Matthias af3e42f59d Merge pull request #9415 from freqtrade/dependabot/pip/develop/numpy-1.26.2
Bump numpy from 1.26.1 to 1.26.2
2023-11-13 06:28:52 +01:00
Matthias 34d58eb7d5 Merge pull request #9417 from freqtrade/dependabot/pip/develop/ruff-0.1.5
Bump ruff from 0.1.4 to 0.1.5
2023-11-13 06:28:32 +01:00
Matthias ca0a04fba5 Merge pull request #9416 from freqtrade/dependabot/pip/develop/pymdown-extensions-10.4
Bump pymdown-extensions from 10.3.1 to 10.4
2023-11-13 06:27:44 +01:00
dependabot[bot] 84b3f9924a Bump ruff from 0.1.4 to 0.1.5
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.4 to 0.1.5.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.4...v0.1.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-13 03:34:19 +00:00
dependabot[bot] 50b264c6f8 Bump pymdown-extensions from 10.3.1 to 10.4
Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 10.3.1 to 10.4.
- [Release notes](https://github.com/facelessuser/pymdown-extensions/releases)
- [Commits](https://github.com/facelessuser/pymdown-extensions/compare/10.3.1...10.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-13 03:34:07 +00:00
dependabot[bot] 88e8a9fe2b Bump numpy from 1.26.1 to 1.26.2
Bumps [numpy](https://github.com/numpy/numpy) from 1.26.1 to 1.26.2.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v1.26.1...v1.26.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-13 03:33:57 +00:00
dependabot[bot] d65aef72e8 Bump xgboost from 2.0.1 to 2.0.2
Bumps [xgboost](https://github.com/dmlc/xgboost) from 2.0.1 to 2.0.2.
- [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/v2.0.1...v2.0.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-13 03:33:44 +00:00
Matthias 8273c0c2cd Skip exchange validation in API server dependencies
Especially when validating pairlists for non-main exchanges (the exchange not in the config),
validation can mess with the exchange loading.
2023-11-12 17:34:16 +01:00
Matthias c7624b1ed6 Simplify LiveStats models 2023-11-11 17:18:18 +01:00
Matthias 54536a1c8e use profit_ratio for mix_tag_performance 2023-11-11 17:18:13 +01:00
Matthias 7daa06a207 Align mixtag response with other statistic models 2023-11-11 17:18:06 +01:00
Matthias da647735b6 Merge pull request #9407 from stash86/bt-metrics
add entries, exits, and mix_tags API endpoints
2023-11-11 16:10:10 +01:00
Matthias 7d0ecfde93 Add tests to ensure responses are as expected 2023-11-11 14:43:43 +01:00
Matthias 2ef716e94c Add response_models for new endpoints 2023-11-11 14:43:30 +01:00
Matthias de68850d28 Don't tag informative endpoints as "trading" 2023-11-11 14:31:18 +01:00
Matthias 59cefda283 Update strategy-callbacks.md with new information
on max_entry_position_adjustment
2023-11-11 13:11:17 +01:00
Matthias babcd5887f Merge pull request #9408 from konradbeck/patch-1
Update freqai-feature-engineering.md
2023-11-11 10:54:27 +01:00
Matthias c9a5e5a98c Fix another (identical) typo 2023-11-11 10:50:58 +01:00
konradbeck 51dc5811c2 Update freqai-feature-engineering.md
I cannot find any reference to 'include_periods_candles'
2023-11-11 09:38:52 +02:00
Stefano Ariestasia 05e36f7b21 increase API version 2023-11-11 15:33:15 +09:00
Stefano Ariestasia 0738cae4a0 fix pre-commit 2023-11-11 15:23:20 +09:00
Stefano Ariestasia da3c42bbbc add entries, exits, and mix_tags API endpoints 2023-11-11 15:16:40 +09:00
Matthias e728e3bc75 Merge pull request #9402 from freqtrade/dependabot/pip/pyarrow-14.0.1
Bump pyarrow from 14.0.0 to 14.0.1
2023-11-10 21:11:23 +01:00
Matthias 315783441d Update pyarrow wheels 2023-11-10 19:41:23 +01:00
dependabot[bot] 62f1421cfb Bump pyarrow from 14.0.0 to 14.0.1
Bumps [pyarrow](https://github.com/apache/arrow) from 14.0.0 to 14.0.1.
- [Commits](https://github.com/apache/arrow/compare/go/v14.0.0...apache-arrow-14.0.1)

---
updated-dependencies:
- dependency-name: pyarrow
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-09 22:48:16 +00:00
Matthias 52f12b704b Avoid time colision when creating orders in test
avoid flakyness of test.
2023-11-06 19:42:16 +01:00
Matthias ee5051f788 Merge pull request #9388 from freqtrade/dependabot/pip/develop/pyarrow-14.0.0
Bump pyarrow from 13.0.0 to 14.0.0
2023-11-06 17:46:19 +01:00
Matthias b30b1227e3 Merge pull request #9394 from freqtrade/dependabot/pip/develop/sqlalchemy-2.0.23
Bump sqlalchemy from 2.0.22 to 2.0.23
2023-11-06 17:45:36 +01:00
Matthias dd2f8db392 Merge pull request #9396 from freqtrade/dependabot/pip/develop/ccxt-4.1.40
Bump ccxt from 4.1.39 to 4.1.40
2023-11-06 17:45:20 +01:00
Matthias 5a76d81529 Merge pull request #9398 from freqtrade/dependabot/pip/develop/uvicorn-0.24.0.post1
Bump uvicorn from 0.23.2 to 0.24.0.post1
2023-11-06 17:21:57 +01:00
Matthias b9851c78ad Merge pull request #9397 from freqtrade/dependabot/pip/develop/nbconvert-7.11.0
Bump nbconvert from 7.10.0 to 7.11.0
2023-11-06 17:21:35 +01:00
Matthias 777cf2ae7a Merge pull request #9399 from freqtrade/dependabot/pip/develop/ruff-0.1.4
Bump ruff from 0.1.3 to 0.1.4
2023-11-06 17:21:17 +01:00
dependabot[bot] 3729b3d793 Bump ruff from 0.1.3 to 0.1.4
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.3 to 0.1.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/v0.1.3...v0.1.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 14:54:26 +00:00
dependabot[bot] 39fc78205d Bump uvicorn from 0.23.2 to 0.24.0.post1
Bumps [uvicorn](https://github.com/encode/uvicorn) from 0.23.2 to 0.24.0.post1.
- [Release notes](https://github.com/encode/uvicorn/releases)
- [Changelog](https://github.com/encode/uvicorn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/encode/uvicorn/compare/0.23.2...0.24.0.post1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 14:54:11 +00:00
dependabot[bot] 46a67e8d4f Bump nbconvert from 7.10.0 to 7.11.0
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.10.0 to 7.11.0.
- [Release notes](https://github.com/jupyter/nbconvert/releases)
- [Changelog](https://github.com/jupyter/nbconvert/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jupyter/nbconvert/compare/v7.10.0...v7.11.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 14:54:05 +00:00
dependabot[bot] 69017805c0 Bump ccxt from 4.1.39 to 4.1.40
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.1.39 to 4.1.40.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.1.39...4.1.40)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 14:54:00 +00:00
Matthias bcec611973 Add pre-built wheels for pyarrow 14 2023-11-06 15:43:55 +01:00
Matthias fbb11a394a Bump sqlalchemy pre-commit 2023-11-06 15:42:18 +01:00
Matthias 5cb916977e Merge pull request #9390 from freqtrade/dependabot/pip/develop/cachetools-5.3.2
Bump cachetools from 5.3.1 to 5.3.2
2023-11-06 15:40:54 +01:00
Matthias 7d4c9bc0cf Merge pull request #9395 from freqtrade/dependabot/pip/develop/markdown-3.5.1
Bump markdown from 3.5 to 3.5.1
2023-11-06 15:40:39 +01:00
Matthias ea2beb46e7 Merge pull request #9392 from freqtrade/dependabot/pip/develop/mkdocs-material-9.4.8
Bump mkdocs-material from 9.4.7 to 9.4.8
2023-11-06 15:40:29 +01:00
Matthias 216ee8117a Merge pull request #9393 from freqtrade/dependabot/pip/develop/tensorboard-2.15.1
Bump tensorboard from 2.15.0 to 2.15.1
2023-11-06 15:40:12 +01:00
Matthias 9c1210b34e Merge pull request #9391 from freqtrade/dependabot/pip/develop/filelock-3.13.1
Bump filelock from 3.12.4 to 3.13.1
2023-11-06 06:44:40 +01:00
dependabot[bot] 921e034266 Bump sqlalchemy from 2.0.22 to 2.0.23
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.22 to 2.0.23.
- [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases)
- [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst)
- [Commits](https://github.com/sqlalchemy/sqlalchemy/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 05:43:11 +00:00
Matthias 6f358b16c0 Merge pull request #9385 from freqtrade/dependabot/pip/develop/ccxt-4.1.39
Bump ccxt from 4.1.31 to 4.1.39
2023-11-06 06:42:10 +01:00
dependabot[bot] 264ab2c471 Bump pyarrow from 13.0.0 to 14.0.0
Bumps [pyarrow](https://github.com/apache/arrow) from 13.0.0 to 14.0.0.
- [Commits](https://github.com/apache/arrow/compare/go/v13.0.0...go/v14.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 05:40:25 +00:00
Matthias a9d6f0023a Merge pull request #9384 from freqtrade/dependabot/pip/develop/py-find-1st-1.1.6
Bump py-find-1st from 1.1.5 to 1.1.6
2023-11-06 06:39:37 +01:00
dependabot[bot] 31af1d5dc7 Bump markdown from 3.5 to 3.5.1
Bumps [markdown](https://github.com/Python-Markdown/markdown) from 3.5 to 3.5.1.
- [Release notes](https://github.com/Python-Markdown/markdown/releases)
- [Changelog](https://github.com/Python-Markdown/markdown/blob/master/docs/changelog.md)
- [Commits](https://github.com/Python-Markdown/markdown/compare/3.5...3.5.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 05:38:40 +00:00
dependabot[bot] 588bbb45b5 Bump cachetools from 5.3.1 to 5.3.2
Bumps [cachetools](https://github.com/tkem/cachetools) from 5.3.1 to 5.3.2.
- [Changelog](https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tkem/cachetools/compare/v5.3.1...v5.3.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 05:38:10 +00:00
Matthias 278c999f1f Merge pull request #9389 from freqtrade/dependabot/pip/develop/jsonschema-4.19.2
Bump jsonschema from 4.19.1 to 4.19.2
2023-11-06 06:38:09 +01:00
Matthias 825ae15109 Merge pull request #9386 from freqtrade/dependabot/pip/develop/nbconvert-7.10.0
Bump nbconvert from 7.9.2 to 7.10.0
2023-11-06 06:37:31 +01:00
Matthias 30cacc7cca Merge pull request #9383 from freqtrade/dependabot/pip/develop/fastapi-0.104.1
Bump fastapi from 0.104.0 to 0.104.1
2023-11-06 06:37:08 +01:00
dependabot[bot] 7ed037bad7 Bump tensorboard from 2.15.0 to 2.15.1
Bumps [tensorboard](https://github.com/tensorflow/tensorboard) from 2.15.0 to 2.15.1.
- [Release notes](https://github.com/tensorflow/tensorboard/releases)
- [Changelog](https://github.com/tensorflow/tensorboard/blob/2.15.1/RELEASE.md)
- [Commits](https://github.com/tensorflow/tensorboard/compare/2.15.0...2.15.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 03:52:46 +00:00
dependabot[bot] 77b00b2a12 Bump mkdocs-material from 9.4.7 to 9.4.8
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.4.7 to 9.4.8.
- [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.4.7...9.4.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 03:52:41 +00:00
dependabot[bot] 773bc386f7 Bump filelock from 3.12.4 to 3.13.1
Bumps [filelock](https://github.com/tox-dev/py-filelock) from 3.12.4 to 3.13.1.
- [Release notes](https://github.com/tox-dev/py-filelock/releases)
- [Changelog](https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst)
- [Commits](https://github.com/tox-dev/py-filelock/compare/3.12.4...3.13.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 03:52:35 +00:00
dependabot[bot] 90dacaca09 Bump jsonschema from 4.19.1 to 4.19.2
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.19.1 to 4.19.2.
- [Release notes](https://github.com/python-jsonschema/jsonschema/releases)
- [Changelog](https://github.com/python-jsonschema/jsonschema/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/python-jsonschema/jsonschema/compare/v4.19.1...v4.19.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 03:52:27 +00:00
dependabot[bot] 3689ad16b5 Bump nbconvert from 7.9.2 to 7.10.0
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.9.2 to 7.10.0.
- [Release notes](https://github.com/jupyter/nbconvert/releases)
- [Changelog](https://github.com/jupyter/nbconvert/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jupyter/nbconvert/compare/v7.9.2...v7.10.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 03:52:09 +00:00
dependabot[bot] ab9954350e Bump ccxt from 4.1.31 to 4.1.39
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.1.31 to 4.1.39.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.1.31...4.1.39)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 03:52:05 +00:00
dependabot[bot] 533f11d9eb Bump py-find-1st from 1.1.5 to 1.1.6
Bumps [py-find-1st](https://github.com/roebel/py_find_1st) from 1.1.5 to 1.1.6.
- [Release notes](https://github.com/roebel/py_find_1st/releases)
- [Commits](https://github.com/roebel/py_find_1st/commits)

---
updated-dependencies:
- dependency-name: py-find-1st
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 03:51:57 +00:00
dependabot[bot] 551033a7c3 Bump fastapi from 0.104.0 to 0.104.1
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.104.0 to 0.104.1.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.104.0...0.104.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 03:51:55 +00:00
Matthias e003930e18 Merge pull request #9382 from freqtrade/test_reduce_time
Reduce wait for ws test
2023-11-05 18:09:50 +01:00
Matthias 2efef72ec2 Reduce wait for ws test 2023-11-05 17:17:07 +01:00
Matthias eb40fc698d Merge pull request #9381 from freqtrade/test_refactor
Test refactor
2023-11-05 17:16:35 +01:00
Matthias 751db2be78 fix: test typo mishap 2023-11-05 16:35:49 +01:00
Matthias 6ea353447e use tmp_path instead of tmpdir 2023-11-05 16:25:36 +01:00
Matthias 5a3839320d Remove further usages of Path(tmpdir) 2023-11-05 16:25:23 +01:00
Matthias 555f4b51e1 Further improvements to test setup 2023-11-05 16:23:22 +01:00
Matthias be82248e01 Remove futher usages of Path(tmpdir) 2023-11-05 16:18:28 +01:00
Matthias 7bed7801cc Further test simplifications 2023-11-05 16:15:36 +01:00
Matthias eb409de916 use tmp_path instead of Path(tmpdir) 2023-11-05 16:15:21 +01:00
Matthias 8ce39a6d75 Merge pull request #9378 from freqtrade/fix/transformer-dimensions
Bugfix: PyTorchTransformer
2023-11-04 15:51:54 +01:00
robcaulk 72dc65cb6a fix: swap tensor dimension to play nicely with pandas 2023-11-04 14:29:51 +01:00
Matthias c94c667fb1 Merge pull request #9375 from freqtrade/ci/pi_cache_talib
Update Dockerfile.armhf to use prebuilt wheels
2023-11-03 06:52:08 +01:00
Matthias 2a0175f629 Add "empty" config to disable default discord messages
closes #9372
2023-11-02 18:09:41 +01:00
Matthias cd68173440 Update Dockerfile.armhf to use prebuilt wheels 2023-11-02 07:08:36 +01:00
Matthias c920e3a031 Bump Dockerfile to 3.11.6 2023-11-02 07:05:10 +01:00
Matthias 83afc4ac7e Add pyarrow 3.11 wheel 2023-11-02 07:04:33 +01:00
Matthias 19f62649ea use "noindex" to install pyarrow on armhf 2023-11-02 07:03:22 +01:00
Matthias e4186cde9e Merge pull request #9369 from freqtrade/feat/informative_base
informative assets -> {base}
2023-11-02 06:36:55 +01:00
Matthias 61ed6aee62 Add test for new formatting 2023-11-01 11:02:50 +01:00
Matthias 051b6e9458 Update documentation 2023-11-01 11:02:03 +01:00
Matthias 44a24685ac Add support for {base} and {quote} in informative decorator 2023-11-01 11:01:55 +01:00
Matthias 1cde980c08 Extract pair_formating options 2023-11-01 10:14:19 +01:00
Matthias 05ef4f9b6f Fix forceenter - cancel dialog not working
closes #9368
2023-11-01 09:10:21 +01:00
Matthias 53f00f248e Merge pull request #9362 from freqtrade/dependabot/pip/develop/pandas-2.1.2
Bump pandas from 2.0.3 to 2.1.2
2023-10-31 14:29:09 +01:00
Matthias a9cd282500 Merge pull request #9349 from freqtrade/fix/issue_9346
Fix/issue 9346
2023-10-31 06:44:37 +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 26aa14dbfc update binance leverage tiers 2023-10-30 20:10:01 +01:00
Matthias 04cd931cc8 Pass explicit stringIO type to pandas read_json 2023-10-30 19:20:59 +01:00
Matthias b8a6330c3f Improve pandas handling 2023-10-30 19:16:22 +01:00
Matthias 949c3c660b Ignore "nan" enter and exit tags
these happen if strings are assigned to individual rows without initializing the whole column
2023-10-30 19:05:15 +01:00
Matthias 9297a90d7f Use proper indexing to avoid deprecation warnings 2023-10-30 18:26:25 +01:00
Matthias b19f17fdfa Improve handling of bt results in optimize_reports 2023-10-30 18:26:01 +01:00
Matthias bbdc6c0f5c improve pandas syntax to avoid deprecation error 2023-10-30 18:11:38 +01:00
dependabot[bot] 528c65c194 Bump pandas from 2.0.3 to 2.1.2
Bumps [pandas](https://github.com/pandas-dev/pandas) from 2.0.3 to 2.1.2.
- [Release notes](https://github.com/pandas-dev/pandas/releases)
- [Commits](https://github.com/pandas-dev/pandas/compare/v2.0.3...v2.1.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 09:13:28 +00:00
Matthias a932df7320 Merge pull request #9356 from freqtrade/dependabot/pip/develop/orjson-3.9.10
Bump orjson from 3.9.9 to 3.9.10
2023-10-30 10:12:34 +01:00
Matthias 2d9b05a3ab Merge pull request #9354 from freqtrade/dependabot/pip/develop/ccxt-4.1.31
Bump ccxt from 4.1.22 to 4.1.31
2023-10-30 10:12:16 +01:00
Matthias 7cf1d25dc6 Merge pull request #9361 from freqtrade/dependabot/pip/develop/types-cachetools-5.3.0.7
Bump types-cachetools from 5.3.0.6 to 5.3.0.7
2023-10-30 10:11:57 +01:00
Matthias 19c955d505 Merge pull request #9358 from freqtrade/dependabot/pip/develop/pytest-7.4.3
Bump pytest from 7.4.2 to 7.4.3
2023-10-30 10:11:21 +01:00
Matthias bd243da47e Merge pull request #9352 from freqtrade/dependabot/pip/develop/plotly-5.18.0
Bump plotly from 5.17.0 to 5.18.0
2023-10-30 07:14:59 +01:00
Matthias bf24c3b279 BUmp cachetools types in pre-commit ocnfig 2023-10-30 07:07:51 +01:00
Matthias e9c72acff2 Merge pull request #9360 from freqtrade/dependabot/pip/develop/ast-comments-1.2.0
Bump ast-comments from 1.1.2 to 1.2.0
2023-10-30 06:55:35 +01:00
Matthias 09fd22c2f8 Merge pull request #9347 from freqtrade/ci/numpy_bump
Bump numpy on armhf devices
2023-10-30 06:48:46 +01:00
Matthias 45721ed62e Merge pull request #9355 from freqtrade/dependabot/pip/develop/xgboost-2.0.1
Bump xgboost from 2.0.0 to 2.0.1
2023-10-30 06:48:22 +01:00
dependabot[bot] 5182045cda Bump pytest from 7.4.2 to 7.4.3
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.2 to 7.4.3.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.4.2...7.4.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 05:45:34 +00:00
Matthias 51ab8fecfc Merge pull request #9359 from freqtrade/dependabot/pip/develop/ruff-0.1.3
Bump ruff from 0.1.1 to 0.1.3
2023-10-30 06:44:45 +01:00
dependabot[bot] b36907133c Bump ccxt from 4.1.22 to 4.1.31
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.1.22 to 4.1.31.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.1.22...4.1.31)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 05:43:21 +00:00
Matthias b6d899344e Merge pull request #9357 from freqtrade/dependabot/pip/develop/mkdocs-material-9.4.7
Bump mkdocs-material from 9.4.6 to 9.4.7
2023-10-30 06:42:47 +01:00
Matthias 095f9fc1ab Merge pull request #9351 from freqtrade/dependabot/pip/develop/cryptography-41.0.5
Bump cryptography from 41.0.4 to 41.0.5
2023-10-30 06:42:32 +01:00
dependabot[bot] 0ab9eb7b05 Bump orjson from 3.9.9 to 3.9.10
Bumps [orjson](https://github.com/ijl/orjson) from 3.9.9 to 3.9.10.
- [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.9.9...3.9.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 05:42:04 +00:00
Matthias d0c582e137 Merge pull request #9353 from freqtrade/dependabot/pip/develop/python-rapidjson-1.13
Bump python-rapidjson from 1.12 to 1.13
2023-10-30 06:40:54 +01:00
dependabot[bot] d3d4464983 Bump types-cachetools from 5.3.0.6 to 5.3.0.7
Bumps [types-cachetools](https://github.com/python/typeshed) from 5.3.0.6 to 5.3.0.7.
- [Commits](https://github.com/python/typeshed/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 03:37:57 +00:00
dependabot[bot] 1d0934074c Bump ast-comments from 1.1.2 to 1.2.0
Bumps [ast-comments](https://github.com/t3rn0/ast-comments) from 1.1.2 to 1.2.0.
- [Release notes](https://github.com/t3rn0/ast-comments/releases)
- [Commits](https://github.com/t3rn0/ast-comments/compare/1.1.2...1.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 03:37:53 +00:00
dependabot[bot] 9382fb3be8 Bump ruff from 0.1.1 to 0.1.3
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.1 to 0.1.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/v0.1.1...v0.1.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 03:37:49 +00:00
dependabot[bot] 223af95da7 Bump mkdocs-material from 9.4.6 to 9.4.7
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.4.6 to 9.4.7.
- [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.4.6...9.4.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 03:37:23 +00:00
dependabot[bot] 8b68b55de4 Bump xgboost from 2.0.0 to 2.0.1
Bumps [xgboost](https://github.com/dmlc/xgboost) from 2.0.0 to 2.0.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/v2.0.0...v2.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 03:37:06 +00:00
dependabot[bot] 99592d1a12 Bump python-rapidjson from 1.12 to 1.13
Bumps [python-rapidjson](https://github.com/python-rapidjson/python-rapidjson) from 1.12 to 1.13.
- [Changelog](https://github.com/python-rapidjson/python-rapidjson/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-rapidjson/python-rapidjson/compare/v1.12...v1.13)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 03:36:47 +00:00
dependabot[bot] b69f5aaac3 Bump plotly from 5.17.0 to 5.18.0
Bumps [plotly](https://github.com/plotly/plotly.py) from 5.17.0 to 5.18.0.
- [Release notes](https://github.com/plotly/plotly.py/releases)
- [Changelog](https://github.com/plotly/plotly.py/blob/master/CHANGELOG.md)
- [Commits](https://github.com/plotly/plotly.py/compare/v5.17.0...v5.18.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 03:36:34 +00:00
dependabot[bot] 0c1fefe6e7 Bump cryptography from 41.0.4 to 41.0.5
Bumps [cryptography](https://github.com/pyca/cryptography) from 41.0.4 to 41.0.5.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/41.0.4...41.0.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 03:36:27 +00:00
Matthias a049ff9371 Improve special testcase 2023-10-29 14:32:15 +01:00
Matthias 0c51e2637f Fix calculation issue for #9346
Closes #9346
2023-10-29 14:29:07 +01:00
Matthias 7492b75e1c Bump version to 2023.11-dev 2023-10-29 13:55:51 +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 24dfd9b93b Add test for #9346, showing current behavior 2023-10-29 10:52:45 +01:00
Matthias 7d65b3e1b4 install libopenblas-base to base image 2023-10-29 10:48:19 +01:00
Matthias 2c20464983 Reinit orders list on "local" objects to instance variable 2023-10-29 09:18:00 +01:00
Matthias e97d9013d5 Avoid having orders leak after multiple "from_json" calls 2023-10-29 09:17:07 +01:00
Matthias cf43427be5 armhf: Move pip install to base image 2023-10-28 10:22:54 +02:00
Matthias 7ae41be975 Remove numpy armv7l lock since wheels are now available 2023-10-28 08:30:27 +02:00
Matthias 1e18b35f22 Change box type to tip 2023-10-27 07:08:38 +02:00
Matthias bb78285661 Add hint about helper commands to common mistakes section 2023-10-27 06:38:35 +02:00
Matthias b47ba8cfd3 Merge pull request #9339 from freqtrade/fix/returndf-bug
fix: bug in startup candle offset
2023-10-26 19:49:44 +02:00
Matthias 1dccdf0594 bump ruff in pre-commit 2023-10-26 19:49:25 +02:00
robcaulk 5da48d8ffc chore: fix tests 2023-10-25 18:38:30 +02:00
robcaulk 4f4b7c5625 fix: bug in startup candle offset 2023-10-23 20:31:51 +02:00
Matthias 9dcf236387 Align flake and ruff configs further 2023-10-23 18:06:31 +02:00
Matthias 97bc5804fd Merge pull request #9334 from freqtrade/dependabot/pip/develop/tensorboard-2.15.0
Bump tensorboard from 2.14.1 to 2.15.0
2023-10-23 09:00:42 +02:00
Matthias beab966851 Merge pull request #9328 from freqtrade/dependabot/pip/develop/websockets-12.0
Bump websockets from 11.0.3 to 12.0
2023-10-23 09:00:17 +02:00
Matthias 00a7e8f9a2 Merge pull request #9338 from freqtrade/dependabot/pip/develop/ccxt-4.1.22
Bump ccxt from 4.1.13 to 4.1.22
2023-10-23 08:57:12 +02:00
Matthias 59dc526683 Merge pull request #9335 from freqtrade/dependabot/pip/develop/types-requests-2.31.0.10
Bump types-requests from 2.31.0.9 to 2.31.0.10
2023-10-23 08:56:50 +02:00
Matthias aef7f9dc03 Merge pull request #9337 from freqtrade/dependabot/pip/develop/pytest-mock-3.12.0
Bump pytest-mock from 3.11.1 to 3.12.0
2023-10-23 08:56:36 +02:00
Matthias abc6a08397 Merge pull request #9336 from freqtrade/dependabot/pip/develop/fastapi-0.104.0
Bump fastapi from 0.103.2 to 0.104.0
2023-10-23 08:56:20 +02:00
Matthias eb4da8a6f6 Merge pull request #9332 from freqtrade/dependabot/pip/develop/ruff-0.1.1
Bump ruff from 0.0.292 to 0.1.1
2023-10-23 08:56:00 +02:00
dependabot[bot] 494fd734bc Bump ruff from 0.0.292 to 0.1.1
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.0.292 to 0.1.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/v0.0.292...v0.1.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-23 04:47:44 +00:00
Matthias 9174f60b1d Merge pull request #9330 from freqtrade/dependabot/pip/develop/mypy-1.6.1
Bump mypy from 1.6.0 to 1.6.1
2023-10-23 06:46:57 +02:00
Matthias c2905a4522 use --output-format in ruff CI 2023-10-23 06:43:50 +02:00
Matthias adf03e2ee3 Merge pull request #9329 from freqtrade/dependabot/pip/develop/pymdown-extensions-10.3.1
Bump pymdown-extensions from 10.3 to 10.3.1
2023-10-23 06:32:13 +02:00
Matthias fe5f085ec1 types-requests pre-commit 2023-10-23 06:31:22 +02:00
dependabot[bot] 748ac50d83 Bump ccxt from 4.1.13 to 4.1.22
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.1.13 to 4.1.22.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.1.13...4.1.22)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-23 03:47:08 +00:00
dependabot[bot] d2069c1729 Bump pytest-mock from 3.11.1 to 3.12.0
Bumps [pytest-mock](https://github.com/pytest-dev/pytest-mock) from 3.11.1 to 3.12.0.
- [Release notes](https://github.com/pytest-dev/pytest-mock/releases)
- [Changelog](https://github.com/pytest-dev/pytest-mock/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-mock/compare/v3.11.1...v3.12.0)

---
updated-dependencies:
- dependency-name: pytest-mock
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-23 03:47:01 +00:00
dependabot[bot] 38cf50830a Bump fastapi from 0.103.2 to 0.104.0
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.103.2 to 0.104.0.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.103.2...0.104.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-23 03:46:55 +00:00
dependabot[bot] bf96a43efb Bump types-requests from 2.31.0.9 to 2.31.0.10
Bumps [types-requests](https://github.com/python/typeshed) from 2.31.0.9 to 2.31.0.10.
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-requests
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-23 03:46:50 +00:00
dependabot[bot] 22b4555926 Bump tensorboard from 2.14.1 to 2.15.0
Bumps [tensorboard](https://github.com/tensorflow/tensorboard) from 2.14.1 to 2.15.0.
- [Release notes](https://github.com/tensorflow/tensorboard/releases)
- [Changelog](https://github.com/tensorflow/tensorboard/blob/2.15.0/RELEASE.md)
- [Commits](https://github.com/tensorflow/tensorboard/compare/2.14.1...2.15.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-23 03:46:46 +00:00
dependabot[bot] 7fb3632e7b Bump mypy from 1.6.0 to 1.6.1
Bumps [mypy](https://github.com/python/mypy) from 1.6.0 to 1.6.1.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.6.0...v1.6.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-23 03:46:11 +00:00
dependabot[bot] e5f0fe288a Bump pymdown-extensions from 10.3 to 10.3.1
Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 10.3 to 10.3.1.
- [Release notes](https://github.com/facelessuser/pymdown-extensions/releases)
- [Commits](https://github.com/facelessuser/pymdown-extensions/compare/10.3...10.3.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-23 03:46:06 +00:00
dependabot[bot] 58aaaffe2b Bump websockets from 11.0.3 to 12.0
Bumps [websockets](https://github.com/python-websockets/websockets) from 11.0.3 to 12.0.
- [Release notes](https://github.com/python-websockets/websockets/releases)
- [Commits](https://github.com/python-websockets/websockets/compare/11.0.3...12.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-23 03:46:02 +00:00
Matthias c62aefbfde Merge pull request #9327 from amargedon/mapping-fiat-usdc
Add FIAT mapping for USDC
2023-10-22 20:12:42 +02:00
amargedon 16dfde22fc Add FIAT mapping for USDC 2023-10-22 18:43:35 +02:00
Matthias bbbc8a760c Fix stop evaluation sequence to have stop before liquidation
Adjust test to have liquidation above stop
closes #9296
2023-10-22 09:24:28 +02:00
Matthias 9b45bb2e24 Merge pull request #9325 from freqtrade/revert-9281-dependabot/pip/develop/torch-2.1.0
Revert "Bump torch from 2.0.1 to 2.1.0"
2023-10-22 09:23:58 +02:00
Matthias e69c21c9f5 Revert "Bump torch from 2.0.1 to 2.1.0" 2023-10-22 08:59:23 +02:00
Robert Caulk 72933859cf Merge pull request #9281 from freqtrade/dependabot/pip/develop/torch-2.1.0
Bump torch from 2.0.1 to 2.1.0
2023-10-22 08:01:16 +02:00
Matthias 0a5cee6a73 Ensure we're not erroring on invalid custom_entry / exit prices
closes #9323
2023-10-19 22:06:21 +02:00
Matthias a80c979482 Improve behavior when downloading trades data on time-based pagination
closes #9307
2023-10-18 20:26:51 +02:00
Matthias 4a4b695b94 Merge pull request #9321 from freqtrade/dependabot/pip/urllib3-2.0.7
Bump urllib3 from 2.0.6 to 2.0.7
2023-10-18 06:26:10 +02:00
dependabot[bot] a8c246ce0d Bump urllib3 from 2.0.6 to 2.0.7
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.0.6 to 2.0.7.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/2.0.6...2.0.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-17 21:02:44 +00:00
Matthias c6e979ddda Merge pull request #9303 from freqtrade/fix/progressbarCallback
Improve freqAI RL (error) behavior
2023-10-17 18:01:31 +02:00
Matthias 1a78346cf1 Add further ebug log message for stopping clarity for --dl-data 2023-10-17 07:11:06 +02:00
Matthias e6d0d53e47 Add further ebug log message for stopping clarity 2023-10-17 07:03:03 +02:00
Matthias 68680bb2c6 Merge pull request #9314 from freqtrade/dependabot/pip/develop/numpy-1.26.1
Bump numpy from 1.25.2 to 1.26.1
2023-10-16 19:33:07 +02:00
Matthias 7de415a6a4 Don't bump numpy for armhf just yet 2023-10-16 18:28:00 +02:00
dependabot[bot] f46fa440f0 Bump numpy from 1.25.2 to 1.26.1
Bumps [numpy](https://github.com/numpy/numpy) from 1.25.2 to 1.26.1.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v1.25.2...v1.26.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-16 16:27:50 +00:00
Matthias 56177d7e92 Merge pull request #9317 from freqtrade/dependabot/pip/develop/ccxt-4.1.13
Bump ccxt from 4.1.8 to 4.1.13
2023-10-16 18:27:02 +02:00
Matthias 41584317e4 Merge pull request #9311 from freqtrade/dependabot/pip/develop/types-requests-2.31.0.9
Bump types-requests from 2.31.0.8 to 2.31.0.9
2023-10-16 14:52:35 +02:00
Matthias 3264e2c31d pre-commit requests bump 2023-10-16 13:38:01 +02:00
dependabot[bot] fadc7a2051 Bump types-requests from 2.31.0.8 to 2.31.0.9
Bumps [types-requests](https://github.com/python/typeshed) from 2.31.0.8 to 2.31.0.9.
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-requests
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-16 09:59:18 +00:00
Matthias cebc55687b Merge pull request #9316 from freqtrade/dependabot/pip/develop/mypy-1.6.0
Bump mypy from 1.5.1 to 1.6.0
2023-10-16 11:58:20 +02:00
dependabot[bot] 5940279f7b Bump mypy from 1.5.1 to 1.6.0
Bumps [mypy](https://github.com/python/mypy) from 1.5.1 to 1.6.0.
- [Commits](https://github.com/python/mypy/compare/v1.5.1...v1.6.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-16 07:01:34 +00:00
dependabot[bot] 35f6333b67 Bump ccxt from 4.1.8 to 4.1.13
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.1.8 to 4.1.13.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.1.8...4.1.13)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-16 07:01:30 +00:00
Matthias 262b044969 Merge pull request #9312 from freqtrade/dependabot/pip/develop/sqlalchemy-2.0.22
Bump sqlalchemy from 2.0.21 to 2.0.22
2023-10-16 09:00:55 +02:00
Matthias a571df784c Merge pull request #9318 from freqtrade/dependabot/pip/develop/pre-commit-3.5.0
Bump pre-commit from 3.4.0 to 3.5.0
2023-10-16 09:00:36 +02:00
Matthias 078aa8327b Merge pull request #9315 from freqtrade/dependabot/pip/develop/ast-comments-1.1.2
Bump ast-comments from 1.1.0 to 1.1.2
2023-10-16 07:25:41 +02:00
Matthias 10945edbe6 Merge pull request #9313 from freqtrade/dependabot/pip/develop/mkdocs-material-9.4.6
Bump mkdocs-material from 9.4.4 to 9.4.6
2023-10-16 07:03:05 +02:00
Matthias 5d9b69cbfe sqlalchemy - precommit 2023-10-16 06:33:53 +02:00
Matthias 89117dd53f Merge pull request #9310 from freqtrade/dependabot/pip/develop/psutil-5.9.6
Bump psutil from 5.9.5 to 5.9.6
2023-10-16 06:33:03 +02:00
Matthias 4af9654696 Merge pull request #9308 from freqtrade/dependabot/pip/develop/orjson-3.9.9
Bump orjson from 3.9.7 to 3.9.9
2023-10-16 06:32:33 +02:00
dependabot[bot] 1e0ce7d47a Bump pre-commit from 3.4.0 to 3.5.0
Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 3.4.0 to 3.5.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/v3.4.0...v3.5.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-16 03:49:38 +00:00
dependabot[bot] 27cd54b42c Bump ast-comments from 1.1.0 to 1.1.2
Bumps [ast-comments](https://github.com/t3rn0/ast-comments) from 1.1.0 to 1.1.2.
- [Release notes](https://github.com/t3rn0/ast-comments/releases)
- [Commits](https://github.com/t3rn0/ast-comments/compare/1.1.0...1.1.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-16 03:49:12 +00:00
dependabot[bot] ec64a182f9 Bump mkdocs-material from 9.4.4 to 9.4.6
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.4.4 to 9.4.6.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.4.4...9.4.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-16 03:48:51 +00:00
dependabot[bot] dd30df7057 Bump sqlalchemy from 2.0.21 to 2.0.22
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.21 to 2.0.22.
- [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases)
- [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst)
- [Commits](https://github.com/sqlalchemy/sqlalchemy/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-16 03:48:44 +00:00
dependabot[bot] 4c6e33aa82 Bump psutil from 5.9.5 to 5.9.6
Bumps [psutil](https://github.com/giampaolo/psutil) from 5.9.5 to 5.9.6.
- [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst)
- [Commits](https://github.com/giampaolo/psutil/compare/release-5.9.5...release-5.9.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-16 03:48:10 +00:00
dependabot[bot] 8cb934849a Bump orjson from 3.9.7 to 3.9.9
Bumps [orjson](https://github.com/ijl/orjson) from 3.9.7 to 3.9.9.
- [Release notes](https://github.com/ijl/orjson/releases)
- [Changelog](https://github.com/ijl/orjson/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ijl/orjson/compare/3.9.7...3.9.9)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-16 03:47:58 +00:00
Matthias c627aee096 Merge pull request #9304 from stash86/bt-metrics
have to use bitwise operator on series comparison, otherwise ambiguous error is thrown
2023-10-15 13:07:54 +02:00
Stefano Ariestasia 9d552d45c2 have to use bitwise operator, otherwise ambiguous error is thrown 2023-10-15 19:32:03 +09:00
Matthias 1e1b8dbe53 Handle multiproc calls for now 2023-10-15 12:03:18 +02:00
Matthias 2d9d8dc976 Improve logic for progressbarcallback handling 2023-10-15 11:20:25 +02:00
Matthias ba674fc796 Type-ignore training-envs 2023-10-15 11:20:11 +02:00
Matthias 58550515ad Fix deprecation warning from tensorboard-callback 2023-10-15 11:04:05 +02:00
Matthias 27bae60b68 Fix typo 2023-10-15 10:51:36 +02:00
Matthias 646dd63faf Properly close out progressbarCallback
based on suggestions provided in https://github.com/DLR-RM/stable-baselines3/issues/1645
2023-10-15 10:41:07 +02:00
Matthias 8d2b389e27 Fix wording in log msg 2023-10-15 10:40:45 +02:00
Matthias fa174a392a Merge pull request #9298 from freqtrade/funding_fees
improve Funding fee behavior
2023-10-13 16:38:16 +02:00
Matthias 042e35e8d3 Improve funding fee startup behavior 2023-10-13 06:45:00 +02:00
Matthias b76513ce33 Fix typo in trade_model 2023-10-12 10:18:57 +00:00
Matthias 368bfcf476 Add comment for funding fees running 2023-10-12 07:25:46 +02:00
Matthias fee3c598d0 Move schedule to 1 minute after the hour
This will avoid congestion at :00, and make sure that the dry-run funding fees are actually already available
2023-10-12 07:16:56 +02:00
Matthias 69264cc164 Reduce funding fee update calls
Funding fees update every 4-8 hours - calling this every 15 minutes is way overboard.
2023-10-12 07:13:30 +02:00
Matthias e81929bc55 Have test use funding_fee_running 2023-10-12 07:01:43 +02:00
Matthias 0843b19b6c Implement logic around funding_fees runnign 2023-10-12 06:53:46 +02:00
Matthias 813b472c6c Add funding_fee_running column 2023-10-12 06:48:35 +02:00
Matthias 2f079711ec Add explicit test for get_funding_fees logic 2023-10-12 06:27:57 +02:00
Matthias 97e9d2dc42 Remove get_funding_fee error handling - it's no longer raising this error. 2023-10-12 06:27:35 +02:00
Matthias 7344f20803 Handle funding_fee error in exchange class 2023-10-12 06:27:29 +02:00
Matthias bfe04464b4 Handle funding fee errors for regular trades per trade 2023-10-11 20:27:54 +02:00
Matthias 2225f5661b Additional funding fee update after additional entry orders 2023-10-11 20:27:03 +02:00
Matthias 9e77c93a54 Tighten funding-fee variance for backtest 2023-10-11 19:49:33 +02:00
Matthias b65fa98cee Simplify backtesting by using current_time more consequently 2023-10-11 19:45:00 +02:00
Matthias b57821b273 Add set_funding_fees to backtesting 2023-10-11 19:38:58 +02:00
Matthias db7f9598b0 add set_funding_fees method 2023-10-11 19:38:46 +02:00
Matthias e547da10de Move funding fee assignment to update_trade 2023-10-11 18:28:15 +02:00
Matthias 5a0c15f377 Update Idem test 2023-10-10 18:21:52 +02:00
Matthias 0f5b69b4f2 Move from_json to LocalTrade class 2023-10-10 07:13:32 +02:00
Matthias 86d4497aaf Add additional test for from_json 2023-10-09 20:01:41 +02:00
Matthias 4b80961c65 Merge pull request #9276 from freqtrade/cancel_behavior
Improve Cancel order messaging behavior
2023-10-09 18:13:04 +02:00
Matthias 785cc9df85 Merge pull request #9293 from freqtrade/revert-9285-dependabot/pip/develop/tables-3.9.1
Revert "Bump tables from 3.8.0 to 3.9.1"
2023-10-09 18:11:16 +02:00
Matthias 1bfecb0313 Revert "Bump tables from 3.8.0 to 3.9.1" 2023-10-09 18:11:01 +02:00
Matthias b88a561eb5 Merge pull request #9283 from freqtrade/dependabot/pip/develop/types-requests-2.31.0.8
Bump types-requests from 2.31.0.7 to 2.31.0.8
2023-10-09 09:42:26 +02:00
Matthias 4bf026605e Merge pull request #9289 from freqtrade/dependabot/pip/develop/markdown-3.5
Bump markdown from 3.4.4 to 3.5
2023-10-09 09:42:13 +02:00
Matthias db6933856f Merge pull request #9288 from freqtrade/dependabot/pip/develop/aiohttp-3.8.6
Bump aiohttp from 3.8.5 to 3.8.6
2023-10-09 09:41:49 +02:00
Matthias 01107ffa59 Merge pull request #9282 from freqtrade/dependabot/pip/develop/python-telegram-bot-20.6
Bump python-telegram-bot from 20.5 to 20.6
2023-10-09 09:41:32 +02:00
dependabot[bot] 74f678a26f Bump markdown from 3.4.4 to 3.5
Bumps [markdown](https://github.com/Python-Markdown/markdown) from 3.4.4 to 3.5.
- [Changelog](https://github.com/Python-Markdown/markdown/blob/master/docs/changelog.md)
- [Commits](https://github.com/Python-Markdown/markdown/compare/3.4.4...3.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 06:13:16 +00:00
Matthias bf93648198 Merge pull request #9287 from freqtrade/dependabot/pip/develop/nbconvert-7.9.2
Bump nbconvert from 7.8.0 to 7.9.2
2023-10-09 08:12:34 +02:00
Matthias 51dccaeb4c Merge pull request #9280 from freqtrade/dependabot/pip/develop/mkdocs-material-9.4.4
Bump mkdocs-material from 9.4.2 to 9.4.4
2023-10-09 08:11:04 +02:00
Matthias ed4252af53 Merge pull request #9285 from freqtrade/dependabot/pip/develop/tables-3.9.1
Bump tables from 3.8.0 to 3.9.1
2023-10-09 08:09:33 +02:00
Matthias 2fde902c82 Merge pull request #9284 from freqtrade/dependabot/pip/develop/python-rapidjson-1.12
Bump python-rapidjson from 1.11 to 1.12
2023-10-09 08:07:24 +02:00
Matthias 4ea75af2d9 Merge pull request #9286 from freqtrade/dependabot/pip/develop/ruff-0.0.292
Bump ruff from 0.0.291 to 0.0.292
2023-10-09 08:07:00 +02:00
Matthias 1bba0cf7fc Bump pre-commit types-requests 2023-10-09 07:06:33 +02:00
Matthias b1fd0c73c7 Add additional test case for funding-fee calculation 2023-10-09 07:05:39 +02:00
Matthias 29eb6d938b Update test for fixed funding_fee logic 2023-10-09 07:04:13 +02:00
Matthias 19620470bd Improve funding fee cutof logic 2023-10-09 07:04:13 +02:00
Matthias 7a69b01b9b avoid edge-case in test 2023-10-09 07:04:13 +02:00
Matthias bc531cf846 Improve variable naming 2023-10-09 07:04:13 +02:00
Matthias 14908e52e2 Improv variable naming 2023-10-09 07:04:13 +02:00
dependabot[bot] a86bf8d6d7 Bump aiohttp from 3.8.5 to 3.8.6
Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.8.5 to 3.8.6.
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.8.5...v3.8.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 05:02:10 +00:00
Matthias 3662ca3ca6 Merge pull request #9279 from freqtrade/dependabot/pip/develop/ccxt-4.1.8
Bump ccxt from 4.0.112 to 4.1.8
2023-10-09 07:01:04 +02:00
dependabot[bot] 5fae03f7be Bump nbconvert from 7.8.0 to 7.9.2
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.8.0 to 7.9.2.
- [Release notes](https://github.com/jupyter/nbconvert/releases)
- [Changelog](https://github.com/jupyter/nbconvert/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jupyter/nbconvert/compare/v7.8.0...v7.9.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 03:54:23 +00:00
dependabot[bot] f7f0f3bebb Bump ruff from 0.0.291 to 0.0.292
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.0.291 to 0.0.292.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/BREAKING_CHANGES.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.0.291...v0.0.292)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 03:54:13 +00:00
dependabot[bot] ccbab6ee6f Bump tables from 3.8.0 to 3.9.1
Bumps [tables](https://github.com/PyTables/PyTables) from 3.8.0 to 3.9.1.
- [Release notes](https://github.com/PyTables/PyTables/releases)
- [Changelog](https://github.com/PyTables/PyTables/blob/master/RELEASE_NOTES.rst)
- [Commits](https://github.com/PyTables/PyTables/compare/v3.8.0...v3.9.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 03:53:53 +00:00
dependabot[bot] ef12dafea8 Bump python-rapidjson from 1.11 to 1.12
Bumps [python-rapidjson](https://github.com/python-rapidjson/python-rapidjson) from 1.11 to 1.12.
- [Changelog](https://github.com/python-rapidjson/python-rapidjson/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-rapidjson/python-rapidjson/compare/v1.11...v1.12)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 03:53:42 +00:00
dependabot[bot] 08a65b50aa Bump types-requests from 2.31.0.7 to 2.31.0.8
Bumps [types-requests](https://github.com/python/typeshed) from 2.31.0.7 to 2.31.0.8.
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-requests
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 03:53:37 +00:00
dependabot[bot] d28d6cbdb4 Bump python-telegram-bot from 20.5 to 20.6
Bumps [python-telegram-bot](https://github.com/python-telegram-bot/python-telegram-bot) from 20.5 to 20.6.
- [Release notes](https://github.com/python-telegram-bot/python-telegram-bot/releases)
- [Changelog](https://github.com/python-telegram-bot/python-telegram-bot/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-telegram-bot/python-telegram-bot/compare/v20.5...v20.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 03:53:34 +00:00
dependabot[bot] 41a6709ece Bump torch from 2.0.1 to 2.1.0
Bumps [torch](https://github.com/pytorch/pytorch) from 2.0.1 to 2.1.0.
- [Release notes](https://github.com/pytorch/pytorch/releases)
- [Changelog](https://github.com/pytorch/pytorch/blob/main/RELEASE.md)
- [Commits](https://github.com/pytorch/pytorch/compare/v2.0.1...v2.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 03:53:23 +00:00
dependabot[bot] 756f5d5408 Bump mkdocs-material from 9.4.2 to 9.4.4
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.4.2 to 9.4.4.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.4.2...9.4.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 03:53:10 +00:00
dependabot[bot] 422b9c8fbc Bump ccxt from 4.0.112 to 4.1.8
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.112 to 4.1.8.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.0.112...4.1.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 03:53:01 +00:00
Matthias 40ec2c4921 Improve messaging in case of delayed exchange cancel 2023-10-08 11:17:29 +02:00
Matthias 5cf7ad85a0 Adjust tests for new interface to handle_cancel_* methods 2023-10-08 10:44:37 +02:00
Matthias f02c9f0435 Pass order object to handle_cancel* methods 2023-10-08 10:26:27 +02:00
Matthias c59b5e7781 Improve type hinting 2023-10-08 09:58:06 +02:00
Matthias e525c6694b Add ft_cancel_reason column to order object 2023-10-08 09:46:12 +02:00
Matthias 897c14e2e5 Don't check for "open orders" in handle_cancel_enter
it's actually irrelenant (closes #9273).
2023-10-08 09:40:46 +02:00
Matthias 6c00bf423b Fix comment 2023-10-08 08:59:18 +02:00
Matthias 094984eb2f Fix wrong typehint 2023-10-07 15:09:44 +02:00
Matthias 081411fba4 Improve bot typehints 2023-10-07 15:09:34 +02:00
Matthias 178c0972ff Read funding_fee on order objects in "from_json" 2023-10-07 08:43:06 +02:00
Matthias 910e317a45 Fix unhandled exception
closes #9270
2023-10-06 20:13:37 +02:00
Matthias 1ef5adbb0e Test for #9270 2023-10-06 20:13:11 +02:00
Matthias f5db856a75 re-align adjust_entry_price between backtest and live 2023-10-05 18:11:35 +02:00
Matthias b2ad40253f Hide most non-freqtrade logs in -v mode 2023-10-05 07:03:29 +02:00
Matthias 1e0d622d80 Don't run "recovery" when stop-orders are open 2023-10-05 06:45:00 +02:00
Matthias 1d941249ed Revert "Remove numpy armv7l lock since wheels are now available"
This reverts commit 04409602a6.
2023-10-04 19:57:26 +02:00
Matthias 5bfd3fdc33 Add openblas to armhf image 2023-10-04 17:55:15 +02:00
Matthias 753b807a45 Merge pull request #9211 from freqtrade/dependabot/pip/cryptography-41.0.4
Bump cryptography from 41.0.3 to 41.0.4
2023-10-04 07:12:01 +02:00
Matthias 04409602a6 Remove numpy armv7l lock since wheels are now available 2023-10-04 07:10:51 +02:00
Matthias b2796b850b Add funding_fee export to order object
Helps debugging #9163
2023-10-04 06:36:39 +02:00
Matthias 8c633aab19 Merge pull request #9261 from stash86/bt-metrics
Fix visual issues and docs
2023-10-03 07:06:03 +02:00
Stefano Ariestasia f14b4133c3 fix wording 2023-10-03 13:36:31 +09:00
Matthias 8f2e4aa4fd Merge pull request #9262 from freqtrade/dependabot/pip/urllib3-2.0.6
Bump urllib3 from 2.0.5 to 2.0.6
2023-10-03 06:17:44 +02:00
dependabot[bot] 3c2e043e82 Bump urllib3 from 2.0.5 to 2.0.6
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.0.5 to 2.0.6.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/v2.0.5...2.0.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-03 00:22:39 +00:00
Stefano 609ed2d7b3 fix return values 2023-10-03 08:41:05 +09:00
Stefano Ariestasia 183166b3fb fix output if no variance, and fix docs 2023-10-03 08:27:28 +09:00
Matthias 12dc91719e Merge pull request #9247 from freqtrade/dependabot/pip/develop/pydantic-2.4.2
Bump pydantic from 2.3.0 to 2.4.2
2023-10-02 19:26:33 +02:00
dependabot[bot] cd071c3bdc Bump cryptography from 41.0.3 to 41.0.4
Bumps [cryptography](https://github.com/pyca/cryptography) from 41.0.3 to 41.0.4.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/41.0.3...41.0.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-02 17:21:57 +00:00
Matthias 0618ecce47 Merge pull request #9249 from freqtrade/dependabot/pip/develop/ccxt-4.0.112
Bump ccxt from 4.0.105 to 4.0.112
2023-10-02 19:21:00 +02:00
Matthias 13438ad8de Merge pull request #9260 from freqtrade/revert-9250-dependabot/pip/develop/ast-comments-1.1.1
Revert "Bump ast-comments from 1.1.0 to 1.1.1"
2023-10-02 18:30:22 +02:00
Matthias 60c2b1d6ca Revert "Bump ast-comments from 1.1.0 to 1.1.1" 2023-10-02 18:02:36 +02:00
Matthias eaf4ffcbaf Merge pull request #9253 from freqtrade/dependabot/pip/develop/types-requests-2.31.0.7
Bump types-requests from 2.31.0.4 to 2.31.0.7
2023-10-02 16:11:00 +02:00
Matthias 79e59bdda0 Bump types-requests pre-commit 2023-10-02 13:37:49 +02:00
dependabot[bot] b409ab5ead Bump pydantic from 2.3.0 to 2.4.2
Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.3.0 to 2.4.2.
- [Release notes](https://github.com/pydantic/pydantic/releases)
- [Changelog](https://github.com/pydantic/pydantic/blob/main/HISTORY.md)
- [Commits](https://github.com/pydantic/pydantic/compare/v2.3.0...v2.4.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-02 07:59:35 +00:00
Matthias 790c7036a1 Merge pull request #9258 from freqtrade/dependabot/pip/develop/fastapi-0.103.2
Bump fastapi from 0.103.1 to 0.103.2
2023-10-02 09:58:33 +02:00
Matthias 73902f507a Merge pull request #9250 from freqtrade/dependabot/pip/develop/ast-comments-1.1.1
Bump ast-comments from 1.1.0 to 1.1.1
2023-10-02 09:43:39 +02:00
Matthias 1a80f6bc4e Merge pull request #9257 from freqtrade/dependabot/pip/develop/arrow-1.3.0
Bump arrow from 1.2.3 to 1.3.0
2023-10-02 09:43:18 +02:00
dependabot[bot] 5feb7fe654 Bump ast-comments from 1.1.0 to 1.1.1
Bumps [ast-comments](https://github.com/t3rn0/ast-comments) from 1.1.0 to 1.1.1.
- [Release notes](https://github.com/t3rn0/ast-comments/releases)
- [Commits](https://github.com/t3rn0/ast-comments/compare/1.1.0...1.1.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-02 06:19:59 +00:00
dependabot[bot] 980960bc6a Bump arrow from 1.2.3 to 1.3.0
Bumps [arrow](https://github.com/arrow-py/arrow) from 1.2.3 to 1.3.0.
- [Release notes](https://github.com/arrow-py/arrow/releases)
- [Changelog](https://github.com/arrow-py/arrow/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/arrow-py/arrow/compare/1.2.3...1.3.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-02 06:18:56 +00:00
Matthias 52c614733f Merge pull request #9255 from freqtrade/dependabot/pip/develop/tensorboard-2.14.1
Bump tensorboard from 2.14.0 to 2.14.1
2023-10-02 08:18:48 +02:00
Matthias e913d12c71 Merge pull request #9252 from freqtrade/dependabot/pip/develop/mkdocs-material-9.4.2
Bump mkdocs-material from 9.4.1 to 9.4.2
2023-10-02 08:18:08 +02:00
Matthias 5dc24232ca Merge pull request #9254 from freqtrade/dependabot/pip/develop/packaging-23.2
Bump packaging from 23.1 to 23.2
2023-10-02 08:17:53 +02:00
Matthias ef2115d667 Merge pull request #9256 from freqtrade/dependabot/pip/develop/rich-13.6.0
Bump rich from 13.5.3 to 13.6.0
2023-10-02 08:17:31 +02:00
Matthias 74476eae43 Merge pull request #9251 from freqtrade/dependabot/pip/develop/scipy-1.11.3
Bump scipy from 1.11.2 to 1.11.3
2023-10-02 08:17:14 +02:00
Matthias 84335d58b3 Greatly speed up recursive by caching exchange 2023-10-02 06:34:35 +02:00
Matthias f175fc6e9b Merge pull request #9248 from freqtrade/dependabot/pip/develop/schedule-1.2.1
Bump schedule from 1.2.0 to 1.2.1
2023-10-02 06:20:44 +02:00
dependabot[bot] 9edd7e6bc8 Bump fastapi from 0.103.1 to 0.103.2
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.103.1 to 0.103.2.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.103.1...0.103.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-02 03:41:42 +00:00
dependabot[bot] 7478c56ca5 Bump rich from 13.5.3 to 13.6.0
Bumps [rich](https://github.com/Textualize/rich) from 13.5.3 to 13.6.0.
- [Release notes](https://github.com/Textualize/rich/releases)
- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Textualize/rich/compare/v13.5.3...v13.6.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-02 03:41:29 +00:00
dependabot[bot] 1f36f4802a Bump tensorboard from 2.14.0 to 2.14.1
Bumps [tensorboard](https://github.com/tensorflow/tensorboard) from 2.14.0 to 2.14.1.
- [Release notes](https://github.com/tensorflow/tensorboard/releases)
- [Changelog](https://github.com/tensorflow/tensorboard/blob/master/RELEASE.md)
- [Commits](https://github.com/tensorflow/tensorboard/compare/2.14.0...2.14.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-02 03:41:23 +00:00
dependabot[bot] 4d920d7866 Bump packaging from 23.1 to 23.2
Bumps [packaging](https://github.com/pypa/packaging) from 23.1 to 23.2.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/23.1...23.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-02 03:41:09 +00:00
dependabot[bot] 19fb3f9b54 Bump types-requests from 2.31.0.4 to 2.31.0.7
Bumps [types-requests](https://github.com/python/typeshed) from 2.31.0.4 to 2.31.0.7.
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-requests
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-02 03:40:59 +00:00
dependabot[bot] fafc102573 Bump mkdocs-material from 9.4.1 to 9.4.2
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.4.1 to 9.4.2.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.4.1...9.4.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-02 03:40:52 +00:00
dependabot[bot] 3868f9c698 Bump scipy from 1.11.2 to 1.11.3
Bumps [scipy](https://github.com/scipy/scipy) from 1.11.2 to 1.11.3.
- [Release notes](https://github.com/scipy/scipy/releases)
- [Commits](https://github.com/scipy/scipy/compare/v1.11.2...v1.11.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-02 03:40:40 +00:00
dependabot[bot] 0204f666b3 Bump ccxt from 4.0.105 to 4.0.112
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.105 to 4.0.112.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.0.105...4.0.112)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-02 03:40:23 +00:00
dependabot[bot] f32a13bfb0 Bump schedule from 1.2.0 to 1.2.1
Bumps [schedule](https://github.com/dbader/schedule) from 1.2.0 to 1.2.1.
- [Changelog](https://github.com/dbader/schedule/blob/master/HISTORY.rst)
- [Commits](https://github.com/dbader/schedule/compare/1.2.0...1.2.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-02 03:40:10 +00:00
Matthias 4809c9f07a Adjust tests for new naming 2023-10-01 08:00:09 +02:00
Matthias 19af144b33 Improve of analysis files further 2023-10-01 07:58:46 +02:00
Matthias 4db7962048 Update tests to new structure 2023-10-01 07:55:03 +02:00
Matthias 7e6f2cba53 Move analysis command into their own subspace 2023-10-01 07:54:09 +02:00
Matthias c6199e5ca6 Merge pull request #9232 from freqtrade/kraken/dldata
Kraken - dataimport
2023-10-01 07:13:54 +02:00
Matthias e73f215a67 Merge pull request #9242 from freqtrade/new_release
New release 2023.9
2023-09-30 17:25:36 +02:00
Matthias f7ff1dc610 Bump develop version to 2023.10-dev 2023-09-30 13:13:18 +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 e27636b798 Merge pull request #9241 from freqtrade/fix/process-only-new-candles
chore: protect users against process_only_new_candles=False
2023-09-30 12:53:54 +02:00
Matthias 2d56b1bc8c Fix whitespace 2023-09-30 08:23:21 +02:00
Matthias 659cbd987a Merge pull request #9152 from stash86/bt-metrics
Add recursive-analysis sub-command
2023-09-29 17:59:37 +02:00
Robert Caulk aff5372a8f chore: protect users against process_only_new_candles=False 2023-09-29 13:12:44 +02:00
Stefano Ariestasia 2e7b5e2be9 Merge remote-tracking branch 'origin/bt-metrics' into bt-metrics 2023-09-29 14:19:37 +09:00
Stefano Ariestasia 7971cb29bb fix error message 2023-09-29 14:17:44 +09:00
Matthias 154149ff03 Slightly updated docs 2023-09-29 07:14:49 +02:00
Matthias 92d7f27983 Further update test a bit 2023-09-29 07:09:48 +02:00
Matthias 20ea679b2b Add "bias2" test with full lookahead bias 2023-09-29 07:06:11 +02:00
Matthias 39ede449a0 Rename test to avoid naming collision 2023-09-29 06:58:16 +02:00
Matthias 37550d3bdb Fix typo in --strategy_list 2023-09-28 21:01:37 +02:00
Matthias b688526623 Improve sorting in docs
(these are more important than advanced strategy/docs)
2023-09-28 20:48:47 +02:00
Matthias d52d30cfbe invert setting-location for stopLossPrice
Slowly migrating to stopLossPrice in favor of stopPrice.
2023-09-28 19:33:59 +02:00
Matthias 9cf08e0434 Merge pull request #9235 from stevanStevic/develop
Change word strat to strategy in freqai-feature-engineering.md
2023-09-28 06:58:49 +02:00
Matthias 56a85690b4 Update cached leverage tiers 2023-09-28 06:38:29 +02:00
Matthias 0f2612c231 Merge pull request #9223 from freqtrade/dependabot/pip/develop/catboost-1.2.2
Bump catboost from 1.2.1 to 1.2.2
2023-09-27 19:09:56 +02:00
Stevan Stevic f9edc72f35 Merge pull request #1 from stevanStevic/minor-doc-fix
Change strat to strategy in freqai-feature-engineering.md
2023-09-27 17:02:44 +02:00
Stevan Stevic 90475e52db Change strat to strategy in freqai-feature-engineering.md 2023-09-27 16:56:03 +02:00
Matthias 504f51fabb Fix liquidation price setting in backtesting
closes #9205
2023-09-27 06:40:24 +02:00
Matthias a905d1bd67 Assert backtesting liquidation price
Fails for #9205
2023-09-27 06:40:24 +02:00
Matthias a27baf1a51 Improve backtest test 2023-09-27 06:40:24 +02:00
Matthias f174c2e01e Merge pull request #9221 from freqtrade/dependabot/pip/develop/ccxt-4.0.105
Bump ccxt from 4.0.88 to 4.0.105
2023-09-26 17:48:04 +02:00
Matthias 3f60b2c140 Update bybit stoploss parameter/prop for new ccxt version 2023-09-26 06:45:48 +02:00
Matthias 927d1d2686 Split stop_price parameter from property 2023-09-26 06:34:10 +02:00
Matthias d04a4db270 Merge pull request #9217 from freqtrade/frog-dataformat-docs-1
Update data-download.md
2023-09-26 06:30:34 +02:00
Matthias 8ad6eb9896 Update parameter value to be clearer 2023-09-25 19:55:58 +02:00
Matthias 74709461e3 Improve exception wording 2023-09-25 19:48:09 +02:00
Matthias 9e6cc5ebbd Improve comment on special handling 2023-09-25 19:46:27 +02:00
Matthias a2d8f92e05 Add rudimentary test for test_trade_converter 2023-09-25 19:46:15 +02:00
Matthias a7d90e2a25 Minor adjustments to conversions 2023-09-25 19:45:03 +02:00
Matthias 83b37e2f78 Add documentation for kraken data mode 2023-09-25 18:23:20 +02:00
Matthias 488629096b Improve logging in kraken-converter 2023-09-25 18:23:20 +02:00
Matthias a3f167f6df Split format-from for trades to allow for trades special case 2023-09-25 18:23:20 +02:00
Matthias 1e8814b43e Improve handling of kraken dataconvert 2023-09-25 18:23:20 +02:00
Matthias 2e430519e3 Call kraken-convert in special cases 2023-09-25 18:23:20 +02:00
Matthias 2164b02c66 Add initial code for trade_kraken import 2023-09-25 18:23:20 +02:00
Matthias ed45dcdf8a Update .gitignore to exclude memray stuff 2023-09-25 18:20:05 +02:00
Matthias e518e741af update bybit live order to v5 2023-09-25 18:05:44 +02:00
Matthias 56b9c250ba Update order_parse online test 2023-09-25 18:05:40 +02:00
dependabot[bot] a009816ac4 Bump ccxt from 4.0.88 to 4.0.105
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.88 to 4.0.105.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.0.88...4.0.105)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-25 10:24:15 +00:00
Matthias c29d2ac05b Merge pull request #9218 from freqtrade/dependabot/pip/develop/sqlalchemy-2.0.21
Bump sqlalchemy from 2.0.20 to 2.0.21
2023-09-25 12:23:27 +02:00
Matthias 551d1b0962 Bump sqlalchemy pre-commit 2023-09-25 11:45:14 +02:00
dependabot[bot] 5e696f4ea0 Bump sqlalchemy from 2.0.20 to 2.0.21
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.20 to 2.0.21.
- [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases)
- [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst)
- [Commits](https://github.com/sqlalchemy/sqlalchemy/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-25 09:28:42 +00:00
Matthias d8423272da Merge pull request #9227 from freqtrade/dependabot/pip/develop/types-requests-2.31.0.4
Bump types-requests from 2.31.0.2 to 2.31.0.4
2023-09-25 11:27:28 +02:00
Matthias b605d4d71f Merge pull request #9222 from freqtrade/dependabot/pip/develop/urllib3-2.0.5
Bump urllib3 from 2.0.4 to 2.0.5
2023-09-25 11:26:25 +02:00
Matthias c39290d7da bump types-requests in pre-commit 2023-09-25 10:10:03 +02:00
dependabot[bot] 4849b23fd6 Bump urllib3 from 2.0.4 to 2.0.5
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.0.4 to 2.0.5.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/2.0.4...v2.0.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-25 08:07:30 +00:00
Matthias c1beb0ff33 Merge pull request #9230 from freqtrade/dependabot/pip/develop/mkdocs-material-9.4.1
Bump mkdocs-material from 9.3.1 to 9.4.1
2023-09-25 10:07:06 +02:00
Matthias d08a015b45 Merge pull request #9228 from freqtrade/dependabot/pip/develop/jsonschema-4.19.1
Bump jsonschema from 4.19.0 to 4.19.1
2023-09-25 10:06:42 +02:00
Matthias 4f7487e931 Merge pull request #9225 from freqtrade/dependabot/pip/develop/ruff-0.0.291
Bump ruff from 0.0.290 to 0.0.291
2023-09-25 10:05:53 +02:00
dependabot[bot] d032aaaba0 Bump mkdocs-material from 9.3.1 to 9.4.1
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.3.1 to 9.4.1.
- [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.3.1...9.4.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-25 04:48:16 +00:00
Matthias 073cb0a5a9 Merge pull request #9220 from freqtrade/dependabot/pip/develop/mkdocs-1.5.3
Bump mkdocs from 1.5.2 to 1.5.3
2023-09-25 06:47:23 +02:00
Matthias ce6c44eda0 Merge pull request #9219 from freqtrade/dependabot/pip/develop/time-machine-2.13.0
Bump time-machine from 2.12.0 to 2.13.0
2023-09-25 06:39:05 +02:00
dependabot[bot] 0099381dd0 Bump jsonschema from 4.19.0 to 4.19.1
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.19.0 to 4.19.1.
- [Release notes](https://github.com/python-jsonschema/jsonschema/releases)
- [Changelog](https://github.com/python-jsonschema/jsonschema/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/python-jsonschema/jsonschema/compare/v4.19.0...v4.19.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-25 03:52:41 +00:00
dependabot[bot] 7bcb3d5580 Bump types-requests from 2.31.0.2 to 2.31.0.4
Bumps [types-requests](https://github.com/python/typeshed) from 2.31.0.2 to 2.31.0.4.
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-requests
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-25 03:52:36 +00:00
dependabot[bot] c15c13a367 Bump ruff from 0.0.290 to 0.0.291
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.0.290 to 0.0.291.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/BREAKING_CHANGES.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.0.290...v0.0.291)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-25 03:52:28 +00:00
dependabot[bot] 53a7273065 Bump catboost from 1.2.1 to 1.2.2
Bumps [catboost](https://github.com/catboost/catboost) from 1.2.1 to 1.2.2.
- [Release notes](https://github.com/catboost/catboost/releases)
- [Changelog](https://github.com/catboost/catboost/blob/master/RELEASE.md)
- [Commits](https://github.com/catboost/catboost/compare/v1.2.1...v1.2.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-25 03:52:11 +00:00
dependabot[bot] da9a8b616e Bump mkdocs from 1.5.2 to 1.5.3
Bumps [mkdocs](https://github.com/mkdocs/mkdocs) from 1.5.2 to 1.5.3.
- [Release notes](https://github.com/mkdocs/mkdocs/releases)
- [Commits](https://github.com/mkdocs/mkdocs/compare/1.5.2...1.5.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-25 03:51:54 +00:00
dependabot[bot] e6277222ca Bump time-machine from 2.12.0 to 2.13.0
Bumps [time-machine](https://github.com/adamchainz/time-machine) from 2.12.0 to 2.13.0.
- [Changelog](https://github.com/adamchainz/time-machine/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/adamchainz/time-machine/compare/2.12.0...2.13.0)

---
updated-dependencies:
- dependency-name: time-machine
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-25 03:51:49 +00:00
Matthias 8002b476ff Update recommendation for kraken 2023-09-24 23:04:28 +02:00
Matthias d9b5d05e2a Align sample configs with the "no ratelimit" recommendation 2023-09-24 23:03:38 +02:00
Matthias f5d7a4417d Split trades methods into seperate converter file 2023-09-24 17:21:21 +02:00
Robert Davey 04b3b1d4d9 Update data-download.md
Fix the main data format docs to reflect the move to feather.
2023-09-24 12:12:16 +01:00
Matthias 38a3ce6164 Convert "converter" to package 2023-09-24 10:42:23 +02:00
Matthias 123e51774e Move trades-to-ohlcv tests 2023-09-24 10:38:38 +02:00
Matthias 2322d0f3f3 Move trades-to-ohlcv to converter file 2023-09-24 10:38:25 +02:00
Matthias 8a5287581f Move some convert-trades-to-ohlcv logic into convert function 2023-09-24 10:37:37 +02:00
Matthias 41cdd28f5f Improve log output for convert-trades 2023-09-24 10:26:51 +02:00
Stefano Ariestasia b387c315da fix pre-commit 2023-09-24 14:59:19 +09:00
Stefano Ariestasia 3c647a3794 change wordings on the doc from backtest to "calculate indicators" since we never do full backtest process 2023-09-24 14:55:13 +09:00
Stefano Ariestasia aac9ee0d55 move lookahead and recursive docs under Advanced Topics 2023-09-24 14:28:18 +09:00
Matthias 966247baaf Make sure use_db is set as early as possible. 2023-09-23 18:20:19 +02:00
Matthias 589b9858f4 Disable build isolation (fix no docker builds) 2023-09-23 17:56:22 +02:00
Stefano Ariestasia c0b2b0b96d fix args description 2023-09-23 19:27:57 +09:00
Stefano Ariestasia 6cfc1836a2 fix wrong startup candle 2023-09-23 19:23:03 +09:00
Matthias 35800f3ada remove hardcoded docs link
we should have one place to configure this.
2023-09-23 12:02:34 +02:00
Matthias 9fa365e766 Fix docs rendering (lists need a newline before the first item) 2023-09-23 10:47:30 +02:00
Matthias a4a3b19566 Fix typo in docs 2023-09-23 10:27:44 +02:00
Matthias 8452399c12 Merge pull request #9187 from stash86/full-pairlist
Add FullTradesPairlist
2023-09-23 10:24:13 +02:00
Matthias ff8a5ad2e5 Merge pull request #9213 from freqtrade/revert-9207-ccxt_update
Revert "Bump ccxt to 4.0.101"
2023-09-22 19:09:29 +02:00
Matthias dda5a59019 Revert "Bump ccxt to 4.0.101" 2023-09-22 18:20:52 +02:00
Robert Davey 30e8466cae Update recursive-analysis.md
Thanks for adding the example table! It's good to have that example available. I've edited this section of the docs as before.
2023-09-22 13:11:35 +01:00
Stefano Ariestasia 3881c51892 add example of the result of the analysis 2023-09-22 20:45:48 +09:00
Robert Davey 4959d124ad Update recursive-analysis.md
I went through the docs which are great, but they needed some tidying up and changes to language to meet the style of the rest of the docs.
2023-09-22 10:50:35 +01:00
Stefano Ariestasia f133ee3cca add more explanation in the docs about startup candle and its relation to API limit 2023-09-22 17:10:43 +09:00
Matthias ef6afaa2cb Add test for replace_fail 2023-09-22 06:37:56 +02:00
Matthias 0e406c4d7d Update some more test wordings 2023-09-22 06:37:56 +02:00
Matthias b21775142d Improve variable naming in test 2023-09-22 06:37:56 +02:00
Matthias 8ccc66cd97 Add tests for cancel order retries 2023-09-22 06:37:56 +02:00
Matthias b4e732617e Add handling for order replacement cancel failing 2023-09-22 06:37:56 +02:00
Matthias 450219c83b Extract replace_order_faild message and behavior 2023-09-22 06:37:56 +02:00
Stefano eb7df30061 add test 2023-09-22 09:43:03 +09:00
Matthias 9385400000 Merge pull request #9209 from alexpvpmindustry/patch-1
fix broken link
2023-09-21 17:57:32 +02:00
alex 961f50e335 fix broken link 2023-09-21 07:50:36 -07:00
Stefano 478e6f1e64 fix test 2023-09-21 21:22:45 +09:00
Stefano a0e115ebd9 fix another test 2023-09-21 20:19:39 +09:00
Stefano ce4f1b0709 fix test after adding new test strategy 2023-09-21 19:56:41 +09:00
Stefano b0c639bac8 Merge branch 'bt-metrics2' of https://github.com/stash86/freqtrade into bt-metrics 2023-09-21 10:19:10 +00:00
Stefano aba576f79f pre-commit fix 2023-09-21 17:58:20 +09:00
Stefano d92a6d7b73 all tests done 2023-09-21 17:51:37 +09:00
Stefano 89d47ffd8f 4 more tests 2023-09-21 17:47:51 +09:00
Stefano b9e9f82503 first test done 2023-09-21 16:45:43 +09:00
Stefano 08b94a2077 1 test 2023-09-21 14:21:54 +09:00
Matthias 9f445cb053 Don't rely on status when determining open order count 2023-09-21 07:14:51 +02:00
Matthias 1d23ba6e30 Improve wording after order-replacement 2023-09-21 07:14:31 +02:00
Stefano Ariestasia 28e43a4867 initial test 2023-09-21 14:00:17 +09:00
Matthias 1b28521875 Improve execute_entry interface 2023-09-21 06:28:51 +02:00
Matthias 4ba3363bc6 Use matching numpy version in docker armhf image 2023-09-21 06:26:46 +02:00
Matthias f1ed9ed048 Merge pull request #9207 from freqtrade/ccxt_update
Bump ccxt to 4.0.101
2023-09-21 06:18:35 +02:00
Stefano Ariestasia d465fcffd5 change startup cande in sample strat 2023-09-21 11:13:06 +09:00
Stefano Ariestasia 32b0098ec1 fix example in the docs, increasing startup to 400 on ema100 2023-09-21 11:08:47 +09:00
Stefano Ariestasia e77b9de89e fix docs 2023-09-21 10:51:12 +09:00
Matthias aec67cda66 update bybit live order to v5 2023-09-20 20:41:12 +02:00
Matthias f3fb801b33 Update order_parse online test 2023-09-20 20:41:12 +02:00
Matthias fe33088245 Bump ccxt to 4.0.101 2023-09-20 20:41:12 +02:00
Matthias 4bca8b97f3 Don't allow empty order-type from exchange 2023-09-20 20:32:37 +02:00
Matthias f62f4f7711 Fix deployment (no arm numpy wheels just yet). 2023-09-20 20:03:41 +02:00
Matthias 896e2b6285 piwheels finally has wheels for cryptography 2023-09-20 20:02:31 +02:00
Matthias ddb0ae10b4 Ensure no None status is passed from "create_order" 2023-09-20 20:02:06 +02:00
Stefano Ariestasia 37fa186c55 remove 1 column 2023-09-20 22:43:01 +09:00
Stefano Ariestasia 979e485f24 initial doc 2023-09-20 20:53:34 +09:00
Stefano Ariestasia 1555667da7 Merge remote-tracking branch 'origin/bt-metrics2' into bt-metrics2 2023-09-20 17:55:59 +09:00
Stefano Ariestasia 8a52a7b50d Merge branch 'freqtrade:develop' into bt-metrics2 2023-09-20 17:48:52 +09:00
Stefano Ariestasia a74b6df14e Merge branch 'freqtrade:develop' into bt-metrics 2023-09-20 17:48:37 +09:00
Matthias 8600ae0387 Merge pull request #9191 from freqtrade/fix/double-date-column
Bug: FreqAI fit_live_predictions()
2023-09-20 08:23:41 +02:00
Matthias 02306884f0 Merge pull request #9204 from alexpvpmindustry/patch-1
Update exchanges.md
2023-09-20 07:04:03 +02:00
Robert Caulk 82ce5af454 Merge pull request #9200 from freqtrade/dependabot/pip/develop/xgboost-2.0.0
Bump xgboost from 1.7.6 to 2.0.0
2023-09-19 20:06:57 +02:00
alex 830f2219c8 Update exchanges.md
- Malaysia is a soverign country... parted with Singapore in 1965.
- also fix some formating
2023-09-19 09:44:01 -07:00
robcaulk d21f0f4081 chore: add guardrails for users who neglect docs 2023-09-19 12:24:44 +02:00
robcaulk 8f883f2310 chore: fix set_initial_hist_preds test 2023-09-19 12:20:44 +02:00
dependabot[bot] 2f63b0199d Bump xgboost from 1.7.6 to 2.0.0
Bumps [xgboost](https://github.com/dmlc/xgboost) from 1.7.6 to 2.0.0.
- [Release notes](https://github.com/dmlc/xgboost/releases)
- [Changelog](https://github.com/dmlc/xgboost/blob/master/NEWS.md)
- [Commits](https://github.com/dmlc/xgboost/compare/v1.7.6...v2.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 18:12:29 +00:00
Matthias 5a96c775fd Merge pull request #9193 from freqtrade/dependabot/pip/develop/lightgbm-4.1.0
Bump lightgbm from 4.0.0 to 4.1.0
2023-09-18 20:11:19 +02:00
dependabot[bot] cfdd9d6be9 Bump lightgbm from 4.0.0 to 4.1.0
Bumps [lightgbm](https://github.com/microsoft/LightGBM) from 4.0.0 to 4.1.0.
- [Release notes](https://github.com/microsoft/LightGBM/releases)
- [Commits](https://github.com/microsoft/LightGBM/compare/v4.0.0...v4.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 16:22:38 +00:00
Matthias c749aae19f Merge pull request #9196 from freqtrade/dependabot/pip/develop/numpy-1.26.0
Bump numpy from 1.25.2 to 1.26.0
2023-09-18 18:21:53 +02:00
Matthias fd4877759c Update hard min-requirement for python 2023-09-18 18:12:39 +02:00
Matthias 2e7acb4482 Merge pull request #9194 from freqtrade/dependabot/pip/develop/ruff-0.0.290
Bump ruff from 0.0.287 to 0.0.290
2023-09-18 08:35:55 +02:00
Matthias b43b60b26d Merge pull request #9202 from freqtrade/dependabot/pip/develop/plotly-5.17.0
Bump plotly from 5.16.1 to 5.17.0
2023-09-18 08:29:48 +02:00
Matthias 5ca8076072 Merge pull request #9201 from freqtrade/dependabot/pip/develop/python-rapidjson-1.11
Bump python-rapidjson from 1.10 to 1.11
2023-09-18 08:28:24 +02:00
Matthias 8d3c2470e3 Merge pull request #9198 from freqtrade/dependabot/pip/develop/rich-13.5.3
Bump rich from 13.5.2 to 13.5.3
2023-09-18 07:09:58 +02:00
Matthias 3f85f3cce6 Exclude UP036 for now 2023-09-18 07:08:08 +02:00
Matthias 2801bccdc7 Merge pull request #9197 from freqtrade/dependabot/pip/develop/mkdocs-material-9.3.1
Bump mkdocs-material from 9.2.8 to 9.3.1
2023-09-18 07:00:14 +02:00
Matthias 22651a8629 Merge pull request #9195 from freqtrade/dependabot/pip/develop/filelock-3.12.4
Bump filelock from 3.12.3 to 3.12.4
2023-09-18 06:59:55 +02:00
dependabot[bot] c7106a6802 Bump plotly from 5.16.1 to 5.17.0
Bumps [plotly](https://github.com/plotly/plotly.py) from 5.16.1 to 5.17.0.
- [Release notes](https://github.com/plotly/plotly.py/releases)
- [Changelog](https://github.com/plotly/plotly.py/blob/master/CHANGELOG.md)
- [Commits](https://github.com/plotly/plotly.py/compare/v5.16.1...v5.17.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 03:39:45 +00:00
dependabot[bot] 6e1f457fb3 Bump python-rapidjson from 1.10 to 1.11
Bumps [python-rapidjson](https://github.com/python-rapidjson/python-rapidjson) from 1.10 to 1.11.
- [Changelog](https://github.com/python-rapidjson/python-rapidjson/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-rapidjson/python-rapidjson/compare/v1.10...v1.11)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 03:39:41 +00:00
dependabot[bot] 533a16658c Bump rich from 13.5.2 to 13.5.3
Bumps [rich](https://github.com/Textualize/rich) from 13.5.2 to 13.5.3.
- [Release notes](https://github.com/Textualize/rich/releases)
- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Textualize/rich/compare/v13.5.2...v13.5.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 03:39:14 +00:00
dependabot[bot] 9b35dae465 Bump mkdocs-material from 9.2.8 to 9.3.1
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.2.8 to 9.3.1.
- [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.2.8...9.3.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 03:39:05 +00:00
dependabot[bot] e6d01b04ea Bump numpy from 1.25.2 to 1.26.0
Bumps [numpy](https://github.com/numpy/numpy) from 1.25.2 to 1.26.0.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v1.25.2...v1.26.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 03:38:57 +00:00
dependabot[bot] d185b2020a Bump filelock from 3.12.3 to 3.12.4
Bumps [filelock](https://github.com/tox-dev/py-filelock) from 3.12.3 to 3.12.4.
- [Release notes](https://github.com/tox-dev/py-filelock/releases)
- [Changelog](https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst)
- [Commits](https://github.com/tox-dev/py-filelock/compare/3.12.3...3.12.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 03:38:44 +00:00
dependabot[bot] 74ed0e0b11 Bump ruff from 0.0.287 to 0.0.290
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.0.287 to 0.0.290.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/BREAKING_CHANGES.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.0.287...v0.0.290)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 03:38:34 +00:00
Matthias 75f89ec12f Merge pull request #9188 from Axel-CH/add-trade-param-to-custom-entry-price
Add trade param to custom entry price
2023-09-17 23:23:42 +02:00
Matthias f6fce2162c Add new parameter to strategy template 2023-09-17 22:25:23 +02:00
Matthias 158bf09774 Fix type checking error 2023-09-17 19:40:44 +02:00
robcaulk 1f1abfe798 fix: avoid duplicate date columns interfering with fit_live_predictions() 2023-09-17 17:36:01 +02:00
Axel-CH 29a5e049b9 edit note wording for custom_entry_price 2023-09-17 03:30:03 -04:00
Axel-CH 2bc0c4ecd5 update docstring 2023-09-17 03:17:07 -04:00
Axel-CH 224213840d update trade object as optional parameter 2023-09-17 03:13:40 -04:00
Axel CHERUBIN d81fdeb3ed Update docs/strategy-callbacks.md
Co-authored-by: Matthias <xmatthias@outlook.com>
2023-09-17 03:06:00 -04:00
Matthias 14c5f435aa okx: Use proper history endpoint for fetch_orders 2023-09-16 20:01:19 +02:00
Matthias 5745722a37 Increase time for fetch_orders in test 2023-09-16 20:00:17 +02:00
Axel-CH a7cd9d77f2 ignore custom_entry_price trade object type test, remove LocalTrade as type 2023-09-16 13:58:59 -04:00
Axel-CH 5b857aeaf0 fix custom_entry_price trade object type test 2023-09-16 13:46:56 -04:00
Matthias afb1b787c8 add okx to fully tested exchanges 2023-09-16 19:43:39 +02:00
Matthias 659168d341 Improve cancel_stop test 2023-09-16 19:43:39 +02:00
Axel-CH 3f4715ba49 update custom_entry_price docstring 2023-09-16 13:20:10 -04:00
Axel-CH 1d0f1bd1ee update doc 2023-09-16 13:13:23 -04:00
Matthias 220bc3c23e Rename fetch_orders_emulate to make it non-protected 2023-09-16 17:56:16 +02:00
Matthias c90be601f5 Add offset to "fetch_orders" to avoid missing the initial order 2023-09-16 17:53:47 +02:00
Matthias 5d8e0573f6 Run handle_onexchange_order test without dry-run 2023-09-16 16:39:52 +02:00
Matthias 3d858f6599 Fix bug closing trades while recalculating
closes #9186
2023-09-16 16:39:52 +02:00
Matthias 6d2d5f93d0 Add exit order test
showing behavior in #9186
2023-09-16 16:39:40 +02:00
Matthias d01bc0fb9f Enforce kwargs for update_trade_state 2023-09-16 14:44:24 +02:00
Matthias 394d758d32 Add missing fields to json (and json parse) 2023-09-16 14:06:36 +02:00
Axel-CH 91c710408a fix flake8, set trade object param as Optional 2023-09-16 03:36:36 -04:00
Matthias 3a7f390510 Cancel based forceexits shouldn't trigger a full exit. 2023-09-16 09:32:51 +02:00
Matthias a7d6efdcd6 Fix order amounts in test 2023-09-16 09:32:30 +02:00
Matthias fed24c1308 Improve test for get_canceled_exit_order 2023-09-16 09:13:41 +02:00
Matthias ae4021da14 Rename get_canceled exit orders ... 2023-09-16 09:11:31 +02:00
Matthias 8378a0234d Filter exit_order_count on canceled orders only 2023-09-16 09:10:56 +02:00
Axel CHERUBIN d26869ea0a Merge branch 'freqtrade:develop' into add-trade-param-to-custom-entry-price 2023-09-16 02:53:01 -04:00
axel cf96ad1d1b add trade param to custom entry price in interface, bot, backtesting, exemples 2023-09-16 02:32:03 -04:00
Matthias 3919bf3740 Adjust sequence of trade json output 2023-09-16 08:25:36 +02:00
Stefano 9814cf5360 flake8 fix 2023-09-15 12:35:56 +09:00
Stefano c19fe95d39 add the filter to docs, tyding up the py file 2023-09-15 11:34:56 +09:00
Stefano 383bdb7d56 flake8 fix 2023-09-15 10:15:19 +09:00
Matthias 41765b14dc Merge pull request #9182 from stash86/fix-rangestability
Change the cache of rangestability to 1 day
2023-09-14 20:43:07 +02:00
Matthias 33bf7f9f30 Ensure test doesn't fail based on daytime
failed if it's run in the first hour of the (UTC) day
2023-09-14 20:05:11 +02:00
Matthias 454c2343a8 More clarity for adjust_trade_position callback docstring 2023-09-14 18:27:45 +02:00
Matthias 6d8bf75572 Merge pull request #9179 from freqtrade/chore/better-freqai-reload
chore: fix bug associated with leaving FreqAI offline for more than 1candle
2023-09-14 18:10:47 +02:00
Robert Caulk 310c9f6034 Update test_freqai_datadrawer.py 2023-09-14 13:49:31 +02:00
Stefano Ariestasia c0a600858f Change the cache of rangestability to 1 day 2023-09-14 08:50:06 +09:00
Stefano Ariestasia 5b07385414 simplify the filter 2023-09-14 08:13:47 +09:00
robcaulk 844ab4aef5 chore: add tests for set_initial_return_values 2023-09-14 00:05:59 +02:00
Stefano Ariestasia 44ca6f1c46 remove unused vars and change wording 2023-09-13 17:07:45 +09:00
Stefano Ariestasia 552f947248 remove unnecessary check 2023-09-13 15:09:13 +09:00
Stefano Ariestasia 7655bf6ea7 turn off logger for now 2023-09-13 14:53:33 +09:00
Stefano Ariestasia 25ae25248c add logger 2023-09-13 14:42:43 +09:00
Stefano Ariestasia dd01ae880f fix error 2023-09-13 14:38:16 +09:00
Stefano Ariestasia e0a06ca454 add fulltradesfilter 2023-09-13 14:18:07 +09:00
Stefano Ariestasia a93592c467 add fulltradespairlist 2023-09-13 14:17:43 +09:00
Stefano Ariestasia 08dffc95d8 fix wording 2023-09-13 11:58:28 +09:00
Stefano Ariestasia 57800e78c7 Merge branch 'freqtrade:develop' into bt-metrics2 2023-09-13 08:20:28 +09:00
Stefano Ariestasia bd4d7efbc9 Merge pull request #20 from stash86/bt-metrics2
create BaseAnalysis class
2023-09-13 08:20:09 +09:00
Stefano Ariestasia 5019fb5bf3 fix flake8 2023-09-12 19:58:40 +09:00
Stefano Ariestasia a0e0d7fe27 more fixes 2023-09-12 19:57:16 +09:00
Stefano Ariestasia 6377fd2689 flake8 fix 2023-09-12 19:54:25 +09:00
root bd9ea9bd8c precommit fix 2023-09-12 19:50:39 +09:00
Stefano Ariestasia cfeefa8754 remove prepare data from baseanalysis 2023-09-12 19:29:13 +09:00
Stefano Ariestasia 475d8486bb fix mutable Backtest 2023-09-12 19:21:01 +09:00
robcaulk 628963c207 chore: fix bug associated with leaving FreqAI offline for more than 1 candle. 2023-09-12 12:19:12 +02:00
Stefano Ariestasia 4d1810c2b6 update lookahead analysis 2023-09-12 19:11:19 +09:00
Stefano Ariestasia 05f0dccb8e add missing args to config 2023-09-12 16:25:25 +09:00
Stefano Ariestasia 6360e7fb15 debug 2023-09-12 16:20:04 +09:00
Stefano Ariestasia 40695a39d5 add missing var 2023-09-12 16:14:25 +09:00
Stefano Ariestasia 008f621211 create BaseAnalysis class 2023-09-12 15:42:32 +09:00
Matthias a52cf42218 use last order date to fill order. 2023-09-12 07:01:51 +02:00
Matthias a866b0a35e Improve test correctness 2023-09-12 07:01:05 +02:00
Matthias af1054fa70 Avoid re-implementing existing feature 2023-09-12 07:00:55 +02:00
Stefano Ariestasia 5608bbde9c Merge branch 'freqtrade:develop' into bt-metrics 2023-09-12 13:56:24 +09:00
Matthias ee9d2c637a Improve "order refind" mechanics 2023-09-11 20:18:42 +02:00
Matthias f0819d9df1 Improve "filled" date assignment for order updates 2023-09-11 20:03:38 +02:00
Matthias 96e5615d1b Update safe_value_fallback to allow empty 2nd keys 2023-09-11 20:03:38 +02:00
Matthias 4798dea6e1 Merge pull request #9168 from freqtrade/dependabot/pip/develop/ccxt-4.0.88
Bump ccxt from 4.0.81 to 4.0.88
2023-09-11 19:12:17 +02:00
Matthias 23a4ff9f25 Merge pull request #9171 from freqtrade/dependabot/pip/develop/orjson-3.9.7
Bump orjson from 3.9.5 to 3.9.7
2023-09-11 18:23:06 +02:00
Matthias 5ddfbea611 Merge pull request #9172 from freqtrade/dependabot/pip/develop/questionary-2.0.1
Bump questionary from 2.0.0 to 2.0.1
2023-09-11 08:12:00 +02:00
Matthias e8e67d1c85 Merge pull request #9173 from freqtrade/dependabot/pip/develop/pytest-7.4.2
Bump pytest from 7.4.1 to 7.4.2
2023-09-11 08:11:41 +02:00
Matthias dc9c31252b Merge pull request #9169 from freqtrade/dependabot/pip/develop/mkdocs-material-9.2.8
Bump mkdocs-material from 9.2.7 to 9.2.8
2023-09-11 06:45:44 +02:00
Matthias 82baa3f93f Improve and clarify wording around use_exit_signal 2023-09-11 06:32:40 +02:00
Matthias 78ca11155b Merge pull request #9167 from freqtrade/dependabot/github_actions/develop/actions/checkout-4
Bump actions/checkout from 3 to 4
2023-09-11 06:22:44 +02:00
dependabot[bot] 45c90c2013 Bump pytest from 7.4.1 to 7.4.2
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.1 to 7.4.2.
- [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/7.4.1...7.4.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-11 03:33:55 +00:00
dependabot[bot] 3a1057e1ff Bump questionary from 2.0.0 to 2.0.1
Bumps [questionary](https://github.com/tmbo/questionary) from 2.0.0 to 2.0.1.
- [Commits](https://github.com/tmbo/questionary/compare/2.0.0...2.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-11 03:33:50 +00:00
dependabot[bot] e45d5d3594 Bump orjson from 3.9.5 to 3.9.7
Bumps [orjson](https://github.com/ijl/orjson) from 3.9.5 to 3.9.7.
- [Release notes](https://github.com/ijl/orjson/releases)
- [Changelog](https://github.com/ijl/orjson/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ijl/orjson/compare/3.9.5...3.9.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-11 03:33:47 +00:00
dependabot[bot] 14ee5a2076 Bump mkdocs-material from 9.2.7 to 9.2.8
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.2.7 to 9.2.8.
- [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.2.7...9.2.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-11 03:33:33 +00:00
dependabot[bot] da83243eb3 Bump ccxt from 4.0.81 to 4.0.88
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.81 to 4.0.88.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.0.81...4.0.88)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-11 03:33:17 +00:00
dependabot[bot] 46ec7d5ea6 Bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-11 03:22:45 +00:00
Matthias 29fbac9f96 Add "catch-all" exceptionhandler for handle_onexchange_order
(it's actually a poor mans workaround)
closes #9025
2023-09-10 20:27:08 +02:00
Matthias 421a6c02a0 Improve enum imports 2023-09-10 18:10:38 +02:00
Matthias 2ee152c5a6 Merge pull request #8779 from Axel-CH/feature/multiple_open_orders
Feature: Multiple open orders
2023-09-10 17:22:26 +02:00
Matthias bef27467b6 Further improve test 2023-09-10 16:18:18 +02:00
Matthias 52f971cbb7 Improve existing test 2023-09-10 16:17:39 +02:00
Matthias 563e68e894 Don't hard-fail merge if there's no informative data 2023-09-10 16:16:52 +02:00
Matthias 49b4ab6d3b Simplify some things in tests 2023-09-09 17:37:05 +02:00
Matthias 7455e56a29 Add docstrings, simplify some code 2023-09-09 10:09:37 +02:00
Matthias 245a67e37e Avoid tons of commits when cancelling all orders 2023-09-09 09:55:01 +02:00
Matthias e76d4241a0 Remove further unnecessary method 2023-09-09 09:54:12 +02:00
Matthias 01ff054a0b fix open orders telegram reporting 2023-09-09 09:40:55 +02:00
Matthias 9e1f7dc6f7 have force-enter also include has_open_orders 2023-09-09 09:23:25 +02:00
Matthias 067c9219b6 replace 'open_orders' with "has_open_orders" in api 2023-09-09 08:36:28 +02:00
Matthias f4e5ce892b use has_open_orders in persistence 2023-09-08 19:58:43 +02:00
Matthias 830fc7580c Cleanup unused property 2023-09-08 19:51:14 +02:00
Matthias 21859f79db Merge pull request #9159 from stash86/fix-adjust
remove old codes when we only can do partial entries
2023-09-08 08:04:20 +02:00
Matthias 376b5fce54 Merge pull request #9160 from mohsenjfar/develop
Update strategy_analysis_example.md
2023-09-08 07:59:55 +02:00
Matthias cb5cd5cd86 Temporarily downgrade padnas to <2.1.0
https://github.com/pandas-dev/pandas/issues/55025
2023-09-08 07:08:18 +02:00
Matthias f8b97b6aa7 Fix dtype mismatch error 2023-09-08 07:05:38 +02:00
Matthias 7b6e2eac49 use ffill instead of fillna(method='ffill') 2023-09-08 07:04:12 +02:00
Matthias f13e134e9b Update actual notebook (not just the docs) 2023-09-08 06:47:31 +02:00
Matthias 97a37198b9 Update test 2023-09-08 06:39:42 +02:00
Matthias 43bb4114d0 Update test for no open_order_id usage 2023-09-07 20:24:40 +02:00
Matthias 8c95207ca4 Merge branch 'develop' into pr/Axel-CH/8779 2023-09-07 20:19:25 +02:00
Matthias ffaa121bc7 Simplify code by removing unnecessary (and non-working) method 2023-09-07 20:16:56 +02:00
Matthias 227b194a88 Partial exits should consider leveraged trades. 2023-09-07 18:27:19 +02:00
Matthias 95d8c45481 test_handle_cancel_exit_limit - partially fill by half 2023-09-07 18:27:19 +02:00
Matthias bae4abace2 Test test_handle_cancel_exit_limit short 2023-09-07 18:27:19 +02:00
Matthias 44461bd1a1 Add leverage to test_handle_cancel_exit_limit test 2023-09-07 18:27:19 +02:00
Matthias 2c095c07f2 Improve variable naming 2023-09-07 18:27:19 +02:00
Matthias 9c3656e24e Merge pull request #9158 from freqtrade/remove_3.8
Remove python 3.8 support
2023-09-07 18:19:17 +02:00
Mohsen 97275f5a46 Update strategy_analysis_example.md
A better approach to calculate equity and equity_daily
2023-09-07 17:18:43 +03:30
Stefano Ariestasia 7ccff18437 remove old codes when we only can do partial entries 2023-09-07 18:05:46 +09:00
Matthias c5f26e72e1 Merge pull request #9153 from freqtrade/rpc/drawdown
Add better drawdown metrics to /profit outputs
2023-09-07 06:33:15 +02:00
Matthias f09c0a5bba Remove 3.8 talib Wheel 2023-09-07 06:27:43 +02:00
Matthias aba9450098 Simplify requirements for 3.9+ 2023-09-07 06:26:55 +02:00
Matthias 4ef1647132 Setup.sh should require 3.9 2023-09-07 06:25:44 +02:00
Matthias 6e93bff374 Update documentation for 3.8 removal 2023-09-07 06:25:08 +02:00
Matthias 4d20e37f4d Remove 3.8 from CI 2023-09-07 06:24:32 +02:00
Matthias 20cca01d10 Fix bug in volumepairlist if lookback is bigger than the available candles (new pairs)
closes #9154
2023-09-06 19:40:31 +02:00
Matthias 8cbb5d2a93 Adjust test for "nan" data
shows problem in #9154
2023-09-06 19:38:54 +02:00
Matthias fbae2142d1 Remove misleading "cd freqtrade" command
closes #9138
2023-09-05 06:29:18 +02:00
Matthias feea20fb0a Merge pull request #9151 from freqtrade/refactor/calc_profits
Refactor calculate profits
2023-09-05 06:26:04 +02:00
Matthias 2ed52a77e5 Merge pull request #9142 from freqtrade/dependabot/pip/develop/pandas-2.1.0
Bump pandas from 2.0.3 to 2.1.0
2023-09-05 06:22:06 +02:00
Matthias e854667eb8 Add max_drawdown_start and end to /profit API endpoints 2023-09-04 20:09:59 +02:00
Matthias 7bf20d9060 Show drawdown from/to on /profit calls 2023-09-04 20:09:59 +02:00
Matthias 7c5a11623e Use dt_ts_def in profit endpoints 2023-09-04 20:09:32 +02:00
Matthias 783a2d945e add dt_ts_def helper 2023-09-04 20:09:32 +02:00
Matthias 2073c71811 use format_date in rpc methods 2023-09-04 20:09:32 +02:00
Matthias d8122962db Add "date to string" helper 2023-09-04 20:09:32 +02:00
Matthias 1ea626fb5b Pin pandas for <3.9 versions to old version 2023-09-04 19:57:10 +02:00
Robert Caulk f66719fc1f Merge pull request #9150 from freqtrade/dependabot/pip/develop/catboost-1.2.1
Bump catboost from 1.2 to 1.2.1
2023-09-04 10:14:03 +02:00
Matthias 4b2813ff37 Merge pull request #9147 from freqtrade/dependabot/pip/develop/pytest-7.4.1
Bump pytest from 7.4.0 to 7.4.1
2023-09-04 09:54:54 +02:00
Matthias 191c85bccc Merge pull request #9140 from freqtrade/dependabot/pip/develop/mkdocs-material-9.2.7
Bump mkdocs-material from 9.2.5 to 9.2.7
2023-09-04 09:21:09 +02:00
Stefano Ariestasia 31816cdb2a Merge branch 'freqtrade:develop' into bt-metrics 2023-09-04 15:44:47 +09:00
dependabot[bot] 574744348a Bump pandas from 2.0.3 to 2.1.0
Bumps [pandas](https://github.com/pandas-dev/pandas) from 2.0.3 to 2.1.0.
- [Release notes](https://github.com/pandas-dev/pandas/releases)
- [Commits](https://github.com/pandas-dev/pandas/compare/v2.0.3...v2.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 06:16:30 +00:00
dependabot[bot] efb9975e3e Bump pytest from 7.4.0 to 7.4.1
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.0 to 7.4.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/7.4.0...7.4.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 06:16:21 +00:00
Matthias cd8743b80c Merge pull request #9144 from freqtrade/dependabot/pip/develop/ccxt-4.0.81
Bump ccxt from 4.0.76 to 4.0.81
2023-09-04 08:15:46 +02:00
Matthias 237f3c58c8 Merge pull request #9148 from freqtrade/dependabot/pip/develop/pre-commit-3.4.0
Bump pre-commit from 3.3.3 to 3.4.0
2023-09-04 08:14:44 +02:00
Matthias be7b0e4247 Merge pull request #9149 from freqtrade/dependabot/pip/develop/ruff-0.0.287
Bump ruff from 0.0.286 to 0.0.287
2023-09-04 08:14:28 +02:00
dependabot[bot] 5954e7796c Bump mkdocs-material from 9.2.5 to 9.2.7
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.2.5 to 9.2.7.
- [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.2.5...9.2.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 06:13:54 +00:00
Matthias f44eef3855 Merge pull request #9146 from freqtrade/dependabot/pip/develop/pymdown-extensions-10.3
Bump pymdown-extensions from 10.1 to 10.3
2023-09-04 08:13:12 +02:00
Matthias 0232eeca54 Merge pull request #9143 from freqtrade/dependabot/pip/develop/fastapi-0.103.1
Bump fastapi from 0.103.0 to 0.103.1
2023-09-04 08:12:56 +02:00
Matthias f5f0506a29 Merge pull request #9141 from freqtrade/dependabot/pip/develop/python-telegram-bot-20.5
Bump python-telegram-bot from 20.4 to 20.5
2023-09-04 08:12:18 +02:00
Matthias 39b6a00224 Improve naming of calculate_profit method 2023-09-04 06:42:16 +02:00
Matthias 206557d4b7 Merge pull request #9145 from freqtrade/dependabot/pip/develop/nbconvert-7.8.0
Bump nbconvert from 7.7.4 to 7.8.0
2023-09-04 06:31:52 +02:00
Matthias 07e07bd66b Improve test, ensuring we calculate profits correctly 2023-09-04 06:28:29 +02:00
Matthias fac8e0fde5 Remove calc_profit content 2023-09-04 06:28:29 +02:00
Matthias ffb1cf52b1 Convert further usages to calc_profit_combined 2023-09-04 06:28:29 +02:00
Matthias 399f144c27 more calc_profit_combined usage 2023-09-04 06:28:29 +02:00
Matthias 459b9d80d4 use calc_profit_combined 2023-09-04 06:28:29 +02:00
Matthias 28e685ee2b Switch combined profit response to dataclass 2023-09-04 06:28:29 +02:00
Matthias c58a1649cb add calc_profit_combined call 2023-09-04 06:28:29 +02:00
Matthias a4512ac791 Merge pull request #9139 from freqtrade/dependabot/pip/develop/filelock-3.12.3
Bump filelock from 3.12.2 to 3.12.3
2023-09-04 06:23:07 +02:00
dependabot[bot] ac6cdb76ce Bump catboost from 1.2 to 1.2.1
Bumps [catboost](https://github.com/catboost/catboost) from 1.2 to 1.2.1.
- [Release notes](https://github.com/catboost/catboost/releases)
- [Changelog](https://github.com/catboost/catboost/blob/master/RELEASE.md)
- [Commits](https://github.com/catboost/catboost/compare/v1.2...v1.2.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 03:03:12 +00:00
dependabot[bot] 8ac3e8ad5f Bump ruff from 0.0.286 to 0.0.287
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.0.286 to 0.0.287.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/BREAKING_CHANGES.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.0.286...v0.0.287)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 03:02:59 +00:00
dependabot[bot] e0f52696a5 Bump pre-commit from 3.3.3 to 3.4.0
Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 3.3.3 to 3.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/v3.3.3...v3.4.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 03:02:45 +00:00
dependabot[bot] f75f0ccf2c Bump pymdown-extensions from 10.1 to 10.3
Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 10.1 to 10.3.
- [Release notes](https://github.com/facelessuser/pymdown-extensions/releases)
- [Commits](https://github.com/facelessuser/pymdown-extensions/compare/10.1.0...10.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 03:02:26 +00:00
dependabot[bot] 440f6ab8e1 Bump nbconvert from 7.7.4 to 7.8.0
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.7.4 to 7.8.0.
- [Release notes](https://github.com/jupyter/nbconvert/releases)
- [Changelog](https://github.com/jupyter/nbconvert/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jupyter/nbconvert/compare/v7.7.4...v7.8.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 03:02:16 +00:00
dependabot[bot] e7daf3177d Bump ccxt from 4.0.76 to 4.0.81
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.76 to 4.0.81.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.0.76...4.0.81)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 03:02:11 +00:00
dependabot[bot] 8ffc0ad9fc Bump fastapi from 0.103.0 to 0.103.1
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.103.0 to 0.103.1.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.103.0...0.103.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 03:01:59 +00:00
dependabot[bot] df83bdea8d Bump python-telegram-bot from 20.4 to 20.5
Bumps [python-telegram-bot](https://github.com/python-telegram-bot/python-telegram-bot) from 20.4 to 20.5.
- [Release notes](https://github.com/python-telegram-bot/python-telegram-bot/releases)
- [Changelog](https://github.com/python-telegram-bot/python-telegram-bot/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-telegram-bot/python-telegram-bot/compare/v20.4...v20.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 03:01:43 +00:00
dependabot[bot] 420f6fb9a9 Bump filelock from 3.12.2 to 3.12.3
Bumps [filelock](https://github.com/tox-dev/py-filelock) from 3.12.2 to 3.12.3.
- [Release notes](https://github.com/tox-dev/py-filelock/releases)
- [Changelog](https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst)
- [Commits](https://github.com/tox-dev/py-filelock/compare/3.12.2...3.12.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 03:01:26 +00:00
Stefano Ariestasia cea3f7d3fa fix flake8 2023-09-04 11:53:59 +09:00
Stefano Ariestasia a9f63c6a99 fix mypy 2023-09-04 11:52:09 +09:00
Stefano Ariestasia 0ada2d9390 fix mypy 2023-09-04 11:45:25 +09:00
Stefano Ariestasia e1b6b9b5a6 ruff fix 2023-09-04 11:41:24 +09:00
root 3fea2a35a2 pre-commit fixes 2023-09-04 11:38:13 +09:00
Stefano Ariestasia 821a598ff4 fix ruff 2023-09-04 11:35:44 +09:00
Stefano Ariestasia feab5f82c1 add missing arg 2023-09-04 11:20:49 +09:00
Stefano Ariestasia 607c604a45 add mising const 2023-09-04 11:16:10 +09:00
Stefano Ariestasia b77f926cdd add recursive analysis 2023-09-04 10:53:04 +09:00
Robert Caulk d2c0e9e438 Merge pull request #9133 from initrv/patch-1
add QRDQN to SB3_CONTRIB_MODELS
2023-09-03 23:24:19 +02:00
Matthias a4077e96ba Merge pull request #9135 from froggleston/frog-fix-analysis-nulls
Fix nulls in indicator list output and add expectancy ratio
2023-09-03 17:16:44 +02:00
Matthias a4fc7ce0c4 "fix" bybit invalid order responses for canceled orders
closes #9128
2023-09-03 17:05:57 +02:00
Matthias 00cef56a57 Merge pull request #9137 from froggleston/frog-update-rpc
Implment weekly/monthly RPC endpoints
2023-09-03 10:22:37 +02:00
Matthias d1984945d5 Improve tests for /weekly and /monthly 2023-09-02 20:15:12 +02:00
Matthias 3c20ab683a Have /monthly return proper dates, move formatting to telegram 2023-09-02 20:11:19 +02:00
froggleston f838bc760f Implment weekly/monthly RPC endpoints 2023-09-02 16:06:23 +01:00
Matthias 25f5dbfcbd Delete trade if replacing the first order failed
part of #9128
2023-09-02 16:49:12 +02:00
Matthias be044fbacf Improve log output 2023-09-02 16:37:53 +02:00
Matthias 7a4276f6c7 Include pair in dry-run order names 2023-09-02 16:37:41 +02:00
froggleston 925e18368a Fix linting a.k.a. Maybe one day, flake8 will like me 2023-09-02 15:05:34 +01:00
froggleston 250e00e6c7 Fix dropna subset 2023-09-02 12:52:05 +01:00
froggleston 81672da57b Fix nulls in indicator list output and add expectancy ratio per entry tag in analysis group 0 output 2023-09-02 12:45:33 +01:00
Matthias d68c22b21d Move merge-informative_pairs helper to informative section 2023-09-02 12:07:25 +02:00
Matthias e806e4a796 Move stop helper functions to callbacks section 2023-09-02 12:06:16 +02:00
Matthias 6f86e30c7e Add leverage adjustment to "stoploss_from_absolute" 2023-09-02 11:01:59 +02:00
Matthias a87404b5a8 Reduce limit order cross threshold 2023-09-02 10:37:57 +02:00
initrv 0357d373a9 add QRDQN to SB3_CONTRIB_MODELS 2023-09-01 11:31:09 +03:00
Matthias 28c62724df Add explicit test and message for "Order could not be replaced" scenario
part of #9128
2023-09-01 06:58:59 +02:00
Robert Caulk 1eb90b115b Merge pull request #9129 from smarmau/patch-3
Update setup.sh
2023-08-31 12:47:11 +02:00
smarmau d13357bb0c Update setup.sh
Fixed small typo
2023-08-31 19:26:11 +10:00
Matthias 65fe1a671c Add explicit test for bybit fetch_orders behavior 2023-08-31 08:14:14 +02:00
Matthias 6429282f05 add iterating emulation to fetch_orders for bybit 2023-08-31 08:07:44 +02:00
Matthias b5fa013600 Add pairs argument to fetch_orders 2023-08-31 08:05:07 +02:00
Matthias 02bd052e45 Improve naming of variable 2023-08-31 06:39:26 +02:00
Matthias 4ed46ef6b3 Add significant digits Round_Up / round_down 2023-08-30 16:48:31 +00:00
Matthias 65c7607e36 Add Tests for "Significant" digits 2023-08-30 08:34:32 +00:00
Matthias bfc2c70b44 Fix and improve Tick size ROUND_DOWN logic 2023-08-30 08:21:02 +00:00
Matthias 3a6c00dbaf Improve price_to_precision test depth 2023-08-30 08:00:33 +00:00
Matthias 133660ff4e Fall back "price_to_precision" to ccxt where possible 2023-08-30 07:53:00 +00:00
Matthias 994b2a0f28 Update sorting of price precision logic 2023-08-30 07:43:53 +00:00
Matthias d4c042c523 Add amount precision test to test for significant digits 2023-08-30 07:32:38 +00:00
Matthias b48fe4ce51 Properly use Precision-mode Variable 2023-08-30 07:23:59 +00:00
Matthias 78f356c0df amount to contract precision to test_utils 2023-08-30 07:18:46 +00:00
Matthias 7263d321f8 move timeframe_to* tests to test_exchange_utils 2023-08-30 07:16:14 +00:00
Matthias 1ccbe87f90 Move precision tests to exchange_utils test file 2023-08-30 07:09:57 +00:00
Matthias e7d2a48766 Move date_minus test to exchange_utils testmethod 2023-08-30 07:07:28 +00:00
Matthias c894843d0f Exclude .venv and .env from flake8 2023-08-29 21:16:10 +02:00
Matthias 23aa8dcd51 Simplify profit calculation (removes unnecessary fallback) 2023-08-29 18:31:51 +02:00
Matthias f3187ddcbf Merge pull request #9057 from freqtrade/feat/stoploss_adjust
"After order" stoploss adjustment
2023-08-29 18:06:37 +02:00
Matthias 5eb446f1ce Don't remove elements from list we're iterating over
closes #9127
2023-08-29 17:44:39 +02:00
Matthias 5efa40215b Allow invalid futures pairs (: separated)
closes #9127
2023-08-29 17:40:35 +02:00
Matthias 1a8b793c0a Merge branch 'develop' into feat/stoploss_adjust 2023-08-29 07:04:08 +02:00
Matthias e0e0a25811 Merge pull request #9123 from freqtrade/deprecate/edge
Add note about Edge status
2023-08-29 06:56:58 +02:00
Matthias 99b01a39d1 Add note about Edge deprecation 2023-08-28 20:16:00 +02:00
Matthias ae08a832c8 Merge pull request #9118 from freqtrade/dependabot/pip/develop/pyarrow-13.0.0
Bump pyarrow from 12.0.1 to 13.0.0
2023-08-28 13:47:45 +02:00
Matthias 2bae4c98b1 Add rpi wheel for pyarrow 13.0.0 2023-08-28 10:18:37 +00:00
Matthias f717928ae0 Bump mypy pre-commit 2023-08-28 08:50:55 +00:00
Matthias b66db8e89c Merge pull request #9117 from freqtrade/dependabot/pip/develop/pydantic-2.3.0
Bump pydantic from 2.2.1 to 2.3.0
2023-08-28 09:34:24 +02:00
dependabot[bot] 3643ad0059 Bump pydantic from 2.2.1 to 2.3.0
Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.2.1 to 2.3.0.
- [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.2.1...v2.3.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-28 06:41:04 +00:00
Matthias 2bdf4c54bd Merge pull request #9119 from freqtrade/dependabot/pip/develop/fastapi-0.103.0
Bump fastapi from 0.101.1 to 0.103.0
2023-08-28 08:39:11 +02:00
Matthias 66be4fd159 Merge pull request #9113 from freqtrade/dependabot/docker/python-3.11.5-slim-bullseye
Bump python from 3.11.4-slim-bullseye to 3.11.5-slim-bullseye
2023-08-28 06:47:34 +02:00
Matthias 078a4ca8b6 Merge pull request #9114 from freqtrade/dependabot/pip/develop/ccxt-4.0.76
Bump ccxt from 4.0.71 to 4.0.76
2023-08-28 06:46:32 +02:00
Matthias 07ab9bba69 Merge pull request #9116 from freqtrade/dependabot/pip/develop/mkdocs-material-9.2.5
Bump mkdocs-material from 9.2.1 to 9.2.5
2023-08-28 06:45:42 +02:00
Matthias a964f56b07 Merge pull request #9115 from freqtrade/dependabot/pip/develop/ruff-0.0.286
Bump ruff from 0.0.285 to 0.0.286
2023-08-28 06:36:28 +02:00
dependabot[bot] 46b8708ffa Bump fastapi from 0.101.1 to 0.103.0
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.101.1 to 0.103.0.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.101.1...0.103.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-28 03:14:08 +00:00
dependabot[bot] 9136c13cd2 Bump pyarrow from 12.0.1 to 13.0.0
Bumps [pyarrow](https://github.com/apache/arrow) from 12.0.1 to 13.0.0.
- [Commits](https://github.com/apache/arrow/compare/go/v12.0.1...go/v13.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-28 03:13:51 +00:00
dependabot[bot] 0df9436d06 Bump mkdocs-material from 9.2.1 to 9.2.5
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.2.1 to 9.2.5.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.2.1...9.2.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-28 03:13:35 +00:00
dependabot[bot] d32aabecd3 Bump ruff from 0.0.285 to 0.0.286
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.0.285 to 0.0.286.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/BREAKING_CHANGES.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.0.285...v0.0.286)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-28 03:13:22 +00:00
dependabot[bot] f2a3dd6414 Bump ccxt from 4.0.71 to 4.0.76
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.71 to 4.0.76.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ccxt/ccxt/compare/4.0.71...4.0.76)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-28 03:13:03 +00:00
dependabot[bot] fc23b47c4d Bump python from 3.11.4-slim-bullseye to 3.11.5-slim-bullseye
Bumps python from 3.11.4-slim-bullseye to 3.11.5-slim-bullseye.

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-28 03:03:46 +00:00
Matthias f256701679 Bump version to 2023.9-dev 2023-08-27 20:40:37 +02:00
Matthias c1df94b507 Bump version to 2023.8 2023-08-27 20:40:07 +02:00
Matthias f19f3ed4eb Fix rpc forceexit logic, fix remaining test 2023-08-27 10:29:34 +02:00
Matthias 2f97b00d31 Fix test 2023-08-27 10:02:41 +02:00
Matthias 911e238494 Revert false removal of Exception from test 2023-08-27 09:52:11 +02:00
Matthias 5659ca2ecd Fix migrations 2023-08-25 07:29:10 +02:00
Matthias 0181abc629 Fix migration SQL statement 2023-08-25 07:14:39 +02:00
Matthias acda2ff909 Remove open_order_id from test_ftbot 2023-08-25 07:13:39 +02:00
Matthias 43c73c75c5 Remove more open_order_id references 2023-08-25 07:10:30 +02:00
Matthias 95daff182d Update backtesting to not use open_order_id 2023-08-25 07:08:24 +02:00
Matthias b82b77d03f Fix some rpc tests 2023-08-25 07:01:48 +02:00
Matthias 193dcf578d Fix logic error in force_exit if no order is open 2023-08-25 06:47:02 +02:00
Matthias 4c0a6611c8 remove open_order_id from test mock trades 2023-08-24 20:17:29 +02:00
Matthias 3e986e24fa Merge branch 'develop' into pr/Axel-CH/8779 2023-08-24 20:09:41 +02:00
Matthias 5cf6f0b491 Merge branch 'develop' into pr/Axel-CH/8779 2023-08-23 07:20:34 +02:00
Matthias 5ed5907809 Add explicit example for "after_fill" handling 2023-08-18 10:14:32 +02:00
Matthias a78d704998 Fix strategy template typng 2023-08-14 17:29:49 +02:00
Matthias cb85a53042 Improve "uses_after_fill" detection
(short-circuits some logic, resulting in less code being executed in interface.py)
2023-08-14 17:08:37 +02:00
Matthias 7f1a81eeed Fix stop switching to trailing if order is replaced in backtesting 2023-08-14 17:08:01 +02:00
Matthias 106dffe2c5 split update_trade 2023-08-14 17:07:34 +02:00
Matthias 070a1990e8 Improve handling of None values from custom_stoploss 2023-08-14 16:46:33 +02:00
Matthias ddf79088fb Update custom stop documenttaion 2023-08-14 16:40:09 +02:00
Matthias 3ed682a9c6 Allow None from custom_stop 2023-08-14 16:40:09 +02:00
Matthias 6e32f172be Update samples in the documentation 2023-08-14 16:40:09 +02:00
Matthias bef5e191a4 Don't surprise people with "after_fill" calls 2023-08-14 16:40:06 +02:00
Matthias fc60c0df19 Add call to stoploss-adjust for backtesting 2023-08-14 16:00:33 +02:00
Matthias 62d83b8dbd Use is_stop_trailing for actual trailing detection 2023-08-14 15:57:47 +02:00
Matthias e1eeaa24d2 Implement "adjust lower" correctly 2023-08-14 15:21:59 +02:00
Matthias 6249392526 Add test for "allow adjustment in other direction" 2023-08-14 15:21:59 +02:00
Matthias 4da8c91161 Improve stop adjustment tests 2023-08-14 15:21:59 +02:00
Matthias ec8ba821ed Simplify stop adjustment code 2023-08-14 15:21:59 +02:00
Matthias 6b9547a9ad Improve migrations 2023-08-14 15:21:38 +02:00
Matthias ae9f730624 Add explicit "is_trailing_stop" field to database 2023-08-14 15:21:38 +02:00
Matthias 147cc4f0b6 Initial version of stop "after_fill" 2023-08-14 15:21:10 +02:00
Matthias e2274e813a Rename adjust_stoploss parameter to allow_refresh 2023-08-14 15:21:10 +02:00
Matthias d091931279 Ease meaning of "refresh" param for adjust_stoploss 2023-08-14 15:20:31 +02:00
Matthias 88925d6c1d Merge branch 'develop' into pr/Axel-CH/8779 2023-08-09 19:58:24 +02:00
axel 2893f0544a fix test_apply_fee_conditional_multibuy 2023-08-03 19:13:43 -04:00
Axel CHERUBIN f397d973f3 Merge branch 'freqtrade:develop' into feature/multiple_open_orders 2023-08-02 23:48:13 -04:00
Matthias f224f743da Add explicit test for open_orders property 2023-06-24 08:53:27 +02:00
Matthias be062c5fbe Fix frequent notification bug due to stop order 2023-06-24 08:10:31 +02:00
axel 5c0d89feb5 fix test_handle_insufficient_funds with comments 2023-06-23 17:53:54 -04:00
axel 4e6068a923 wip fix test_rpc_force_exit / __exec_force_exit 2023-06-21 02:46:16 -04:00
axel 07c629922a fiw wip test_api_status 2023-06-21 02:15:06 -04:00
axel 3f506bb474 fix test_api_performance 2023-06-21 02:05:40 -04:00
axel 1c4c2272f5 fix test_api_delete_open_order 2023-06-21 02:02:47 -04:00
axel 1ed6f1875b wip fix test_rpc_force_exit 2023-06-21 01:48:57 -04:00
axel ca4ef22d07 fix test_rpc_status_table 2023-06-20 23:12:31 -04:00
axel db5383927c fix test_rpc_trade_status 2023-06-20 21:52:06 -04:00
Matthias 2b88137612 Merge branch 'develop' into pr/Axel-CH/8779 2023-06-20 19:17:47 +02:00
Matthias 9fddc1499e Merge branch 'develop' into pr/Axel-CH/8779 2023-06-20 18:14:25 +02:00
Matthias c7f4dc1651 Merge branch 'develop' into pr/Axel-CH/8779 2023-06-20 17:43:50 +02:00
Matthias 29d77a17e5 Fix more tests 2023-06-20 17:42:05 +02:00
Matthias e34bfa9767 Fix exception test 2023-06-20 17:13:16 +02:00
Matthias d08bad7288 Fix trade_from_json 2023-06-20 17:10:04 +02:00
Matthias ac4e3028d2 Clean up some code 2023-06-20 17:09:31 +02:00
Matthias f1bed95153 Fix some initial tests 2023-06-20 17:02:03 +02:00
Matthias f3f5b63b7f Remove duplicate attributes 2023-06-20 16:43:32 +02:00
axel a98e8ef201 retreive open orders from orders list, not from db 2023-06-19 12:28:55 -04:00
axel b031470979 WIP with comment on test test_adjust_entry_maintain_replace 2023-06-17 12:36:03 -04:00
axel 171c4f182d update test_adjust_entry_maintain_replace test case, fix first RPC test 2023-06-17 00:06:30 -04:00
axel 32c919cfad replace open_orders_count by has_open_orders in freqtradebot 2023-06-16 23:36:37 -04:00
axel bf60f38a23 fix tests test_handle_trade, test_handle_cancel_exit_limit, WIP on test_adjust_entry_maintain_replace 2023-06-16 23:29:41 -04:00
axel 93994756e8 fix multiple tests, including test_check_handle_cancelled_buy 2023-06-16 21:51:24 -04:00
axel 7c55a2c6e2 fix tests: test_manage_open_orders_entry, test_manage_open_orders_partial_except, test_adjust_entry_cancel, test_manage_open_orders_partial_fee 2023-06-16 18:01:38 -04:00
axel ee43792566 fix tests: test_handle_cancel_exit_cancel_exception, test_update_trade_state_sell, test_manage_open_orders_entry_usercustom 2023-06-16 17:14:53 -04:00
axel f14b42f202 add use has_open_orders property in freqtradebot tests 2023-06-16 16:22:08 -04:00
axel 6e8c765ece add has_open_orders to Trade model property 2023-06-16 16:15:24 -04:00
axel 5f70406880 fix more tests 2023-06-15 22:00:15 -04:00
axel 069759c7c5 fix more tests 2023-06-15 21:33:39 -04:00
axel ebd5fac91d update cancel_all_open_orders, wip on fixing test_cancel_all_open_orders 2023-06-15 21:04:40 -04:00
axel 156c202889 fix more tests including process_open_trade_positions 2023-06-15 20:46:35 -04:00
axel 8e0faf4aaa fix more tests, remove legacy conditions from update_trade function 2023-06-15 14:29:08 -04:00
axel 20a2b27498 update LocalTrade model orders related property type 2023-06-15 14:11:21 -04:00
axel 73d1201ed8 start fixing test_handle_stoploss_on_exchange_trailing, add temp logs 2023-06-15 13:37:36 -04:00
axel fcbacae6f1 remove unuseful function call in manage_open_orders 2023-06-15 12:04:42 -04:00
axel 60a50a2ea8 fix test_handle_stoploss_on_exchange, add more orders related hybrid_properties to Trade classes 2023-06-15 11:56:41 -04:00
axel defa6f45b2 fix more freqtradebot tests, update params of handle_cancel_enter, handle_cancel_exit 2023-06-15 03:05:01 -04:00
axel 9cdff0b0a5 fix first important tests in test_freqtradebot, update and fix on order related Trade class hybrid_properties 2023-06-15 01:55:13 -04:00
axel 450fc5763f fix test test_freqtradebot.py::test_execute_entry 2023-06-14 14:20:14 -04:00
axel 2495661554 remove unrequired appends from test_update_limit_order 2023-06-14 11:49:20 -04:00
axel ae92557dd7 remove commented legacy open_order_id property references 2023-06-14 11:44:49 -04:00
axel 057f852e06 fix localTrade and trade classe miroring, fix persistence tests 2023-06-14 11:40:30 -04:00
axel 4874d10455 Replace open_order_id property by open_orders in Trade model, first test update 2023-06-13 02:11:34 -04:00
210 changed files with 12974 additions and 4166 deletions
+109 -74
View File
@@ -25,13 +25,13 @@ jobs:
strategy:
matrix:
os: [ ubuntu-20.04, ubuntu-22.04 ]
python-version: ["3.8", "3.9", "3.10", "3.11"]
python-version: ["3.9", "3.10", "3.11"]
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
@@ -44,7 +44,6 @@ jobs:
- name: pip cache (linux)
uses: actions/cache@v3
if: runner.os == 'Linux'
with:
path: ~/.cache/pip
key: test-${{ matrix.os }}-${{ matrix.python-version }}-pip
@@ -55,7 +54,6 @@ jobs:
cd build_helpers && ./install_ta-lib.sh ${HOME}/dependencies/; cd ..
- name: Installation - *nix
if: runner.os == 'Linux'
run: |
python -m pip install --upgrade pip wheel
export LD_LIBRARY_PATH=${HOME}/dependencies/lib:$LD_LIBRARY_PATH
@@ -90,7 +88,7 @@ jobs:
- name: Backtesting (multi)
run: |
cp config_examples/config_bittrex.example.json config.json
cp tests/testdata/config.tests.json config.json
freqtrade create-userdir --userdir user_data
freqtrade new-strategy -s AwesomeStrategy
freqtrade new-strategy -s AwesomeStrategyMin --template minimal
@@ -98,7 +96,7 @@ jobs:
- name: Hyperopt
run: |
cp config_examples/config_bittrex.example.json config.json
cp tests/testdata/config.tests.json config.json
freqtrade create-userdir --userdir user_data
freqtrade hyperopt --datadir tests/testdata -e 6 --strategy SampleStrategy --hyperopt-loss SharpeHyperOptLossDaily --print-all
@@ -108,7 +106,7 @@ jobs:
- name: Run Ruff
run: |
ruff check --format=github .
ruff check --output-format=github .
- name: Mypy
run: |
@@ -122,18 +120,18 @@ jobs:
details: Freqtrade CI failed on ${{ matrix.os }}
webhookUrl: ${{ secrets.DISCORD_WEBHOOK }}
build_macos:
build-macos:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ macos-latest ]
python-version: ["3.8", "3.9", "3.10", "3.11"]
os: [ "macos-latest", "macos-13" ]
python-version: ["3.9", "3.10", "3.11"]
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
check-latest: true
@@ -143,14 +141,13 @@ jobs:
id: cache
with:
path: ~/dependencies/
key: ${{ runner.os }}-dependencies
key: ${{ matrix.os }}-dependencies
- name: pip cache (macOS)
uses: actions/cache@v3
if: runner.os == 'macOS'
with:
path: ~/Library/Caches/pip
key: test-${{ matrix.os }}-${{ matrix.python-version }}-pip
key: ${{ matrix.os }}-${{ matrix.python-version }}-pip
- name: TA binary *nix
if: steps.cache.outputs.cache-hit != 'true'
@@ -158,7 +155,6 @@ jobs:
cd build_helpers && ./install_ta-lib.sh ${HOME}/dependencies/; cd ..
- name: Installation - macOS
if: runner.os == 'macOS'
run: |
# brew update
# TODO: Should be the brew upgrade
@@ -166,16 +162,21 @@ jobs:
# https://github.com/actions/runner-images/issues/6817
rm /usr/local/bin/2to3 || true
rm /usr/local/bin/2to3-3.11 || true
rm /usr/local/bin/2to3-3.12 || true
rm /usr/local/bin/idle3 || true
rm /usr/local/bin/idle3.11 || true
rm /usr/local/bin/idle3.12 || true
rm /usr/local/bin/pydoc3 || true
rm /usr/local/bin/pydoc3.11 || true
rm /usr/local/bin/pydoc3.12 || true
rm /usr/local/bin/python3 || true
rm /usr/local/bin/python3.11 || true
rm /usr/local/bin/python3.12 || true
rm /usr/local/bin/python3-config || true
rm /usr/local/bin/python3.11-config || true
rm /usr/local/bin/python3.12-config || true
brew install hdf5 c-blosc
brew install hdf5 c-blosc libomp
python -m pip install --upgrade pip wheel
export LD_LIBRARY_PATH=${HOME}/dependencies/lib:$LD_LIBRARY_PATH
export TA_LIBRARY_PATH=${HOME}/dependencies/lib
@@ -200,14 +201,14 @@ jobs:
- name: Backtesting
run: |
cp config_examples/config_bittrex.example.json config.json
cp tests/testdata/config.tests.json config.json
freqtrade create-userdir --userdir user_data
freqtrade new-strategy -s AwesomeStrategyAdv --template advanced
freqtrade backtesting --datadir tests/testdata --strategy AwesomeStrategyAdv
- name: Hyperopt
run: |
cp config_examples/config_bittrex.example.json config.json
cp tests/testdata/config.tests.json config.json
freqtrade create-userdir --userdir user_data
freqtrade hyperopt --datadir tests/testdata -e 5 --strategy SampleStrategy --hyperopt-loss SharpeHyperOptLossDaily --print-all
@@ -217,7 +218,7 @@ jobs:
- name: Run Ruff
run: |
ruff check --format=github .
ruff check --output-format=github .
- name: Mypy
run: |
@@ -231,19 +232,19 @@ jobs:
details: Test Succeeded!
webhookUrl: ${{ secrets.DISCORD_WEBHOOK }}
build_windows:
build-windows:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ windows-latest ]
python-version: ["3.8", "3.9", "3.10", "3.11"]
python-version: ["3.9", "3.10", "3.11"]
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
@@ -275,19 +276,19 @@ jobs:
- name: Backtesting
run: |
cp config_examples/config_bittrex.example.json config.json
cp tests/testdata/config.tests.json config.json
freqtrade create-userdir --userdir user_data
freqtrade backtesting --datadir tests/testdata --strategy SampleStrategy
- name: Hyperopt
run: |
cp config_examples/config_bittrex.example.json config.json
cp tests/testdata/config.tests.json config.json
freqtrade create-userdir --userdir user_data
freqtrade hyperopt --datadir tests/testdata -e 5 --strategy SampleStrategy --hyperopt-loss SharpeHyperOptLossDaily --print-all
- name: Run Ruff
run: |
ruff check --format=github .
ruff check --output-format=github .
- name: Mypy
run: |
@@ -301,13 +302,13 @@ jobs:
details: Test Failed
webhookUrl: ${{ secrets.DISCORD_WEBHOOK }}
mypy_version_check:
mypy-version-check:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: "3.10"
@@ -319,24 +320,24 @@ jobs:
pre-commit:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
- uses: actions/setup-python@v5
with:
python-version: "3.10"
- uses: pre-commit/action@v3.0.0
docs_check:
docs-check:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Documentation syntax
run: |
./tests/test_docs.sh
- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: "3.11"
@@ -359,12 +360,12 @@ jobs:
# Run pytest with "live" checks
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: "3.9"
python-version: "3.11"
- name: Cache_dependencies
uses: actions/cache@v3
@@ -375,7 +376,6 @@ jobs:
- name: pip cache (linux)
uses: actions/cache@v3
if: runner.os == 'Linux'
with:
path: ~/.cache/pip
key: test-${{ matrix.os }}-${{ matrix.python-version }}-pip
@@ -386,7 +386,6 @@ jobs:
cd build_helpers && ./install_ta-lib.sh ${HOME}/dependencies/; cd ..
- name: Installation - *nix
if: runner.os == 'Linux'
run: |
python -m pip install --upgrade pip wheel
export LD_LIBRARY_PATH=${HOME}/dependencies/lib:$LD_LIBRARY_PATH
@@ -399,17 +398,17 @@ jobs:
env:
CI_WEB_PROXY: http://152.67.78.211:13128
run: |
pytest --random-order --cov=freqtrade --cov-config=.coveragerc --longrun
pytest --random-order --longrun --durations 20 -n auto --dist loadscope
# Notify only once - when CI completes (and after deploy) in case it's successfull
notify-complete:
needs: [
build_linux,
build_macos,
build_windows,
docs_check,
mypy_version_check,
build-macos,
build-windows,
docs-check,
mypy-version-check,
pre-commit,
build_linux_online
]
@@ -436,45 +435,80 @@ jobs:
details: Test Completed!
webhookUrl: ${{ secrets.DISCORD_WEBHOOK }}
deploy:
needs: [ build_linux, build_macos, build_windows, docs_check, mypy_version_check, pre-commit ]
build:
name: "Build"
needs: [ build_linux, build-macos, build-windows, docs-check, mypy-version-check, pre-commit ]
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Build distribution
run: |
pip install -U build
python -m build --sdist --wheel
- name: Upload artifacts 📦
uses: actions/upload-artifact@v4
with:
name: freqtrade-build
path: |
dist
retention-days: 10
deploy-pypi:
name: "Deploy to PyPI"
needs: [ build ]
runs-on: ubuntu-22.04
if: (github.event_name == 'release')
environment:
name: release
url: https://pypi.org/p/freqtrade
permissions:
id-token: write
steps:
- uses: actions/checkout@v4
- name: Download artifact 📦
uses: actions/download-artifact@v4
with:
name: freqtrade-build
path: dist
- name: Publish to PyPI (Test)
uses: pypa/gh-action-pypi-publish@v1.8.11
with:
repository-url: https://test.pypi.org/legacy/
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@v1.8.11
deploy-docker:
needs: [ build_linux, build-macos, build-windows, docs-check, mypy-version-check, pre-commit ]
runs-on: ubuntu-22.04
if: (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'release') && github.repository == 'freqtrade/freqtrade'
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: "3.9"
python-version: "3.11"
- name: Extract branch name
shell: bash
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF##*/})"
id: extract_branch
- name: Build distribution
run: |
pip install -U setuptools wheel
python setup.py sdist bdist_wheel
- name: Publish to PyPI (Test)
uses: pypa/gh-action-pypi-publish@v1.8.10
if: (github.event_name == 'release')
with:
user: __token__
password: ${{ secrets.pypi_test_password }}
repository_url: https://test.pypi.org/legacy/
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@v1.8.10
if: (github.event_name == 'release')
with:
user: __token__
password: ${{ secrets.pypi_password }}
- name: Dockerhub login
env:
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
@@ -506,16 +540,17 @@ jobs:
run: |
build_helpers/publish_docker_multi.sh
deploy_arm:
deploy-arm:
name: "Deploy Docker"
permissions:
packages: write
needs: [ deploy ]
needs: [ deploy-docker ]
# Only run on 64bit machines
runs-on: [self-hosted, linux, ARM64]
if: (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'release') && github.repository == 'freqtrade/freqtrade'
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Extract branch name
shell: bash
+1 -1
View File
@@ -8,7 +8,7 @@ jobs:
dockerHubDescription:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Docker Hub Description
uses: peter-evans/dockerhub-description@v3
env:
+44
View File
@@ -0,0 +1,44 @@
name: Pre-commit auto-update
on:
# every day at midnight
schedule:
- cron: "0 3 * * 2"
# on demand
workflow_dispatch:
permissions:
contents: read
jobs:
auto-update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install pre-commit
run: pip install pre-commit
- name: Run auto-update
run: pre-commit autoupdate
- name: Run pre-commit
run: pre-commit run --all-files
- uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.REPO_SCOPED_TOKEN }}
add-paths: .pre-commit-config.yaml
labels: |
Tech maintenance
branch: update/pre-commit-hooks
title: Update pre-commit hooks
commit-message: "chore: update pre-commit hooks"
committer: Freqtrade Bot <noreply@github.com>
body: Update versions of pre-commit hooks to latest version.
delete-branch: true
+3 -1
View File
@@ -83,6 +83,9 @@ instance/
# Scrapy stuff:
.scrapy
# memray
memray-*
# Sphinx documentation
docs/_build/
# Mkdocs documentation
@@ -108,7 +111,6 @@ target/
#exceptions
!*.gitkeep
!config_examples/config_binance.example.json
!config_examples/config_bittrex.example.json
!config_examples/config_full.example.json
!config_examples/config_kraken.example.json
!config_examples/config_freqai.example.json
+9 -8
View File
@@ -2,27 +2,28 @@
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pycqa/flake8
rev: "6.0.0"
rev: "6.1.0"
hooks:
- id: flake8
additional_dependencies: [Flake8-pyproject]
# stages: [push]
- repo: https://github.com/pre-commit/mirrors-mypy
rev: "v1.5.0"
rev: "v1.8.0"
hooks:
- id: mypy
exclude: build_helpers
additional_dependencies:
- types-cachetools==5.3.0.6
- types-cachetools==5.3.0.7
- types-filelock==3.2.7
- types-requests==2.31.0.2
- types-requests==2.31.0.10
- types-tabulate==0.9.0.3
- types-python-dateutil==2.8.19.14
- SQLAlchemy==2.0.20
- SQLAlchemy==2.0.23
# stages: [push]
- repo: https://github.com/pycqa/isort
rev: "5.12.0"
rev: "5.13.2"
hooks:
- id: isort
name: isort (python)
@@ -30,12 +31,12 @@ repos:
- repo: https://github.com/charliermarsh/ruff-pre-commit
# Ruff version.
rev: 'v0.0.270'
rev: 'v0.1.9'
hooks:
- id: ruff
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
rev: v4.5.0
hooks:
- id: end-of-file-fixer
exclude: |
+1 -1
View File
@@ -125,7 +125,7 @@ Exceptions:
Contributors may be given commit privileges. Preference will be given to those with:
1. Past contributions to Freqtrade and other related open-source projects. Contributions to Freqtrade include both code (both accepted and pending) and friendly participation in the issue tracker and Pull request reviews. Quantity and quality are considered.
1. Past contributions to Freqtrade and other related open-source projects. Contributions to Freqtrade include both code (both accepted and pending) and friendly participation in the issue tracker and Pull request reviews. Both quantity and quality are considered.
1. A coding style that the other core committers find simple, minimal, and clean.
1. Access to resources for cross-platform development and testing.
1. Time to devote to the project regularly.
+1 -1
View File
@@ -1,4 +1,4 @@
FROM python:3.11.4-slim-bullseye as base
FROM python:3.11.6-slim-bookworm as base
# Setup env
ENV LANG C.UTF-8
+2
View File
@@ -5,3 +5,5 @@ recursive-include freqtrade/templates/ *.j2 *.ipynb
include freqtrade/exchange/binance_leverage_tiers.json
include freqtrade/rpc/api_server/ui/fallback_file.html
include freqtrade/rpc/api_server/ui/favicon.ico
prune tests
+3 -3
View File
@@ -28,7 +28,7 @@ hesitate to read the source code and understand the mechanism of this bot.
Please read the [exchange specific notes](docs/exchanges.md) to learn about eventual, special configurations needed for each exchange.
- [X] [Binance](https://www.binance.com/)
- [X] [Bittrex](https://bittrex.com/)
- [X] [Bitmart](https://bitmart.com/)
- [X] [Gate.io](https://www.gate.io/ref/6266643)
- [X] [Huobi](http://huobi.com/)
- [X] [Kraken](https://kraken.com/)
@@ -59,7 +59,7 @@ Please find the complete documentation on the [freqtrade website](https://www.fr
## Features
- [x] **Based on Python 3.8+**: For botting on any operating system - Windows, macOS and Linux.
- [x] **Based on Python 3.9+**: For botting on any operating system - Windows, macOS and Linux.
- [x] **Persistence**: Persistence is achieved through sqlite.
- [x] **Dry-run**: Run the bot without paying money.
- [x] **Backtesting**: Run a simulation of your buy/sell strategy.
@@ -207,7 +207,7 @@ To run this bot we recommend you a cloud instance with a minimum of:
### Software requirements
- [Python >= 3.8](http://docs.python-guide.org/en/latest/starting/installation/)
- [Python >= 3.9](http://docs.python-guide.org/en/latest/starting/installation/)
- [pip](https://pip.pypa.io/en/stable/installing/)
- [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
- [TA-Lib](https://ta-lib.github.io/ta-lib-python/)
Binary file not shown.
+1 -1
View File
@@ -54,7 +54,7 @@ docker tag freqtrade:$TAG_FREQAI_ARM ${CACHE_IMAGE}:$TAG_FREQAI_ARM
docker tag freqtrade:$TAG_FREQAI_RL_ARM ${CACHE_IMAGE}:$TAG_FREQAI_RL_ARM
# Run backtest
docker run --rm -v $(pwd)/config_examples/config_bittrex.example.json:/freqtrade/config.json:ro -v $(pwd)/tests:/tests freqtrade:${TAG_ARM} backtesting --datadir /tests/testdata --strategy-path /tests/strategy/strats/ --strategy StrategyTestV3
docker run --rm -v $(pwd)/tests/testdata/config.tests.json:/freqtrade/config.json:ro -v $(pwd)/tests:/tests freqtrade:${TAG_ARM} backtesting --datadir /tests/testdata --strategy-path /tests/strategy/strats/ --strategy StrategyTestV3
if [ $? -ne 0 ]; then
echo "failed running backtest"
+1 -1
View File
@@ -67,7 +67,7 @@ docker tag freqtrade:$TAG_FREQAI ${CACHE_IMAGE}:$TAG_FREQAI
docker tag freqtrade:$TAG_FREQAI_RL ${CACHE_IMAGE}:$TAG_FREQAI_RL
# Run backtest
docker run --rm -v $(pwd)/config_examples/config_bittrex.example.json:/freqtrade/config.json:ro -v $(pwd)/tests:/tests freqtrade:${TAG} backtesting --datadir /tests/testdata --strategy-path /tests/strategy/strats/ --strategy StrategyTestV3
docker run --rm -v $(pwd)/tests/testdata/config.tests.json:/freqtrade/config.json:ro -v $(pwd)/tests:/tests freqtrade:${TAG} backtesting --datadir /tests/testdata --strategy-path /tests/strategy/strats/ --strategy StrategyTestV3
if [ $? -ne 0 ]; then
echo "failed running backtest"
+16 -16
View File
@@ -1,6 +1,6 @@
{
"max_open_trades": 3,
"stake_currency": "BTC",
"stake_currency": "USDT",
"stake_amount": 0.05,
"tradable_balance_ratio": 0.99,
"fiat_display_currency": "USD",
@@ -36,21 +36,21 @@
"ccxt_async_config": {
},
"pair_whitelist": [
"ALGO/BTC",
"ATOM/BTC",
"BAT/BTC",
"BCH/BTC",
"BRD/BTC",
"EOS/BTC",
"ETH/BTC",
"IOTA/BTC",
"LINK/BTC",
"LTC/BTC",
"NEO/BTC",
"NXS/BTC",
"XMR/BTC",
"XRP/BTC",
"XTZ/BTC"
"ALGO/USDT",
"ATOM/USDT",
"BAT/USDT",
"BCH/USDT",
"BRD/USDT",
"EOS/USDT",
"ETH/USDT",
"IOTA/USDT",
"LINK/USDT",
"LTC/USDT",
"NEO/USDT",
"NXS/USDT",
"XMR/USDT",
"XRP/USDT",
"XTZ/USDT"
],
"pair_blacklist": [
"BNB/.*"
+1
View File
@@ -70,6 +70,7 @@
},
"pairlists": [
{"method": "StaticPairList"},
{"method": "FullTradesFilter"},
{
"method": "VolumePairList",
"number_assets": 20,
+5 -7
View File
@@ -1,4 +1,4 @@
FROM python:3.9.16-slim-bullseye as base
FROM python:3.11.6-slim-bookworm as base
# Setup env
ENV LANG C.UTF-8
@@ -11,12 +11,13 @@ ENV FT_APP_ENV="docker"
# Prepare environment
RUN mkdir /freqtrade \
&& apt-get update \
&& apt-get -y install sudo libatlas3-base curl sqlite3 libhdf5-dev libutf8proc-dev libsnappy-dev \
&& apt-get -y install sudo libatlas3-base libopenblas-dev curl sqlite3 libhdf5-dev libutf8proc-dev libsnappy-dev \
&& apt-get clean \
&& useradd -u 1000 -G sudo -U -m ftuser \
&& chown ftuser:ftuser /freqtrade \
# Allow sudoers
&& echo "ftuser ALL=(ALL) NOPASSWD: /bin/chown" >> /etc/sudoers
&& echo "ftuser ALL=(ALL) NOPASSWD: /bin/chown" >> /etc/sudoers \
&& pip install --upgrade pip
WORKDIR /freqtrade
@@ -25,19 +26,16 @@ FROM base as python-deps
RUN apt-get update \
&& apt-get -y install build-essential libssl-dev libffi-dev libgfortran5 pkg-config cmake gcc \
&& apt-get clean \
&& pip install --upgrade pip \
&& echo "[global]\nextra-index-url=https://www.piwheels.org/simple" > /etc/pip.conf
# Install TA-lib
COPY build_helpers/* /tmp/
RUN cd /tmp && /tmp/install_ta-lib.sh && rm -r /tmp/*ta-lib*
ENV LD_LIBRARY_PATH /usr/local/lib
# Install dependencies
COPY --chown=ftuser:ftuser requirements.txt /freqtrade/
USER ftuser
RUN pip install --user --no-cache-dir numpy \
&& pip install --user /tmp/pyarrow-*.whl \
&& pip install --user --no-index --find-links /tmp/ pyarrow TA-Lib==0.4.28 \
&& pip install --user --no-cache-dir -r requirements.txt
# Copy dependencies to runtime-image
+6 -6
View File
@@ -31,9 +31,9 @@ optional arguments:
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--timerange TIMERANGE
Specify what timerange of data to use.
--data-format-ohlcv {json,jsongz,hdf5}
--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}
Storage format for downloaded candle (OHLCV) data.
(default: `json`).
(default: `feather`).
--max-open-trades INT
Override the value of the `max_open_trades`
configuration setting.
@@ -170,11 +170,11 @@ freqtrade backtesting --strategy AwesomeStrategy --dry-run-wallet 1000
Using a different on-disk historical candle (OHLCV) data source
Assume you downloaded the history data from the Bittrex exchange and kept it in the `user_data/data/bittrex-20180101` directory.
Assume you downloaded the history data from the Binance exchange and kept it in the `user_data/data/binance-20180101` directory.
You can then use this data for backtesting as follows:
```bash
freqtrade backtesting --strategy AwesomeStrategy --datadir user_data/data/bittrex-20180101
freqtrade backtesting --strategy AwesomeStrategy --datadir user_data/data/binance-20180101
```
---
@@ -618,13 +618,13 @@ To compare multiple strategies, a list of Strategies can be provided to backtest
This is limited to 1 timeframe value per run. However, data is only loaded once from disk so if you have multiple
strategies you'd like to compare, this will give a nice runtime boost.
All listed Strategies need to be in the same directory.
All listed Strategies need to be in the same directory, unless also `--recursive-strategy-search` is specified, where sub-directories within the strategy directory are also considered.
``` bash
freqtrade backtesting --timerange 20180401-20180410 --timeframe 5m --strategy-list Strategy001 Strategy002 --export trades
```
This will save the results to `user_data/backtest_results/backtest-result-<strategy>.json`, injecting the strategy-name into the target filename.
This will save the results to `user_data/backtest_results/backtest-result-<datetime>.json`, including results for both `Strategy001` and `Strategy002`.
There will be an additional table comparing win/losses of the different strategies (identical to the "Total" row in the first table).
Detailed output for all strategies one after the other will be available, so make sure to scroll up to see the details per strategy.
+5 -4
View File
@@ -177,7 +177,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi
| `exit_pricing.order_book_top` | Bot will use the top N rate in Order Book "price_side" to exit. I.e. a value of 2 will allow the bot to pick the 2nd ask rate in [Order Book Exit](#exit-price-with-orderbook-enabled)<br>*Defaults to `1`.* <br> **Datatype:** Positive Integer
| `custom_price_max_distance_ratio` | Configure maximum distance ratio between current and custom entry or exit price. <br>*Defaults to `0.02` 2%).*<br> **Datatype:** Positive float
| | **TODO**
| `use_exit_signal` | Use exit signals produced by the strategy in addition to the `minimal_roi`. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `true`.* <br> **Datatype:** Boolean
| `use_exit_signal` | Use exit signals produced by the strategy in addition to the `minimal_roi`. <br>Setting this to false disables the usage of `"exit_long"` and `"exit_short"` columns. Has no influence on other exit methods (Stoploss, ROI, callbacks). [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `true`.* <br> **Datatype:** Boolean
| `exit_profit_only` | Wait until the bot reaches `exit_profit_offset` before taking an exit decision. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `false`.* <br> **Datatype:** Boolean
| `exit_profit_offset` | Exit-signal is only active above this value. Only active in combination with `exit_profit_only=True`. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `0.0`.* <br> **Datatype:** Float (as ratio)
| `ignore_roi_if_entry_signal` | Do not exit if the entry signal is still active. This setting takes preference over `minimal_roi` and `use_exit_signal`. [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `false`.* <br> **Datatype:** Boolean
@@ -321,7 +321,7 @@ For example, if you have 10 ETH available in your wallet on the exchange and `tr
To fully utilize compounding profits when using multiple bots on the same exchange account, you'll want to limit each bot to a certain starting balance.
This can be accomplished by setting `available_capital` to the desired starting balance.
Assuming your account has 10.000 USDT and you want to run 2 different strategies on this exchange.
Assuming your account has 10000 USDT and you want to run 2 different strategies on this exchange.
You'd set `available_capital=5000` - granting each bot an initial capital of 5000 USDT.
The bot will then split this starting balance equally into `max_open_trades` buckets.
Profitable trades will result in increased stake-sizes for this bot - without affecting the stake-sizes of the other bot.
@@ -594,7 +594,7 @@ creating trades on the exchange.
```json
"exchange": {
"name": "bittrex",
"name": "binance",
"key": "key",
"secret": "secret",
...
@@ -613,6 +613,7 @@ Once you will be happy with your bot performance running in the Dry-run mode, yo
* Orders are simulated, and will not be posted to the exchange.
* Market orders fill based on orderbook volume the moment the order is placed.
* Limit orders fill once the price reaches the defined level - or time out based on `unfilledtimeout` settings.
* Limit orders will be converted to market orders if they cross the price by more than 1%.
* In combination with `stoploss_on_exchange`, the stop_loss price is assumed to be filled.
* Open orders (not trades, which are stored in the database) are kept open after bot restarts, with the assumption that they were not filled while being offline.
@@ -643,7 +644,7 @@ API Keys are usually only required for live trading (trading for real money, bot
```json
{
"exchange": {
"name": "bittrex",
"name": "binance",
"key": "af8ddd35195e9dc500b9a6f799f6f5c93d89193b",
"secret": "08a9dc6db3d7b53e1acebd9275677f4b0a04f1a5",
//"password": "", // Optional, not needed by all exchanges)
+1 -1
View File
@@ -10,7 +10,7 @@ You can run this server using the following command: `docker compose -f docker/d
This will create a dockercontainer running jupyter lab, which will be accessible using `https://127.0.0.1:8888/lab`.
Please use the link that's printed in the console after startup for simplified login.
For more information, Please visit the [Data analysis with Docker](docker_quickstart.md#data-analayis-using-docker-compose) section.
For more information, Please visit the [Data analysis with Docker](docker_quickstart.md#data-analysis-using-docker-compose) section.
### Pro tips
+4 -4
View File
@@ -154,13 +154,13 @@ freqtrade download-data --exchange binance --pairs ETH/USDT XRP/USDT BTC/USDT --
Freqtrade currently supports the following data-formats:
* `feather` - a dataformat based on Apache Arrow
* `json` - plain "text" json files
* `jsongz` - a gzip-zipped version of json files
* `hdf5` - a high performance datastore
* `feather` - a dataformat based on Apache Arrow
* `parquet` - columnar datastore (OHLCV only)
By default, OHLCV data is stored as `json` data, while trades data is stored as `jsongz` data.
By default, both OHLCV data and trades data are stored in the `feather` format.
This can be changed via the `--data-format-ohlcv` and `--data-format-trades` command line arguments respectively.
To persist this change, you should also add the following snippet to your configuration, so you don't have to insert the above arguments each time:
@@ -203,15 +203,15 @@ time freqtrade list-data --show-timerange --data-format-ohlcv <dataformat>
| Format | Size | timing |
|------------|-------------|-------------|
| `feather` | 72Mb | 3.5s |
| `json` | 149Mb | 25.6s |
| `jsongz` | 39Mb | 27s |
| `hdf5` | 145Mb | 3.9s |
| `feather` | 72Mb | 3.5s |
| `parquet` | 83Mb | 3.8s |
Size has been taken from the BTC/USDT 1m spot combination for the timerange specified above.
To have a best performance/size mix, we recommend the use of either feather or parquet.
To have a best performance/size mix, we recommend using the default feather format, or parquet.
### Pairs file
+5 -4
View File
@@ -318,6 +318,7 @@ Additional tests / steps to complete:
* Check if balance shows correctly (*)
* Create market order (*)
* Create limit order (*)
* Cancel order (*)
* Complete trade (enter + exit) (*)
* Compare result calculation between exchange and bot
* Ensure fees are applied correctly (check the database against the exchange)
@@ -418,6 +419,9 @@ This part of the documentation is aimed at maintainers, and shows how to create
### Create release branch
!!! Note
Make sure that the `stable` branch is up-to-date!
First, pick a commit that's about one week old (to not include latest additions to releases).
``` bash
@@ -430,14 +434,11 @@ Determine if crucial bugfixes have been made between this commit and the current
* Merge the release branch (stable) into this branch.
* Edit `freqtrade/__init__.py` and add the version matching the current date (for example `2019.7` for July 2019). Minor versions can be `2019.7.1` should we need to do a second release that month. Version numbers must follow allowed versions from PEP0440 to avoid failures pushing to pypi.
* Commit this part.
* push that branch to the remote and create a PR against the stable branch.
* Push that branch to the remote and create a PR against the **stable branch**.
* Update develop version to next version following the pattern `2019.8-dev`.
### Create changelog from git commits
!!! Note
Make sure that the `stable` branch is up-to-date!
``` bash
# Needs to be done before merging / pulling that branch.
git log --oneline --no-decorate --no-merges stable..new_release
+4
View File
@@ -2,6 +2,10 @@
The `Edge Positioning` module uses probability to calculate your win rate and risk reward ratio. It will use these statistics to control your strategy trade entry points, position size and, stoploss.
!!! Danger "Deprecated functionality"
`Edge positioning` (or short Edge) is currently in maintenance mode only (we keep existing functionality alive) and should be considered as deprecated.
It will currently not receive new features until either someone stepped forward to take up ownership of that module - or we'll decide to remove edge from freqtrade.
!!! Warning
When using `Edge positioning` with a dynamic whitelist (VolumePairList), make sure to also use `AgeFilter` and set it to at least `calculate_since_number_of_days` to avoid problems with missing data.
+53 -49
View File
@@ -55,7 +55,7 @@ This configuration enables kraken, as well as rate-limiting to avoid bans from t
## Binance
!!! Warning "Server location and geo-ip restrictions"
Please be aware that binance restrict api access regarding the server country. The currents and non exhaustive countries blocked are United States, Malaysia (Singapour), Ontario (Canada). Please go to [binance terms > b. Eligibility](https://www.binance.com/en/terms) to find up to date list.
Please be aware that Binance restricts API access regarding the server country. The current and non-exhaustive countries blocked are Canada, Malaysia, Netherlands and United States. Please go to [binance terms > b. Eligibility](https://www.binance.com/en/terms) to find up to date list.
Binance supports [time_in_force](configuration.md#understand-order_time_in_force).
@@ -136,13 +136,41 @@ Freqtrade will not attempt to change these settings.
The Kraken API does only provide 720 historic candles, which is sufficient for Freqtrade dry-run and live trade modes, but is a problem for backtesting.
To download data for the Kraken exchange, using `--dl-trades` is mandatory, otherwise the bot will download the same 720 candles over and over, and you'll not have enough backtest data.
Due to the heavy rate-limiting applied by Kraken, the following configuration section should be used to download data:
To speed up downloading, you can download the [trades zip files](https://support.kraken.com/hc/en-us/articles/360047543791-Downloadable-historical-market-data-time-and-sales-) kraken provides.
These are usually updated once per quarter. Freqtrade expects these files to be placed in `user_data/data/kraken/trades_csv`.
``` json
"ccxt_async_config": {
"enableRateLimit": true,
"rateLimit": 3100
},
A structure as follows can make sense if using incremental files, with the "full" history in one directory, and incremental files in different directories.
The assumption for this mode is that the data is downloaded and unzipped keeping filenames as they are.
Duplicate content will be ignored (based on timestamp) - though the assumption is that there is no gap in the data.
This means, if your "full" history ends in Q4 2022 - then both incremental updates Q1 2023 and Q2 2023 are available.
Not having this will lead to incomplete data, and therefore invalid results while using the data.
```
└── trades_csv
    ├── Kraken_full_history
   │   ├── BCHEUR.csv
   │   └── XBTEUR.csv
   ├── Kraken_Trading_History_Q1_2023
   │   ├── BCHEUR.csv
   │   └── XBTEUR.csv
   └── Kraken_Trading_History_Q2_2023
      ├── BCHEUR.csv
      └── XBTEUR.csv
```
You can convert these files into freqtrade files:
``` bash
freqtrade convert-trade-data --exchange kraken --format-from kraken_csv --format-to feather
# Convert trade data to different ohlcv timeframes
freqtrade trades-to-ohlcv -p BTC/EUR BCH/EUR --exchange kraken -t 1m 5m 15m 1h
```
The converted data also makes downloading data possible, and will start the download after the latest loaded trade.
``` bash
freqtrade download-data --exchange kraken --dl-trades -p BTC/EUR BCH/EUR
```
!!! Warning "Downloading data from kraken"
@@ -153,48 +181,6 @@ Due to the heavy rate-limiting applied by Kraken, the following configuration se
Please pay attention that rateLimit configuration entry holds delay in milliseconds between requests, NOT requests\sec rate.
So, in order to mitigate Kraken API "Rate limit exceeded" exception, this configuration should be increased, NOT decreased.
## Bittrex
### Order types
Bittrex does not support market orders. If you have a message at the bot startup about this, you should change order type values set in your configuration and/or in the strategy from `"market"` to `"limit"`. See some more details on this [here in the FAQ](faq.md#im-getting-the-exchange-bittrex-does-not-support-market-orders-message-and-cannot-run-my-strategy).
Bittrex also does not support `VolumePairlist` due to limited / split API constellation at the moment.
Please use `StaticPairlist`. Other pairlists (other than `VolumePairlist`) should not be affected.
### Volume pairlist
Bittrex does not support the direct usage of VolumePairList. This can however be worked around by using the advanced mode with `lookback_days: 1` (or more), which will emulate 24h volume.
Read more in the [pairlist documentation](plugins.md#volumepairlist-advanced-mode).
### Restricted markets
Bittrex split its exchange into US and International versions.
The International version has more pairs available, however the API always returns all pairs, so there is currently no automated way to detect if you're affected by the restriction.
If you have restricted pairs in your whitelist, you'll get a warning message in the log on Freqtrade startup for each restricted pair.
The warning message will look similar to the following:
``` output
[...] Message: bittrex {"success":false,"message":"RESTRICTED_MARKET","result":null,"explanation":null}"
```
If you're an "International" customer on the Bittrex exchange, then this warning will probably not impact you.
If you're a US customer, the bot will fail to create orders for these pairs, and you should remove them from your whitelist.
You can get a list of restricted markets by using the following snippet:
``` python
import ccxt
ct = ccxt.bittrex()
lm = ct.load_markets()
res = [p for p, x in lm.items() if 'US' in x['info']['prohibitedIn']]
print(res)
```
## Kucoin
Kucoin requires a passphrase for each api key, you will therefore need to add this key into the configuration so your exchange section looks as follows:
@@ -274,6 +260,24 @@ We do strongly recommend to limit all API keys to the IP you're going to use it
Bybit (futures only) supports `stoploss_on_exchange` and uses `stop-loss-limit` orders. It provides great advantages, so we recommend to benefit from it by enabling stoploss on exchange.
On futures, Bybit supports both `stop-limit` as well as `stop-market` orders. You can use either `"limit"` or `"market"` in the `order_types.stoploss` configuration setting to decide which type to use.
## Bitmart
Bitmart requires the API key Memo (the name you give the API key) to go along with the exchange key and secret.
It's therefore required to pass the UID as well.
```json
"exchange": {
"name": "bitmart",
"uid": "your_bitmart_api_key_memo",
"secret": "your_exchange_secret",
"password": "your_exchange_api_key_password",
// ...
}
```
!!! Warning "Necessary Verification"
Bitmart requires Verification Lvl2 to successfully trade on the spot market through the API - even though trading via UI works just fine with just Lvl1 verification.
## All exchanges
Should you experience constant errors with Nonce (like `InvalidNonce`), it is best to regenerate the API keys. Resetting Nonce is difficult and it's usually easier to regenerate the API keys.
+1 -7
View File
@@ -128,15 +128,9 @@ This warning can point to one of the below problems:
* Barely traded pair -> Check the pair on the exchange webpage, look at the timeframe your strategy uses. If the pair does not have any volume in some candles (usually visualized with a "volume 0" bar, and a "_" as candle), this pair did not have any trades in this timeframe. These pairs should ideally be avoided, as they can cause problems with order-filling.
* API problem -> API returns wrong data (this only here for completeness, and should not happen with supported exchanges).
### I'm getting the "RESTRICTED_MARKET" message in the log
Currently known to happen for US Bittrex users.
Read [the Bittrex section about restricted markets](exchanges.md#restricted-markets) for more information.
### I'm getting the "Exchange XXX does not support market orders." message and cannot run my strategy
As the message says, your exchange does not support market orders and you have one of the [order types](configuration.md/#understand-order_types) set to "market". Your strategy was probably written with other exchanges in mind and sets "market" orders for "stoploss" orders, which is correct and preferable for most of the exchanges supporting market orders (but not for Bittrex and Gate.io).
As the message says, your exchange does not support market orders and you have one of the [order types](configuration.md/#understand-order_types) set to "market". Your strategy was probably written with other exchanges in mind and sets "market" orders for "stoploss" orders, which is correct and preferable for most of the exchanges supporting market orders (but not for Gate.io).
To fix this, redefine order types in the strategy to use "limit" instead of "market":
+2 -2
View File
@@ -7,7 +7,7 @@ Low level feature engineering is performed in the user strategy within a set of
| Function | Description |
|---------------|-------------|
| `feature_engineering_expand_all()` | This optional function will automatically expand the defined features on the config defined `indicator_periods_candles`, `include_timeframes`, `include_shifted_candles`, and `include_corr_pairs`.
| `feature_engineering_expand_basic()` | This optional function will automatically expand the defined features on the config defined `include_timeframes`, `include_shifted_candles`, and `include_corr_pairs`. Note: this function does *not* expand across `include_periods_candles`.
| `feature_engineering_expand_basic()` | This optional function will automatically expand the defined features on the config defined `include_timeframes`, `include_shifted_candles`, and `include_corr_pairs`. Note: this function does *not* expand across `indicator_periods_candles`.
| `feature_engineering_standard()` | This optional function will be called once with the dataframe of the base timeframe. This is the final function to be called, which means that the dataframe entering this function will contain all the features and columns from the base asset created by the other `feature_engineering_expand` functions. This function is a good place to do custom exotic feature extractions (e.g. tsfresh). This function is also a good place for any feature that should not be auto-expanded upon (e.g., day of the week).
| `set_freqai_targets()` | Required function to set the targets for the model. All targets must be prepended with `&` to be recognized by the FreqAI internals.
@@ -178,7 +178,7 @@ You can ask for each of the defined features to be included also for informative
`include_shifted_candles` indicates the number of previous candles to include in the feature set. For example, `include_shifted_candles: 2` tells FreqAI to include the past 2 candles for each of the features in the feature set.
In total, the number of features the user of the presented example strat has created is: length of `include_timeframes` * no. features in `feature_engineering_expand_*()` * length of `include_corr_pairlist` * no. `include_shifted_candles` * length of `indicator_periods_candles`
In total, the number of features the user of the presented example strategy has created is: length of `include_timeframes` * no. features in `feature_engineering_expand_*()` * length of `include_corr_pairlist` * no. `include_shifted_candles` * length of `indicator_periods_candles`
$= 3 * 3 * 3 * 2 * 2 = 108$.
!!! note "Learn more about creative feature engineering"
-1
View File
@@ -74,7 +74,6 @@ Mandatory parameters are marked as **Required** and have to be set in one of the
| | **Reinforcement Learning Parameters within the `freqai.rl_config` sub dictionary**
| `rl_config` | A dictionary containing the control parameters for a Reinforcement Learning model. <br> **Datatype:** Dictionary.
| `train_cycles` | Training time steps will be set based on the `train_cycles * number of training data points. <br> **Datatype:** Integer.
| `cpu_count` | Number of processors to dedicate to the Reinforcement Learning training process. <br> **Datatype:** int.
| `max_trade_duration_candles`| Guides the agent training to keep trades below desired length. Example usage shown in `prediction_models/ReinforcementLearner.py` within the customizable `calculate_reward()` function. <br> **Datatype:** int.
| `model_type` | Model string from stable_baselines3 or SBcontrib. Available strings include: `'TRPO', 'ARS', 'RecurrentPPO', 'MaskablePPO', 'PPO', 'A2C', 'DQN'`. User should ensure that `model_training_parameters` match those available to the corresponding stable_baselines3 model by visiting their documentaiton. [PPO doc](https://stable-baselines3.readthedocs.io/en/master/modules/ppo.html) (external website) <br> **Datatype:** string.
| `policy_type` | One of the available policy types from stable_baselines3 <br> **Datatype:** string.
+1 -2
View File
@@ -237,11 +237,10 @@ class MyCoolRLModel(ReinforcementLearner):
Reinforcement Learning models benefit from tracking training metrics. FreqAI has integrated Tensorboard to allow users to track training and evaluation performance across all coins and across all retrainings. Tensorboard is activated via the following command:
```bash
cd freqtrade
tensorboard --logdir user_data/models/unique-id
```
where `unique-id` is the `identifier` set in the `freqai` configuration file. This command must be run in a separate shell to view the output in their browser at 127.0.0.1:6006 (6006 is the default port used by Tensorboard).
where `unique-id` is the `identifier` set in the `freqai` configuration file. This command must be run in a separate shell to view the output in the browser at 127.0.0.1:6006 (6006 is the default port used by Tensorboard).
![tensorboard](assets/tensorboard.jpg)
+9 -5
View File
@@ -337,11 +337,15 @@ There are four parameter types each suited for different purposes.
* `CategoricalParameter` - defines a parameter with a predetermined number of choices.
* `BooleanParameter` - Shorthand for `CategoricalParameter([True, False])` - great for "enable" parameters.
!!! Tip "Disabling parameter optimization"
Each parameter takes two boolean parameters:
* `load` - when set to `False` it will not load values configured in `buy_params` and `sell_params`.
* `optimize` - when set to `False` parameter will not be included in optimization process.
Use these parameters to quickly prototype various ideas.
### Parameter options
There are two parameter options that can help you to quickly test various ideas:
* `optimize` - when set to `False`, the parameter will not be included in optimization process. (Default: True)
* `load` - when set to `False`, results of a previous hyperopt run (in `buy_params` and `sell_params` either in your strategy or the JSON output file) will not be used as the starting value for subsequent hyperopts. The default value specified in the parameter will be used instead. (Default: True)
!!! Tip "Effects of `load=False` on backtesting"
Be aware that setting the `load` option to `False` will mean backtesting will also use the default value specified in the parameter and *not* the value found through hyperoptimisation.
!!! Warning
Hyperoptable parameters cannot be used in `populate_indicators` - as hyperopt does not recalculate indicators for each epoch, so the starting value would be used in this case.
+16 -4
View File
@@ -25,6 +25,7 @@ You may also use something like `.*DOWN/BTC` or `.*UP/BTC` to exclude leveraged
* [`ProducerPairList`](#producerpairlist)
* [`RemotePairList`](#remotepairlist)
* [`AgeFilter`](#agefilter)
* [`FullTradesFilter`](#fulltradesfilter)
* [`OffsetFilter`](#offsetfilter)
* [`PerformanceFilter`](#performancefilter)
* [`PrecisionFilter`](#precisionfilter)
@@ -111,8 +112,8 @@ For convenience `lookback_days` can be specified, which will imply that 1d candl
!!! Warning "Performance implications when using lookback range"
If used in first position in combination with lookback, the computation of the range based volume can be time and resource consuming, as it downloads candles for all tradable pairs. Hence it's highly advised to use the standard approach with `VolumeFilter` to narrow the pairlist down for further range volume calculation.
??? Tip "Unsupported exchanges (Bittrex, Gemini)"
On some exchanges (like Bittrex and Gemini), regular VolumePairList does not work as the api does not natively provide 24h volume. This can be worked around by using candle data to build the volume.
??? Tip "Unsupported exchanges"
On some exchanges (like Gemini), regular VolumePairList does not work as the api does not natively provide 24h volume. This can be worked around by using candle data to build the volume.
To roughly simulate 24h volume, you can use the following configuration.
Please note that These pairlists will only refresh once per day.
@@ -236,6 +237,17 @@ be caught out buying before the pair has finished dropping in price.
This filter allows freqtrade to ignore pairs until they have been listed for at least `min_days_listed` days and listed before `max_days_listed`.
#### FullTradesFilter
Shrink whitelist to consist only in-trade pairs when the trade slots are full (when `max_open_trades` isn't being set to `-1` in the config).
When the trade slots are full, there is no need to calculate indicators of the rest of the pairs (except informative pairs) since no new trade can be opened. By shrinking the whitelist to just the in-trade pairs, you can improve calculation speeds and reduce CPU usage. When a trade slot is free (either a trade is closed or `max_open_trades` value in config is increased), then the whitelist will return to normal state.
When multiple pairlist filters are being used, it's recommended to put this filter at second position directly below the primary pairlist, so when the trade slots are full, the bot doesn't have to download data for the rest of the filters.
!!! Warning "Backtesting"
`FullTradesFilter` does not support backtesting mode.
#### OffsetFilter
Offsets an incoming pairlist by a given `offset` value.
@@ -376,7 +388,7 @@ If the trading range over the last 10 days is <1% or >99%, remove the pair from
"lookback_days": 10,
"min_rate_of_change": 0.01,
"max_rate_of_change": 0.99,
"refresh_period": 1440
"refresh_period": 86400
}
]
```
@@ -431,7 +443,7 @@ The below example blacklists `BNB/BTC`, uses `VolumePairList` with `20` assets,
"method": "RangeStabilityFilter",
"lookback_days": 10,
"min_rate_of_change": 0.01,
"refresh_period": 1440
"refresh_period": 86400
},
{
"method": "VolatilityFilter",
+2 -2
View File
@@ -40,7 +40,7 @@ Freqtrade is a free and open source crypto trading bot written in Python. It is
Please read the [exchange specific notes](exchanges.md) to learn about eventual, special configurations needed for each exchange.
- [X] [Binance](https://www.binance.com/)
- [X] [Bittrex](https://bittrex.com/)
- [X] [Bitmart](https://bitmart.com/)
- [X] [Gate.io](https://www.gate.io/ref/6266643)
- [X] [Huobi](http://huobi.com/)
- [X] [Kraken](https://kraken.com/)
@@ -83,7 +83,7 @@ To run this bot we recommend you a linux cloud instance with a minimum of:
Alternatively
- Python 3.8+
- Python 3.9+
- pip (pip3)
- git
- TA-Lib
+4 -4
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).
!!! Note
Python3.8 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.
Python3.9 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.
!!! Warning "Up-to-date clock"
@@ -42,7 +42,7 @@ These requirements apply to both [Script Installation](#script-installation) and
### Install guide
* [Python >= 3.8.x](http://docs.python-guide.org/en/latest/starting/installation/)
* [Python >= 3.9](http://docs.python-guide.org/en/latest/starting/installation/)
* [pip](https://pip.pypa.io/en/stable/installing/)
* [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
* [virtualenv](https://virtualenv.pypa.io/en/stable/installation.html) (Recommended)
@@ -54,7 +54,7 @@ We've included/collected install instructions for Ubuntu, MacOS, and Windows. Th
OS Specific steps are listed first, the [Common](#common) section below is necessary for all systems.
!!! Note
Python3.8 or higher and the corresponding pip are assumed to be available.
Python3.9 or higher and the corresponding pip are assumed to be available.
=== "Debian/Ubuntu"
#### Install necessary dependencies
@@ -169,7 +169,7 @@ You can as well update, configure and reset the codebase of your bot with `./scr
** --install **
With this option, the script will install the bot and most dependencies:
You will need to have git and python3.8+ installed beforehand for this to work.
You will need to have git and python3.9+ installed beforehand for this to work.
* Mandatory software as: `ta-lib`
* Setup your virtualenv under `.venv/`
+119
View File
@@ -0,0 +1,119 @@
# Recursive analysis
This page explains how to validate your strategy for inaccuracies due to recursive issues with certain indicators.
A recursive formula defines any term of a sequence relative to its preceding term(s). An example of a recursive formula is a<sub>n</sub> = a<sub>n-1</sub> + b.
Why does this matter for Freqtrade? In backtesting, the bot will get full data of the pairs according to the timerange specified. But in a dry/live run, the bot will be limited by the amount of data each exchanges gives.
For example, to calculate a very basic indicator called `steps`, the first row's value is always 0, while the following rows' values are equal to the value of the previous row plus 1. If I were to calculate it using the latest 1000 candles, then the `steps` value of the first row is 0, and the `steps` value at the last closed candle is 999.
What happens if the calculation is using only the latest 500 candles? Then instead of 999, the `steps` value at last closed candle is 499. The difference of the value means your backtest result can differ from your dry/live run result.
The `recursive-analysis` command requires historic data to be available. To learn how to get data for the pairs and exchange you're interested in,
head over to the [Data Downloading](data-download.md) section of the documentation.
This command is built upon preparing different lengths of data and calculates indicators based on them.
This does not backtest the strategy itself, but rather only calculates the indicators. After calculating the indicators of different startup candle values (`startup_candle_count`) are done, the values of last rows across all specified `startup_candle_count` are compared to see how much variance they show compared to the base calculation.
Command settings:
- Use the `-p` option to set your desired pair to analyze. Since we are only looking at indicator values, using more than one pair is redundant. Preferably use a pair with a relatively high price and at least moderate volatility, such as BTC or ETH, to avoid rounding issues that can make the results inaccurate. If no pair is set on the command, the pair used for this analysis is the first pair in the whitelist.
- It is recommended to set a long timerange (at least 5000 candles) so that the initial indicators' calculation that is going to be used as a benchmark has very small or no recursive issues itself. For example, for a 5m timeframe, a timerange of 5000 candles would be equal to 18 days.
- `--cache` is forced to "none" to avoid loading previous indicators calculation automatically.
In addition to the recursive formula check, this command also carries out a simple lookahead bias check on the indicator values only. For a full lookahead check, use [Lookahead-analysis](lookahead-analysis.md).
## Recursive-analysis command reference
```
usage: freqtrade recursive-analysis [-h] [-v] [--logfile FILE] [-V] [-c PATH]
[-d PATH] [--userdir PATH] [-s NAME]
[--strategy-path PATH]
[--recursive-strategy-search]
[--freqaimodel NAME]
[--freqaimodel-path PATH] [-i TIMEFRAME]
[--timerange TIMERANGE]
[--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}]
[-p PAIR]
[--freqai-backtest-live-models]
[--startup-candle STARTUP_CANDLES [STARTUP_CANDLES ...]]
optional arguments:
-h, --help show this help message and exit
-i TIMEFRAME, --timeframe TIMEFRAME
Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}
Storage format for downloaded candle (OHLCV) data.
(default: `feather`).
-p PAIR, --pairs PAIR
Limit command to this pair.
--startup-candle STARTUP_CANDLE [STARTUP_CANDLE ...]
Provide a space-separated list of startup_candle_count to
be checked. Default : `199 399 499 999 1999`.
Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--logfile FILE Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more
details.
-V, --version show program's version number and exit
-c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin.
-d PATH, --datadir PATH
Path to directory with historical backtesting data.
--userdir PATH, --user-data-dir PATH
Path to userdata directory.
Strategy arguments:
-s NAME, --strategy NAME
Specify strategy class name which will be used by the
bot.
--strategy-path PATH Specify additional strategy lookup path.
--timerange TIMERANGE
Specify what timerange of data to use.
```
### Why are odd-numbered default startup candles used?
The default value for startup candles are odd numbers. When the bot fetches candle data from the exchange's API, the last candle is the one being checked by the bot and the rest of the data are the "startup candles".
For example, Binance allows 1000 candles per API call. When the bot receives 1000 candles, the last candle is the "current candle", and the preceding 999 candles are the "startup candles". By setting the startup candle count as 1000 instead of 999, the bot will try to fetch 1001 candles instead. The exchange API will then send candle data in a paginated form, i.e. in case of the Binance API, this will be two groups- one of length 1000 and another of length 1. This results in the bot thinking the strategy needs 1001 candles of data, and so it will download 2000 candles worth of data instead, which means there will be 1 "current candle" and 1999 "startup candles".
Furthermore, exchanges limit the number of consecutive bulk API calls, e.g. Binance allows 5 calls. In this case, only 5000 candles can be downloaded from Binance API without hitting the API rate limit, which means the max `startup_candle_count` you can have is 4999.
Please note that this candle limit may be changed in the future by the exchanges without any prior notice.
### How does the command work?
- Firstly an initial indicator calculation is carried out using the supplied timerange to generate a benchmark for indicator values.
- After setting the benchmark it will then carry out additional runs for each of the different startup candle count values.
- The command will then compare the indicator values at the last candle rows and report the differences in a table.
## Understanding the recursive-analysis output
This is an example of an output results table where at least one indicator has a recursive formula issue:
```
| indicators | 20 | 40 | 80 | 100 | 150 | 300 | 999 |
|--------------+---------+---------+--------+--------+---------+---------+--------|
| rsi_30 | nan% | -6.025% | 0.612% | 0.828% | -0.140% | 0.000% | 0.000% |
| rsi_14 | 24.141% | -0.876% | 0.070% | 0.007% | -0.000% | -0.000% | - |
```
The column headers indicate the different `startup_candle_count` used in the analysis. The values in the table indicate the variance of the calculated indicators compared to the benchmark value.
`nan%` means the value of that indicator cannot be calculated due to lack of data. In this example, you cannot calculate RSI with length 30 with just 21 candles (1 current candle + 20 startup candles).
Users should assess the table per indicator to decide if the specified `startup_candle_count` results in a sufficiently small variance so that the indicator does not have any effect on entries and/or exits.
As such, aiming for absolute zero variance (shown by `-` value) might not be the best option, because some indicators might require you to use such a long `startup_candle_count` to have zero variance.
## Caveats
- `recursive-analysis` will only calculate and compare the indicator values at the last row. The output table reports the percentage differences between the different startup candle count calculations and the original benchmark calculation. Whether it has any actual impact on your entries and exits is not included.
- The ideal scenario is that indicators will have no variance (or at least very close to 0%) despite the startup candle being varied. In reality, indicators such as EMA are using a recursive formula to calculate indicator values, so the goal is not necessarily to have zero percentage variance, but to have the variance low enough (and therefore `startup_candle_count` high enough) that the recursion inherent in the indicator will not have any real impact on trading decisions.
- `recursive-analysis` will only run calculations on `populate_indicators` and `@informative` decorator(s). If you put any indicator calculation on `populate_entry_trend` or `populate_exit_trend`, it won't be calculated.
+4 -4
View File
@@ -1,6 +1,6 @@
markdown==3.4.4
mkdocs==1.5.2
mkdocs-material==9.2.1
markdown==3.5.1
mkdocs==1.5.3
mkdocs-material==9.5.3
mdx_truly_sane_lists==1.3
pymdown-extensions==10.1
pymdown-extensions==10.5
jinja2==3.1.2
+8 -3
View File
@@ -134,13 +134,16 @@ python3 scripts/rest_client.py --config rest_config.json <command> [optional par
| `reload_config` | Reloads the configuration file.
| `trades` | List last trades. Limited to 500 trades per call.
| `trade/<tradeid>` | Get specific trade.
| `trade/<tradeid>` | DELETE - Remove trade from the database. Tries to close open orders. Requires manual handling of this trade on the exchange.
| `trade/<tradeid>/open-order` | DELETE - Cancel open order for this trade.
| `trade/<tradeid>/reload` | GET - Reload a trade from the Exchange. Only works in live, and can potentially help recover a trade that was manually sold on the exchange.
| `trades/<tradeid>` | DELETE - Remove trade from the database. Tries to close open orders. Requires manual handling of this trade on the exchange.
| `trades/<tradeid>/open-order` | DELETE - Cancel open order for this trade.
| `trades/<tradeid>/reload` | GET - Reload a trade from the Exchange. Only works in live, and can potentially help recover a trade that was manually sold on the exchange.
| `show_config` | Shows part of the current configuration with relevant settings to operation.
| `logs` | Shows last log messages.
| `status` | Lists all open trades.
| `count` | Displays number of trades used and available.
| `entries [pair]` | Shows profit statistics for each enter tags for given pair (or all pairs if pair isn't given). Pair is optional.
| `exits [pair]` | Shows profit statistics for each exit reasons for given pair (or all pairs if pair isn't given). Pair is optional.
| `mix_tags [pair]` | Shows profit statistics for each combinations of enter tag + exit reasons for given pair (or all pairs if pair isn't given). Pair is optional.
| `locks` | Displays currently locked pairs.
| `delete_lock <lock_id>` | Deletes (disables) the lock by id.
| `profit` | Display a summary of your profit/loss from close trades and some stats about your performance.
@@ -151,6 +154,8 @@ python3 scripts/rest_client.py --config rest_config.json <command> [optional par
| `performance` | Show performance of each finished trade grouped by pair.
| `balance` | Show account balance per currency.
| `daily <n>` | Shows profit or loss per day, over the last n days (n defaults to 7).
| `weekly <n>` | Shows profit or loss per week, over the last n days (n defaults to 4).
| `monthly <n>` | Shows profit or loss per month, over the last n days (n defaults to 3).
| `stats` | Display a summary of profit / loss reasons as well as average holding times.
| `whitelist` | Show the current whitelist.
| `blacklist [pair]` | Show the current blacklist, or adds a pair to the blacklist.
+166 -35
View File
@@ -164,6 +164,31 @@ E.g. If the `current_rate` is 200 USD, then returning `0.02` will set the stoplo
During backtesting, `current_rate` (and `current_profit`) are provided against the candle's high (or low for short trades) - while the resulting stoploss is evaluated against the candle's low (or high for short trades).
The absolute value of the return value is used (the sign is ignored), so returning `0.05` or `-0.05` have the same result, a stoploss 5% below the current price.
Returning None will be interpreted as "no desire to change", and is the only safe way to return when you'd like to not modify the stoploss.
Stoploss on exchange works similar to `trailing_stop`, and the stoploss on exchange is updated as configured in `stoploss_on_exchange_interval` ([More details about stoploss on exchange](stoploss.md#stop-loss-on-exchange-freqtrade)).
!!! Note "Use of dates"
All time-based calculations should be done based on `current_time` - using `datetime.now()` or `datetime.utcnow()` is discouraged, as this will break backtesting support.
!!! Tip "Trailing stoploss"
It's recommended to disable `trailing_stop` when using custom stoploss values. Both can work in tandem, but you might encounter the trailing stop to move the price higher while your custom function would not want this, causing conflicting behavior.
### Adjust stoploss after position adjustments
Depending on your strategy, you may encounter the need to adjust the stoploss in both directions after a [position adjustment](#adjust-trade-position).
For this, freqtrade will make an additional call with `after_fill=True` after an order fills, which will allow the strategy to move the stoploss in any direction (also widening the gap between stoploss and current price, which is otherwise forbidden).
!!! Note "backwards compatibility"
This call will only be made if the `after_fill` parameter is part of the function definition of your `custom_stoploss` function.
As such, this will not impact (and with that, surprise) existing, running strategies.
### Custom stoploss examples
The next section will show some examples on what's possible with the custom stoploss function.
Of course, many more things are possible, and all examples can be combined at will.
#### Trailing stop via custom stoploss
To simulate a regular trailing stoploss of 4% (trailing 4% behind the maximum reached price) you would use the following very simple method:
@@ -179,7 +204,8 @@ class AwesomeStrategy(IStrategy):
use_custom_stoploss = True
def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime,
current_rate: float, current_profit: float, **kwargs) -> float:
current_rate: float, current_profit: float, after_fill: bool,
**kwargs) -> Optional[float]:
"""
Custom stoploss logic, returning the new distance relative to current_rate (as ratio).
e.g. returning -0.05 would create a stoploss 5% below current_rate.
@@ -187,7 +213,7 @@ class AwesomeStrategy(IStrategy):
For full documentation please go to https://www.freqtrade.io/en/latest/strategy-advanced/
When not implemented by a strategy, returns the initial stoploss value
When not implemented by a strategy, returns the initial stoploss value.
Only called when use_custom_stoploss is set to True.
:param pair: Pair that's currently analyzed
@@ -195,25 +221,13 @@ class AwesomeStrategy(IStrategy):
:param current_time: datetime object, containing the current datetime
:param current_rate: Rate, calculated based on pricing settings in exit_pricing.
:param current_profit: Current profit (as ratio), calculated based on current_rate.
:param after_fill: True if the stoploss is called after the order was filled.
:param **kwargs: Ensure to keep this here so updates to this won't break your strategy.
:return float: New stoploss value, relative to the current rate
:return float: New stoploss value, relative to the current_rate
"""
return -0.04
```
Stoploss on exchange works similar to `trailing_stop`, and the stoploss on exchange is updated as configured in `stoploss_on_exchange_interval` ([More details about stoploss on exchange](stoploss.md#stop-loss-on-exchange-freqtrade)).
!!! Note "Use of dates"
All time-based calculations should be done based on `current_time` - using `datetime.now()` or `datetime.utcnow()` is discouraged, as this will break backtesting support.
!!! Tip "Trailing stoploss"
It's recommended to disable `trailing_stop` when using custom stoploss values. Both can work in tandem, but you might encounter the trailing stop to move the price higher while your custom function would not want this, causing conflicting behavior.
### Custom stoploss examples
The next section will show some examples on what's possible with the custom stoploss function.
Of course, many more things are possible, and all examples can be combined at will.
#### Time based trailing stop
Use the initial stoploss for the first 60 minutes, after this change to 10% trailing stoploss, and after 2 hours (120 minutes) we use a 5% trailing stoploss.
@@ -229,14 +243,45 @@ class AwesomeStrategy(IStrategy):
use_custom_stoploss = True
def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime,
current_rate: float, current_profit: float, **kwargs) -> float:
current_rate: float, current_profit: float, after_fill: bool,
**kwargs) -> Optional[float]:
# Make sure you have the longest interval first - these conditions are evaluated from top to bottom.
if current_time - timedelta(minutes=120) > trade.open_date_utc:
return -0.05
elif current_time - timedelta(minutes=60) > trade.open_date_utc:
return -0.10
return 1
return None
```
#### Time based trailing stop with after-fill adjustments
Use the initial stoploss for the first 60 minutes, after this change to 10% trailing stoploss, and after 2 hours (120 minutes) we use a 5% trailing stoploss.
If an additional order fills, set stoploss to -10% below the new `open_rate` ([Averaged across all entries](#position-adjust-calculations)).
``` python
from datetime import datetime, timedelta
from freqtrade.persistence import Trade
class AwesomeStrategy(IStrategy):
# ... populate_* methods
use_custom_stoploss = True
def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime,
current_rate: float, current_profit: float, after_fill: bool,
**kwargs) -> Optional[float]:
if after_fill:
# After an additional order, start with a stoploss of 10% below the new open rate
return stoploss_from_open(0.10, current_profit, is_short=trade.is_short, leverage=trade.leverage)
# Make sure you have the longest interval first - these conditions are evaluated from top to bottom.
if current_time - timedelta(minutes=120) > trade.open_date_utc:
return -0.05
elif current_time - timedelta(minutes=60) > trade.open_date_utc:
return -0.10
return None
```
#### Different stoploss per pair
@@ -255,7 +300,8 @@ class AwesomeStrategy(IStrategy):
use_custom_stoploss = True
def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime,
current_rate: float, current_profit: float, **kwargs) -> float:
current_rate: float, current_profit: float, after_fill: bool,
**kwargs) -> Optional[float]:
if pair in ('ETH/BTC', 'XRP/BTC'):
return -0.10
@@ -281,7 +327,8 @@ class AwesomeStrategy(IStrategy):
use_custom_stoploss = True
def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime,
current_rate: float, current_profit: float, **kwargs) -> float:
current_rate: float, current_profit: float, after_fill: bool,
**kwargs) -> Optional[float]:
if current_profit < 0.04:
return -1 # return a value bigger than the initial stoploss to keep using the initial stoploss
@@ -314,7 +361,8 @@ class AwesomeStrategy(IStrategy):
use_custom_stoploss = True
def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime,
current_rate: float, current_profit: float, **kwargs) -> float:
current_rate: float, current_profit: float, after_fill: bool,
**kwargs) -> Optional[float]:
# evaluate highest to lowest, so that highest possible stop is used
if current_profit > 0.40:
@@ -325,7 +373,7 @@ class AwesomeStrategy(IStrategy):
return stoploss_from_open(0.07, current_profit, is_short=trade.is_short, leverage=trade.leverage)
# return maximum stoploss value, keeping current stoploss price unchanged
return 1
return None
```
#### Custom stoploss using an indicator from dataframe example
@@ -342,7 +390,8 @@ class AwesomeStrategy(IStrategy):
use_custom_stoploss = True
def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime,
current_rate: float, current_profit: float, **kwargs) -> float:
current_rate: float, current_profit: float, after_fill: bool,
**kwargs) -> Optional[float]:
dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe)
last_candle = dataframe.iloc[-1].squeeze()
@@ -355,7 +404,7 @@ class AwesomeStrategy(IStrategy):
return stoploss_from_absolute(stoploss_price, current_rate, is_short=trade.is_short)
# return maximum stoploss value, keeping current stoploss price unchanged
return 1
return None
```
See [Dataframe access](strategy-advanced.md#dataframe-access) for more information about dataframe use in strategy callbacks.
@@ -364,15 +413,89 @@ See [Dataframe access](strategy-advanced.md#dataframe-access) for more informati
#### Stoploss relative to open price
Stoploss values returned from `custom_stoploss()` always specify a percentage relative to `current_rate`. In order to set a stoploss relative to the *open* price, we need to use `current_profit` to calculate what percentage relative to the `current_rate` will give you the same result as if the percentage was specified from the open price.
Stoploss values returned from `custom_stoploss()` must specify a percentage relative to `current_rate`, but sometimes you may want to specify a stoploss relative to the _entry_ price instead.
`stoploss_from_open()` is a helper function to calculate a stoploss value that can be returned from `custom_stoploss` which will be equivalent to the desired trade profit above the entry point.
The helper function [`stoploss_from_open()`](strategy-customization.md#stoploss_from_open) can be used to convert from an open price relative stop, to a current price relative stop which can be returned from `custom_stoploss()`.
??? Example "Returning a stoploss relative to the open price from the custom stoploss function"
Say the open price was $100, and `current_price` is $121 (`current_profit` will be `0.21`).
If we want a stop price at 7% above the open price we can call `stoploss_from_open(0.07, current_profit, False)` which will return `0.1157024793`. 11.57% below $121 is $107, which is the same as 7% above $100.
This function will consider leverage - so at 10x leverage, the actual stoploss would be 0.7% above $100 (0.7% * 10x = 7%).
``` python
from datetime import datetime
from freqtrade.persistence import Trade
from freqtrade.strategy import IStrategy, stoploss_from_open
class AwesomeStrategy(IStrategy):
# ... populate_* methods
use_custom_stoploss = True
def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime,
current_rate: float, current_profit: float, after_fill: bool,
**kwargs) -> Optional[float]:
# once the profit has risen above 10%, keep the stoploss at 7% above the open price
if current_profit > 0.10:
return stoploss_from_open(0.07, current_profit, is_short=trade.is_short, leverage=trade.leverage)
return 1
```
Full examples can be found in the [Custom stoploss](strategy-advanced.md#custom-stoploss) section of the Documentation.
!!! Note
Providing invalid input to `stoploss_from_open()` may produce "CustomStoploss function did not return valid stoploss" warnings.
This may happen if `current_profit` parameter is below specified `open_relative_stop`. Such situations may arise when closing trade
is blocked by `confirm_trade_exit()` method. Warnings can be solved by never blocking stop loss sells by checking `exit_reason` in
`confirm_trade_exit()`, or by using `return stoploss_from_open(...) or 1` idiom, which will request to not change stop loss when
`current_profit < open_relative_stop`.
#### Stoploss percentage from absolute price
Stoploss values returned from `custom_stoploss()` always specify a percentage relative to `current_rate`. In order to set a stoploss at specified absolute price level, we need to use `stop_rate` to calculate what percentage relative to the `current_rate` will give you the same result as if the percentage was specified from the open price.
The helper function [`stoploss_from_absolute()`](strategy-customization.md#stoploss_from_absolute) can be used to convert from an absolute price, to a current price relative stop which can be returned from `custom_stoploss()`.
The helper function `stoploss_from_absolute()` can be used to convert from an absolute price, to a current price relative stop which can be returned from `custom_stoploss()`.
??? Example "Returning a stoploss using absolute price from the custom stoploss function"
If we want to trail a stop price at 2xATR below current price we can call `stoploss_from_absolute(current_rate + (side * candle['atr'] * 2), current_rate, is_short=trade.is_short, leverage=trade.leverage)`.
For futures, we need to adjust the direction (up or down), as well as adjust for leverage, since the [`custom_stoploss`](strategy-callbacks.md#custom-stoploss) callback returns the ["risk for this trade"](stoploss.md#stoploss-and-leverage) - not the relative price movement.
``` python
from datetime import datetime
from freqtrade.persistence import Trade
from freqtrade.strategy import IStrategy, stoploss_from_absolute, timeframe_to_prev_date
class AwesomeStrategy(IStrategy):
use_custom_stoploss = True
def populate_indicators_1h(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe['atr'] = ta.ATR(dataframe, timeperiod=14)
return dataframe
def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime,
current_rate: float, current_profit: float, after_fill: bool,
**kwargs) -> Optional[float]:
dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe)
trade_date = timeframe_to_prev_date(self.timeframe, trade.open_date_utc)
candle = dataframe.iloc[-1].squeeze()
side = 1 if trade.is_short else -1
return stoploss_from_absolute(current_rate + (side * candle['atr'] * 2),
current_rate, is_short=trade.is_short,
leverage=trade.leverage)
```
---
@@ -387,6 +510,9 @@ Each of these methods are called right before placing an order on the exchange.
!!! Note
If your custom pricing function return None or an invalid value, price will fall back to `proposed_rate`, which is based on the regular pricing configuration.
!!! Note
Using custom_entry_price, the Trade object will be available as soon as the first entry order associated with the trade is created, for the first entry, `trade` parameter value will be `None`.
### Custom order entry and exit price example
``` python
@@ -397,7 +523,7 @@ class AwesomeStrategy(IStrategy):
# ... populate_* methods
def custom_entry_price(self, pair: str, current_time: datetime, proposed_rate: float,
def custom_entry_price(self, pair: str, trade: Optional['Trade'], current_time: datetime, proposed_rate: float,
entry_tag: Optional[str], side: str, **kwargs) -> float:
dataframe, last_updated = self.dp.get_analyzed_dataframe(pair=pair,
@@ -634,9 +760,9 @@ The `position_adjustment_enable` strategy property enables the usage of `adjust_
For performance reasons, it's disabled by default and freqtrade will show a warning message on startup if enabled.
`adjust_trade_position()` can be used to perform additional orders, for example to manage risk with DCA (Dollar Cost Averaging) or to increase or decrease positions.
`max_entry_position_adjustment` property is used to limit the number of additional buys per trade (on top of the first buy) that the bot can execute. By default, the value is -1 which means the bot have no limit on number of adjustment buys.
`max_entry_position_adjustment` property is used to limit the number of additional entries per trade (on top of the first entry order) that the bot can execute. By default, the value is -1 which means the bot have no limit on number of adjustment entries.
The strategy is expected to return a stake_amount (in stake currency) between `min_stake` and `max_stake` if and when an additional buy order should be made (position is increased).
The strategy is expected to return a stake_amount (in stake currency) between `min_stake` and `max_stake` if and when an additional entry order should be made (position is increased -> buy order for long trades, sell order for short trades).
If there are not enough funds in the wallet (the return value is above `max_stake`) then the signal will be ignored.
Additional orders also result in additional fees and those orders don't count towards `max_open_trades`.
@@ -644,9 +770,11 @@ This callback is **not** called when there is an open order (either buy or sell)
`adjust_trade_position()` is called very frequently for the duration of a trade, so you must keep your implementation as performant as possible.
Additional Buys are ignored once you have reached the maximum amount of extra buys that you have set on `max_entry_position_adjustment`, but the callback is called anyway looking for partial exits.
Additional entries are ignored once you have reached the maximum amount of extra entries that you have set on `max_entry_position_adjustment`, but the callback is called anyway looking for partial exits.
Position adjustments will always be applied in the direction of the trade, so a positive value will always increase your position (negative values will decrease your position), no matter if it's a long or short trade. Modifications to leverage are not possible, and the stake-amount is assumed to be before applying leverage.
Position adjustments will always be applied in the direction of the trade, so a positive value will always increase your position (negative values will decrease your position), no matter if it's a long or short trade.
Modifications to leverage are not possible, and the stake-amount returned is assumed to be before applying leverage.
!!! Note "About stake size"
Using fixed stake size means it will be the amount used for the first order, just like without position adjustment.
@@ -700,7 +828,7 @@ class DigDeeperStrategy(IStrategy):
"""
Custom trade adjustment logic, returning the stake amount that a trade should be
increased or decreased.
This means extra buy or sell orders with additional fees.
This means extra entry or exit orders with additional fees.
Only called when `position_adjustment_enable` is set to True.
For full documentation please go to https://www.freqtrade.io/en/latest/strategy-advanced/
@@ -709,8 +837,9 @@ class DigDeeperStrategy(IStrategy):
:param trade: trade object.
:param current_time: datetime object, containing the current datetime
:param current_rate: Current buy rate.
:param current_profit: Current profit (as ratio), calculated based on current_rate.
:param current_rate: Current entry rate (same as current_entry_profit)
:param current_profit: Current profit (as ratio), calculated based on current_rate
(same as current_entry_profit).
:param min_stake: Minimal stake size allowed by exchange (for both entries and exits)
:param max_stake: Maximum stake allowed (either through balance, or by exchange limits).
:param current_entry_rate: Current rate using entry pricing.
@@ -793,6 +922,8 @@ Returning any other price will cancel the existing order, and replace it with a
The trade open-date (`trade.open_date_utc`) will remain at the time of the very first order placed.
Please make sure to be aware of this - and eventually adjust your logic in other callbacks to account for this, and use the date of the first filled order instead.
If the cancellation of the original order fails, then the order will not be replaced - though the order will most likely have been canceled on exchange. Having this happen on initial entries will result in the deletion of the order, while on position adjustment orders, it'll result in the trade size remaining as is.
!!! Warning "Regular timeout"
Entry `unfilledtimeout` mechanism (as well as `check_entry_timeout()`) takes precedence over this.
Entry Orders that are cancelled via the above methods will not have this callback called. Be sure to update timeout values to match your expectations.
+76 -148
View File
@@ -168,7 +168,9 @@ Most indicators have an instable startup period, in which they are either not av
To account for this, the strategy can be assigned the `startup_candle_count` attribute.
This should be set to the maximum number of candles that the strategy requires to calculate stable indicators. In the case where a user includes higher timeframes with informative pairs, the `startup_candle_count` does not necessarily change. The value is the maximum period (in candles) that any of the informatives timeframes need to compute stable indicators.
In this example strategy, this should be set to 100 (`startup_candle_count = 100`), since the longest needed history is 100 candles.
You can use [recursive-analysis](recursive-analysis.md) to check and find the correct `startup_candle_count` to be used.
In this example strategy, this should be set to 400 (`startup_candle_count = 400`), since the minimum needed history for ema100 calculation to make sure the value is correct is 400 candles.
``` python
dataframe['ema100'] = ta.EMA(dataframe, timeperiod=100)
@@ -193,11 +195,11 @@ Let's try to backtest 1 month (January 2019) of 5m candles using an example stra
freqtrade backtesting --timerange 20190101-20190201 --timeframe 5m
```
Assuming `startup_candle_count` is set to 100, backtesting knows it needs 100 candles to generate valid buy signals. It will load data from `20190101 - (100 * 5m)` - which is ~2018-12-31 15:30:00.
Assuming `startup_candle_count` is set to 400, backtesting knows it needs 400 candles to generate valid buy signals. It will load data from `20190101 - (400 * 5m)` - which is ~2018-12-30 11:40:00.
If this data is available, indicators will be calculated with this extended timerange. The instable startup period (up to 2019-01-01 00:00:00) will then be removed before starting backtesting.
!!! Note
If data for the startup period is not available, then the timerange will be adjusted to account for this startup period - so Backtesting would start at 2019-01-01 08:30:00.
If data for the startup period is not available, then the timerange will be adjusted to account for this startup period - so Backtesting would start at 2019-01-02 09:20:00.
### Entry signal rules
@@ -264,7 +266,7 @@ def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFram
### Exit signal rules
Edit the method `populate_exit_trend()` into your strategy file to update your exit strategy.
The exit-signal is only used for exits if `use_exit_signal` is set to true in the configuration.
The exit-signal can be suppressed by setting `use_exit_signal` to false in the configuration or strategy.
`use_exit_signal` will not influence [signal collision rules](#colliding-signals) - which will still apply and can prevent entries.
It's important to always return the dataframe without removing/modifying the columns `"open", "high", "low", "close", "volume"`, otherwise these fields would contain something unexpected.
@@ -484,17 +486,18 @@ for more information.
:param timeframe: Informative timeframe. Must always be equal or higher than strategy timeframe.
:param asset: Informative asset, for example BTC, BTC/USDT, ETH/BTC. Do not specify to use
current pair.
current pair. Also supports limited pair format strings (see below)
:param fmt: Column format (str) or column formatter (callable(name, asset, timeframe)). When not
specified, defaults to:
* {base}_{quote}_{column}_{timeframe} if asset is specified.
* {base}_{quote}_{column}_{timeframe} if asset is specified.
* {column}_{timeframe} if asset is not specified.
Format string supports these format variables:
* {asset} - full name of the asset, for example 'BTC/USDT'.
Pair format supports these format variables:
* {base} - base currency in lower case, for example 'eth'.
* {BASE} - same as {base}, except in upper case.
* {quote} - quote currency in lower case, for example 'usdt'.
* {QUOTE} - same as {quote}, except in upper case.
Format string additionally supports this variables.
* {asset} - full name of the asset, for example 'BTC/USDT'.
* {column} - name of dataframe column.
* {timeframe} - timeframe of informative dataframe.
:param ffill: ffill dataframe after merging informative pair.
@@ -586,6 +589,67 @@ for more information.
will overwrite previously defined method and not produce any errors due to limitations of Python programming language. In such cases you will find that indicators
created in earlier-defined methods are not available in the dataframe. Carefully review method names and make sure they are unique!
### *merge_informative_pair()*
This method helps you merge an informative pair to a regular dataframe without lookahead bias.
It's there to help you merge the dataframe in a safe and consistent way.
Options:
- Rename the columns for you to create unique columns
- Merge the dataframe without lookahead bias
- Forward-fill (optional)
For a full sample, please refer to the [complete data provider example](#complete-data-provider-sample) below.
All columns of the informative dataframe will be available on the returning dataframe in a renamed fashion:
!!! Example "Column renaming"
Assuming `inf_tf = '1d'` the resulting columns will be:
``` python
'date', 'open', 'high', 'low', 'close', 'rsi' # from the original dataframe
'date_1d', 'open_1d', 'high_1d', 'low_1d', 'close_1d', 'rsi_1d' # from the informative dataframe
```
??? Example "Column renaming - 1h"
Assuming `inf_tf = '1h'` the resulting columns will be:
``` python
'date', 'open', 'high', 'low', 'close', 'rsi' # from the original dataframe
'date_1h', 'open_1h', 'high_1h', 'low_1h', 'close_1h', 'rsi_1h' # from the informative dataframe
```
??? Example "Custom implementation"
A custom implementation for this is possible, and can be done as follows:
``` python
# Shift date by 1 candle
# This is necessary since the data is always the "open date"
# and a 15m candle starting at 12:15 should not know the close of the 1h candle from 12:00 to 13:00
minutes = timeframe_to_minutes(inf_tf)
# Only do this if the timeframes are different:
informative['date_merge'] = informative["date"] + pd.to_timedelta(minutes, 'm')
# Rename columns to be unique
informative.columns = [f"{col}_{inf_tf}" for col in informative.columns]
# Assuming inf_tf = '1d' - then the columns will now be:
# date_1d, open_1d, high_1d, low_1d, close_1d, rsi_1d
# Combine the 2 dataframes
# all indicators on the informative sample MUST be calculated before this point
dataframe = pd.merge(dataframe, informative, left_on='date', right_on=f'date_merge_{inf_tf}', how='left')
# FFill to have the 1d value available in every row throughout the day.
# Without this, comparisons would only work once per day.
dataframe = dataframe.ffill()
```
!!! Warning "Informative timeframe < timeframe"
Using informative timeframes smaller than the dataframe timeframe is not recommended with this method, as it will not use any of the additional information this would provide.
To use the more detailed information properly, more advanced methods should be applied (which are out of scope for freqtrade documentation, as it'll depend on the respective need).
## Additional data (DataProvider)
The strategy provides access to the `DataProvider`. This allows you to get additional data to use in your strategy.
@@ -810,146 +874,6 @@ class SampleStrategy(IStrategy):
***
## Helper functions
### *merge_informative_pair()*
This method helps you merge an informative pair to a regular dataframe without lookahead bias.
It's there to help you merge the dataframe in a safe and consistent way.
Options:
- Rename the columns for you to create unique columns
- Merge the dataframe without lookahead bias
- Forward-fill (optional)
For a full sample, please refer to the [complete data provider example](#complete-data-provider-sample) below.
All columns of the informative dataframe will be available on the returning dataframe in a renamed fashion:
!!! Example "Column renaming"
Assuming `inf_tf = '1d'` the resulting columns will be:
``` python
'date', 'open', 'high', 'low', 'close', 'rsi' # from the original dataframe
'date_1d', 'open_1d', 'high_1d', 'low_1d', 'close_1d', 'rsi_1d' # from the informative dataframe
```
??? Example "Column renaming - 1h"
Assuming `inf_tf = '1h'` the resulting columns will be:
``` python
'date', 'open', 'high', 'low', 'close', 'rsi' # from the original dataframe
'date_1h', 'open_1h', 'high_1h', 'low_1h', 'close_1h', 'rsi_1h' # from the informative dataframe
```
??? Example "Custom implementation"
A custom implementation for this is possible, and can be done as follows:
``` python
# Shift date by 1 candle
# This is necessary since the data is always the "open date"
# and a 15m candle starting at 12:15 should not know the close of the 1h candle from 12:00 to 13:00
minutes = timeframe_to_minutes(inf_tf)
# Only do this if the timeframes are different:
informative['date_merge'] = informative["date"] + pd.to_timedelta(minutes, 'm')
# Rename columns to be unique
informative.columns = [f"{col}_{inf_tf}" for col in informative.columns]
# Assuming inf_tf = '1d' - then the columns will now be:
# date_1d, open_1d, high_1d, low_1d, close_1d, rsi_1d
# Combine the 2 dataframes
# all indicators on the informative sample MUST be calculated before this point
dataframe = pd.merge(dataframe, informative, left_on='date', right_on=f'date_merge_{inf_tf}', how='left')
# FFill to have the 1d value available in every row throughout the day.
# Without this, comparisons would only work once per day.
dataframe = dataframe.ffill()
```
!!! Warning "Informative timeframe < timeframe"
Using informative timeframes smaller than the dataframe timeframe is not recommended with this method, as it will not use any of the additional information this would provide.
To use the more detailed information properly, more advanced methods should be applied (which are out of scope for freqtrade documentation, as it'll depend on the respective need).
***
### *stoploss_from_open()*
Stoploss values returned from `custom_stoploss` must specify a percentage relative to `current_rate`, but sometimes you may want to specify a stoploss relative to the entry point instead. `stoploss_from_open()` is a helper function to calculate a stoploss value that can be returned from `custom_stoploss` which will be equivalent to the desired trade profit above the entry point.
??? Example "Returning a stoploss relative to the open price from the custom stoploss function"
Say the open price was $100, and `current_price` is $121 (`current_profit` will be `0.21`).
If we want a stop price at 7% above the open price we can call `stoploss_from_open(0.07, current_profit, False)` which will return `0.1157024793`. 11.57% below $121 is $107, which is the same as 7% above $100.
This function will consider leverage - so at 10x leverage, the actual stoploss would be 0.7% above $100 (0.7% * 10x = 7%).
``` python
from datetime import datetime
from freqtrade.persistence import Trade
from freqtrade.strategy import IStrategy, stoploss_from_open
class AwesomeStrategy(IStrategy):
# ... populate_* methods
use_custom_stoploss = True
def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime,
current_rate: float, current_profit: float, **kwargs) -> float:
# once the profit has risen above 10%, keep the stoploss at 7% above the open price
if current_profit > 0.10:
return stoploss_from_open(0.07, current_profit, is_short=trade.is_short, leverage=trade.leverage)
return 1
```
Full examples can be found in the [Custom stoploss](strategy-advanced.md#custom-stoploss) section of the Documentation.
!!! Note
Providing invalid input to `stoploss_from_open()` may produce "CustomStoploss function did not return valid stoploss" warnings.
This may happen if `current_profit` parameter is below specified `open_relative_stop`. Such situations may arise when closing trade
is blocked by `confirm_trade_exit()` method. Warnings can be solved by never blocking stop loss sells by checking `exit_reason` in
`confirm_trade_exit()`, or by using `return stoploss_from_open(...) or 1` idiom, which will request to not change stop loss when
`current_profit < open_relative_stop`.
### *stoploss_from_absolute()*
In some situations it may be confusing to deal with stops relative to current rate. Instead, you may define a stoploss level using an absolute price.
??? Example "Returning a stoploss using absolute price from the custom stoploss function"
If we want to trail a stop price at 2xATR below current price we can call `stoploss_from_absolute(current_rate - (candle['atr'] * 2), current_rate, is_short=trade.is_short)`.
``` python
from datetime import datetime
from freqtrade.persistence import Trade
from freqtrade.strategy import IStrategy, stoploss_from_absolute
class AwesomeStrategy(IStrategy):
use_custom_stoploss = True
def populate_indicators_1h(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe['atr'] = ta.ATR(dataframe, timeperiod=14)
return dataframe
def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime,
current_rate: float, current_profit: float, **kwargs) -> float:
dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe)
candle = dataframe.iloc[-1].squeeze()
return stoploss_from_absolute(current_rate - (candle['atr'] * 2), current_rate, is_short=trade.is_short)
```
## Additional data (Wallets)
The strategy provides access to the `wallets` object. This contains the current balances on the exchange.
@@ -1085,6 +1009,10 @@ The following lists some common patterns which should be avoided to prevent frus
- don't use `dataframe['volume'].mean()`. This uses the full DataFrame for backtesting, including data from the future. Use `dataframe['volume'].rolling(<window>).mean()` instead
- don't use `.resample('1h')`. This uses the left border of the interval, so moves data from an hour to the start of the hour. Use `.resample('1h', label='right')` instead.
!!! Tip "Identifying problems"
You may also want to check the 2 helper commands [lookahead-analysis](lookahead-analysis.md) and [recursive-analysis](recursive-analysis.md), which can each help you figure out problems with your strategy in different ways.
Please treat them as what they are - helpers to identify most common problems. A negative result of each does not guarantee that there's none of the above errors included.
### Colliding signals
When conflicting signals collide (e.g. both `'enter_long'` and `'exit_long'` are 1), freqtrade will do nothing and ignore the entry signal. This will avoid trades that enter, and exit immediately. Obviously, this can potentially lead to missed entries.
+3 -15
View File
@@ -167,7 +167,7 @@ trades.groupby("pair")["exit_reason"].value_counts()
# Plotting equity line (starting with 0 on day 1 and adding daily profit for each backtested day)
from freqtrade.configuration import Configuration
from freqtrade.data.btanalysis import load_backtest_data, load_backtest_stats
from freqtrade.data.btanalysis import load_backtest_stats
import plotly.express as px
import pandas as pd
@@ -178,20 +178,8 @@ import pandas as pd
stats = load_backtest_stats(backtest_dir)
strategy_stats = stats['strategy'][strategy]
dates = []
profits = []
for date_profit in strategy_stats['daily_profit']:
dates.append(date_profit[0])
profits.append(date_profit[1])
equity = 0
equity_daily = []
for daily_profit in profits:
equity_daily.append(equity)
equity += float(daily_profit)
df = pd.DataFrame({'dates': dates,'equity_daily': equity_daily})
df = pd.DataFrame(columns=['dates','equity'], data=strategy_stats['daily_profit'])
df['equity_daily'] = df['equity'].cumsum()
fig = px.line(df, x="dates", y="equity_daily")
fig.show()
+5 -4
View File
@@ -280,7 +280,7 @@ After:
``` python hl_lines="3"
class AwesomeStrategy(IStrategy):
def custom_entry_price(self, pair: str, current_time: datetime, proposed_rate: float,
def custom_entry_price(self, pair: str, trade: Optional[Trade], current_time: datetime, proposed_rate: float,
entry_tag: Optional[str], side: str, **kwargs) -> float:
return proposed_rate
```
@@ -311,12 +311,13 @@ After:
``` python hl_lines="5 7"
def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime,
current_rate: float, current_profit: float, **kwargs) -> float:
current_rate: float, current_profit: float, after_fill: bool,
**kwargs) -> Optional[float]:
# once the profit has risen above 10%, keep the stoploss at 7% above the open price
if current_profit > 0.10:
return stoploss_from_open(0.07, current_profit, is_short=trade.is_short)
return stoploss_from_absolute(current_rate - (candle['atr'] * 2), current_rate, is_short=trade.is_short)
return stoploss_from_absolute(current_rate - (candle['atr'] * 2), current_rate, is_short=trade.is_short, leverage=trade.leverage)
```
@@ -569,7 +570,7 @@ def populate_any_indicators(
```
1. Features - Move to `feature_engineering_expand_all`
2. Basic features, not expanded across `include_periods_candles` - move to`feature_engineering_expand_basic()`.
2. Basic features, not expanded across `indicator_periods_candles` - move to`feature_engineering_expand_basic()`.
3. Standard features which should not be expanded - move to `feature_engineering_standard()`.
4. Targets - Move this part to `set_freqai_targets()`.
+1
View File
@@ -175,6 +175,7 @@ official commands. You can ask at any moment for help with `/help`.
| `/status` | Lists all open trades
| `/status <trade_id>` | Lists one or more specific trade. Separate multiple <trade_id> with a blank space.
| `/status table` | List all open trades in a table format. Pending buy orders are marked with an asterisk (*) Pending sell orders are marked with a double asterisk (**)
| `/order <trade_id>` | Lists orders of one or more specific trade. Separate multiple <trade_id> with a blank space.
| `/trades [limit]` | List all recently closed trades in a table format.
| `/count` | Displays number of trades used and available
| `/locks` | Show currently locked pairs.
+30 -26
View File
@@ -242,7 +242,6 @@ bitkk True missing opt: fetchMyTrades
bitmart True
bitmax True missing opt: fetchMyTrades
bitpanda True
bittrex True
bitvavo True
bitz True missing opt: fetchMyTrades
btcalpha True missing opt: fetchTicker, fetchTickers
@@ -324,7 +323,6 @@ bitpanda True
bitso False missing: fetchOHLCV
bitstamp True missing opt: fetchTickers
bitstamp1 False missing: fetchOrder, fetchOHLCV
bittrex True
bitvavo True
bitz True missing opt: fetchMyTrades
bl3p False missing: fetchOrder, fetchOHLCV
@@ -427,25 +425,33 @@ zb True missing opt: fetchMyTrades
Use the `list-timeframes` subcommand to see the list of timeframes available for the exchange.
```
usage: freqtrade list-timeframes [-h] [-v] [--logfile FILE] [-V] [-c PATH] [-d PATH] [--userdir PATH] [--exchange EXCHANGE] [-1]
usage: freqtrade list-timeframes [-h] [-v] [--logfile FILE] [-V] [-c PATH]
[-d PATH] [--userdir PATH]
[--exchange EXCHANGE] [-1]
optional arguments:
options:
-h, --help show this help message and exit
--exchange EXCHANGE Exchange name (default: `bittrex`). 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.
Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--logfile FILE Log to the file specified. Special values are: 'syslog', 'journald'. See the documentation for more details.
--logfile FILE, --log-file FILE
Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more
details.
-V, --version show program's version number and exit
-c PATH, --config PATH
Specify configuration file (default: `config.json`). Multiple --config options may be used. Can be set to `-`
to read config from stdin.
-d PATH, --datadir PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH
Path to directory with historical backtesting data.
--userdir PATH, --user-data-dir PATH
Path to userdata directory.
```
* Example: see the timeframes for the 'binance' exchange, set in the configuration file:
@@ -479,20 +485,17 @@ usage: freqtrade list-markets [-h] [-v] [--logfile FILE] [-V] [-c PATH]
[-d PATH] [--userdir PATH] [--exchange EXCHANGE]
[--print-list] [--print-json] [-1] [--print-csv]
[--base BASE_CURRENCY [BASE_CURRENCY ...]]
[--quote QUOTE_CURRENCY [QUOTE_CURRENCY ...]] [-a]
[--trading-mode {spot,margin,futures}]
[--quote QUOTE_CURRENCY [QUOTE_CURRENCY ...]]
[-a] [--trading-mode {spot,margin,futures}]
usage: freqtrade list-pairs [-h] [-v] [--logfile FILE] [-V] [-c PATH]
[-d PATH] [--userdir PATH] [--exchange EXCHANGE]
[--print-list] [--print-json] [-1] [--print-csv]
[--base BASE_CURRENCY [BASE_CURRENCY ...]]
[--quote QUOTE_CURRENCY [QUOTE_CURRENCY ...]] [-a]
[--trading-mode {spot,margin,futures}]
optional arguments:
options:
-h, --help show this help message and exit
--exchange EXCHANGE Exchange name (default: `bittrex`). Only valid if no
config is provided.
--exchange EXCHANGE Exchange name. Only valid if no config is provided.
--print-list Print list of pairs or market symbols. By default data
is printed in the tabular format.
--print-json Print list of pairs or market symbols in JSON format.
@@ -504,20 +507,22 @@ optional arguments:
Specify quote currency(-ies). Space-separated list.
-a, --all Print all pairs or market symbols. By default only
active ones are shown.
--trading-mode {spot,margin,futures}
--trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures}
Select Trading mode
Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--logfile FILE Log to the file specified. Special values are:
--logfile FILE, --log-file FILE
Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more
details.
-V, --version show program's version number and exit
-c PATH, --config PATH
Specify configuration file (default: `config.json`).
Multiple --config options may be used. Can be set to
`-` to read config from stdin.
-d PATH, --datadir PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH
Path to directory with historical backtesting data.
--userdir PATH, --user-data-dir PATH
Path to userdata directory.
@@ -532,7 +537,7 @@ Pairs/markets are sorted by its symbol string in the printed output.
### Examples
* Print the list of active pairs with quote currency USD on exchange, specified in the default
configuration file (i.e. pairs on the "Bittrex" exchange) in JSON format:
configuration file (i.e. pairs on the "Binance" exchange) in JSON format:
```
$ freqtrade list-pairs --quote USD --print-json
@@ -564,7 +569,7 @@ usage: freqtrade test-pairlist [-h] [--userdir PATH] [-v] [-c PATH]
[--quote QUOTE_CURRENCY [QUOTE_CURRENCY ...]]
[-1] [--print-json] [--exchange EXCHANGE]
optional arguments:
options:
-h, --help show this help message and exit
--userdir PATH, --user-data-dir PATH
Path to userdata directory.
@@ -578,8 +583,7 @@ optional arguments:
Specify quote currency(-ies). Space-separated list.
-1, --one-column Print output in one column.
--print-json Print list of pairs or market symbols in JSON format.
--exchange EXCHANGE Exchange name (default: `bittrex`). Only valid if no
config is provided.
--exchange EXCHANGE Exchange name. Only valid if no config is provided.
```
+1
View File
@@ -302,6 +302,7 @@ You can configure this as follows:
```
The above represents the default (`exit_fill` and `entry_fill` are optional and will default to the above configuration) - modifications are obviously possible.
To disable either of the two default values (`entry_fill` / `exit_fill`), you can assign them an empty array (`exit_fill: []`).
Available fields correspond to the fields for webhooks and are documented in the corresponding webhook sections.
+1 -1
View File
@@ -24,7 +24,7 @@ git clone https://github.com/freqtrade/freqtrade.git
Install ta-lib according to the [ta-lib documentation](https://github.com/mrjbq7/ta-lib#windows).
As compiling from source on windows has heavy dependencies (requires a partial visual studio installation), Freqtrade provides these dependencies (in the binary wheel format) for the latest 3 Python versions (3.8, 3.9, 3.10 and 3.11) and for 64bit Windows.
As compiling from source on windows has heavy dependencies (requires a partial visual studio installation), Freqtrade provides these dependencies (in the binary wheel format) for the latest 3 Python versions (3.9, 3.10 and 3.11) and for 64bit Windows.
These Wheels are also used by CI running on windows, and are therefore tested together with freqtrade.
Other versions must be downloaded from the above link.
+1 -1
View File
@@ -1,5 +1,5 @@
""" Freqtrade bot """
__version__ = '2023.8'
__version__ = '2023.12'
if 'dev' in __version__:
from pathlib import Path
+1 -1
View File
@@ -3,7 +3,7 @@
__main__.py for Freqtrade
To launch Freqtrade as a module
> python -m freqtrade (with Python >= 3.8)
> python -m freqtrade (with Python >= 3.9)
"""
from freqtrade import main
+2 -1
View File
@@ -20,7 +20,8 @@ from freqtrade.commands.list_commands import (start_list_exchanges, start_list_f
start_list_timeframes, start_show_trades)
from freqtrade.commands.optimize_commands import (start_backtesting, start_backtesting_show,
start_edge, start_hyperopt,
start_lookahead_analysis)
start_lookahead_analysis,
start_recursive_analysis)
from freqtrade.commands.pairlist_commands import start_test_pairlist
from freqtrade.commands.plot_commands import start_plot_dataframe, start_plot_profit
from freqtrade.commands.strategy_utils_commands import start_strategy_update
+18 -4
View File
@@ -65,8 +65,8 @@ ARGS_BUILD_CONFIG = ["config"]
ARGS_BUILD_STRATEGY = ["user_data_dir", "strategy", "template"]
ARGS_CONVERT_DATA_TRADES = ["pairs", "format_from_trades", "format_to", "erase", "exchange"]
ARGS_CONVERT_DATA = ["pairs", "format_from", "format_to", "erase", "exchange"]
ARGS_CONVERT_DATA_OHLCV = ARGS_CONVERT_DATA + ["timeframes", "trading_mode", "candle_types"]
ARGS_CONVERT_TRADES = ["pairs", "timeframes", "exchange", "dataformat_ohlcv", "dataformat_trades"]
@@ -122,6 +122,8 @@ ARGS_LOOKAHEAD_ANALYSIS = [
a for a in ARGS_BACKTEST if a not in ("position_stacking", "use_max_market_positions", 'cache')
] + ["minimum_trade_amount", "targeted_trade_amount", "lookahead_analysis_exportfilename"]
ARGS_RECURSIVE_ANALYSIS = ["timeframe", "timerange", "dataformat_ohlcv", "pairs", "startup_candle"]
class Arguments:
"""
@@ -206,8 +208,9 @@ class Arguments:
start_list_strategies, start_list_timeframes,
start_lookahead_analysis, start_new_config,
start_new_strategy, start_plot_dataframe, start_plot_profit,
start_show_trades, start_strategy_update,
start_test_pairlist, start_trading, start_webserver)
start_recursive_analysis, start_show_trades,
start_strategy_update, start_test_pairlist, start_trading,
start_webserver)
subparsers = self.parser.add_subparsers(dest='command',
# Use custom message when no subhandler is added
@@ -265,7 +268,7 @@ class Arguments:
parents=[_common_parser],
)
convert_trade_data_cmd.set_defaults(func=partial(start_convert_data, ohlcv=False))
self._build_args(optionlist=ARGS_CONVERT_DATA, parser=convert_trade_data_cmd)
self._build_args(optionlist=ARGS_CONVERT_DATA_TRADES, parser=convert_trade_data_cmd)
# Add trades-to-ohlcv subcommand
convert_trade_data_cmd = subparsers.add_parser(
@@ -467,3 +470,14 @@ class Arguments:
self._build_args(optionlist=ARGS_LOOKAHEAD_ANALYSIS,
parser=lookahead_analayis_cmd)
# Add recursive_analysis subcommand
recursive_analayis_cmd = subparsers.add_parser(
'recursive-analysis',
help="Check for potential recursive formula issue.",
parents=[_common_parser, _strategy_parser])
recursive_analayis_cmd.set_defaults(func=start_recursive_analysis)
self._build_args(optionlist=ARGS_RECURSIVE_ANALYSIS,
parser=recursive_analayis_cmd)
@@ -108,7 +108,6 @@ def ask_user_config() -> Dict[str, Any]:
"choices": [
"binance",
"binanceus",
"bittrex",
"gate",
"huobi",
"kraken",
+11
View File
@@ -421,6 +421,12 @@ AVAILABLE_CLI_OPTIONS = {
'desired timeframe as specified as --timeframes/-t.',
action='store_true',
),
"format_from_trades": Arg(
'--format-from',
help='Source format for data conversion.',
choices=constants.AVAILABLE_DATAHANDLERS + ['kraken_csv'],
required=True,
),
"format_from": Arg(
'--format-from',
help='Source format for data conversion.',
@@ -705,4 +711,9 @@ AVAILABLE_CLI_OPTIONS = {
help="Use this csv-filename to store lookahead-analysis-results",
type=str
),
"startup_candle": Arg(
'--startup-candle',
help='Specify startup candles to be checked (`199`, `499`, `999`, `1999`).',
nargs='+',
),
}
+6 -15
View File
@@ -5,12 +5,12 @@ from typing import Any, Dict
from freqtrade.configuration import TimeRange, setup_utils_configuration
from freqtrade.constants import DATETIME_PRINT_FORMAT, DL_DATA_TIMEFRAMES, Config
from freqtrade.data.converter import convert_ohlcv_format, convert_trades_format
from freqtrade.data.history import convert_trades_to_ohlcv, download_data_main
from freqtrade.data.converter import (convert_ohlcv_format, convert_trades_format,
convert_trades_to_ohlcv)
from freqtrade.data.history import download_data_main
from freqtrade.enums import RunMode, TradingMode
from freqtrade.exceptions import OperationalException
from freqtrade.exchange import timeframe_to_minutes
from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist
from freqtrade.resolvers import ExchangeResolver
from freqtrade.util.binance_mig import migrate_binance_futures_data
@@ -53,28 +53,19 @@ def start_convert_trades(args: Dict[str, Any]) -> None:
# Remove stake-currency to skip checks which are not relevant for datadownload
config['stake_currency'] = ''
if 'pairs' not in config:
raise OperationalException(
"Downloading data requires a list of pairs. "
"Please check the documentation on how to configure this.")
if 'timeframes' not in config:
config['timeframes'] = DL_DATA_TIMEFRAMES
# Init exchange
exchange = ExchangeResolver.load_exchange(config, validate=False)
# Manual validations of relevant settings
if not config['exchange'].get('skip_pair_validation', False):
exchange.validate_pairs(config['pairs'])
expanded_pairs = expand_pairlist(config['pairs'], list(exchange.markets))
logger.info(f"About to Convert pairs: {expanded_pairs}, "
f"intervals: {config['timeframes']} to {config['datadir']}")
for timeframe in config['timeframes']:
exchange.validate_timeframes(timeframe)
# Convert downloaded trade data to different timeframes
convert_trades_to_ohlcv(
pairs=expanded_pairs, timeframes=config['timeframes'],
pairs=config.get('pairs', []), timeframes=config['timeframes'],
datadir=config['datadir'], timerange=timerange, erase=bool(config.get('erase')),
data_format_ohlcv=config['dataformat_ohlcv'],
data_format_trades=config['dataformat_trades'],
@@ -94,7 +85,7 @@ def start_convert_data(args: Dict[str, Any], ohlcv: bool = True) -> None:
erase=args['erase'])
else:
convert_trades_format(config,
convert_from=args['format_from'], convert_to=args['format_to'],
convert_from=args['format_from_trades'], convert_to=args['format_to'],
erase=args['erase'])
+13 -1
View File
@@ -140,7 +140,19 @@ def start_lookahead_analysis(args: Dict[str, Any]) -> None:
:param args: Cli args from Arguments()
:return: None
"""
from freqtrade.optimize.lookahead_analysis_helpers import LookaheadAnalysisSubFunctions
from freqtrade.optimize.analysis.lookahead_helpers import LookaheadAnalysisSubFunctions
config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)
LookaheadAnalysisSubFunctions.start(config)
def start_recursive_analysis(args: Dict[str, Any]) -> None:
"""
Start the backtest recursive tester script
:param args: Cli args from Arguments()
:return: None
"""
from freqtrade.optimize.analysis.recursive_helpers import RecursiveAnalysisSubFunctions
config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)
RecursiveAnalysisSubFunctions.start(config)
+4 -4
View File
@@ -67,7 +67,7 @@ def validate_config_schema(conf: Dict[str, Any], preliminary: bool = False) -> D
)
def validate_config_consistency(conf: Dict[str, Any], preliminary: bool = False) -> None:
def validate_config_consistency(conf: Dict[str, Any], *, preliminary: bool = False) -> None:
"""
Validate the configuration consistency.
Should be ran after loading both configuration and strategy,
@@ -86,7 +86,7 @@ def validate_config_consistency(conf: Dict[str, Any], preliminary: bool = False)
_validate_ask_orderbook(conf)
_validate_freqai_hyperopt(conf)
_validate_freqai_backtest(conf)
_validate_freqai_include_timeframes(conf)
_validate_freqai_include_timeframes(conf, preliminary=preliminary)
_validate_consumers(conf)
validate_migrated_strategy_settings(conf)
@@ -335,7 +335,7 @@ def _validate_freqai_hyperopt(conf: Dict[str, Any]) -> None:
'Using analyze-per-epoch parameter is not supported with a FreqAI strategy.')
def _validate_freqai_include_timeframes(conf: Dict[str, Any]) -> None:
def _validate_freqai_include_timeframes(conf: Dict[str, Any], preliminary: bool) -> None:
freqai_enabled = conf.get('freqai', {}).get('enabled', False)
if freqai_enabled:
main_tf = conf.get('timeframe', '5m')
@@ -355,7 +355,7 @@ def _validate_freqai_include_timeframes(conf: Dict[str, Any]) -> None:
f"`include_timeframes`.Offending include-timeframes: {', '.join(offending_lines)}")
# Ensure that the base timeframe is included in the include_timeframes list
if main_tf not in freqai_include_timeframes:
if not preliminary and main_tf not in freqai_include_timeframes:
feature_parameters = conf.get('freqai', {}).get('feature_parameters', {})
include_timeframes = [main_tf] + freqai_include_timeframes
conf.get('freqai', {}).get('feature_parameters', {}) \
+3
View File
@@ -490,6 +490,9 @@ class Configuration:
self._args_to_config(config, argname='lookahead_analysis_exportfilename',
logstring='Path to store lookahead-analysis-results: {}')
self._args_to_config(config, argname='startup_candle',
logstring='Startup candle to be used on recursive analysis: {}')
def _process_runmode(self, config: Config) -> None:
self._args_to_config(config, argname='dry_run',
+12 -2
View File
@@ -33,7 +33,7 @@ HYPEROPT_LOSS_BUILTIN = ['ShortTradeDurHyperOptLoss', 'OnlyProfitHyperOptLoss',
'MaxDrawDownHyperOptLoss', 'MaxDrawDownRelativeHyperOptLoss',
'ProfitDrawDownHyperOptLoss']
AVAILABLE_PAIRLISTS = ['StaticPairList', 'VolumePairList', 'ProducerPairList', 'RemotePairList',
'AgeFilter', 'OffsetFilter', 'PerformanceFilter',
'AgeFilter', "FullTradesFilter", 'OffsetFilter', 'PerformanceFilter',
'PrecisionFilter', 'PriceFilter', 'RangeStabilityFilter',
'ShuffleFilter', 'SpreadFilter', 'VolatilityFilter']
AVAILABLE_PROTECTIONS = ['CooldownPeriod',
@@ -77,7 +77,8 @@ DL_DATA_TIMEFRAMES = ['1m', '5m']
ENV_VAR_PREFIX = 'FREQTRADE__'
NON_OPEN_EXCHANGE_STATES = ('cancelled', 'canceled', 'closed', 'expired')
CANCELED_EXCHANGE_STATES = ('cancelled', 'canceled', 'expired')
NON_OPEN_EXCHANGE_STATES = CANCELED_EXCHANGE_STATES + ('closed',)
# Define decimals per coin for outputs
# Only used for outputs.
@@ -177,6 +178,11 @@ CONF_SCHEMA = {
'minimum_trade_amount': {'type': 'number', 'default': 10},
'targeted_trade_amount': {'type': 'number', 'default': 20},
'lookahead_analysis_exportfilename': {'type': 'string'},
'startup_candle': {
'type': 'array',
'uniqueItems': True,
'default': [199, 399, 499, 999, 1999],
},
'liquidation_buffer': {'type': 'number', 'minimum': 0.0, 'maximum': 0.99},
'backtest_breakdown': {
'type': 'array',
@@ -688,6 +694,7 @@ CANCEL_REASON = {
"CANCELLED_ON_EXCHANGE": "cancelled on exchange",
"FORCE_EXIT": "forcesold",
"REPLACE": "cancelled to be replaced by new limit order",
"REPLACE_FAILED": "failed to replace order, deleting Trade",
"USER_CANCEL": "user requested order cancel"
}
@@ -709,3 +716,6 @@ Config = Dict[str, Any]
# Exchange part of the configuration.
ExchangeConfig = Dict[str, Any]
IntOrInf = float
EntryExecuteMode = Literal['initial', 'pos_adjust', 'replace']
+4 -1
View File
@@ -326,7 +326,10 @@ def load_backtest_data(filename: Union[Path, str], strategy: Optional[str] = Non
"Please specify a strategy.")
if strategy not in data['strategy']:
raise ValueError(f"Strategy {strategy} not available in the backtest result.")
raise ValueError(
f"Strategy {strategy} not available in the backtest result. "
f"Available strategies are '{','.join(data['strategy'].keys())}'"
)
data = data['strategy'][strategy]['trades']
df = pd.DataFrame(data)
+28
View File
@@ -0,0 +1,28 @@
from freqtrade.data.converter.converter import (clean_ohlcv_dataframe, convert_ohlcv_format,
ohlcv_fill_up_missing_data, ohlcv_to_dataframe,
order_book_to_dataframe, reduce_dataframe_footprint,
trim_dataframe, trim_dataframes)
from freqtrade.data.converter.trade_converter import (convert_trades_format,
convert_trades_to_ohlcv, trades_convert_types,
trades_df_remove_duplicates,
trades_dict_to_list, trades_list_to_df,
trades_to_ohlcv)
__all__ = [
'clean_ohlcv_dataframe',
'convert_ohlcv_format',
'ohlcv_fill_up_missing_data',
'ohlcv_to_dataframe',
'order_book_to_dataframe',
'reduce_dataframe_footprint',
'trim_dataframe',
'trim_dataframes',
'convert_trades_format',
'convert_trades_to_ohlcv',
'trades_convert_types',
'trades_df_remove_duplicates',
'trades_dict_to_list',
'trades_list_to_df',
'trades_to_ohlcv',
]
@@ -2,14 +2,13 @@
Functions to convert data from one format to another
"""
import logging
from typing import Dict, List
from typing import Dict
import numpy as np
import pandas as pd
from pandas import DataFrame, to_datetime
from freqtrade.constants import (DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS, TRADES_DTYPES,
Config, TradeList)
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, Config
from freqtrade.enums import CandleType, TradingMode
@@ -105,7 +104,7 @@ def ohlcv_fill_up_missing_data(dataframe: DataFrame, timeframe: str, pair: str)
df = dataframe.resample(resample_interval, on='date').agg(ohlcv_dict)
# Forwardfill close for missing columns
df['close'] = df['close'].fillna(method='ffill')
df['close'] = df['close'].ffill()
# Use close for "open, high, low"
df.loc[:, ['open', 'high', 'low']] = df[['open', 'high', 'low']].fillna(
value={'open': df['close'],
@@ -117,8 +116,8 @@ def ohlcv_fill_up_missing_data(dataframe: DataFrame, timeframe: str, pair: str)
len_after = len(df)
pct_missing = (len_after - len_before) / len_before if len_before > 0 else 0
if len_before != len_after:
message = (f"Missing data fillup for {pair}: before: {len_before} - after: {len_after}"
f" - {pct_missing:.2%}")
message = (f"Missing data fillup for {pair}, {timeframe}: "
f"before: {len_before} - after: {len_after} - {pct_missing:.2%}")
if pct_missing > 0.01:
logger.info(message)
else:
@@ -194,97 +193,6 @@ def order_book_to_dataframe(bids: list, asks: list) -> DataFrame:
return frame
def trades_df_remove_duplicates(trades: pd.DataFrame) -> pd.DataFrame:
"""
Removes duplicates from the trades DataFrame.
Uses pandas.DataFrame.drop_duplicates to remove duplicates based on the 'timestamp' column.
:param trades: DataFrame with the columns constants.DEFAULT_TRADES_COLUMNS
:return: DataFrame with duplicates removed based on the 'timestamp' column
"""
return trades.drop_duplicates(subset=['timestamp', 'id'])
def trades_dict_to_list(trades: List[Dict]) -> TradeList:
"""
Convert fetch_trades result into a List (to be more memory efficient).
:param trades: List of trades, as returned by ccxt.fetch_trades.
:return: List of Lists, with constants.DEFAULT_TRADES_COLUMNS as columns
"""
return [[t[col] for col in DEFAULT_TRADES_COLUMNS] for t in trades]
def trades_convert_types(trades: DataFrame) -> DataFrame:
"""
Convert Trades dtypes and add 'date' column
"""
trades = trades.astype(TRADES_DTYPES)
trades['date'] = to_datetime(trades['timestamp'], unit='ms', utc=True)
return trades
def trades_list_to_df(trades: TradeList, convert: bool = True):
"""
convert trades list to dataframe
:param trades: List of Lists with constants.DEFAULT_TRADES_COLUMNS as columns
"""
if not trades:
df = DataFrame(columns=DEFAULT_TRADES_COLUMNS)
else:
df = DataFrame(trades, columns=DEFAULT_TRADES_COLUMNS)
if convert:
df = trades_convert_types(df)
return df
def trades_to_ohlcv(trades: DataFrame, timeframe: str) -> DataFrame:
"""
Converts trades list to OHLCV list
:param trades: List of trades, as returned by ccxt.fetch_trades.
:param timeframe: Timeframe to resample data to
:return: OHLCV Dataframe.
:raises: ValueError if no trades are provided
"""
from freqtrade.exchange import timeframe_to_minutes
timeframe_minutes = timeframe_to_minutes(timeframe)
if trades.empty:
raise ValueError('Trade-list empty.')
df = trades.set_index('date', drop=True)
df_new = df['price'].resample(f'{timeframe_minutes}min').ohlc()
df_new['volume'] = df['amount'].resample(f'{timeframe_minutes}min').sum()
df_new['date'] = df_new.index
# Drop 0 volume rows
df_new = df_new.dropna()
return df_new.loc[:, DEFAULT_DATAFRAME_COLUMNS]
def convert_trades_format(config: Config, convert_from: str, convert_to: str, erase: bool):
"""
Convert trades from one format to another format.
:param config: Config dictionary
:param convert_from: Source format
:param convert_to: Target format
:param erase: Erase source data (does not apply if source and target format are identical)
"""
from freqtrade.data.history.idatahandler import get_datahandler
src = get_datahandler(config['datadir'], convert_from)
trg = get_datahandler(config['datadir'], convert_to)
if 'pairs' not in config:
config['pairs'] = src.trades_get_pairs(config['datadir'])
logger.info(f"Converting trades for {config['pairs']}")
for pair in config['pairs']:
data = src.trades_load(pair=pair)
logger.info(f"Converting {len(data)} trades for {pair}")
trg.trades_store(pair, data)
if erase and convert_from != convert_to:
logger.info(f"Deleting source Trade data for {pair}.")
src.trades_purge(pair=pair)
def convert_ohlcv_format(
config: Config,
convert_from: str,
+155
View File
@@ -0,0 +1,155 @@
"""
Functions to convert data from one format to another
"""
import logging
from pathlib import Path
from typing import Dict, List
import pandas as pd
from pandas import DataFrame, to_datetime
from freqtrade.configuration import TimeRange
from freqtrade.constants import (DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS, TRADES_DTYPES,
Config, TradeList)
from freqtrade.enums import CandleType
from freqtrade.exceptions import OperationalException
logger = logging.getLogger(__name__)
def trades_df_remove_duplicates(trades: pd.DataFrame) -> pd.DataFrame:
"""
Removes duplicates from the trades DataFrame.
Uses pandas.DataFrame.drop_duplicates to remove duplicates based on the 'timestamp' column.
:param trades: DataFrame with the columns constants.DEFAULT_TRADES_COLUMNS
:return: DataFrame with duplicates removed based on the 'timestamp' column
"""
return trades.drop_duplicates(subset=['timestamp', 'id'])
def trades_dict_to_list(trades: List[Dict]) -> TradeList:
"""
Convert fetch_trades result into a List (to be more memory efficient).
:param trades: List of trades, as returned by ccxt.fetch_trades.
:return: List of Lists, with constants.DEFAULT_TRADES_COLUMNS as columns
"""
return [[t[col] for col in DEFAULT_TRADES_COLUMNS] for t in trades]
def trades_convert_types(trades: DataFrame) -> DataFrame:
"""
Convert Trades dtypes and add 'date' column
"""
trades = trades.astype(TRADES_DTYPES)
trades['date'] = to_datetime(trades['timestamp'], unit='ms', utc=True)
return trades
def trades_list_to_df(trades: TradeList, convert: bool = True):
"""
convert trades list to dataframe
:param trades: List of Lists with constants.DEFAULT_TRADES_COLUMNS as columns
"""
if not trades:
df = DataFrame(columns=DEFAULT_TRADES_COLUMNS)
else:
df = DataFrame(trades, columns=DEFAULT_TRADES_COLUMNS)
if convert:
df = trades_convert_types(df)
return df
def trades_to_ohlcv(trades: DataFrame, timeframe: str) -> DataFrame:
"""
Converts trades list to OHLCV list
:param trades: List of trades, as returned by ccxt.fetch_trades.
:param timeframe: Timeframe to resample data to
:return: OHLCV Dataframe.
:raises: ValueError if no trades are provided
"""
from freqtrade.exchange import timeframe_to_minutes
timeframe_minutes = timeframe_to_minutes(timeframe)
if trades.empty:
raise ValueError('Trade-list empty.')
df = trades.set_index('date', drop=True)
df_new = df['price'].resample(f'{timeframe_minutes}min').ohlc()
df_new['volume'] = df['amount'].resample(f'{timeframe_minutes}min').sum()
df_new['date'] = df_new.index
# Drop 0 volume rows
df_new = df_new.dropna()
return df_new.loc[:, DEFAULT_DATAFRAME_COLUMNS]
def convert_trades_to_ohlcv(
pairs: List[str],
timeframes: List[str],
datadir: Path,
timerange: TimeRange,
erase: bool = False,
data_format_ohlcv: str = 'feather',
data_format_trades: str = 'feather',
candle_type: CandleType = CandleType.SPOT
) -> None:
"""
Convert stored trades data to ohlcv data
"""
from freqtrade.data.history.idatahandler import get_datahandler
data_handler_trades = get_datahandler(datadir, data_format=data_format_trades)
data_handler_ohlcv = get_datahandler(datadir, data_format=data_format_ohlcv)
if not pairs:
pairs = data_handler_trades.trades_get_pairs(datadir)
logger.info(f"About to convert pairs: '{', '.join(pairs)}', "
f"intervals: '{', '.join(timeframes)}' to {datadir}")
for pair in pairs:
trades = data_handler_trades.trades_load(pair)
for timeframe in timeframes:
if erase:
if data_handler_ohlcv.ohlcv_purge(pair, timeframe, candle_type=candle_type):
logger.info(f'Deleting existing data for pair {pair}, interval {timeframe}.')
try:
ohlcv = trades_to_ohlcv(trades, timeframe)
# Store ohlcv
data_handler_ohlcv.ohlcv_store(pair, timeframe, data=ohlcv, candle_type=candle_type)
except ValueError:
logger.exception(f'Could not convert {pair} to OHLCV.')
def convert_trades_format(config: Config, convert_from: str, convert_to: str, erase: bool):
"""
Convert trades from one format to another format.
:param config: Config dictionary
:param convert_from: Source format
:param convert_to: Target format
:param erase: Erase source data (does not apply if source and target format are identical)
"""
if convert_from == 'kraken_csv':
if config['exchange']['name'] != 'kraken':
raise OperationalException(
'Converting from csv is only supported for kraken.'
'Please refer to the documentation for details about this special mode.'
)
from freqtrade.data.converter.trade_converter_kraken import import_kraken_trades_from_csv
import_kraken_trades_from_csv(config, convert_to)
return
from freqtrade.data.history.idatahandler import get_datahandler
src = get_datahandler(config['datadir'], convert_from)
trg = get_datahandler(config['datadir'], convert_to)
if 'pairs' not in config:
config['pairs'] = src.trades_get_pairs(config['datadir'])
logger.info(f"Converting trades for {config['pairs']}")
for pair in config['pairs']:
data = src.trades_load(pair=pair)
logger.info(f"Converting {len(data)} trades for {pair}")
trg.trades_store(pair, data)
if erase and convert_from != convert_to:
logger.info(f"Deleting source Trade data for {pair}.")
src.trades_purge(pair=pair)
@@ -0,0 +1,70 @@
import logging
from pathlib import Path
import pandas as pd
from freqtrade.constants import DATETIME_PRINT_FORMAT, DEFAULT_TRADES_COLUMNS, Config
from freqtrade.data.converter.trade_converter import (trades_convert_types,
trades_df_remove_duplicates)
from freqtrade.data.history.idatahandler import get_datahandler
from freqtrade.exceptions import OperationalException
from freqtrade.resolvers import ExchangeResolver
logger = logging.getLogger(__name__)
KRAKEN_CSV_TRADE_COLUMNS = ['timestamp', 'price', 'amount']
def import_kraken_trades_from_csv(config: Config, convert_to: str):
"""
Import kraken trades from csv
"""
if config['exchange']['name'] != 'kraken':
raise OperationalException('This function is only for the kraken exchange.')
datadir: Path = config['datadir']
data_handler = get_datahandler(datadir, data_format=convert_to)
tradesdir: Path = config['datadir'] / 'trades_csv'
exchange = ExchangeResolver.load_exchange(config, validate=False)
# iterate through directories in this directory
data_symbols = {p.stem for p in tradesdir.rglob('*.csv')}
# create pair/filename mapping
markets = {
(m['symbol'], m['altname']) for m in exchange.markets.values()
if m.get('altname') in data_symbols
}
logger.info(f"Found csv files for {', '.join(data_symbols)}.")
for pair, name in markets:
dfs = []
# Load and combine all csv files for this pair
for f in tradesdir.rglob(f"{name}.csv"):
df = pd.read_csv(f, names=KRAKEN_CSV_TRADE_COLUMNS)
dfs.append(df)
# Load existing trades data
if not dfs:
# edgecase, can only happen if the file was deleted between the above glob and here
logger.info(f"No data found for pair {pair}")
continue
trades = pd.concat(dfs, ignore_index=True)
trades.loc[:, 'timestamp'] = trades['timestamp'] * 1e3
trades.loc[:, 'cost'] = trades['price'] * trades['amount']
for col in DEFAULT_TRADES_COLUMNS:
if col not in trades.columns:
trades[col] = ''
trades = trades[DEFAULT_TRADES_COLUMNS]
trades = trades_convert_types(trades)
trades_df = trades_df_remove_duplicates(trades)
logger.info(f"{pair}: {len(trades_df)} trades, from "
f"{trades_df['date'].min():{DATETIME_PRINT_FORMAT}} to "
f"{trades_df['date'].max():{DATETIME_PRINT_FORMAT}}")
data_handler.trades_store(pair, trades_df)
+12 -3
View File
@@ -119,8 +119,15 @@ def _do_group_table_output(bigdf, glist, csv_path: Path, to_csv=False, ):
new['avg_win'] = (new['profit_abs_wins'] / new.iloc[:, 1]).fillna(0)
new['avg_loss'] = (new['profit_abs_loss'] / new.iloc[:, 2]).fillna(0)
new.columns = ['total_num_buys', 'wins', 'losses', 'profit_abs_wins', 'profit_abs_loss',
'profit_tot', 'wl_ratio_pct', 'avg_win', 'avg_loss']
new['exp_ratio'] = (
(
(1 + (new['avg_win'] / abs(new['avg_loss']))) * (new['wl_ratio_pct'] / 100)
) - 1).fillna(0)
new.columns = ['total_num_buys', 'wins', 'losses',
'profit_abs_wins', 'profit_abs_loss',
'profit_tot', 'wl_ratio_pct',
'avg_win', 'avg_loss', 'exp_ratio']
sortcols = ['total_num_buys']
@@ -204,7 +211,9 @@ def prepare_results(analysed_trades, stratname,
timerange=None):
res_df = pd.DataFrame()
for pair, trades in analysed_trades[stratname].items():
res_df = pd.concat([res_df, trades], ignore_index=True)
if (trades.shape[0] > 0):
trades.dropna(subset=['close_date'], inplace=True)
res_df = pd.concat([res_df, trades], ignore_index=True)
res_df = _select_rows_within_dates(res_df, timerange)
+3 -33
View File
@@ -9,9 +9,9 @@ from pandas import DataFrame, concat
from freqtrade.configuration import TimeRange
from freqtrade.constants import (DATETIME_PRINT_FORMAT, DEFAULT_DATAFRAME_COLUMNS,
DL_DATA_TIMEFRAMES, Config)
from freqtrade.data.converter import (clean_ohlcv_dataframe, ohlcv_to_dataframe,
trades_df_remove_duplicates, trades_list_to_df,
trades_to_ohlcv)
from freqtrade.data.converter import (clean_ohlcv_dataframe, convert_trades_to_ohlcv,
ohlcv_to_dataframe, trades_df_remove_duplicates,
trades_list_to_df)
from freqtrade.data.history.idatahandler import IDataHandler, get_datahandler
from freqtrade.enums import CandleType
from freqtrade.exceptions import OperationalException
@@ -429,36 +429,6 @@ def refresh_backtest_trades_data(exchange: Exchange, pairs: List[str], datadir:
return pairs_not_available
def convert_trades_to_ohlcv(
pairs: List[str],
timeframes: List[str],
datadir: Path,
timerange: TimeRange,
erase: bool = False,
data_format_ohlcv: str = 'feather',
data_format_trades: str = 'feather',
candle_type: CandleType = CandleType.SPOT
) -> None:
"""
Convert stored trades data to ohlcv data
"""
data_handler_trades = get_datahandler(datadir, data_format=data_format_trades)
data_handler_ohlcv = get_datahandler(datadir, data_format=data_format_ohlcv)
for pair in pairs:
trades = data_handler_trades.trades_load(pair)
for timeframe in timeframes:
if erase:
if data_handler_ohlcv.ohlcv_purge(pair, timeframe, candle_type=candle_type):
logger.info(f'Deleting existing data for pair {pair}, interval {timeframe}.')
try:
ohlcv = trades_to_ohlcv(trades, timeframe)
# Store ohlcv
data_handler_ohlcv.ohlcv_store(pair, timeframe, data=ohlcv, candle_type=candle_type)
except ValueError:
logger.exception(f'Could not convert {pair} to OHLCV.')
def get_timerange(data: Dict[str, DataFrame]) -> Tuple[datetime, datetime]:
"""
Get the maximum common timerange for the given backtest data.
+1 -1
View File
@@ -4,8 +4,8 @@ from freqtrade.exchange.common import remove_exchange_credentials, MAP_EXCHANGE_
from freqtrade.exchange.exchange import Exchange
# isort: on
from freqtrade.exchange.binance import Binance
from freqtrade.exchange.bitmart import Bitmart
from freqtrade.exchange.bitpanda import Bitpanda
from freqtrade.exchange.bittrex import Bittrex
from freqtrade.exchange.bitvavo import Bitvavo
from freqtrade.exchange.bybit import Bybit
from freqtrade.exchange.coinbasepro import Coinbasepro
+8 -2
View File
@@ -21,6 +21,8 @@ class Binance(Exchange):
_ft_has: Dict = {
"stoploss_on_exchange": True,
"stop_price_param": "stopPrice",
"stop_price_prop": "stopPrice",
"stoploss_order_types": {"limit": "stop_loss_limit"},
"order_time_in_force": ["GTC", "FOK", "IOC", "PO"],
"ohlcv_candle_limit": 1000,
@@ -121,10 +123,14 @@ class Binance(Exchange):
def funding_fee_cutoff(self, open_date: datetime):
"""
Funding fees are only charged at full hours (usually every 4-8h).
Therefore a trade opening at 10:00:01 will not be charged a funding fee until the next hour.
On binance, this cutoff is 15s.
https://github.com/freqtrade/freqtrade/pull/5779#discussion_r740175931
:param open_date: The open date for a trade
:return: The cutoff open time for when a funding fee is charged
:return: True if the date falls on a full hour, False otherwise
"""
return open_date.minute > 0 or (open_date.minute == 0 and open_date.second > 15)
return open_date.minute == 0 and open_date.second < 15
def dry_run_liquidation_price(
self,
File diff suppressed because it is too large Load Diff
+20
View File
@@ -0,0 +1,20 @@
""" Bitmart exchange subclass """
import logging
from typing import Dict
from freqtrade.exchange import Exchange
logger = logging.getLogger(__name__)
class Bitmart(Exchange):
"""
Bitmart exchange class. Contains adjustments needed for Freqtrade to work
with this exchange.
"""
_ft_has: Dict = {
"stoploss_on_exchange": False, # Bitmart API does not support stoploss orders
"ohlcv_candle_limit": 200,
}
-25
View File
@@ -1,25 +0,0 @@
""" Bittrex exchange subclass """
import logging
from typing import Dict
from freqtrade.exchange import Exchange
logger = logging.getLogger(__name__)
class Bittrex(Exchange):
"""
Bittrex exchange class. Contains adjustments needed for Freqtrade to work
with this exchange.
"""
_ft_has: Dict = {
"ohlcv_candle_limit_per_timeframe": {
'1m': 1440,
'5m': 288,
'1h': 744,
'1d': 365,
},
"l2_limit_range": [1, 25, 500],
}
+40 -6
View File
@@ -1,16 +1,16 @@
""" Bybit exchange subclass """
import logging
from datetime import datetime
from datetime import datetime, timedelta
from typing import Any, Dict, List, Optional, Tuple
import ccxt
from freqtrade.constants import BuySell
from freqtrade.enums import MarginMode, PriceType, TradingMode
from freqtrade.enums.candletype import CandleType
from freqtrade.exceptions import DDosProtection, OperationalException, TemporaryError
from freqtrade.enums import CandleType, MarginMode, PriceType, TradingMode
from freqtrade.exceptions import DDosProtection, ExchangeError, OperationalException, TemporaryError
from freqtrade.exchange import Exchange
from freqtrade.exchange.common import retrier
from freqtrade.util.datetime_helpers import dt_now, dt_ts
logger = logging.getLogger(__name__)
@@ -29,6 +29,7 @@ class Bybit(Exchange):
_ft_has: Dict = {
"ohlcv_candle_limit": 1000,
"ohlcv_has_history": True,
"order_time_in_force": ["GTC", "FOK", "IOC", "PO"],
}
_ft_has_futures: Dict = {
"ohlcv_has_history": True,
@@ -36,6 +37,8 @@ class Bybit(Exchange):
"funding_fee_timeframe": "8h",
"stoploss_on_exchange": True,
"stoploss_order_types": {"limit": "limit", "market": "market"},
# bybit response parsing fails to populate stopLossPrice
"stop_price_prop": "stopPrice",
"stop_price_type_field": "triggerBy",
"stop_price_type_value_mapping": {
PriceType.LAST: "LastPrice",
@@ -200,6 +203,37 @@ class Bybit(Exchange):
"""
# Bybit does not provide "applied" funding fees per position.
if self.trading_mode == TradingMode.FUTURES:
return self._fetch_and_calculate_funding_fees(
pair, amount, is_short, open_date)
try:
return self._fetch_and_calculate_funding_fees(
pair, amount, is_short, open_date)
except ExchangeError:
logger.warning(f"Could not update funding fees for {pair}.")
return 0.0
def fetch_orders(self, pair: str, since: datetime, params: Optional[Dict] = None) -> List[Dict]:
"""
Fetch all orders for a pair "since"
:param pair: Pair for the query
:param since: Starting time for the query
"""
# On bybit, the distance between since and "until" can't exceed 7 days.
# we therefore need to split the query into multiple queries.
orders = []
while since < dt_now():
until = since + timedelta(days=7, minutes=-1)
orders += super().fetch_orders(pair, since, params={'until': dt_ts(until)})
since = until
return orders
def fetch_order(self, order_id: str, pair: str, params: Dict = {}) -> Dict:
order = super().fetch_order(order_id, pair, params)
if (
order.get('status') == 'canceled'
and order.get('filled') == 0.0
and order.get('remaining') == 0.0
):
# Canceled orders will have "remaining=0" on bybit.
order['remaining'] = None
return order
+1 -1
View File
@@ -52,7 +52,7 @@ MAP_EXCHANGE_CHILDCLASS = {
SUPPORTED_EXCHANGES = [
'binance',
'bittrex',
'bitmart',
'gate',
'huobi',
'kraken',
+92 -60
View File
@@ -23,8 +23,7 @@ from freqtrade.constants import (DEFAULT_AMOUNT_RESERVE_PERCENT, NON_OPEN_EXCHAN
BuySell, Config, EntryExit, ExchangeConfig,
ListPairsWithTimeframes, MakerTaker, OBLiteral, PairWithTimeframe)
from freqtrade.data.converter import clean_ohlcv_dataframe, ohlcv_to_dataframe, trades_dict_to_list
from freqtrade.enums import OPTIMIZE_MODES, CandleType, MarginMode, TradingMode
from freqtrade.enums.pricetype import PriceType
from freqtrade.enums import OPTIMIZE_MODES, CandleType, MarginMode, PriceType, TradingMode
from freqtrade.exceptions import (DDosProtection, ExchangeError, InsufficientFundsError,
InvalidOrderException, OperationalException, PricingError,
RetryableOrderError, TemporaryError)
@@ -62,7 +61,8 @@ class Exchange:
# or by specifying them in the configuration.
_ft_has_default: Dict = {
"stoploss_on_exchange": False,
"stop_price_param": "stopPrice",
"stop_price_param": "stopLossPrice", # Used for stoploss_on_exchange request
"stop_price_prop": "stopLossPrice", # Used for stoploss_on_exchange response parsing
"order_time_in_force": ["GTC"],
"ohlcv_params": {},
"ohlcv_candle_limit": 500,
@@ -330,6 +330,7 @@ class Exchange:
Exchange ohlcv candle limit
Uses ohlcv_candle_limit_per_timeframe if the exchange has different limits
per timeframe (e.g. bittrex), otherwise falls back to ohlcv_candle_limit
TODO: this is most likely no longer needed since only bittrex needed this.
:param timeframe: Timeframe to check
:param candle_type: Candle-type
:param since_ms: Starting timestamp
@@ -486,11 +487,14 @@ class Exchange:
except ccxt.BaseError:
logger.exception('Unable to initialize markets.')
def reload_markets(self) -> None:
def reload_markets(self, force: bool = False) -> None:
"""Reload markets both sync and async if refresh interval has passed """
# Check whether markets have to be reloaded
if (self._last_markets_refresh > 0) and (
self._last_markets_refresh + self.markets_refresh_interval > dt_ts()):
if (
not force
and self._last_markets_refresh > 0
and (self._last_markets_refresh + self.markets_refresh_interval > dt_ts())
):
return None
logger.debug("Performing scheduled market reload..")
try:
@@ -832,7 +836,7 @@ class Exchange:
rate: float, leverage: float, params: Dict = {},
stop_loss: bool = False) -> Dict[str, Any]:
now = dt_now()
order_id = f'dry_run_{side}_{now.timestamp()}'
order_id = f'dry_run_{side}_{pair}_{now.timestamp()}'
# Rounding here must respect to contract sizes
_amount = self._contracts_to_amount(
pair, self.amount_to_precision(pair, self._amount_to_contracts(pair, amount)))
@@ -856,15 +860,15 @@ class Exchange:
}
if stop_loss:
dry_order["info"] = {"stopPrice": dry_order["price"]}
dry_order[self._ft_has['stop_price_param']] = dry_order["price"]
dry_order[self._ft_has['stop_price_prop']] = dry_order["price"]
# Workaround to avoid filling stoploss orders immediately
dry_order["ft_order_type"] = "stoploss"
orderbook: Optional[OrderBook] = None
if self.exchange_has('fetchL2OrderBook'):
orderbook = self.fetch_l2_order_book(pair, 20)
if ordertype == "limit" and orderbook:
# Allow a 3% price difference
allowed_diff = 0.03
# Allow a 1% price difference
allowed_diff = 0.01
if self._dry_is_price_crossed(pair, side, rate, orderbook, allowed_diff):
logger.info(
f"Converted order {pair} to market order due to price {rate} crossing spread "
@@ -920,7 +924,7 @@ class Exchange:
max_slippage_val = rate * ((1 + slippage) if side == 'buy' else (1 - slippage))
remaining_amount = amount
filled_amount = 0.0
filled_value = 0.0
book_entry_price = 0.0
for book_entry in orderbook[ob_type]:
book_entry_price = book_entry[0]
@@ -928,17 +932,17 @@ class Exchange:
if remaining_amount > 0:
if remaining_amount < book_entry_coin_volume:
# Orderbook at this slot bigger than remaining amount
filled_amount += remaining_amount * book_entry_price
filled_value += remaining_amount * book_entry_price
break
else:
filled_amount += book_entry_coin_volume * book_entry_price
filled_value += book_entry_coin_volume * book_entry_price
remaining_amount -= book_entry_coin_volume
else:
break
else:
# If remaining_amount wasn't consumed completely (break was not called)
filled_amount += remaining_amount * book_entry_price
forecast_avg_filled_price = max(filled_amount, 0) / amount
filled_value += remaining_amount * book_entry_price
forecast_avg_filled_price = max(filled_value, 0) / amount
# Limit max. slippage to specified value
if side == 'buy':
forecast_avg_filled_price = min(forecast_avg_filled_price, max_slippage_val)
@@ -1008,7 +1012,7 @@ class Exchange:
from freqtrade.persistence import Order
order = Order.order_by_id(order_id)
if order:
ccxt_order = order.to_ccxt_object(self._ft_has['stop_price_param'])
ccxt_order = order.to_ccxt_object(self._ft_has['stop_price_prop'])
self._dry_run_open_orders[order_id] = ccxt_order
return ccxt_order
# Gracefully handle errors with dry-run orders.
@@ -1080,6 +1084,13 @@ class Exchange:
rate_for_order,
params,
)
if order.get('status') is None:
# Map empty status to open.
order['status'] = 'open'
if order.get('type') is None:
order['type'] = ordertype
self._log_exchange_response('create_order', order)
order = self._order_contracts_to_amount(order)
return order
@@ -1109,7 +1120,7 @@ class Exchange:
"""
if not self._ft_has.get('stoploss_on_exchange'):
raise OperationalException(f"stoploss is not implemented for {self.name}.")
price_param = self._ft_has['stop_price_param']
price_param = self._ft_has['stop_price_prop']
return (
order.get(price_param, None) is None
or ((side == "sell" and stop_loss > float(order[price_param])) or
@@ -1221,16 +1232,16 @@ class Exchange:
return order
except ccxt.InsufficientFunds as e:
raise InsufficientFundsError(
f'Insufficient funds to create {ordertype} sell order on market {pair}. '
f'Tried to sell amount {amount} at rate {limit_rate}. '
f'Message: {e}') from e
except ccxt.InvalidOrder as e:
f'Insufficient funds to create {ordertype} {side} order on market {pair}. '
f'Tried to {side} amount {amount} at rate {limit_rate} with '
f'stop-price {stop_price_norm}. Message: {e}') from e
except (ccxt.InvalidOrder, ccxt.BadRequest) as e:
# Errors:
# `Order would trigger immediately.`
raise InvalidOrderException(
f'Could not create {ordertype} sell order on market {pair}. '
f'Tried to sell amount {amount} at rate {limit_rate}. '
f'Message: {e}') from e
f'Could not create {ordertype} {side} order on market {pair}. '
f'Tried to {side} amount {amount} at rate {limit_rate} with '
f'stop-price {stop_price_norm}. Message: {e}') from e
except ccxt.DDoSProtection as e:
raise DDosProtection(e) from e
except (ccxt.NetworkError, ccxt.ExchangeError) as e:
@@ -1421,8 +1432,17 @@ class Exchange:
except ccxt.BaseError as e:
raise OperationalException(e) from e
def _fetch_orders_emulate(self, pair: str, since_ms: int) -> List[Dict]:
orders = []
if self.exchange_has('fetchClosedOrders'):
orders = self._api.fetch_closed_orders(pair, since=since_ms)
if self.exchange_has('fetchOpenOrders'):
orders_open = self._api.fetch_open_orders(pair, since=since_ms)
orders.extend(orders_open)
return orders
@retrier(retries=0)
def fetch_orders(self, pair: str, since: datetime) -> List[Dict]:
def fetch_orders(self, pair: str, since: datetime, params: Optional[Dict] = None) -> List[Dict]:
"""
Fetch all orders for a pair "since"
:param pair: Pair for the query
@@ -1431,26 +1451,20 @@ class Exchange:
if self._config['dry_run']:
return []
def fetch_orders_emulate() -> List[Dict]:
orders = []
if self.exchange_has('fetchClosedOrders'):
orders = self._api.fetch_closed_orders(pair, since=since_ms)
if self.exchange_has('fetchOpenOrders'):
orders_open = self._api.fetch_open_orders(pair, since=since_ms)
orders.extend(orders_open)
return orders
try:
since_ms = int((since.timestamp() - 10) * 1000)
if self.exchange_has('fetchOrders'):
if not params:
params = {}
try:
orders: List[Dict] = self._api.fetch_orders(pair, since=since_ms)
orders: List[Dict] = self._api.fetch_orders(pair, since=since_ms, params=params)
except ccxt.NotSupported:
# Some exchanges don't support fetchOrders
# attempt to fetch open and closed orders separately
orders = fetch_orders_emulate()
orders = self._fetch_orders_emulate(pair, since_ms)
else:
orders = fetch_orders_emulate()
orders = self._fetch_orders_emulate(pair, since_ms)
self._log_exchange_response('fetch_orders', orders)
orders = [self._order_contracts_to_amount(o) for o in orders]
return orders
@@ -1486,8 +1500,9 @@ class Exchange:
@retrier
def fetch_bids_asks(self, symbols: Optional[List[str]] = None, cached: bool = False) -> Dict:
"""
:param symbols: List of symbols to fetch
:param cached: Allow cached result
:return: fetch_tickers result
:return: fetch_bids_asks result
"""
if not self.exchange_has('fetchBidsAsks'):
return {}
@@ -1536,6 +1551,12 @@ class Exchange:
raise OperationalException(
f'Exchange {self._api.name} does not support fetching tickers in batch. '
f'Message: {e}') from e
except ccxt.BadSymbol as e:
logger.warning(f"Could not load tickers due to {e.__class__.__name__}. Message: {e} ."
"Reloading markets.")
self.reload_markets(True)
# Re-raise exception to repeat the call.
raise TemporaryError from e
except ccxt.DDoSProtection as e:
raise DDosProtection(e) from e
except (ccxt.NetworkError, ccxt.ExchangeError) as e:
@@ -1944,7 +1965,7 @@ class Exchange:
results = await asyncio.gather(*input_coro, return_exceptions=True)
for res in results:
if isinstance(res, Exception):
if isinstance(res, BaseException):
logger.warning(f"Async code raised an exception: {repr(res)}")
if raise_:
raise
@@ -2269,6 +2290,7 @@ class Exchange:
from_id = t[-1][1]
else:
logger.debug("Stopping as no more trades were returned.")
break
except asyncio.CancelledError:
logger.debug("Async operation Interrupted, breaking trades DL loop.")
@@ -2294,6 +2316,11 @@ class Exchange:
try:
t = await self._async_fetch_trades(pair, since=since)
if t:
# No more trades to download available at the exchange,
# So we repeatedly get the same trade over and over again.
if since == t[-1][0] and len(t) == 1:
logger.debug("Stopping because no more trades are available.")
break
since = t[-1][0]
trades.extend(t)
# Reached the end of the defined-download period
@@ -2302,6 +2329,7 @@ class Exchange:
f"Stopping because until was reached. {t[-1][0]} > {until}")
break
else:
logger.debug("Stopping as no more trades were returned.")
break
except asyncio.CancelledError:
logger.debug("Async operation Interrupted, breaking trades DL loop.")
@@ -2643,12 +2671,14 @@ class Exchange:
"""
return 0.0
def funding_fee_cutoff(self, open_date: datetime):
def funding_fee_cutoff(self, open_date: datetime) -> bool:
"""
Funding fees are only charged at full hours (usually every 4-8h).
Therefore a trade opening at 10:00:01 will not be charged a funding fee until the next hour.
:param open_date: The open date for a trade
:return: The cutoff open time for when a funding fee is charged
:return: True if the date falls on a full hour, False otherwise
"""
return open_date.minute > 0 or open_date.second > 0
return open_date.minute == 0 and open_date.second == 0
@retrier
def set_margin_mode(self, pair: str, margin_mode: MarginMode, accept_fail: bool = False,
@@ -2696,15 +2726,16 @@ class Exchange:
"""
if self.funding_fee_cutoff(open_date):
open_date += timedelta(hours=1)
# Shift back to 1h candle to avoid missing funding fees
# Only really relevant for trades very close to the full hour
open_date = timeframe_to_prev_date('1h', open_date)
timeframe = self._ft_has['mark_ohlcv_timeframe']
timeframe_ff = self._ft_has.get('funding_fee_timeframe',
self._ft_has['mark_ohlcv_timeframe'])
if not close_date:
close_date = datetime.now(timezone.utc)
open_timestamp = int(timeframe_to_prev_date(timeframe, open_date).timestamp()) * 1000
# close_timestamp = int(close_date.timestamp()) * 1000
since_ms = int(timeframe_to_prev_date(timeframe, open_date).timestamp()) * 1000
mark_comb: PairWithTimeframe = (
pair, timeframe, CandleType.from_string(self._ft_has["mark_ohlcv_price"]))
@@ -2712,7 +2743,7 @@ class Exchange:
funding_comb: PairWithTimeframe = (pair, timeframe_ff, CandleType.FUNDING_RATE)
candle_histories = self.refresh_latest_ohlcv(
[mark_comb, funding_comb],
since_ms=open_timestamp,
since_ms=since_ms,
cache=False,
drop_incomplete=False,
)
@@ -2723,8 +2754,7 @@ class Exchange:
except KeyError:
raise ExchangeError("Could not find funding rates.") from None
funding_mark_rates = self.combine_funding_and_mark(
funding_rates=funding_rates, mark_rates=mark_rates)
funding_mark_rates = self.combine_funding_and_mark(funding_rates, mark_rates)
return self.calculate_funding_fees(
funding_mark_rates,
@@ -2771,7 +2801,7 @@ class Exchange:
amount: float,
is_short: bool,
open_date: datetime,
close_date: Optional[datetime] = None,
close_date: datetime,
time_in_ratio: Optional[float] = None
) -> float:
"""
@@ -2787,8 +2817,8 @@ class Exchange:
fees: float = 0
if not df.empty:
df = df[(df['date'] >= open_date) & (df['date'] <= close_date)]
fees = sum(df['open_fund'] * df['open_mark'] * amount)
df1 = df[(df['date'] >= open_date) & (df['date'] <= close_date)]
fees = sum(df1['open_fund'] * df1['open_mark'] * amount)
# Negate fees for longs as funding_fees expects it this way based on live endpoints.
return fees if is_short else -fees
@@ -2803,17 +2833,19 @@ class Exchange:
:param amount: Trade amount
:param open_date: Open date of the trade
:return: funding fee since open_date
:raises: ExchangeError if something goes wrong.
"""
if self.trading_mode == TradingMode.FUTURES:
if self._config['dry_run']:
funding_fees = self._fetch_and_calculate_funding_fees(
pair, amount, is_short, open_date)
else:
funding_fees = self._get_funding_fees_from_exchange(pair, open_date)
return funding_fees
else:
return 0.0
try:
if self._config['dry_run']:
funding_fees = self._fetch_and_calculate_funding_fees(
pair, amount, is_short, open_date)
else:
funding_fees = self._get_funding_fees_from_exchange(pair, open_date)
return funding_fees
except ExchangeError:
logger.warning(f"Could not update funding fees for {pair}.")
return 0.0
def get_liquidation_price(
self,
+54 -10
View File
@@ -248,6 +248,39 @@ def amount_to_contract_precision(
return amount
def __price_to_precision_significant_digits(
price: float,
price_precision: float,
*,
rounding_mode: int = ROUND,
) -> float:
"""
Implementation of ROUND_UP/Round_down for significant digits mode.
"""
from decimal import ROUND_DOWN as dec_ROUND_DOWN
from decimal import ROUND_UP as dec_ROUND_UP
from decimal import Decimal
dec = Decimal(str(price))
string = f'{dec:f}'
precision = round(price_precision)
q = precision - dec.adjusted() - 1
sigfig = Decimal('10') ** -q
if q < 0:
string_to_precision = string[:precision]
# string_to_precision is '' when we have zero precision
below = sigfig * Decimal(string_to_precision if string_to_precision else '0')
above = below + sigfig
res = above if rounding_mode == ROUND_UP else below
precise = f'{res:f}'
else:
precise = '{:f}'.format(dec.quantize(
sigfig,
rounding=dec_ROUND_DOWN if rounding_mode == ROUND_DOWN else dec_ROUND_UP)
)
return float(precise)
def price_to_precision(
price: float,
price_precision: Optional[float],
@@ -271,28 +304,39 @@ def price_to_precision(
:return: price rounded up to the precision the Exchange accepts
"""
if price_precision is not None and precisionMode is not None:
if rounding_mode not in (ROUND_UP, ROUND_DOWN):
# Use CCXT code where possible.
return float(decimal_to_precision(price, rounding_mode=rounding_mode,
precision=price_precision,
counting_mode=precisionMode
))
if precisionMode == TICK_SIZE:
if rounding_mode == ROUND:
ticks = price / price_precision
rounded_ticks = round(ticks)
return rounded_ticks * price_precision
precision = FtPrecise(price_precision)
price_str = FtPrecise(price)
missing = price_str % precision
if not missing == FtPrecise("0"):
return round(float(str(price_str - missing + precision)), 14)
if rounding_mode == ROUND_UP:
res = price_str - missing + precision
elif rounding_mode == ROUND_DOWN:
res = price_str - missing
return round(float(str(res)), 14)
return price
elif precisionMode in (SIGNIFICANT_DIGITS, DECIMAL_PLACES):
elif precisionMode == DECIMAL_PLACES:
ndigits = round(price_precision)
if rounding_mode == ROUND:
return round(price, ndigits)
ticks = price * (10**ndigits)
if rounding_mode == ROUND_UP:
return ceil(ticks) / (10**ndigits)
if rounding_mode == TRUNCATE:
return int(ticks) / (10**ndigits)
if rounding_mode == ROUND_DOWN:
return floor(ticks) / (10**ndigits)
raise ValueError(f"Unknown rounding_mode {rounding_mode}")
elif precisionMode == SIGNIFICANT_DIGITS:
if rounding_mode in (ROUND_UP, ROUND_DOWN):
return __price_to_precision_significant_digits(
price, price_precision, rounding_mode=rounding_mode
)
raise ValueError(f"Unknown precisionMode {precisionMode}")
return price
+3 -1
View File
@@ -25,8 +25,10 @@ class Gate(Exchange):
_ft_has: Dict = {
"ohlcv_candle_limit": 1000,
"order_time_in_force": ['GTC', 'IOC'],
"stoploss_order_types": {"limit": "limit"},
"stoploss_on_exchange": True,
"stoploss_order_types": {"limit": "limit"},
"stop_price_param": "stopPrice",
"stop_price_prop": "stopPrice",
"marketOrderRequiresPrice": True,
}
+2
View File
@@ -17,6 +17,8 @@ class Huobi(Exchange):
_ft_has: Dict = {
"stoploss_on_exchange": True,
"stop_price_param": "stopPrice",
"stop_price_prop": "stopPrice",
"stoploss_order_types": {"limit": "stop-limit"},
"ohlcv_candle_limit": 1000,
"l2_limit_range": [5, 10, 20],
+3 -1
View File
@@ -24,6 +24,8 @@ class Kraken(Exchange):
_params: Dict = {"trading_agreement": "agree"}
_ft_has: Dict = {
"stoploss_on_exchange": True,
"stop_price_param": "stopPrice",
"stop_price_prop": "stopPrice",
"ohlcv_candle_limit": 720,
"ohlcv_has_history": False,
"trades_pagination": "id",
@@ -193,7 +195,7 @@ class Kraken(Exchange):
amount: float,
is_short: bool,
open_date: datetime,
close_date: Optional[datetime] = None,
close_date: datetime,
time_in_ratio: Optional[float] = None
) -> float:
"""
+2
View File
@@ -21,6 +21,8 @@ class Kucoin(Exchange):
_ft_has: Dict = {
"stoploss_on_exchange": True,
"stop_price_param": "stopPrice",
"stop_price_prop": "stopPrice",
"stoploss_order_types": {"limit": "limit", "market": "market"},
"l2_limit_range": [20, 100],
"l2_limit_range_required": False,
+19 -4
View File
@@ -1,16 +1,17 @@
import logging
from datetime import timedelta
from typing import Any, Dict, List, Optional, Tuple
import ccxt
from freqtrade.constants import BuySell
from freqtrade.enums import CandleType, MarginMode, TradingMode
from freqtrade.enums.pricetype import PriceType
from freqtrade.enums import CandleType, MarginMode, PriceType, TradingMode
from freqtrade.exceptions import (DDosProtection, OperationalException, RetryableOrderError,
TemporaryError)
from freqtrade.exchange import Exchange, date_minus_candles
from freqtrade.exchange.common import retrier
from freqtrade.misc import safe_value_fallback2
from freqtrade.util import dt_now, dt_ts
logger = logging.getLogger(__name__)
@@ -28,7 +29,6 @@ class Okx(Exchange):
"funding_fee_timeframe": "8h",
"stoploss_order_types": {"limit": "limit"},
"stoploss_on_exchange": True,
"stop_price_param": "stopLossPrice",
}
_ft_has_futures: Dict = {
"tickers_have_quoteVolume": False,
@@ -187,7 +187,7 @@ class Okx(Exchange):
def _convert_stop_order(self, pair: str, order_id: str, order: Dict) -> Dict:
if (
order['status'] == 'closed'
order.get('status', 'open') == 'closed'
and (real_order_id := order.get('info', {}).get('ordId')) is not None
):
# Once a order triggered, we fetch the regular followup order.
@@ -241,3 +241,18 @@ class Okx(Exchange):
pair=pair,
params=params1,
)
def _fetch_orders_emulate(self, pair: str, since_ms: int) -> List[Dict]:
orders = []
orders = self._api.fetch_closed_orders(pair, since=since_ms)
if (since_ms < dt_ts(dt_now() - timedelta(days=6, hours=23))):
# Regular fetch_closed_orders only returns 7 days of data.
# Force usage of "archive" endpoint, which returns 3 months of data.
params = {'method': 'privateGetTradeOrdersHistoryArchive'}
orders_hist = self._api.fetch_closed_orders(pair, since=since_ms, params=params)
orders.extend(orders_hist)
orders_open = self._api.fetch_open_orders(pair, since=since_ms)
orders.extend(orders_open)
return orders
+1 -1
View File
@@ -159,7 +159,7 @@ class BaseEnvironment(gym.Env):
function is designed for tracking incremented objects,
events, actions inside the training environment.
For example, a user can call this to track the
frequency of occurence of an `is_valid` call in
frequency of occurrence of an `is_valid` call in
their `calculate_reward()`:
def calculate_reward(self, action: int) -> float:
@@ -33,7 +33,7 @@ logger = logging.getLogger(__name__)
torch.multiprocessing.set_sharing_strategy('file_system')
SB3_MODELS = ['PPO', 'A2C', 'DQN']
SB3_CONTRIB_MODELS = ['TRPO', 'ARS', 'RecurrentPPO', 'MaskablePPO']
SB3_CONTRIB_MODELS = ['TRPO', 'ARS', 'RecurrentPPO', 'MaskablePPO', 'QRDQN']
class BaseReinforcementLearningModel(IFreqaiModel):
+43 -14
View File
@@ -12,7 +12,6 @@ import numpy as np
import pandas as pd
import psutil
import rapidjson
from joblib import dump, load
from joblib.externals import cloudpickle
from numpy.typing import NDArray
from pandas import DataFrame
@@ -263,23 +262,51 @@ class FreqaiDataDrawer:
self.pair_dict[metadata["pair"]] = self.empty_pair_dict.copy()
return
def set_initial_return_values(self, pair: str, pred_df: DataFrame) -> None:
def set_initial_return_values(self, pair: str,
pred_df: DataFrame,
dataframe: DataFrame
) -> None:
"""
Set the initial return values to the historical predictions dataframe. This avoids needing
to repredict on historical candles, and also stores historical predictions despite
retrainings (so stored predictions are true predictions, not just inferencing on trained
data)
data).
We also aim to keep the date from historical predictions so that the FreqUI displays
zeros during any downtime (between FreqAI reloads).
"""
hist_df = self.historic_predictions
len_diff = len(hist_df[pair].index) - len(pred_df.index)
if len_diff < 0:
df_concat = pd.concat([pred_df.iloc[:abs(len_diff)], hist_df[pair]],
ignore_index=True, keys=hist_df[pair].keys())
new_pred = pred_df.copy()
# set new_pred values to nans (we want to signal to user that there was nothing
# historically made during downtime. The newest pred will get appeneded later in
# append_model_predictions)
new_pred.iloc[:, :] = np.nan
new_pred["date_pred"] = dataframe["date"]
hist_preds = self.historic_predictions[pair].copy()
# ensure both dataframes have the same date format so they can be merged
new_pred["date_pred"] = pd.to_datetime(new_pred["date_pred"])
hist_preds["date_pred"] = pd.to_datetime(hist_preds["date_pred"])
# find the closest common date between new_pred and historic predictions
# and cut off the new_pred dataframe at that date
common_dates = pd.merge(new_pred, hist_preds, on="date_pred", how="inner")
if len(common_dates.index) > 0:
new_pred = new_pred.iloc[len(common_dates):]
else:
df_concat = hist_df[pair].tail(len(pred_df.index)).reset_index(drop=True)
logger.warning("No common dates found between new predictions and historic "
"predictions. You likely left your FreqAI instance offline "
f"for more than {len(dataframe.index)} candles.")
# reindex new_pred columns to match the historic predictions dataframe
new_pred_reindexed = new_pred.reindex(columns=hist_preds.columns)
df_concat = pd.concat([hist_preds, new_pred_reindexed], ignore_index=True)
# any missing values will get zeroed out so users can see the exact
# downtime in FreqUI
df_concat = df_concat.fillna(0)
self.model_return_values[pair] = df_concat
self.historic_predictions[pair] = df_concat
self.model_return_values[pair] = df_concat.tail(len(dataframe.index)).reset_index(drop=True)
def append_model_predictions(self, pair: str, predictions: DataFrame,
do_preds: NDArray[np.int_],
@@ -296,9 +323,9 @@ class FreqaiDataDrawer:
index = self.historic_predictions[pair].index[-1:]
columns = self.historic_predictions[pair].columns
nan_df = pd.DataFrame(np.nan, index=index, columns=columns)
zeros_df = pd.DataFrame(np.zeros((1, len(columns))), index=index, columns=columns)
self.historic_predictions[pair] = pd.concat(
[self.historic_predictions[pair], nan_df], ignore_index=True, axis=0)
[self.historic_predictions[pair], zeros_df], ignore_index=True, axis=0)
df = self.historic_predictions[pair]
# model outputs and associated statistics
@@ -449,7 +476,8 @@ class FreqaiDataDrawer:
# Save the trained model
if self.model_type == 'joblib':
dump(model, save_path / f"{dk.model_filename}_model.joblib")
with (save_path / f"{dk.model_filename}_model.joblib").open("wb") as fp:
cloudpickle.dump(model, fp)
elif self.model_type == 'keras':
model.save(save_path / f"{dk.model_filename}_model.h5")
elif self.model_type in ["stable_baselines3", "sb3_contrib", "pytorch"]:
@@ -536,7 +564,8 @@ class FreqaiDataDrawer:
if dk.live and coin in self.model_dictionary:
model = self.model_dictionary[coin]
elif self.model_type == 'joblib':
model = load(dk.data_path / f"{dk.model_filename}_model.joblib")
with (dk.data_path / f"{dk.model_filename}_model.joblib").open("rb") as fp:
model = cloudpickle.load(fp)
elif 'stable_baselines' in self.model_type or 'sb3_contrib' == self.model_type:
mod = importlib.import_module(
self.model_type, self.freqai_info['rl_config']['model_type'])
+8
View File
@@ -244,6 +244,14 @@ class FreqaiDataKitchen:
f"{self.pair}: dropped {len(unfiltered_df) - len(filtered_df)} training points"
f" due to NaNs in populated dataset {len(unfiltered_df)}."
)
if len(filtered_df) == 0 and not self.live:
raise OperationalException(
f"{self.pair}: all training data dropped due to NaNs. "
"You likely did not download enough training data prior "
"to your backtest timerange. Hint:\n"
f"{DOCS_LINK}/freqai-running/"
"#downloading-data-to-cover-the-full-backtest-period"
)
if (1 - len(filtered_df) / len(unfiltered_df)) > 0.1 and self.live:
worst_indicator = str(unfiltered_df.count().idxmin())
logger.warning(
+9 -5
View File
@@ -138,7 +138,6 @@ class IFreqaiModel(ABC):
:param metadata: pair metadata coming from strategy.
:param strategy: Strategy to train on
"""
self.live = strategy.dp.runmode in (RunMode.DRY_RUN, RunMode.LIVE)
self.dd.set_pair_dict_info(metadata)
self.data_provider = strategy.dp
@@ -394,6 +393,11 @@ class IFreqaiModel(ABC):
dk: FreqaiDataKitchen = Data management/analysis tool associated to present pair only
"""
if not strategy.process_only_new_candles:
raise OperationalException("You are trying to use a FreqAI strategy with "
"process_only_new_candles = False. This is not supported "
"by FreqAI, and it is therefore aborting.")
# get the model metadata associated with the current pair
(_, trained_timestamp) = self.dd.get_pair_dict_info(metadata["pair"])
@@ -453,7 +457,7 @@ class IFreqaiModel(ABC):
pred_df, do_preds = self.predict(dataframe, dk)
if pair not in self.dd.historic_predictions:
self.set_initial_historic_predictions(pred_df, dk, pair, dataframe)
self.dd.set_initial_return_values(pair, pred_df)
self.dd.set_initial_return_values(pair, pred_df, dataframe)
dk.return_dataframe = self.dd.attach_return_values_to_return_dataframe(pair, dataframe)
return
@@ -645,11 +649,11 @@ class IFreqaiModel(ABC):
If the user reuses an identifier on a subsequent instance,
this function will not be called. In that case, "real" predictions
will be appended to the loaded set of historic predictions.
:param df: DataFrame = the dataframe containing the training feature data
:param model: Any = A model which was `fit` using a common library such as
catboost or lightgbm
:param pred_df: DataFrame = the dataframe containing the predictions coming
out of a model
:param dk: FreqaiDataKitchen = object containing methods for data analysis
:param pair: str = current pair
:param strat_df: DataFrame = dataframe coming from strategy
"""
self.dd.historic_predictions[pair] = pred_df
@@ -27,6 +27,12 @@ class PyTorchTransformerRegressor(BasePyTorchRegressor):
...
"freqai": {
...
"conv_width": 30, // PyTorchTransformer is based on windowing
"feature_parameters": {
...
"include_shifted_candles": 0, // which removes the need for shifted candles
...
},
"model_training_parameters" : {
"learning_rate": 3e-4,
"trainer_kwargs": {
@@ -120,16 +126,16 @@ class PyTorchTransformerRegressor(BasePyTorchRegressor):
# create empty torch tensor
self.model.model.eval()
yb = torch.empty(0).to(self.device)
if x.shape[1] > 1:
if x.shape[1] > self.window_size:
ws = self.window_size
for i in range(0, x.shape[1] - ws):
xb = x[:, i:i + ws, :].to(self.device)
y = self.model.model(xb)
yb = torch.cat((yb, y), dim=0)
yb = torch.cat((yb, y), dim=1)
else:
yb = self.model.model(x)
yb = yb.cpu().squeeze()
yb = yb.cpu().squeeze(0)
pred_df = pd.DataFrame(yb.detach().numpy(), columns=dk.label_list)
pred_df, _, _ = dk.label_pipeline.inverse_transform(pred_df)
@@ -1,8 +1,9 @@
import logging
from pathlib import Path
from typing import Any, Dict, Type
from typing import Any, Dict, List, Optional, Type
import torch as th
from stable_baselines3.common.callbacks import ProgressBarCallback
from freqtrade.freqai.data_kitchen import FreqaiDataKitchen
from freqtrade.freqai.RL.Base5ActionRLEnv import Actions, Base5ActionRLEnv, Positions
@@ -73,19 +74,27 @@ class ReinforcementLearner(BaseReinforcementLearningModel):
'trained agent.')
model = self.dd.model_dictionary[dk.pair]
model.set_env(self.train_env)
callbacks: List[Any] = [self.eval_callback, self.tensorboard_callback]
progressbar_callback: Optional[ProgressBarCallback] = None
if self.rl_config.get('progress_bar', False):
progressbar_callback = ProgressBarCallback()
callbacks.insert(0, progressbar_callback)
model.learn(
total_timesteps=int(total_timesteps),
callback=[self.eval_callback, self.tensorboard_callback],
progress_bar=self.rl_config.get('progress_bar', False)
)
try:
model.learn(
total_timesteps=int(total_timesteps),
callback=callbacks,
)
finally:
if progressbar_callback:
progressbar_callback.on_training_end()
if Path(dk.data_path / "best_model.zip").is_file():
logger.info('Callback found a best model.')
best_model = self.MODELCLASS.load(dk.data_path / "best_model")
return best_model
logger.info('Couldnt find best model, using final model instead.')
logger.info("Couldn't find best model, using final model instead.")
return model
@@ -0,0 +1,82 @@
import logging
from typing import Any, Dict, Tuple
import numpy as np
import numpy.typing as npt
from pandas import DataFrame
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder
from freqtrade.freqai.base_models.BaseClassifierModel import BaseClassifierModel
from freqtrade.freqai.data_kitchen import FreqaiDataKitchen
logger = logging.getLogger(__name__)
class SKLearnRandomForestClassifier(BaseClassifierModel):
"""
User created prediction model. The class inherits IFreqaiModel, which
means it has full access to all Frequency AI functionality. Typically,
users would use this to override the common `fit()`, `train()`, or
`predict()` methods to add their custom data handling tools or change
various aspects of the training that cannot be configured via the
top level config.json file.
"""
def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen, **kwargs) -> Any:
"""
User sets up the training and test data to fit their desired model here
:param data_dictionary: the dictionary holding all data for train, test,
labels, weights
:param dk: The datakitchen object for the current coin/model
"""
X = data_dictionary["train_features"].to_numpy()
y = data_dictionary["train_labels"].to_numpy()[:, 0]
if self.freqai_info.get('data_split_parameters', {}).get('test_size', 0.1) == 0:
eval_set = None
else:
test_features = data_dictionary["test_features"].to_numpy()
test_labels = data_dictionary["test_labels"].to_numpy()[:, 0]
eval_set = (test_features, test_labels)
if self.freqai_info.get("continual_learning", False):
logger.warning("Continual learning is not supported for "
"SKLearnRandomForestClassifier, ignoring.")
train_weights = data_dictionary["train_weights"]
model = RandomForestClassifier(**self.model_training_parameters)
model.fit(X=X, y=y, sample_weight=train_weights)
if eval_set:
logger.info("Score: %s", model.score(eval_set[0], eval_set[1]))
return model
def predict(
self, unfiltered_df: DataFrame, dk: FreqaiDataKitchen, **kwargs
) -> Tuple[DataFrame, npt.NDArray[np.int_]]:
"""
Filter the prediction features data and predict with it.
:param unfiltered_df: Full dataframe for the current backtest period.
:return:
:pred_df: dataframe containing the predictions
:do_predict: np.array of 1s and 0s to indicate places where freqai needed to remove
data (NaNs) or felt uncertain about data (PCA and DI index)
"""
(pred_df, dk.do_predict) = super().predict(unfiltered_df, dk, **kwargs)
le = LabelEncoder()
label = dk.label_list[0]
labels_before = list(dk.data['labels_std'].keys())
labels_after = le.fit_transform(labels_before).tolist()
pred_df[label] = le.inverse_transform(pred_df[label])
pred_df = pred_df.rename(
columns={labels_after[i]: labels_before[i] for i in range(len(labels_before))})
return (pred_df, dk.do_predict)
@@ -45,7 +45,7 @@ class XGBoostRFRegressor(BaseRegressionModel):
model = XGBRFRegressor(**self.model_training_parameters)
model.set_params(callbacks=[TBCallback(dk.data_path)], activate=self.activate_tensorboard)
model.set_params(callbacks=[TBCallback(dk.data_path)])
model.fit(X=X, y=y, sample_weight=sample_weight, eval_set=eval_set,
sample_weight_eval_set=eval_weights, xgb_model=xgb_model)
# set the callbacks to empty so that we can serialize to disk later
@@ -45,7 +45,7 @@ class XGBoostRegressor(BaseRegressionModel):
model = XGBRegressor(**self.model_training_parameters)
model.set_params(callbacks=[TBCallback(dk.data_path)], activate=self.activate_tensorboard)
model.set_params(callbacks=[TBCallback(dk.data_path)])
model.fit(X=X, y=y, sample_weight=sample_weight, eval_set=eval_set,
sample_weight_eval_set=eval_weights, xgb_model=xgb_model)
# set the callbacks to empty so that we can serialize to disk later
@@ -3,7 +3,6 @@ from typing import Any, Dict, Type, Union
from stable_baselines3.common.callbacks import BaseCallback
from stable_baselines3.common.logger import HParam
from stable_baselines3.common.vec_env import VecEnv
from freqtrade.freqai.RL.BaseEnvironment import BaseActions
@@ -13,13 +12,9 @@ class TensorboardCallback(BaseCallback):
Custom callback for plotting additional values in tensorboard and
episodic summary reports.
"""
# Override training_env type to fix type errors
training_env: Union[VecEnv, None] = None
def __init__(self, verbose=1, actions: Type[Enum] = BaseActions):
super().__init__(verbose)
self.model: Any = None
self.logger: Any = None
self.actions: Type[Enum] = actions
def _on_training_start(self) -> None:
@@ -47,9 +42,13 @@ class TensorboardCallback(BaseCallback):
def _on_step(self) -> bool:
local_info = self.locals["infos"][0]
if self.training_env is None:
return True
tensorboard_metrics = self.training_env.get_attr("tensorboard_metrics")[0]
if hasattr(self.training_env, 'envs'):
tensorboard_metrics = self.training_env.envs[0].unwrapped.tensorboard_metrics
else:
# For RL-multiproc - usage of [0] might need to be evaluated
tensorboard_metrics = self.training_env.get_attr("tensorboard_metrics")[0]
for metric in local_info:
if metric not in ["episode", "terminal_observation"]:
+275 -203
View File
@@ -7,13 +7,14 @@ from copy import deepcopy
from datetime import datetime, time, timedelta, timezone
from math import isclose
from threading import Lock
from time import sleep
from typing import Any, Dict, List, Optional, Tuple
from schedule import Scheduler
from freqtrade import constants
from freqtrade.configuration import validate_config_consistency
from freqtrade.constants import BuySell, Config, ExchangeConfig, LongShort
from freqtrade.constants import BuySell, Config, EntryExecuteMode, ExchangeConfig, LongShort
from freqtrade.data.converter import order_book_to_dataframe
from freqtrade.data.dataprovider import DataProvider
from freqtrade.edge import Edge
@@ -21,9 +22,8 @@ from freqtrade.enums import (ExitCheckTuple, ExitType, RPCMessageType, RunMode,
State, TradingMode)
from freqtrade.exceptions import (DependencyException, ExchangeError, InsufficientFundsError,
InvalidOrderException, PricingError)
from freqtrade.exchange import (ROUND_DOWN, ROUND_UP, timeframe_to_minutes, timeframe_to_next_date,
timeframe_to_seconds)
from freqtrade.exchange.common import remove_exchange_credentials
from freqtrade.exchange import (ROUND_DOWN, ROUND_UP, remove_exchange_credentials,
timeframe_to_minutes, timeframe_to_next_date, timeframe_to_seconds)
from freqtrade.misc import safe_value_fallback, safe_value_fallback2
from freqtrade.mixins import LoggingMixin
from freqtrade.persistence import Order, PairLocks, Trade, init_db
@@ -33,8 +33,8 @@ from freqtrade.plugins.protectionmanager import ProtectionManager
from freqtrade.resolvers import ExchangeResolver, StrategyResolver
from freqtrade.rpc import RPCManager
from freqtrade.rpc.external_message_consumer import ExternalMessageConsumer
from freqtrade.rpc.rpc_types import (RPCBuyMsg, RPCCancelMsg, RPCProtectionMsg, RPCSellCancelMsg,
RPCSellMsg)
from freqtrade.rpc.rpc_types import (ProfitLossStr, RPCCancelMsg, RPCEntryMsg, RPCExitCancelMsg,
RPCExitMsg, RPCProtectionMsg)
from freqtrade.strategy.interface import IStrategy
from freqtrade.strategy.strategy_wrapper import strategy_safe_wrapper
from freqtrade.util import FtPrecise
@@ -132,7 +132,7 @@ class FreqtradeBot(LoggingMixin):
# TODO: This would be more efficient if scheduled in utc time, and performed at each
# TODO: funding interval, specified by funding_fee_times on the exchange classes
for time_slot in range(0, 24):
for minutes in [0, 15, 30, 45]:
for minutes in [1, 31]:
t = str(time(time_slot, minutes, 2))
self._schedule.every().day.at(t).do(update)
self.last_process: Optional[datetime] = None
@@ -199,6 +199,7 @@ class FreqtradeBot(LoggingMixin):
# Only update open orders on startup
# This will update the database after the initial migration
self.startup_update_open_orders()
self.update_funding_fees()
def process(self) -> None:
"""
@@ -312,22 +313,19 @@ class FreqtradeBot(LoggingMixin):
open_trades = Trade.get_open_trade_count()
return max(0, self.config['max_open_trades'] - open_trades)
def update_funding_fees(self):
def update_funding_fees(self) -> None:
if self.trading_mode == TradingMode.FUTURES:
trades = Trade.get_open_trades()
try:
for trade in trades:
funding_fees = self.exchange.get_funding_fees(
trades: List[Trade] = Trade.get_open_trades()
for trade in trades:
trade.set_funding_fees(
self.exchange.get_funding_fees(
pair=trade.pair,
amount=trade.amount,
is_short=trade.is_short,
open_date=trade.date_last_filled_utc
)
trade.funding_fees = funding_fees
except ExchangeError:
logger.warning("Could not update funding fees for open trades.")
open_date=trade.date_last_filled_utc)
)
def startup_backpopulate_precision(self):
def startup_backpopulate_precision(self) -> None:
trades = Trade.get_trades([Trade.contract_size.is_(None)])
for trade in trades:
@@ -373,15 +371,14 @@ class FreqtradeBot(LoggingMixin):
"Order is older than 5 days. Assuming order was fully cancelled.")
fo = order.to_ccxt_object()
fo['status'] = 'canceled'
self.handle_cancel_order(fo, order.trade, constants.CANCEL_REASON['TIMEOUT'])
self.handle_cancel_order(
fo, order, order.trade, constants.CANCEL_REASON['TIMEOUT']
)
except ExchangeError as e:
logger.warning(f"Error updating Order {order.order_id} due to {e}")
if self.trading_mode == TradingMode.FUTURES:
self._schedule.run_pending()
def update_trades_without_assigned_fees(self) -> None:
"""
Update closed trades without close fees assigned.
@@ -440,13 +437,6 @@ class FreqtradeBot(LoggingMixin):
if fo and fo['status'] == 'open':
# Assume this as the open stoploss order
trade.stoploss_order_id = order.order_id
elif order.ft_order_side == trade.exit_side:
if fo and fo['status'] == 'open':
# Assume this as the open order
trade.open_order_id = order.order_id
elif order.ft_order_side == trade.entry_side:
if fo and fo['status'] == 'open':
trade.open_order_id = order.order_id
if fo:
logger.info(f"Found {order} for trade {trade}.")
self.update_trade_state(trade, order.order_id, fo,
@@ -461,36 +451,48 @@ class FreqtradeBot(LoggingMixin):
Only used balance disappeared, which would make exiting impossible.
"""
try:
orders = self.exchange.fetch_orders(trade.pair, trade.open_date_utc)
orders = self.exchange.fetch_orders(
trade.pair, trade.open_date_utc - timedelta(seconds=10))
prev_exit_reason = trade.exit_reason
prev_trade_state = trade.is_open
for order in orders:
trade_order = [o for o in trade.orders if o.order_id == order['id']]
if trade_order:
continue
logger.info(f"Found previously unknown order {order['id']} for {trade.pair}.")
order_obj = Order.parse_from_ccxt_object(order, trade.pair, order['side'])
order_obj.order_filled_date = datetime.fromtimestamp(
safe_value_fallback(order, 'lastTradeTimestamp', 'timestamp') // 1000,
tz=timezone.utc)
trade.orders.append(order_obj)
# TODO: how do we handle open_order_id ...
Trade.commit()
prev_exit_reason = trade.exit_reason
trade.exit_reason = ExitType.SOLD_ON_EXCHANGE.value
self.update_trade_state(trade, order['id'], order)
if trade_order:
# We knew this order, but didn't have it updated properly
order_obj = trade_order[0]
else:
logger.info(f"Found previously unknown order {order['id']} for {trade.pair}.")
order_obj = Order.parse_from_ccxt_object(order, trade.pair, order['side'])
order_obj.order_filled_date = datetime.fromtimestamp(
safe_value_fallback(order, 'lastTradeTimestamp', 'timestamp') // 1000,
tz=timezone.utc)
trade.orders.append(order_obj)
Trade.commit()
trade.exit_reason = ExitType.SOLD_ON_EXCHANGE.value
self.update_trade_state(trade, order['id'], order, send_msg=False)
logger.info(f"handled order {order['id']}")
if not trade.is_open:
# Trade was just closed
trade.close_date = order_obj.order_filled_date
Trade.commit()
break
else:
trade.exit_reason = prev_exit_reason
Trade.commit()
# Refresh trade from database
Trade.session.refresh(trade)
if not trade.is_open:
# Trade was just closed
trade.close_date = trade.date_last_filled_utc
self.order_close_notify(trade, order_obj,
order_obj.ft_order_side == 'stoploss',
send_msg=prev_trade_state != trade.is_open)
else:
trade.exit_reason = prev_exit_reason
Trade.commit()
except ExchangeError:
logger.warning("Error finding onexchange order")
logger.warning("Error finding onexchange order.")
except Exception:
# catching https://github.com/freqtrade/freqtrade/issues/9025
logger.warning("Error finding onexchange order", exc_info=True)
#
# BUY / enter positions / open trades logic and methods
#
@@ -578,7 +580,8 @@ class FreqtradeBot(LoggingMixin):
else:
self.log_once(f"Pair {pair} is currently locked.", logger.info)
return False
stake_amount = self.wallets.get_trade_stake_amount(pair, self.edge)
stake_amount = self.wallets.get_trade_stake_amount(
pair, self.config['max_open_trades'], self.edge)
bid_check_dom = self.config.get('entry_pricing', {}).get('check_depth_of_market', {})
if ((bid_check_dom.get('enabled', False)) and
@@ -612,7 +615,8 @@ class FreqtradeBot(LoggingMixin):
# Walk through each pair and check if it needs changes
for trade in Trade.get_open_trades():
# If there is any open orders, wait for them to finish.
if trade.open_order_id is None:
# TODO Remove to allow mul open orders
if not trade.has_open_orders:
# Do a wallets update (will be ratelimited to once per hour)
self.wallets.update(False)
try:
@@ -662,7 +666,7 @@ class FreqtradeBot(LoggingMixin):
else:
logger.debug("Max adjustment entries is set to unlimited.")
self.execute_entry(trade.pair, stake_amount, price=current_entry_rate,
trade=trade, is_short=trade.is_short)
trade=trade, is_short=trade.is_short, mode='pos_adjust')
if stake_amount is not None and stake_amount < 0.0:
# We should decrease our position
@@ -732,7 +736,7 @@ class FreqtradeBot(LoggingMixin):
ordertype: Optional[str] = None,
enter_tag: Optional[str] = None,
trade: Optional[Trade] = None,
order_adjust: bool = False,
mode: EntryExecuteMode = 'initial',
leverage_: Optional[float] = None,
) -> bool:
"""
@@ -740,6 +744,7 @@ class FreqtradeBot(LoggingMixin):
:param pair: pair for which we want to create a LIMIT_BUY
:param stake_amount: amount of stake-currency for the pair
:return: True if a buy order is created, false if it fails.
:raise: DependencyException or it's subclasses like ExchangeError.
"""
time_in_force = self.strategy.order_time_in_force['entry']
@@ -749,22 +754,25 @@ class FreqtradeBot(LoggingMixin):
pos_adjust = trade is not None
enter_limit_requested, stake_amount, leverage = self.get_valid_enter_price_and_stake(
pair, price, stake_amount, trade_side, enter_tag, trade, order_adjust, leverage_,
pos_adjust)
pair, price, stake_amount, trade_side, enter_tag, trade, mode, leverage_)
if not stake_amount:
return False
msg = (f"Position adjust: about to create a new order for {pair} with stake: "
f"{stake_amount} for {trade}" if pos_adjust
msg = (f"Position adjust: about to create a new order for {pair} with stake_amount: "
f"{stake_amount} for {trade}" if mode == 'pos_adjust'
else
f"{name} signal found: about create a new trade for {pair} with stake_amount: "
f"{stake_amount} ...")
(f"Replacing {side} order: about create a new order for {pair} with stake_amount: "
f"{stake_amount} ..."
if mode == 'replace' else
f"{name} signal found: about create a new trade for {pair} with stake_amount: "
f"{stake_amount} ..."
))
logger.info(msg)
amount = (stake_amount / enter_limit_requested) * leverage
order_type = ordertype or self.strategy.order_types['entry']
if not pos_adjust and not strategy_safe_wrapper(
if mode == 'initial' and not strategy_safe_wrapper(
self.strategy.confirm_trade_entry, default_retval=True)(
pair=pair, order_type=order_type, amount=amount, rate=enter_limit_requested,
time_in_force=time_in_force, current_time=datetime.now(timezone.utc),
@@ -784,7 +792,7 @@ class FreqtradeBot(LoggingMixin):
order_obj = Order.parse_from_ccxt_object(order, pair, side, amount, enter_limit_requested)
order_id = order['id']
order_status = order.get('status')
logger.info(f"Order #{order_id} was created for {pair} and status is {order_status}.")
logger.info(f"Order {order_id} was created for {pair} and status is {order_status}.")
# we assume the order is executed at the price requested
enter_limit_filled_price = enter_limit_requested
@@ -823,14 +831,15 @@ class FreqtradeBot(LoggingMixin):
base_currency = self.exchange.get_pair_base_currency(pair)
open_date = datetime.now(timezone.utc)
funding_fees = self.exchange.get_funding_fees(
pair=pair,
amount=amount + trade.amount if trade else amount,
is_short=is_short,
open_date=trade.date_last_filled_utc if trade else open_date
)
# This is a new trade
if trade is None:
funding_fees = 0.0
try:
funding_fees = self.exchange.get_funding_fees(
pair=pair, amount=amount, is_short=is_short, open_date=open_date)
except ExchangeError:
logger.warning("Could not find funding fee.")
trade = Trade(
pair=pair,
@@ -846,7 +855,6 @@ class FreqtradeBot(LoggingMixin):
open_rate_requested=enter_limit_requested,
open_date=open_date,
exchange=self.exchange.id,
open_order_id=order_id,
strategy=self.strategy.get_strategy_name(),
enter_tag=enter_tag,
timeframe=timeframe_to_minutes(self.config['timeframe']),
@@ -867,7 +875,7 @@ class FreqtradeBot(LoggingMixin):
trade.is_open = True
trade.fee_open_currency = None
trade.open_rate_requested = enter_limit_requested
trade.open_order_id = order_id
trade.set_funding_fees(funding_fees)
trade.orders.append(order_obj)
trade.recalc_trade_from_orders()
@@ -896,7 +904,7 @@ class FreqtradeBot(LoggingMixin):
# First cancelling stoploss on exchange ...
if trade.stoploss_order_id:
try:
logger.info(f"Canceling stoploss on exchange for {trade}")
logger.info(f"Cancelling stoploss on exchange for {trade}")
co = self.exchange.cancel_stoploss_order_with_result(
trade.stoploss_order_id, trade.pair, trade.amount)
self.update_trade_state(trade, trade.stoploss_order_id, co, stoploss_order=True)
@@ -913,9 +921,8 @@ class FreqtradeBot(LoggingMixin):
trade_side: LongShort,
entry_tag: Optional[str],
trade: Optional[Trade],
order_adjust: bool,
mode: EntryExecuteMode,
leverage_: Optional[float],
pos_adjust: bool,
) -> Tuple[float, float, float]:
"""
Validate and eventually adjust (within limits) limit, amount and leverage
@@ -928,11 +935,12 @@ class FreqtradeBot(LoggingMixin):
# Calculate price
enter_limit_requested = self.exchange.get_rate(
pair, side='entry', is_short=(trade_side == 'short'), refresh=True)
if not order_adjust:
if mode != 'replace':
# Don't call custom_entry_price in order-adjust scenario
custom_entry_price = strategy_safe_wrapper(self.strategy.custom_entry_price,
default_retval=enter_limit_requested)(
pair=pair, current_time=datetime.now(timezone.utc),
pair=pair, trade=trade,
current_time=datetime.now(timezone.utc),
proposed_rate=enter_limit_requested, entry_tag=entry_tag,
side=trade_side,
)
@@ -967,7 +975,7 @@ class FreqtradeBot(LoggingMixin):
# edge-case for now.
min_stake_amount = self.exchange.get_min_pair_stake_amount(
pair, enter_limit_requested,
self.strategy.stoploss if not pos_adjust else 0.0,
self.strategy.stoploss if not mode != 'pos_adjust' else 0.0,
leverage)
max_stake_amount = self.exchange.get_max_pair_stake_amount(
pair, enter_limit_requested, leverage)
@@ -1007,7 +1015,7 @@ class FreqtradeBot(LoggingMixin):
current_rate = self.exchange.get_rate(
trade.pair, side='entry', is_short=trade.is_short, refresh=False)
msg: RPCBuyMsg = {
msg: RPCEntryMsg = {
'trade_id': trade.id,
'type': RPCMessageType.ENTRY_FILL if fill else RPCMessageType.ENTRY,
'buy_tag': trade.enter_tag,
@@ -1077,7 +1085,11 @@ class FreqtradeBot(LoggingMixin):
trades_closed = 0
for trade in trades:
if trade.open_order_id is None and not self.wallets.check_exit_amount(trade):
if (
not trade.has_open_orders
and not trade.stoploss_order_id
and not self.wallets.check_exit_amount(trade)
):
logger.warning(
f'Not enough {trade.safe_base_currency} in wallet to exit {trade}. '
'Trying to recover.')
@@ -1095,7 +1107,7 @@ class FreqtradeBot(LoggingMixin):
logger.warning(
f'Unable to handle stoploss on exchange for {trade.pair}: {exception}')
# Check if we can sell our current pair
if trade.open_order_id is None and trade.is_open and self.handle_trade(trade):
if not trade.has_open_orders and trade.is_open and self.handle_trade(trade):
trades_closed += 1
except DependencyException as exception:
@@ -1214,7 +1226,6 @@ class FreqtradeBot(LoggingMixin):
"""
logger.debug('Handling stoploss on exchange %s ...', trade)
stoploss_order = None
try:
@@ -1237,7 +1248,7 @@ class FreqtradeBot(LoggingMixin):
self.handle_protections(trade.pair, trade.trade_direction)
return True
if trade.open_order_id or not trade.is_open:
if trade.has_open_orders or not trade.is_open:
# Trade has an open Buy or Sell order, Stoploss-handling can't happen in this case
# as the Amount on the exchange is tied up in another trade.
# The trade can be closed already (sell-order fill confirmation came in this iteration)
@@ -1321,53 +1332,80 @@ class FreqtradeBot(LoggingMixin):
Timeout setting takes priority over limit order adjustment request.
:return: None
"""
for trade in Trade.get_open_order_trades():
try:
if not trade.open_order_id:
for trade in Trade.get_open_trades():
open_order: Order
for open_order in trade.open_orders:
try:
order = self.exchange.fetch_order(open_order.order_id, trade.pair)
except (ExchangeError):
logger.info(
'Cannot query order for %s due to %s', trade, traceback.format_exc()
)
continue
order = self.exchange.fetch_order(trade.open_order_id, trade.pair)
except (ExchangeError):
logger.info('Cannot query order for %s due to %s', trade, traceback.format_exc())
continue
fully_cancelled = self.update_trade_state(trade, trade.open_order_id, order)
not_closed = order['status'] == 'open' or fully_cancelled
order_obj = trade.select_order_by_order_id(trade.open_order_id)
fully_cancelled = self.update_trade_state(trade, open_order.order_id, order)
not_closed = order['status'] == 'open' or fully_cancelled
if not_closed:
if fully_cancelled or (order_obj and self.strategy.ft_check_timed_out(
trade, order_obj, datetime.now(timezone.utc))):
self.handle_cancel_order(order, trade, constants.CANCEL_REASON['TIMEOUT'])
else:
self.replace_order(order, order_obj, trade)
if not_closed:
if fully_cancelled or (
open_order and self.strategy.ft_check_timed_out(
trade, open_order, datetime.now(timezone.utc)
)
):
self.handle_cancel_order(
order, open_order, trade, constants.CANCEL_REASON['TIMEOUT']
)
else:
self.replace_order(order, open_order, trade)
def handle_cancel_order(self, order: Dict, trade: Trade, reason: str) -> None:
def handle_cancel_order(self, order: Dict, order_obj: Order, trade: Trade, reason: str) -> None:
"""
Check if current analyzed order timed out and cancel if necessary.
:param order: Order dict grabbed with exchange.fetch_order()
:param order_obj: Order object from the database.
:param trade: Trade object.
:return: None
"""
if order['side'] == trade.entry_side:
self.handle_cancel_enter(trade, order, reason)
self.handle_cancel_enter(trade, order, order_obj, reason)
else:
canceled = self.handle_cancel_exit(trade, order, reason)
canceled_count = trade.get_exit_order_count()
canceled = self.handle_cancel_exit(trade, order, order_obj, reason)
canceled_count = trade.get_canceled_exit_order_count()
max_timeouts = self.config.get('unfilledtimeout', {}).get('exit_timeout_count', 0)
if canceled and max_timeouts > 0 and canceled_count >= max_timeouts:
logger.warning(f'Emergency exiting trade {trade}, as the exit order '
f'timed out {max_timeouts} times.')
self.emergency_exit(trade, order['price'])
if (canceled and max_timeouts > 0 and canceled_count >= max_timeouts):
logger.warning(f"Emergency exiting trade {trade}, as the exit order "
f"timed out {max_timeouts} times. force selling {order['amount']}.")
self.emergency_exit(trade, order['price'], order['amount'])
def emergency_exit(self, trade: Trade, price: float) -> None:
def emergency_exit(
self, trade: Trade, price: float, sub_trade_amt: Optional[float] = None) -> None:
try:
self.execute_trade_exit(
trade, price,
exit_check=ExitCheckTuple(exit_type=ExitType.EMERGENCY_EXIT))
exit_check=ExitCheckTuple(exit_type=ExitType.EMERGENCY_EXIT),
sub_trade_amt=sub_trade_amt
)
except DependencyException as exception:
logger.warning(
f'Unable to emergency exit trade {trade.pair}: {exception}')
def replace_order_failed(self, trade: Trade, msg: str) -> None:
"""
Order replacement fail handling.
Deletes the trade if necessary.
:param trade: Trade object.
:param msg: Error message.
"""
logger.warning(msg)
if trade.nr_of_successful_entries == 0:
# this is the first entry and we didn't get filled yet, delete trade
logger.warning(f"Removing {trade} from database.")
self._notify_enter_cancel(
trade, order_type=self.strategy.order_types['entry'],
reason=constants.CANCEL_REASON['REPLACE_FAILED'])
trade.delete()
def replace_order(self, order: Dict, order_obj: Optional[Order], trade: Trade) -> None:
"""
Check if current analyzed entry order should be replaced or simply cancelled.
@@ -1397,7 +1435,7 @@ class FreqtradeBot(LoggingMixin):
trade=trade, order=order_obj, pair=trade.pair,
current_time=datetime.now(timezone.utc), proposed_rate=proposed_rate,
current_order_rate=order_obj.safe_price, entry_tag=trade.enter_tag,
side=trade.entry_side)
side=trade.trade_direction)
replacing = True
cancel_reason = constants.CANCEL_REASON['REPLACE']
@@ -1406,19 +1444,30 @@ class FreqtradeBot(LoggingMixin):
cancel_reason = constants.CANCEL_REASON['USER_CANCEL']
if order_obj.price != adjusted_entry_price:
# cancel existing order if new price is supplied or None
self.handle_cancel_enter(trade, order, cancel_reason,
replacing=replacing)
res = self.handle_cancel_enter(trade, order, order_obj, cancel_reason,
replacing=replacing)
if not res:
self.replace_order_failed(
trade, f"Could not cancel order for {trade}, therefore not replacing.")
return
if adjusted_entry_price:
# place new order only if new price is supplied
self.execute_entry(
pair=trade.pair,
stake_amount=(
order_obj.safe_remaining * order_obj.safe_price / trade.leverage),
price=adjusted_entry_price,
trade=trade,
is_short=trade.is_short,
order_adjust=True,
)
try:
if not self.execute_entry(
pair=trade.pair,
stake_amount=(
order_obj.safe_remaining * order_obj.safe_price / trade.leverage),
price=adjusted_entry_price,
trade=trade,
is_short=trade.is_short,
mode='replace',
):
self.replace_order_failed(
trade, f"Could not replace order for {trade}.")
except DependencyException as exception:
logger.warning(
f'Unable to replace order for {trade.pair}: {exception}')
self.replace_order_failed(trade, f"Could not replace order for {trade}.")
def cancel_all_open_orders(self) -> None:
"""
@@ -1426,38 +1475,39 @@ class FreqtradeBot(LoggingMixin):
:return: None
"""
for trade in Trade.get_open_order_trades():
if not trade.open_order_id:
continue
try:
order = self.exchange.fetch_order(trade.open_order_id, trade.pair)
except (ExchangeError):
logger.info('Cannot query order for %s due to %s', trade, traceback.format_exc())
continue
for trade in Trade.get_open_trades():
for open_order in trade.open_orders:
try:
order = self.exchange.fetch_order(open_order.order_id, trade.pair)
except (ExchangeError):
logger.info("Can't query order for %s due to %s", trade, traceback.format_exc())
continue
if order['side'] == trade.entry_side:
self.handle_cancel_enter(trade, order, constants.CANCEL_REASON['ALL_CANCELLED'])
if order['side'] == trade.entry_side:
self.handle_cancel_enter(
trade, order, open_order, constants.CANCEL_REASON['ALL_CANCELLED']
)
elif order['side'] == trade.exit_side:
self.handle_cancel_exit(trade, order, constants.CANCEL_REASON['ALL_CANCELLED'])
elif order['side'] == trade.exit_side:
self.handle_cancel_exit(
trade, order, open_order, constants.CANCEL_REASON['ALL_CANCELLED']
)
Trade.commit()
def handle_cancel_enter(
self, trade: Trade, order: Dict, reason: str,
replacing: Optional[bool] = False
self, trade: Trade, order: Dict, order_obj: Order,
reason: str, replacing: Optional[bool] = False
) -> bool:
"""
entry cancel - cancel order
:param order_obj: Order object from the database.
:param replacing: Replacing order - prevent trade deletion.
:return: True if trade was fully cancelled
"""
was_trade_fully_canceled = False
order_id = order_obj.order_id
side = trade.entry_side.capitalize()
if not trade.open_order_id:
logger.warning(f"No open order for {trade}.")
return False
# Cancelled orders may have the status of 'canceled' or 'closed'
if order['status'] not in constants.NON_OPEN_EXCHANGE_STATES:
filled_val: float = order.get('filled', 0.0) or 0.0
filled_stake = filled_val * trade.open_rate
@@ -1466,71 +1516,87 @@ class FreqtradeBot(LoggingMixin):
if filled_val > 0 and minstake and filled_stake < minstake:
logger.warning(
f"Order {trade.open_order_id} for {trade.pair} not cancelled, "
f"Order {order_id} for {trade.pair} not cancelled, "
f"as the filled amount of {filled_val} would result in an unexitable trade.")
return False
corder = self.exchange.cancel_order_with_result(trade.open_order_id, trade.pair,
trade.amount)
corder = self.exchange.cancel_order_with_result(order_id, trade.pair, trade.amount)
order_obj.ft_cancel_reason = reason
# if replacing, retry fetching the order 3 times if the status is not what we need
if replacing:
retry_count = 0
while (
corder.get('status') not in constants.NON_OPEN_EXCHANGE_STATES
and retry_count < 3
):
sleep(0.5)
corder = self.exchange.fetch_order(order_id, trade.pair)
retry_count += 1
# Avoid race condition where the order could not be cancelled coz its already filled.
# Simply bailing here is the only safe way - as this order will then be
# handled in the next iteration.
if corder.get('status') not in constants.NON_OPEN_EXCHANGE_STATES:
logger.warning(f"Order {trade.open_order_id} for {trade.pair} not cancelled.")
logger.warning(f"Order {order_id} for {trade.pair} not cancelled.")
return False
else:
# Order was cancelled already, so we can reuse the existing dict
corder = order
reason = constants.CANCEL_REASON['CANCELLED_ON_EXCHANGE']
if order_obj.ft_cancel_reason is None:
order_obj.ft_cancel_reason = constants.CANCEL_REASON['CANCELLED_ON_EXCHANGE']
logger.info(f'{side} order {reason} for {trade}.')
logger.info(f'{side} order {order_obj.ft_cancel_reason} for {trade}.')
# Using filled to determine the filled amount
filled_amount = safe_value_fallback2(corder, order, 'filled', 'filled')
if isclose(filled_amount, 0.0, abs_tol=constants.MATH_CLOSE_PREC):
was_trade_fully_canceled = True
# if trade is not partially completed and it's the only order, just delete the trade
open_order_count = len([order for order in trade.orders if order.status == 'open'])
if open_order_count <= 1 and trade.nr_of_successful_entries == 0 and not replacing:
open_order_count = len([
order for order in trade.orders if order.ft_is_open and order.order_id != order_id
])
if open_order_count < 1 and trade.nr_of_successful_entries == 0 and not replacing:
logger.info(f'{side} order fully cancelled. Removing {trade} from database.')
trade.delete()
was_trade_fully_canceled = True
reason += f", {constants.CANCEL_REASON['FULLY_CANCELLED']}"
order_obj.ft_cancel_reason += f", {constants.CANCEL_REASON['FULLY_CANCELLED']}"
else:
self.update_trade_state(trade, trade.open_order_id, corder)
trade.open_order_id = None
self.update_trade_state(trade, order_id, corder)
logger.info(f'{side} Order timeout for {trade}.')
else:
# update_trade_state (and subsequently recalc_trade_from_orders) will handle updates
# to the trade object
self.update_trade_state(trade, trade.open_order_id, corder)
trade.open_order_id = None
self.update_trade_state(trade, order_id, corder)
logger.info(f'Partial {trade.entry_side} order timeout for {trade}.')
reason += f", {constants.CANCEL_REASON['PARTIALLY_FILLED']}"
order_obj.ft_cancel_reason += f", {constants.CANCEL_REASON['PARTIALLY_FILLED']}"
self.wallets.update()
self._notify_enter_cancel(trade, order_type=self.strategy.order_types['entry'],
reason=reason)
reason=order_obj.ft_cancel_reason)
return was_trade_fully_canceled
def handle_cancel_exit(self, trade: Trade, order: Dict, reason: str) -> bool:
def handle_cancel_exit(
self, trade: Trade, order: Dict, order_obj: Order, reason: str
) -> bool:
"""
exit order cancel - cancel order and update trade
:return: True if exit order was cancelled, false otherwise
"""
order_id = order_obj.order_id
cancelled = False
# Cancelled orders may have the status of 'canceled' or 'closed'
if order['status'] not in constants.NON_OPEN_EXCHANGE_STATES:
filled_val: float = order.get('filled', 0.0) or 0.0
filled_rem_stake = trade.stake_amount - filled_val * trade.open_rate
filled_amt: float = order.get('filled', 0.0) or 0.0
# Filled val is in quote currency (after leverage)
filled_rem_stake = trade.stake_amount - (filled_amt * trade.open_rate / trade.leverage)
minstake = self.exchange.get_min_pair_stake_amount(
trade.pair, trade.open_rate, self.strategy.stoploss)
# Double-check remaining amount
if filled_val > 0:
if filled_amt > 0:
reason = constants.CANCEL_REASON['PARTIALLY_FILLED']
if minstake and filled_rem_stake < minstake:
logger.warning(
f"Order {trade.open_order_id} for {trade.pair} not cancelled, as "
f"the filled amount of {filled_val} would result in an unexitable trade.")
f"Order {order_id} for {trade.pair} not cancelled, as "
f"the filled amount of {filled_amt} would result in an unexitable trade.")
reason = constants.CANCEL_REASON['PARTIALLY_FILLED_KEEP_OPEN']
self._notify_exit_cancel(
@@ -1540,13 +1606,13 @@ class FreqtradeBot(LoggingMixin):
sub_trade=trade.amount != order['amount']
)
return False
order_obj.ft_cancel_reason = reason
try:
order = self.exchange.cancel_order_with_result(
order['id'], trade.pair, trade.amount)
except InvalidOrderException:
logger.exception(
f"Could not cancel {trade.exit_side} order {trade.open_order_id}")
f"Could not cancel {trade.exit_side} order {order_id}")
return False
# Set exit_reason for fill message
@@ -1555,25 +1621,26 @@ class FreqtradeBot(LoggingMixin):
# Order might be filled above in odd timing issues.
if order.get('status') in ('canceled', 'cancelled'):
trade.exit_reason = None
trade.open_order_id = None
else:
trade.exit_reason = exit_reason_prev
cancelled = True
else:
reason = constants.CANCEL_REASON['CANCELLED_ON_EXCHANGE']
if order_obj.ft_cancel_reason is None:
order_obj.ft_cancel_reason = constants.CANCEL_REASON['CANCELLED_ON_EXCHANGE']
trade.exit_reason = None
trade.open_order_id = None
self.update_trade_state(trade, order['id'], order)
logger.info(f'{trade.exit_side.capitalize()} order {reason} for {trade}.')
logger.info(
f'{trade.exit_side.capitalize()} order {order_obj.ft_cancel_reason} for {trade}.')
trade.close_rate = None
trade.close_rate_requested = None
self._notify_exit_cancel(
trade,
order_type=self.strategy.order_types['exit'],
reason=reason, order_id=order['id'], sub_trade=trade.amount != order['amount']
reason=order_obj.ft_cancel_reason, order_id=order['id'],
sub_trade=trade.amount != order['amount']
)
return cancelled
@@ -1625,15 +1692,13 @@ class FreqtradeBot(LoggingMixin):
:param exit_check: CheckTuple with signal and reason
:return: True if it succeeds False
"""
try:
trade.funding_fees = self.exchange.get_funding_fees(
trade.set_funding_fees(
self.exchange.get_funding_fees(
pair=trade.pair,
amount=trade.amount,
is_short=trade.is_short,
open_date=trade.date_last_filled_utc,
)
except ExchangeError:
logger.warning("Could not update funding fee.")
open_date=trade.date_last_filled_utc)
)
exit_type = 'exit'
exit_reason = exit_tag or exit_check.exit_reason
@@ -1696,7 +1761,6 @@ class FreqtradeBot(LoggingMixin):
order_obj = Order.parse_from_ccxt_object(order, trade.pair, trade.exit_side, amount, limit)
trade.orders.append(order_obj)
trade.open_order_id = order['id']
trade.exit_order_status = ''
trade.close_rate_requested = limit
trade.exit_reason = exit_reason
@@ -1704,7 +1768,7 @@ class FreqtradeBot(LoggingMixin):
self._notify_exit(trade, order_type, sub_trade=bool(sub_trade_amt), order=order_obj)
# In case of market sell orders the order can be closed immediately
if order.get('status', 'unknown') in ('closed', 'expired'):
self.update_trade_state(trade, trade.open_order_id, order)
self.update_trade_state(trade, order_obj.order_id, order)
Trade.commit()
return True
@@ -1723,16 +1787,14 @@ class FreqtradeBot(LoggingMixin):
amount = order.safe_filled if fill else order.safe_amount
order_rate: float = order.safe_price
profit = trade.calc_profit(rate=order_rate, amount=amount, open_rate=trade.open_rate)
profit_ratio = trade.calc_profit_ratio(order_rate, amount, trade.open_rate)
profit = trade.calculate_profit(order_rate, amount, trade.open_rate)
else:
order_rate = trade.safe_close_rate
profit = trade.calc_profit(rate=order_rate) + (0.0 if fill else trade.realized_profit)
profit_ratio = trade.calc_profit_ratio(order_rate)
profit = trade.calculate_profit(rate=order_rate)
amount = trade.amount
gain = "profit" if profit_ratio > 0 else "loss"
gain: ProfitLossStr = "profit" if profit.profit_ratio > 0 else "loss"
msg: RPCSellMsg = {
msg: RPCExitMsg = {
'type': (RPCMessageType.EXIT_FILL if fill
else RPCMessageType.EXIT),
'trade_id': trade.id,
@@ -1748,8 +1810,8 @@ class FreqtradeBot(LoggingMixin):
'open_rate': trade.open_rate,
'close_rate': order_rate,
'current_rate': current_rate,
'profit_amount': profit,
'profit_ratio': profit_ratio,
'profit_amount': profit.profit_abs if fill else profit.total_profit,
'profit_ratio': profit.profit_ratio,
'buy_tag': trade.enter_tag,
'enter_tag': trade.enter_tag,
'sell_reason': trade.exit_reason, # Deprecated
@@ -1781,13 +1843,12 @@ class FreqtradeBot(LoggingMixin):
order = self.order_obj_or_raise(order_id, order_or_none)
profit_rate: float = trade.safe_close_rate
profit_trade = trade.calc_profit(rate=profit_rate)
profit = trade.calculate_profit(rate=profit_rate)
current_rate = self.exchange.get_rate(
trade.pair, side='exit', is_short=trade.is_short, refresh=False)
profit_ratio = trade.calc_profit_ratio(profit_rate)
gain = "profit" if profit_ratio > 0 else "loss"
gain: ProfitLossStr = "profit" if profit.profit_ratio > 0 else "loss"
msg: RPCSellCancelMsg = {
msg: RPCExitCancelMsg = {
'type': RPCMessageType.EXIT_CANCEL,
'trade_id': trade.id,
'exchange': trade.exchange.capitalize(),
@@ -1800,8 +1861,8 @@ class FreqtradeBot(LoggingMixin):
'amount': order.safe_amount_after_fee,
'open_rate': trade.open_rate,
'current_rate': current_rate,
'profit_amount': profit_trade,
'profit_ratio': profit_ratio,
'profit_amount': profit.profit_abs,
'profit_ratio': profit.profit_ratio,
'buy_tag': trade.enter_tag,
'enter_tag': trade.enter_tag,
'sell_reason': trade.exit_reason, # Deprecated
@@ -1831,7 +1892,7 @@ class FreqtradeBot(LoggingMixin):
def update_trade_state(
self, trade: Trade, order_id: Optional[str],
action_order: Optional[Dict[str, Any]] = None,
action_order: Optional[Dict[str, Any]] = None, *,
stoploss_order: bool = False, send_msg: bool = True) -> bool:
"""
Checks trades with open orders and updates the amount if necessary
@@ -1860,7 +1921,7 @@ class FreqtradeBot(LoggingMixin):
if self.exchange.check_order_canceled_empty(order):
# Trade has been cancelled on exchange
# Handling of this will happen in check_handle_timedout.
# Handling of this will happen in handle_cancel_order.
return True
order_obj_or_none = trade.select_order_by_order_id(order_id)
@@ -1868,17 +1929,25 @@ class FreqtradeBot(LoggingMixin):
self.handle_order_fee(trade, order_obj, order)
trade.update_trade(order_obj)
trade.update_trade(order_obj, not send_msg)
if order.get('status') in constants.NON_OPEN_EXCHANGE_STATES:
trade = self._update_trade_after_fill(trade, order_obj)
Trade.commit()
self.order_close_notify(trade, order_obj, stoploss_order, send_msg)
return False
def _update_trade_after_fill(self, trade: Trade, order: Order) -> Trade:
if order.status in constants.NON_OPEN_EXCHANGE_STATES:
# If a entry order was closed, force update on stoploss on exchange
if order.get('side') == trade.entry_side:
if order.ft_order_side == trade.entry_side:
trade = self.cancel_stoploss_on_exchange(trade)
if not self.edge:
# TODO: should shorting/leverage be supported by Edge,
# then this will need to be fixed.
trade.adjust_stop_loss(trade.open_rate, self.strategy.stoploss, initial=True)
if order.get('side') == trade.entry_side or (trade.amount > 0 and trade.is_open):
if order.ft_order_side == trade.entry_side or (trade.amount > 0 and trade.is_open):
# Must also run for partial exits
# TODO: Margin will need to use interest_rate as well.
# interest_rate = self.exchange.get_interest_rate()
@@ -1894,13 +1963,16 @@ class FreqtradeBot(LoggingMixin):
))
except DependencyException:
logger.warning('Unable to calculate liquidation price')
if self.strategy.use_custom_stoploss:
current_rate = self.exchange.get_rate(
trade.pair, side='exit', is_short=trade.is_short, refresh=True)
profit = trade.calc_profit_ratio(current_rate)
self.strategy.ft_stoploss_adjust(current_rate, trade,
datetime.now(timezone.utc), profit, 0,
after_fill=True)
# Updating wallets when order is closed
self.wallets.update()
Trade.commit()
self.order_close_notify(trade, order_obj, stoploss_order, send_msg)
return False
return trade
def order_close_notify(
self, trade: Trade, order: Order, stoploss_order: bool, send_msg: bool):
@@ -1910,11 +1982,11 @@ class FreqtradeBot(LoggingMixin):
trade.amount, abs_tol=constants.MATH_CLOSE_PREC)
if order.ft_order_side == trade.exit_side:
# Exit notification
if send_msg and not stoploss_order and not trade.open_order_id:
if send_msg and not stoploss_order and order.order_id not in trade.open_orders_ids:
self._notify_exit(trade, '', fill=True, sub_trade=sub_trade, order=order)
if not trade.is_open:
self.handle_protections(trade.pair, trade.trade_direction)
elif send_msg and not trade.open_order_id and not stoploss_order:
elif send_msg and order.order_id not in trade.open_orders_ids and not stoploss_order:
# Enter fill
self._notify_enter(trade, order, order.order_type, fill=True, sub_trade=sub_trade)
+5 -7
View File
@@ -8,15 +8,13 @@ logger = logging.getLogger(__name__)
def set_loggers(verbosity: int = 0, api_verbosity: str = 'info') -> None:
"""
Set the logging level for third party libraries
:param verbosity: Verbosity level. amount of `-v` passed to the command line
:return: None
"""
logging.getLogger('requests').setLevel(
logging.INFO if verbosity <= 1 else logging.DEBUG
)
logging.getLogger("urllib3").setLevel(
logging.INFO if verbosity <= 1 else logging.DEBUG
)
for logger_name in ('requests', 'urllib3', 'httpcore'):
logging.getLogger(logger_name).setLevel(
logging.INFO if verbosity <= 1 else logging.DEBUG
)
logging.getLogger('ccxt.base.exchange').setLevel(
logging.INFO if verbosity <= 2 else logging.DEBUG
)
+2 -2
View File
@@ -11,8 +11,8 @@ from freqtrade.util.gc_setup import gc_set_threshold
# check min. python version
if sys.version_info < (3, 8): # pragma: no cover
sys.exit("Freqtrade requires Python version >= 3.8")
if sys.version_info < (3, 9): # pragma: no cover
sys.exit("Freqtrade requires Python version >= 3.9")
from freqtrade import __version__
from freqtrade.commands import Arguments
+4 -3
View File
@@ -3,6 +3,7 @@ Various tool function for Freqtrade and scripts
"""
import gzip
import logging
from io import StringIO
from pathlib import Path
from typing import Any, Dict, Iterator, List, Mapping, Optional, TextIO, Union
from urllib.parse import urlparse
@@ -156,7 +157,7 @@ def round_dict(d, n):
return {k: (round(v, n) if isinstance(v, float) else v) for k, v in d.items()}
def safe_value_fallback(obj: dict, key1: str, key2: str, default_value=None):
def safe_value_fallback(obj: dict, key1: str, key2: Optional[str] = None, default_value=None):
"""
Search a value in obj, return this if it's not None.
Then search key2 in obj - return that if it's not none - then use default_value.
@@ -165,7 +166,7 @@ def safe_value_fallback(obj: dict, key1: str, key2: str, default_value=None):
if key1 in obj and obj[key1] is not None:
return obj[key1]
else:
if key2 in obj and obj[key2] is not None:
if key2 and key2 in obj and obj[key2] is not None:
return obj[key2]
return default_value
@@ -231,7 +232,7 @@ def json_to_dataframe(data: str) -> pd.DataFrame:
:param data: A JSON string
:returns: A pandas DataFrame from the JSON string
"""
dataframe = pd.read_json(data, orient='split')
dataframe = pd.read_json(StringIO(data), orient='split')
if 'date' in dataframe.columns:
dataframe['date'] = pd.to_datetime(dataframe['date'], unit='ms', utc=True)
@@ -1,35 +1,23 @@
import logging
import shutil
from copy import deepcopy
from datetime import datetime, timedelta, timezone
from datetime import datetime, timedelta
from pathlib import Path
from typing import Any, Dict, List, Optional
from typing import Any, Dict, List
from pandas import DataFrame
from freqtrade.configuration import TimeRange
from freqtrade.data.history import get_timerange
from freqtrade.exchange import timeframe_to_minutes
from freqtrade.loggers.set_log_levels import (reduce_verbosity_for_bias_tester,
restore_verbosity_for_bias_tester)
from freqtrade.optimize.backtesting import Backtesting
from freqtrade.optimize.base_analysis import BaseAnalysis, VarHolder
logger = logging.getLogger(__name__)
class VarHolder:
timerange: TimeRange
data: DataFrame
indicators: Dict[str, DataFrame]
result: DataFrame
compared: DataFrame
from_dt: datetime
to_dt: datetime
compared_dt: datetime
timeframe: str
class Analysis:
def __init__(self) -> None:
self.total_signals = 0
@@ -39,29 +27,18 @@ class Analysis:
self.has_bias = False
class LookaheadAnalysis:
class LookaheadAnalysis(BaseAnalysis):
def __init__(self, config: Dict[str, Any], strategy_obj: Dict):
self.failed_bias_check = True
self.full_varHolder = VarHolder()
super().__init__(config, strategy_obj)
self.entry_varHolders: List[VarHolder] = []
self.exit_varHolders: List[VarHolder] = []
self.exchange: Optional[Any] = None
self._fee = None
# pull variables the scope of the lookahead_analysis-instance
self.local_config = deepcopy(config)
self.local_config['strategy'] = strategy_obj['name']
self.current_analysis = Analysis()
self.minimum_trade_amount = config['minimum_trade_amount']
self.targeted_trade_amount = config['targeted_trade_amount']
self.strategy_obj = strategy_obj
@staticmethod
def dt_to_timestamp(dt: datetime):
timestamp = int(dt.replace(tzinfo=timezone.utc).timestamp())
return timestamp
@staticmethod
def get_result(backtesting: Backtesting, processed: DataFrame):
@@ -117,8 +94,8 @@ class LookaheadAnalysis:
# compare_df now comprises tuples with [1] having either 'self' or 'other'
if 'other' in col_name[1]:
continue
self_value = compare_df_row[col_idx]
other_value = compare_df_row[col_idx + 1]
self_value = compare_df_row.iloc[col_idx]
other_value = compare_df_row.iloc[col_idx + 1]
# output differences
if self_value != other_value:
@@ -162,24 +139,6 @@ class LookaheadAnalysis:
varholder.indicators = backtesting.strategy.advise_all_indicators(varholder.data)
varholder.result = self.get_result(backtesting, varholder.indicators)
def fill_full_varholder(self):
self.full_varHolder = VarHolder()
# define datetime in human-readable format
parsed_timerange = TimeRange.parse_timerange(self.local_config['timerange'])
if parsed_timerange.startdt is None:
self.full_varHolder.from_dt = datetime.fromtimestamp(0, tz=timezone.utc)
else:
self.full_varHolder.from_dt = parsed_timerange.startdt
if parsed_timerange.stopdt is None:
self.full_varHolder.to_dt = datetime.utcnow()
else:
self.full_varHolder.to_dt = parsed_timerange.stopdt
self.prepare_data(self.full_varHolder, self.local_config['pairs'])
def fill_entry_and_exit_varHolders(self, result_row):
# entry_varHolder
entry_varHolder = VarHolder()
@@ -246,8 +205,7 @@ class LookaheadAnalysis:
def start(self) -> None:
# first make a single backtest
self.fill_full_varholder()
super().start()
reduce_verbosity_for_bias_tester()
@@ -7,7 +7,7 @@ import pandas as pd
from freqtrade.constants import Config
from freqtrade.exceptions import OperationalException
from freqtrade.optimize.lookahead_analysis import LookaheadAnalysis
from freqtrade.optimize.analysis.lookahead import LookaheadAnalysis
from freqtrade.resolvers import StrategyResolver
@@ -184,12 +184,12 @@ class LookaheadAnalysisSubFunctions:
lookaheadAnalysis_instances = []
# unify --strategy and --strategy_list to one list
# unify --strategy and --strategy-list to one list
if not (strategy_list := config.get('strategy_list', [])):
if config.get('strategy') is None:
raise OperationalException(
"No Strategy specified. Please specify a strategy via --strategy or "
"--strategy_list"
"--strategy-list"
)
strategy_list = [config['strategy']]
@@ -211,5 +211,5 @@ class LookaheadAnalysisSubFunctions:
else:
logger.error("There were no strategies specified neither through "
"--strategy nor through "
"--strategy_list "
"--strategy-list "
"or timeframe was not specified.")
+183
View File
@@ -0,0 +1,183 @@
import logging
import shutil
from copy import deepcopy
from datetime import timedelta
from pathlib import Path
from typing import Any, Dict, List
from pandas import DataFrame
from freqtrade.exchange import timeframe_to_minutes
from freqtrade.loggers.set_log_levels import (reduce_verbosity_for_bias_tester,
restore_verbosity_for_bias_tester)
from freqtrade.optimize.backtesting import Backtesting
from freqtrade.optimize.base_analysis import BaseAnalysis, VarHolder
logger = logging.getLogger(__name__)
class RecursiveAnalysis(BaseAnalysis):
def __init__(self, config: Dict[str, Any], strategy_obj: Dict):
self._startup_candle = config.get('startup_candle', [199, 399, 499, 999, 1999])
super().__init__(config, strategy_obj)
self.partial_varHolder_array: List[VarHolder] = []
self.partial_varHolder_lookahead_array: List[VarHolder] = []
self.dict_recursive: Dict[str, Any] = dict()
# For recursive bias check
# analyzes two data frames with processed indicators and shows differences between them.
def analyze_indicators(self):
pair_to_check = self.local_config['pairs'][0]
logger.info("Start checking for recursive bias")
# check and report signals
base_last_row = self.full_varHolder.indicators[pair_to_check].iloc[-1]
for part in self.partial_varHolder_array:
part_last_row = part.indicators[pair_to_check].iloc[-1]
compare_df = base_last_row.compare(part_last_row)
if compare_df.shape[0] > 0:
# print(compare_df)
for col_name, values in compare_df.items():
# print(col_name)
if 'other' == col_name:
continue
indicators = values.index
for indicator in indicators:
if (indicator not in self.dict_recursive):
self.dict_recursive[indicator] = {}
values_diff = compare_df.loc[indicator]
values_diff_self = values_diff.loc['self']
values_diff_other = values_diff.loc['other']
diff = (values_diff_other - values_diff_self) / values_diff_self * 100
self.dict_recursive[indicator][part.startup_candle] = f"{diff:.3f}%"
else:
logger.info("No variance on indicator(s) found due to recursive formula.")
break
# For lookahead bias check
# analyzes two data frames with processed indicators and shows differences between them.
def analyze_indicators_lookahead(self):
pair_to_check = self.local_config['pairs'][0]
logger.info("Start checking for lookahead bias on indicators only")
part = self.partial_varHolder_lookahead_array[0]
part_last_row = part.indicators[pair_to_check].iloc[-1]
date_to_check = part_last_row['date']
index_to_get = (self.full_varHolder.indicators[pair_to_check]['date'] == date_to_check)
base_row_check = self.full_varHolder.indicators[pair_to_check].loc[index_to_get].iloc[-1]
check_time = part.to_dt.strftime('%Y-%m-%dT%H:%M:%S')
logger.info(f"Check indicators at {check_time}")
# logger.info(f"vs {part_timerange} with {part.startup_candle} startup candle")
compare_df = base_row_check.compare(part_last_row)
if compare_df.shape[0] > 0:
# print(compare_df)
for col_name, values in compare_df.items():
# print(col_name)
if 'other' == col_name:
continue
indicators = values.index
for indicator in indicators:
logger.info(f"=> found lookahead in indicator {indicator}")
# logger.info("base value {:.5f}".format(values_diff_self))
# logger.info("part value {:.5f}".format(values_diff_other))
else:
logger.info("No lookahead bias on indicators found.")
def prepare_data(self, varholder: VarHolder, pairs_to_load: List[DataFrame]):
if 'freqai' in self.local_config and 'identifier' in self.local_config['freqai']:
# purge previous data if the freqai model is defined
# (to be sure nothing is carried over from older backtests)
path_to_current_identifier = (
Path(f"{self.local_config['user_data_dir']}/models/"
f"{self.local_config['freqai']['identifier']}").resolve())
# remove folder and its contents
if Path.exists(path_to_current_identifier):
shutil.rmtree(path_to_current_identifier)
prepare_data_config = deepcopy(self.local_config)
prepare_data_config['timerange'] = (str(self.dt_to_timestamp(varholder.from_dt)) + "-" +
str(self.dt_to_timestamp(varholder.to_dt)))
prepare_data_config['exchange']['pair_whitelist'] = pairs_to_load
backtesting = Backtesting(prepare_data_config, self.exchange)
self.exchange = backtesting.exchange
backtesting._set_strategy(backtesting.strategylist[0])
varholder.data, varholder.timerange = backtesting.load_bt_data()
backtesting.load_bt_data_detail()
varholder.timeframe = backtesting.timeframe
varholder.indicators = backtesting.strategy.advise_all_indicators(varholder.data)
def fill_partial_varholder(self, start_date, startup_candle):
logger.info(f"Calculating indicators using startup candle of {startup_candle}.")
partial_varHolder = VarHolder()
partial_varHolder.from_dt = start_date
partial_varHolder.to_dt = self.full_varHolder.to_dt
partial_varHolder.startup_candle = startup_candle
self.local_config['startup_candle_count'] = startup_candle
self.prepare_data(partial_varHolder, self.local_config['pairs'])
self.partial_varHolder_array.append(partial_varHolder)
def fill_partial_varholder_lookahead(self, end_date):
logger.info("Calculating indicators to test lookahead on indicators.")
partial_varHolder = VarHolder()
partial_varHolder.from_dt = self.full_varHolder.from_dt
partial_varHolder.to_dt = end_date
self.prepare_data(partial_varHolder, self.local_config['pairs'])
self.partial_varHolder_lookahead_array.append(partial_varHolder)
def start(self) -> None:
super().start()
reduce_verbosity_for_bias_tester()
start_date_full = self.full_varHolder.from_dt
end_date_full = self.full_varHolder.to_dt
timeframe_minutes = timeframe_to_minutes(self.full_varHolder.timeframe)
end_date_partial = start_date_full + timedelta(minutes=int(timeframe_minutes * 10))
self.fill_partial_varholder_lookahead(end_date_partial)
# restore_verbosity_for_bias_tester()
start_date_partial = end_date_full - timedelta(minutes=int(timeframe_minutes))
for startup_candle in self._startup_candle:
self.fill_partial_varholder(start_date_partial, int(startup_candle))
# Restore verbosity, so it's not too quiet for the next strategy
restore_verbosity_for_bias_tester()
self.analyze_indicators()
self.analyze_indicators_lookahead()
@@ -0,0 +1,106 @@
import logging
import time
from pathlib import Path
from typing import Any, Dict, List
from freqtrade.constants import Config
from freqtrade.exceptions import OperationalException
from freqtrade.optimize.analysis.recursive import RecursiveAnalysis
from freqtrade.resolvers import StrategyResolver
logger = logging.getLogger(__name__)
class RecursiveAnalysisSubFunctions:
@staticmethod
def text_table_recursive_analysis_instances(
recursive_instances: List[RecursiveAnalysis]):
startups = recursive_instances[0]._startup_candle
headers = ['indicators']
for candle in startups:
headers.append(candle)
data = []
for inst in recursive_instances:
if len(inst.dict_recursive) > 0:
for indicator, values in inst.dict_recursive.items():
temp_data = [indicator]
for candle in startups:
temp_data.append(values.get(int(candle), '-'))
data.append(temp_data)
if len(data) > 0:
from tabulate import tabulate
table = tabulate(data, headers=headers, tablefmt="orgtbl")
print(table)
return table, headers, data
return None, None, data
@staticmethod
def calculate_config_overrides(config: Config):
if 'timerange' not in config:
# setting a timerange is enforced here
raise OperationalException(
"Please set a timerange. "
"A timerange of 5000 candles are enough for recursive analysis."
)
if config.get('backtest_cache') is None:
config['backtest_cache'] = 'none'
elif config['backtest_cache'] != 'none':
logger.info(f"backtest_cache = "
f"{config['backtest_cache']} detected. "
f"Inside recursive-analysis it is enforced to be 'none'. "
f"Changed it to 'none'")
config['backtest_cache'] = 'none'
return config
@staticmethod
def initialize_single_recursive_analysis(config: Config, strategy_obj: Dict[str, Any]):
logger.info(f"Recursive test of {Path(strategy_obj['location']).name} started.")
start = time.perf_counter()
current_instance = RecursiveAnalysis(config, strategy_obj)
current_instance.start()
elapsed = time.perf_counter() - start
logger.info(f"Checking recursive and indicator-only lookahead bias of indicators "
f"of {Path(strategy_obj['location']).name} "
f"took {elapsed:.0f} seconds.")
return current_instance
@staticmethod
def start(config: Config):
config = RecursiveAnalysisSubFunctions.calculate_config_overrides(config)
strategy_objs = StrategyResolver.search_all_objects(
config, enum_failed=False, recursive=config.get('recursive_strategy_search', False))
RecursiveAnalysis_instances = []
# unify --strategy and --strategy-list to one list
if not (strategy_list := config.get('strategy_list', [])):
if config.get('strategy') is None:
raise OperationalException(
"No Strategy specified. Please specify a strategy via --strategy"
)
strategy_list = [config['strategy']]
# check if strategies can be properly loaded, only check them if they can be.
for strat in strategy_list:
for strategy_obj in strategy_objs:
if strategy_obj['name'] == strat and strategy_obj not in strategy_list:
RecursiveAnalysis_instances.append(
RecursiveAnalysisSubFunctions.initialize_single_recursive_analysis(
config, strategy_obj))
break
# report the results
if RecursiveAnalysis_instances:
RecursiveAnalysisSubFunctions.text_table_recursive_analysis_instances(
RecursiveAnalysis_instances)
else:
logger.error("There was no strategy specified through --strategy "
"or timeframe was not specified.")
+81 -53
View File
@@ -116,6 +116,7 @@ class Backtesting:
raise OperationalException("Timeframe needs to be set in either "
"configuration or as cli argument `--timeframe 5m`")
self.timeframe = str(self.config.get('timeframe'))
self.disable_database_use()
self.timeframe_min = timeframe_to_minutes(self.timeframe)
self.init_backtest_detail()
self.pairlists = PairListManager(self.exchange, self.config, self.dataprovider)
@@ -275,11 +276,13 @@ class Backtesting:
else:
self.detail_data = {}
if self.trading_mode == TradingMode.FUTURES:
self.funding_fee_timeframe: str = self.exchange.get_option('mark_ohlcv_timeframe')
self.funding_fee_timeframe_secs: int = timeframe_to_seconds(self.funding_fee_timeframe)
# Load additional futures data.
funding_rates_dict = history.load_data(
datadir=self.config['datadir'],
pairs=self.pairlists.whitelist,
timeframe=self.exchange.get_option('mark_ohlcv_timeframe'),
timeframe=self.funding_fee_timeframe,
timerange=self.timerange,
startup_candles=0,
fail_without_data=True,
@@ -291,7 +294,7 @@ class Backtesting:
mark_rates_dict = history.load_data(
datadir=self.config['datadir'],
pairs=self.pairlists.whitelist,
timeframe=self.exchange.get_option('mark_ohlcv_timeframe'),
timeframe=self.funding_fee_timeframe,
timerange=self.timerange,
startup_candles=0,
fail_without_data=True,
@@ -318,13 +321,16 @@ class Backtesting:
else:
self.futures_data = {}
def disable_database_use(self):
PairLocks.use_db = False
PairLocks.timeframe = self.timeframe
Trade.use_db = False
def prepare_backtest(self, enable_protections):
"""
Backtesting setup method - called once for every call to "backtest()".
"""
PairLocks.use_db = False
PairLocks.timeframe = self.config['timeframe']
Trade.use_db = False
self.disable_database_use()
PairLocks.reset_locks()
Trade.reset_trades()
self.rejected_trades = 0
@@ -521,10 +527,10 @@ class Backtesting:
# This should not be reached...
return row[OPEN_IDX]
def _get_adjust_trade_entry_for_candle(self, trade: LocalTrade, row: Tuple
) -> LocalTrade:
def _get_adjust_trade_entry_for_candle(
self, trade: LocalTrade, row: Tuple, current_time: datetime
) -> LocalTrade:
current_rate = row[OPEN_IDX]
current_date = row[DATE_IDX].to_pydatetime()
current_profit = trade.calc_profit_ratio(current_rate)
min_stake = self.exchange.get_min_pair_stake_amount(trade.pair, current_rate, -0.1)
max_stake = self.exchange.get_max_pair_stake_amount(trade.pair, current_rate)
@@ -532,7 +538,7 @@ class Backtesting:
stake_amount = strategy_safe_wrapper(self.strategy.adjust_trade_position,
default_retval=None, supress_error=True)(
trade=trade, # type: ignore[arg-type]
current_time=current_date, current_rate=current_rate,
current_time=current_time, current_rate=current_rate,
current_profit=current_profit, min_stake=min_stake,
max_stake=min(max_stake, stake_available),
current_entry_rate=current_rate, current_exit_rate=current_rate,
@@ -565,10 +571,10 @@ class Backtesting:
# Remaining stake is too low to be sold.
return trade
exit_ = ExitCheckTuple(ExitType.PARTIAL_EXIT)
pos_trade = self._get_exit_for_signal(trade, row, exit_, amount)
pos_trade = self._get_exit_for_signal(trade, row, exit_, current_time, amount)
if pos_trade is not None:
order = pos_trade.orders[-1]
if self._try_close_open_order(order, trade, current_date, row):
if self._try_close_open_order(order, trade, current_time, row):
trade.recalc_trade_from_orders()
self.wallets.update()
return pos_trade
@@ -579,6 +585,11 @@ class Backtesting:
""" Rate is within candle, therefore filled"""
return row[LOW_IDX] <= rate <= row[HIGH_IDX]
def _call_adjust_stop(self, current_date: datetime, trade: LocalTrade, current_rate: float):
profit = trade.calc_profit_ratio(current_rate)
self.strategy.ft_stoploss_adjust(current_rate, trade, # type: ignore
current_date, profit, 0, after_fill=True)
def _try_close_open_order(
self, order: Optional[Order], trade: LocalTrade, current_date: datetime,
row: Tuple) -> bool:
@@ -588,17 +599,31 @@ class Backtesting:
"""
if order and self._get_order_filled(order.ft_price, row):
order.close_bt_order(current_date, trade)
trade.open_order_id = None
self._run_funding_fees(trade, current_date, force=True)
if not (order.ft_order_side == trade.exit_side and order.safe_amount == trade.amount):
# trade is still open
trade.set_liquidation_price(self.exchange.get_liquidation_price(
pair=trade.pair,
open_rate=trade.open_rate,
is_short=trade.is_short,
amount=trade.amount,
stake_amount=trade.stake_amount,
leverage=trade.leverage,
wallet_balance=trade.stake_amount,
))
self._call_adjust_stop(current_date, trade, order.ft_price)
# pass
return True
return False
def _get_exit_for_signal(
self, trade: LocalTrade, row: Tuple, exit_: ExitCheckTuple,
current_time: datetime,
amount: Optional[float] = None) -> Optional[LocalTrade]:
exit_candle_time: datetime = row[DATE_IDX].to_pydatetime()
if exit_.exit_flag:
trade.close_date = exit_candle_time
trade.close_date = current_time
exit_reason = exit_.exit_reason
amount_ = amount if amount is not None else trade.amount
trade_dur = int((trade.close_date_utc - trade.open_date_utc).total_seconds() // 60)
@@ -626,10 +651,10 @@ class Backtesting:
default_retval=close_rate)(
pair=trade.pair,
trade=trade, # type: ignore[arg-type]
current_time=exit_candle_time,
current_time=current_time,
proposed_rate=close_rate, current_profit=current_profit,
exit_tag=exit_reason)
if rate != close_rate:
if rate is not None and rate != close_rate:
close_rate = price_to_precision(rate, trade.price_precision,
self.precision_mode)
# We can't place orders lower than current low.
@@ -652,7 +677,7 @@ class Backtesting:
time_in_force=time_in_force,
sell_reason=exit_reason, # deprecated
exit_reason=exit_reason,
current_time=exit_candle_time)):
current_time=current_time)):
return None
trade.exit_reason = exit_reason
@@ -693,21 +718,15 @@ class Backtesting:
trade.orders.append(order)
return trade
def _check_trade_exit(self, trade: LocalTrade, row: Tuple) -> Optional[LocalTrade]:
exit_candle_time: datetime = row[DATE_IDX].to_pydatetime()
def _check_trade_exit(
self, trade: LocalTrade, row: Tuple, current_time: datetime
) -> Optional[LocalTrade]:
if self.trading_mode == TradingMode.FUTURES:
trade.funding_fees = self.exchange.calculate_funding_fees(
self.futures_data[trade.pair],
amount=trade.amount,
is_short=trade.is_short,
open_date=trade.date_last_filled_utc,
close_date=exit_candle_time,
)
self._run_funding_fees(trade, current_time)
# Check if we need to adjust our current positions
if self.strategy.position_adjustment_enable:
trade = self._get_adjust_trade_entry_for_candle(trade, row)
trade = self._get_adjust_trade_entry_for_candle(trade, row, current_time)
enter = row[SHORT_IDX] if trade.is_short else row[LONG_IDX]
exit_sig = row[ESHORT_IDX] if trade.is_short else row[ELONG_IDX]
@@ -717,11 +736,32 @@ class Backtesting:
low=row[LOW_IDX], high=row[HIGH_IDX]
)
for exit_ in exits:
t = self._get_exit_for_signal(trade, row, exit_)
t = self._get_exit_for_signal(trade, row, exit_, current_time)
if t:
return t
return None
def _run_funding_fees(self, trade: LocalTrade, current_time: datetime, force: bool = False):
"""
Calculate funding fees if necessary and add them to the trade.
"""
if self.trading_mode == TradingMode.FUTURES:
if (
force
or (current_time.timestamp() % self.funding_fee_timeframe_secs) == 0
):
# Funding fee interval.
trade.set_funding_fees(
self.exchange.calculate_funding_fees(
self.futures_data[trade.pair],
amount=trade.amount,
is_short=trade.is_short,
open_date=trade.date_last_filled_utc,
close_date=current_time
)
)
def get_valid_price_and_stake(
self, pair: str, row: Tuple, propose_rate: float, stake_amount: float,
direction: LongShort, current_time: datetime, entry_tag: Optional[str],
@@ -731,13 +771,15 @@ class Backtesting:
if order_type == 'limit':
new_rate = strategy_safe_wrapper(self.strategy.custom_entry_price,
default_retval=propose_rate)(
pair=pair, current_time=current_time,
pair=pair,
trade=trade, # type: ignore[arg-type]
current_time=current_time,
proposed_rate=propose_rate, entry_tag=entry_tag,
side=direction,
) # default value is the open rate
# We can't place orders higher than current high (otherwise it'd be a stop limit entry)
# which freqtrade does not support in live.
if new_rate != propose_rate:
if new_rate is not None and new_rate != propose_rate:
propose_rate = price_to_precision(new_rate, price_precision,
self.precision_mode)
if direction == "short":
@@ -749,7 +791,8 @@ class Backtesting:
leverage = trade.leverage if trade else 1.0
if not pos_adjust:
try:
stake_amount = self.wallets.get_trade_stake_amount(pair, None, update=False)
stake_amount = self.wallets.get_trade_stake_amount(
pair, self.strategy.max_open_trades, update=False)
except DependencyException:
return 0, 0, 0, 0
@@ -854,7 +897,6 @@ class Backtesting:
self.trade_id_counter += 1
trade = LocalTrade(
id=self.trade_id_counter,
open_order_id=self.order_id_counter,
pair=pair,
base_currency=base_currency,
stake_currency=self.config['stake_currency'],
@@ -882,16 +924,6 @@ class Backtesting:
trade.adjust_stop_loss(trade.open_rate, self.strategy.stoploss, initial=True)
trade.set_liquidation_price(self.exchange.get_liquidation_price(
pair=pair,
open_rate=propose_rate,
amount=amount,
stake_amount=trade.stake_amount,
leverage=trade.leverage,
wallet_balance=trade.stake_amount,
is_short=is_short,
))
order = Order(
id=self.order_id_counter,
ft_trade_id=trade.id,
@@ -916,8 +948,7 @@ class Backtesting:
)
order._trade_bt = trade
trade.orders.append(order)
if not self._try_close_open_order(order, trade, current_time, row):
trade.open_order_id = str(self.order_id_counter)
self._try_close_open_order(order, trade, current_time, row)
trade.recalc_trade_from_orders()
return trade
@@ -929,7 +960,7 @@ class Backtesting:
"""
for pair in open_trades.keys():
for trade in list(open_trades[pair]):
if trade.open_order_id and trade.nr_of_successful_entries == 0:
if trade.has_open_orders and trade.nr_of_successful_entries == 0:
# Ignore trade if entry-order did not fill yet
continue
exit_row = data[pair][-1]
@@ -943,7 +974,7 @@ class Backtesting:
def trade_slot_available(self, open_trade_count: int) -> bool:
# Always allow trades when max_open_trades is enabled.
max_open_trades: IntOrInf = self.config['max_open_trades']
max_open_trades: IntOrInf = self.strategy.max_open_trades
if max_open_trades <= 0 or open_trade_count < max_open_trades:
return True
# Rejected trade
@@ -1006,13 +1037,11 @@ class Backtesting:
else:
# Close additional entry order
del trade.orders[trade.orders.index(order)]
trade.open_order_id = None
return False
if order.side == trade.exit_side:
self.timedout_exit_orders += 1
# Close exit order and retry exiting on next signal.
del trade.orders[trade.orders.index(order)]
trade.open_order_id = None
return False
return None
@@ -1040,7 +1069,6 @@ class Backtesting:
return False
else:
del trade.orders[trade.orders.index(order)]
trade.open_order_id = None
self.canceled_entry_orders += 1
# place new order if result was not None
@@ -1051,7 +1079,7 @@ class Backtesting:
order.safe_remaining * order.ft_price / trade.leverage),
direction='short' if trade.is_short else 'long')
# Delete trade if no successful entries happened (if placing the new order failed)
if trade.open_order_id is None and trade.nr_of_successful_entries == 0:
if not trade.has_open_orders and trade.nr_of_successful_entries == 0:
return True
self.replaced_entry_orders += 1
else:
@@ -1136,8 +1164,8 @@ class Backtesting:
self.wallets.update()
# 4. Create exit orders (if any)
if not trade.open_order_id:
self._check_trade_exit(trade, row) # Place exit order if necessary
if not trade.has_open_orders:
self._check_trade_exit(trade, row, current_time) # Place exit order if necessary
# 5. Process exit orders.
order = trade.select_order(trade.exit_side, is_open=True)
+66
View File
@@ -0,0 +1,66 @@
import logging
from copy import deepcopy
from datetime import datetime, timezone
from typing import Any, Dict, Optional
from pandas import DataFrame
from freqtrade.configuration import TimeRange
logger = logging.getLogger(__name__)
class VarHolder:
timerange: TimeRange
data: DataFrame
indicators: Dict[str, DataFrame]
result: DataFrame
compared: DataFrame
from_dt: datetime
to_dt: datetime
compared_dt: datetime
timeframe: str
startup_candle: int
class BaseAnalysis:
def __init__(self, config: Dict[str, Any], strategy_obj: Dict):
self.failed_bias_check = True
self.full_varHolder = VarHolder()
self.exchange: Optional[Any] = None
self._fee = None
# pull variables the scope of the lookahead_analysis-instance
self.local_config = deepcopy(config)
self.local_config['strategy'] = strategy_obj['name']
self.strategy_obj = strategy_obj
@staticmethod
def dt_to_timestamp(dt: datetime):
timestamp = int(dt.replace(tzinfo=timezone.utc).timestamp())
return timestamp
def fill_full_varholder(self):
self.full_varHolder = VarHolder()
# define datetime in human-readable format
parsed_timerange = TimeRange.parse_timerange(self.local_config['timerange'])
if parsed_timerange.startdt is None:
self.full_varHolder.from_dt = datetime.fromtimestamp(0, tz=timezone.utc)
else:
self.full_varHolder.from_dt = parsed_timerange.startdt
if parsed_timerange.stopdt is None:
self.full_varHolder.to_dt = datetime.utcnow()
else:
self.full_varHolder.to_dt = parsed_timerange.stopdt
self.prepare_data(self.full_varHolder, self.local_config['pairs'])
def start(self) -> None:
# first make a single backtest
self.fill_full_varholder()

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