Compare commits

...

980 Commits

Author SHA1 Message Date
Matthias
dbf53ce952 Merge pull request #9112 from freqtrade/new_release
New release 2023.8
2023-08-28 18:44:59 +02:00
Matthias
f6b6b5976d Bump version to 2023.8 2023-08-27 20:46:19 +02:00
Matthias
0c15eb4ace Merge branch 'stable' into develop 2023-08-27 20:39:53 +02:00
Matthias
3388bc5012 update conda docs to use 3.11 by default 2023-08-27 20:16:37 +02:00
Matthias
981cf1f6ee Update cached binance leverage tiers 2023-08-27 14:50:54 +02:00
Matthias
2d66f3c022 Merge pull request #9105 from freqtrade/protect-add-state-info
Convert add_state_info warning into a OperationalException
2023-08-26 19:52:38 +02:00
robcaulk
04122abd17 chore: protect users who dont read log warnings 2023-08-25 16:45:46 +02:00
Matthias
e5a88fdeda Fix stylistic issues 2023-08-24 20:06:51 +02:00
Matthias
9c4aca2b90 Improve download data debug output 2023-08-24 20:05:20 +02:00
Matthias
67e3ce308b Remove now unused import 2023-08-24 20:01:23 +02:00
Matthias
a740b9458f Fix remaining test after conftest_trade rework 2023-08-24 19:49:05 +02:00
Matthias
ffdb5fb790 Fix further tests after conftest_trades rework 2023-08-24 18:06:17 +02:00
Matthias
0cc7039232 Fix mock trade 1 status 2023-08-24 17:53:46 +02:00
Matthias
0f73e38f98 Improve docstring for "select_filled_orders". 2023-08-24 17:44:48 +02:00
Matthias
cfe1187cd9 Fix missed Test 2023-08-24 17:38:56 +02:00
Matthias
a36e131838 Fix more conftest trades 2023-08-24 07:29:50 +02:00
Matthias
94864a6ab3 Fix bad open_order_id assignment in test 2023-08-24 07:28:55 +02:00
Matthias
e1e90112ba conftest_usdt trades - align open orders 2023-08-24 07:16:01 +02:00
Matthias
c303d47f26 Ensure stop_duration is converted to int
closes #9099
2023-08-23 15:16:14 +02:00
Matthias
36d99876c5 Add mkdocs to rtd config 2023-08-23 07:12:14 +02:00
Matthias
2a192b19c3 Fix path typo 2023-08-23 07:09:27 +02:00
Matthias
9eaff301e8 Attempt update RTD config 2023-08-23 07:07:42 +02:00
Matthias
62ce96fd40 Add documentation explanation on pair naming conventions 2023-08-23 06:55:22 +02:00
Matthias
da7599065f Merge pull request #9094 from freqtrade/dependabot/pip/develop/ruff-0.0.285
Bump ruff from 0.0.284 to 0.0.285
2023-08-22 22:32:52 +02:00
Matthias
0c7cb29ea1 Don't use type() is comparisons 2023-08-22 20:39:36 +02:00
Matthias
001c998b26 Merge pull request #9086 from freqtrade/dependabot/pip/develop/gymnasium-0.29.1
Bump gymnasium from 0.28.1 to 0.29.1
2023-08-22 10:03:18 +02:00
Matthias
5934a6e6c3 Merge pull request #9095 from freqtrade/dependabot/pip/develop/sqlalchemy-2.0.20
Bump sqlalchemy from 2.0.19 to 2.0.20
2023-08-22 10:02:43 +02:00
dependabot[bot]
8ac4f4ac44 Bump ruff from 0.0.284 to 0.0.285
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.0.284 to 0.0.285.
- [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.284...v0.0.285)

---
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-22 06:55:01 +00:00
Matthias
03c7e9a022 Merge pull request #9081 from freqtrade/dependabot/pip/develop/mypy-1.5.1
Bump mypy from 1.5.0 to 1.5.1
2023-08-22 08:54:03 +02:00
Matthias
329b35fc58 Update sqlalchemy pre-commit 2023-08-22 08:33:18 +02:00
Matthias
6ede7b49e0 Merge pull request #9091 from freqtrade/dependabot/pip/develop/mkdocs-material-9.2.1
Bump mkdocs-material from 9.2.0 to 9.2.1
2023-08-22 08:30:05 +02:00
Matthias
5e41f9b42a Merge pull request #9090 from freqtrade/dependabot/pip/develop/pydantic-2.2.1
Bump pydantic from 2.2.0 to 2.2.1
2023-08-22 08:29:47 +02:00
Matthias
f2b00a54d0 Merge pull request #9093 from freqtrade/dependabot/pip/develop/orjson-3.9.5
Bump orjson from 3.9.4 to 3.9.5
2023-08-22 08:28:53 +02:00
Matthias
5b25acef52 Merge pull request #9092 from freqtrade/dependabot/pip/develop/plotly-5.16.1
Bump plotly from 5.16.0 to 5.16.1
2023-08-22 08:28:34 +02:00
dependabot[bot]
e3d17b98be Bump gymnasium from 0.28.1 to 0.29.1
Bumps [gymnasium](https://github.com/Farama-Foundation/Gymnasium) from 0.28.1 to 0.29.1.
- [Release notes](https://github.com/Farama-Foundation/Gymnasium/releases)
- [Commits](https://github.com/Farama-Foundation/Gymnasium/compare/v0.28.1...v0.29.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-22 04:48:14 +00:00
Matthias
9da9d48625 Merge pull request #9080 from freqtrade/dependabot/pip/develop/stable-baselines3-2.1.0
Bump stable-baselines3 from 2.0.0 to 2.1.0
2023-08-22 06:47:32 +02:00
dependabot[bot]
1c55432bd1 Bump sqlalchemy from 2.0.19 to 2.0.20
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.19 to 2.0.20.
- [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-08-22 04:47:31 +00:00
dependabot[bot]
a6a1b0e847 Bump orjson from 3.9.4 to 3.9.5
Bumps [orjson](https://github.com/ijl/orjson) from 3.9.4 to 3.9.5.
- [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.4...3.9.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-22 04:47:05 +00:00
dependabot[bot]
57c23fd9b3 Bump plotly from 5.16.0 to 5.16.1
Bumps [plotly](https://github.com/plotly/plotly.py) from 5.16.0 to 5.16.1.
- [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.0...v5.16.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-22 04:47:00 +00:00
dependabot[bot]
d18dea076b Bump mkdocs-material from 9.2.0 to 9.2.1
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.2.0 to 9.2.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.0...9.2.1)

---
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-22 04:46:53 +00:00
dependabot[bot]
4b79481163 Bump pydantic from 2.2.0 to 2.2.1
Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.2.0 to 2.2.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.2.0...v2.2.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-22 04:46:44 +00:00
Matthias
9d31566a2d Update dependabot pip limit
should be adjusted for the huge amount of dependencies freqtrade has.
2023-08-22 06:46:10 +02:00
Matthias
3e44bd073c Merge pull request #9082 from freqtrade/dependabot/pip/develop/ccxt-4.0.71
Bump ccxt from 4.0.59 to 4.0.71
2023-08-22 06:42:51 +02:00
Matthias
d2a378b706 Merge pull request #9087 from freqtrade/dependabot/pip/develop/scipy-1.11.2
Bump scipy from 1.11.1 to 1.11.2
2023-08-22 06:36:24 +02:00
dependabot[bot]
ec2f51dcc9 Bump mypy from 1.5.0 to 1.5.1
Bumps [mypy](https://github.com/python/mypy) from 1.5.0 to 1.5.1.
- [Commits](https://github.com/python/mypy/compare/v1.5.0...v1.5.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-08-22 04:36:08 +00:00
Matthias
6d1c1b3e63 Merge pull request #9083 from freqtrade/dependabot/pip/develop/fastapi-0.101.1
Bump fastapi from 0.101.0 to 0.101.1
2023-08-22 06:35:57 +02:00
Matthias
4e52380e09 Merge pull request #9084 from freqtrade/dependabot/pip/develop/mkdocs-material-9.2.0
Bump mkdocs-material from 9.1.21 to 9.2.0
2023-08-22 06:35:30 +02:00
Matthias
f0fc12dfc2 Merge pull request #9085 from freqtrade/dependabot/pip/develop/nbconvert-7.7.4
Bump nbconvert from 7.7.3 to 7.7.4
2023-08-22 06:35:01 +02:00
Matthias
7f4007ecdb Merge pull request #9088 from freqtrade/dependabot/pip/develop/time-machine-2.12.0
Bump time-machine from 2.11.0 to 2.12.0
2023-08-22 06:34:32 +02:00
dependabot[bot]
5a0f62431f Bump time-machine from 2.11.0 to 2.12.0
Bumps [time-machine](https://github.com/adamchainz/time-machine) from 2.11.0 to 2.12.0.
- [Changelog](https://github.com/adamchainz/time-machine/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/adamchainz/time-machine/compare/2.11.0...2.12.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-08-21 20:15:50 +00:00
dependabot[bot]
99f7e3bce1 Bump scipy from 1.11.1 to 1.11.2
Bumps [scipy](https://github.com/scipy/scipy) from 1.11.1 to 1.11.2.
- [Release notes](https://github.com/scipy/scipy/releases)
- [Commits](https://github.com/scipy/scipy/compare/v1.11.1...v1.11.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-21 20:15:46 +00:00
dependabot[bot]
e93832117d Bump nbconvert from 7.7.3 to 7.7.4
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.7.3 to 7.7.4.
- [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.3...v7.7.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-21 20:15:34 +00:00
dependabot[bot]
6d90ceca50 Bump mkdocs-material from 9.1.21 to 9.2.0
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.1.21 to 9.2.0.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.1.21...9.2.0)

---
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-08-21 20:15:29 +00:00
dependabot[bot]
22f1c72517 Bump fastapi from 0.101.0 to 0.101.1
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.101.0 to 0.101.1.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.101.0...0.101.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-08-21 20:15:21 +00:00
dependabot[bot]
0f1e66b22a Bump ccxt from 4.0.59 to 4.0.71
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.59 to 4.0.71.
- [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.59...4.0.71)

---
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-21 20:15:15 +00:00
dependabot[bot]
b088154c0a Bump stable-baselines3 from 2.0.0 to 2.1.0
Bumps [stable-baselines3](https://github.com/DLR-RM/stable-baselines3) from 2.0.0 to 2.1.0.
- [Release notes](https://github.com/DLR-RM/stable-baselines3/releases)
- [Commits](https://github.com/DLR-RM/stable-baselines3/compare/v2.0.0...v2.1.0)

---
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-08-21 20:15:03 +00:00
Matthias
4c5f992670 Ensure signals don't break on windows 2023-08-20 16:09:12 +02:00
Matthias
f92b8c50dd Update config echo block to store config in user_data 2023-08-20 13:55:03 +02:00
Matthias
2d800a1422 Fix bug in config-builder 2023-08-20 13:51:33 +02:00
Matthias
fb790b2d42 Update path of config for new-config documentation 2023-08-20 13:32:32 +02:00
Matthias
b71a44f27c Enhance Keyboard interrupt handling for dl-trades (stores data it already downloaded). 2023-08-20 11:57:59 +02:00
Matthias
4fefae6f07 Improve download-trades test 2023-08-20 11:51:01 +02:00
Matthias
3167938d43 move "since" fallback to be the last check 2023-08-20 11:44:40 +02:00
Matthias
cf226afb1a Merge pull request #9072 from freqtrade/talib_update
Talib update to 0.4.28
2023-08-20 11:01:11 +02:00
Matthias
7da0174937 Allow slightly different ta-lib installation locations in setup.sh script 2023-08-20 10:24:05 +02:00
Matthias
4feafb25cf Update ta-lib windows wheels 2023-08-20 10:02:45 +02:00
Matthias
08532e1df1 Bump ta-lib to 0.4.28 2023-08-20 10:02:35 +02:00
Matthias
c0f5d31c8e Merge pull request #9071 from freqtrade/talib_windows_install
improve installation of ta-lib on windows
2023-08-20 09:26:18 +02:00
Matthias
8fa31b35f5 use prefer-binary to avoid hardcoding ta-lib outside of requirements.txt 2023-08-20 08:41:01 +02:00
Matthias
f5e0543113 Fix windows CI failure 2023-08-19 20:50:55 +02:00
Matthias
399e308e07 Fix bug in --dl-trades downloading 2023-08-19 18:32:27 +02:00
Matthias
aa1dcd1b44 Merge pull request #9065 from freqtrade/trades_data_handling
Improve Trades data handling
2023-08-18 18:04:38 +02:00
Matthias
5a9dd79b45 Merge pull request #9011 from freqtrade/dependabot/pip/develop/pydantic-2.1.1
Bump pydantic from 1.10.11 to 2.1.1
2023-08-18 11:50:24 +02:00
Matthias
277cc0a523 Fix import sort order 2023-08-18 10:55:05 +02:00
Matthias
185c5a779d use model_validate instead of parse_obj 2023-08-18 10:21:50 +02:00
Matthias
352f0fdfca Bump pydantic to 2.2.0 2023-08-18 10:19:13 +02:00
Matthias
ee11dae82a Merge branch 'develop' into dependabot/pip/develop/pydantic-2.1.1 2023-08-18 10:18:53 +02:00
Matthias
3d8dcd1644 Improve and parametrize trades_data tests 2023-08-18 10:05:15 +02:00
Matthias
30064b4102 Add support for trades data in Parquet format 2023-08-18 09:58:03 +02:00
Matthias
8caadc4c5b Fix feather handler storing 2023-08-18 09:47:18 +02:00
Matthias
3eb3596552 Simplify trades_data storing 2023-08-18 09:36:16 +02:00
Matthias
d4bc736eb1 Merge pull request #9064 from freqtrade/maint/venv
Update setup.sh script to use `.venv`
2023-08-18 09:33:34 +02:00
Matthias
5de3b9d7ae Clean up no longer used method 2023-08-18 09:31:17 +02:00
Matthias
fae742de59 Fix imports 2023-08-18 09:12:40 +02:00
Matthias
fa5f7d290b Update download-trades method to work with dataframes 2023-08-18 09:08:10 +02:00
Matthias
7577613882 Extract trades df type conversion 2023-08-18 09:08:10 +02:00
Matthias
0fab65df03 Set explicit dtypes 2023-08-18 09:08:10 +02:00
Matthias
f69a776305 Ensure only relevant columns are stored 2023-08-18 09:08:10 +02:00
Matthias
26c89d89e4 Keep original timestamp in dataframe 2023-08-18 09:08:10 +02:00
Matthias
d97d0e4426 Extract trades DF creation to converter function 2023-08-18 07:02:46 +02:00
Matthias
357b04202c Datahandlers should store data from dataframes 2023-08-17 20:11:18 +02:00
Matthias
6fc1ee9831 trades_append should use dataframe, not lists 2023-08-17 18:06:25 +02:00
Matthias
780f238904 Fix trades duplicates if trade id is different 2023-08-17 18:04:13 +02:00
Matthias
5d5cc71945 Fix pandas duplication detection, improve test 2023-08-17 17:53:08 +02:00
Matthias
0be2250cf5 Keep existing trades_remove_duplicates for now 2023-08-17 17:23:12 +02:00
Matthias
53db254cba don't cascade calls, that creates an additional call 2023-08-17 17:22:02 +02:00
Matthias
02ee7f8b5b Update further tests 2023-08-17 16:05:47 +02:00
Matthias
a595074754 Update test for new trades handling 2023-08-17 10:03:56 +02:00
Matthias
7ac9d33c31 Default should return a dataframe, not an empty list. 2023-08-17 10:00:11 +02:00
Matthias
ac80a69142 Update converters for trades dataframe handling 2023-08-17 10:00:11 +02:00
Matthias
46882406be Update Datahandlers to work with trades data as dataframes 2023-08-17 10:00:11 +02:00
Matthias
ba34318f7a Update converter test to use fixture 2023-08-17 09:57:26 +02:00
Matthias
3bc49330ce webserver mode should properly validate config 2023-08-17 09:15:59 +02:00
Matthias
7bc317fea7 Merge pull request #9061 from freqtrade/fix/7389_backtest_startup_candle
improve `get_analyzed_dataframe` behavior in early candles
2023-08-17 08:25:30 +02:00
Matthias
b93c6235c1 Fix Case of gym.Env in documentation 2023-08-16 18:59:22 +02:00
Matthias
aa756221f6 Improve behavior of ta-lib install 2023-08-16 18:56:42 +02:00
Matthias
688018d9f2 Update setup.sh script to use .venv instead of .env 2023-08-16 18:51:24 +02:00
Matthias
ea181645b0 setup.sh: Extract environment recration to function 2023-08-16 18:33:19 +02:00
Matthias
f607b8abfb Silence pip download 2023-08-16 18:24:40 +02:00
Matthias
d439936014 Update docs about suing .venv instead of .env 2023-08-16 18:24:40 +02:00
Matthias
91fd472717 Extend ruff excludes to .venv 2023-08-16 13:16:23 +02:00
Matthias
6134807c67 Remove wrong image link 2023-08-16 11:00:28 +02:00
Matthias
7651f1b1db Add more samples for correct debug configurations 2023-08-16 10:55:48 +02:00
Matthias
d9fb40ca3e Update cached binance leverage tiers 2023-08-16 07:45:22 +02:00
Matthias
77c7dd8a12 Add FIAT mapping for true usdt 2023-08-16 07:44:19 +02:00
Matthias
452e1ab016 get_analyzed_dataframe should provide dataframe with startup candles
closes #7389
2023-08-15 19:43:04 +02:00
Matthias
bea6782223 Ensure cutoffs in backtesting are properly tested 2023-08-15 19:33:07 +02:00
Matthias
045d8c6fca Add test for informative pair filtering 2023-08-15 17:56:40 +02:00
Matthias
161ab14ed0 Avoid lookahead bias through informative pairs in callbacks 2023-08-15 17:48:07 +02:00
Matthias
6f347b839a Remove optionality from timeframe parameter
(it was never optional, and code was failing if it wasn't provided).
2023-08-15 17:31:56 +02:00
Matthias
09ec00888f Don't use global variable in test 2023-08-15 17:31:56 +02:00
Robert Caulk
5d3f3fb39f Merge pull request #8903 from Yinon-Polak/freqai-pytorch-bugfixes
Freqai pytorch bugfixes
2023-08-15 16:48:44 +02:00
Matthias
3f5903bad8 Split tests for jinja utils 2023-08-15 07:42:43 +02:00
Matthias
afcaeafd96 Move rendering commands to utils 2023-08-15 07:42:05 +02:00
Matthias
6b11f3063f "minimal" strategy templates shouldn't render all attributes 2023-08-15 06:58:50 +02:00
Matthias
a4842113ce Split strategy template to have conditional attributes 2023-08-15 06:58:35 +02:00
Matthias
d768afed37 price_to_precision should only run once 2023-08-14 15:19:34 +02:00
Matthias
db9247e78e prevent errors in custom stop from crashing the bot 2023-08-14 14:54:11 +02:00
Matthias
d53b6871ea Bump pre-commit mypy 2023-08-14 13:22:55 +02:00
Matthias
08bc615826 Further simplify backtest order handling 2023-08-14 13:22:55 +02:00
Matthias
bcc2dd9803 Simplify backtest order closing 2023-08-14 13:22:55 +02:00
Matthias
d7e9f87b33 Improve comment indent 2023-08-14 13:22:55 +02:00
Matthias
d7556cd66a Remove duplicate call in backtesting 2023-08-14 13:22:55 +02:00
Matthias
018d3a3f6e Merge pull request #9053 from freqtrade/dependabot/pip/develop/ruff-0.0.284
Bump ruff from 0.0.282 to 0.0.284
2023-08-14 13:22:47 +02:00
Matthias
2f5689b32b Merge pull request #9047 from freqtrade/dependabot/pip/develop/questionary-2.0.0
Bump questionary from 1.10.0 to 2.0.0
2023-08-14 13:20:46 +02:00
Matthias
f4844c1224 Downgrade prompt-toolkid to 3.0.36 2023-08-14 09:19:29 +02:00
Matthias
e6218e8580 Merge pull request #9052 from freqtrade/dependabot/pip/develop/joblib-1.3.2
Bump joblib from 1.3.1 to 1.3.2
2023-08-14 09:16:26 +02:00
Matthias
af64971b86 Merge pull request #9055 from freqtrade/dependabot/pip/develop/tqdm-4.66.1
Bump tqdm from 4.65.0 to 4.66.1
2023-08-14 09:12:43 +02:00
Matthias
21cf5fc679 Fix use of string.format() 2023-08-14 09:11:50 +02:00
Matthias
9b6654e81a Fix ruff E721 (type comparison) 2023-08-14 09:11:19 +02:00
Matthias
80c9b1ac7a Merge pull request #9056 from freqtrade/dependabot/pip/develop/ccxt-4.0.59
Bump ccxt from 4.0.50 to 4.0.59
2023-08-14 09:09:08 +02:00
Matthias
b60fdac9f4 Merge pull request #9054 from freqtrade/dependabot/pip/develop/aiofiles-23.2.1
Bump aiofiles from 23.1.0 to 23.2.1
2023-08-14 08:33:22 +02:00
dependabot[bot]
bb52778126 Bump joblib from 1.3.1 to 1.3.2
Bumps [joblib](https://github.com/joblib/joblib) from 1.3.1 to 1.3.2.
- [Release notes](https://github.com/joblib/joblib/releases)
- [Changelog](https://github.com/joblib/joblib/blob/master/CHANGES.rst)
- [Commits](https://github.com/joblib/joblib/compare/1.3.1...1.3.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-14 05:42:41 +00:00
Matthias
92dc6dd8ef Merge pull request #9050 from freqtrade/dependabot/pip/develop/tensorboard-2.14.0
Bump tensorboard from 2.13.0 to 2.14.0
2023-08-14 07:41:07 +02:00
dependabot[bot]
7224bdf823 Bump ccxt from 4.0.50 to 4.0.59
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.50 to 4.0.59.
- [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.50...4.0.59)

---
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-14 05:30:14 +00:00
dependabot[bot]
0abfad5586 Bump tqdm from 4.65.0 to 4.66.1
Bumps [tqdm](https://github.com/tqdm/tqdm) from 4.65.0 to 4.66.1.
- [Release notes](https://github.com/tqdm/tqdm/releases)
- [Commits](https://github.com/tqdm/tqdm/compare/v4.65.0...v4.66.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-14 05:29:48 +00:00
dependabot[bot]
9a95011b57 Bump ruff from 0.0.282 to 0.0.284
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.0.282 to 0.0.284.
- [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.282...v0.0.284)

---
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-14 05:28:56 +00:00
Matthias
2a3157c745 Merge pull request #9048 from freqtrade/dependabot/pip/develop/mypy-1.5.0
Bump mypy from 1.4.1 to 1.5.0
2023-08-14 07:27:49 +02:00
Matthias
63bc89cff8 Merge pull request #9051 from freqtrade/dependabot/pip/develop/plotly-5.16.0
Bump plotly from 5.15.0 to 5.16.0
2023-08-14 07:27:19 +02:00
Matthias
aed33e759b Merge pull request #9049 from freqtrade/dependabot/pip/develop/jsonschema-4.19.0
Bump jsonschema from 4.18.6 to 4.19.0
2023-08-14 07:26:39 +02:00
Matthias
e0915e1638 Merge pull request #9046 from freqtrade/dependabot/pip/develop/orjson-3.9.4
Bump orjson from 3.9.3 to 3.9.4
2023-08-14 07:24:27 +02:00
Matthias
0722844a6d Merge pull request #9045 from freqtrade/dependabot/github_actions/develop/pypa/gh-action-pypi-publish-1.8.10
Bump pypa/gh-action-pypi-publish from 1.8.8 to 1.8.10
2023-08-14 07:24:03 +02:00
dependabot[bot]
987a7ddac0 Bump aiofiles from 23.1.0 to 23.2.1
Bumps [aiofiles](https://github.com/Tinche/aiofiles) from 23.1.0 to 23.2.1.
- [Release notes](https://github.com/Tinche/aiofiles/releases)
- [Commits](https://github.com/Tinche/aiofiles/compare/v23.1.0...v23.2.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-14 03:53:17 +00:00
dependabot[bot]
ceee57c39c Bump plotly from 5.15.0 to 5.16.0
Bumps [plotly](https://github.com/plotly/plotly.py) from 5.15.0 to 5.16.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.15.0...v5.16.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-08-14 03:52:53 +00:00
dependabot[bot]
6e79c19fe0 Bump tensorboard from 2.13.0 to 2.14.0
Bumps [tensorboard](https://github.com/tensorflow/tensorboard) from 2.13.0 to 2.14.0.
- [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.13.0...2.14.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-08-14 03:52:50 +00:00
dependabot[bot]
f0a50b1f2d Bump jsonschema from 4.18.6 to 4.19.0
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.18.6 to 4.19.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.18.6...v4.19.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-08-14 03:52:45 +00:00
dependabot[bot]
4942d01574 Bump mypy from 1.4.1 to 1.5.0
Bumps [mypy](https://github.com/python/mypy) from 1.4.1 to 1.5.0.
- [Commits](https://github.com/python/mypy/compare/v1.4.1...v1.5.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-08-14 03:52:40 +00:00
dependabot[bot]
4664cc23eb Bump questionary from 1.10.0 to 2.0.0
Bumps [questionary](https://github.com/tmbo/questionary) from 1.10.0 to 2.0.0.
- [Commits](https://github.com/tmbo/questionary/compare/1.10.0...2.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-14 03:52:34 +00:00
dependabot[bot]
6768641bac Bump orjson from 3.9.3 to 3.9.4
Bumps [orjson](https://github.com/ijl/orjson) from 3.9.3 to 3.9.4.
- [Release notes](https://github.com/ijl/orjson/releases)
- [Changelog](https://github.com/ijl/orjson/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ijl/orjson/compare/3.9.3...3.9.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-14 03:52:31 +00:00
dependabot[bot]
90e41274e0 Bump pypa/gh-action-pypi-publish from 1.8.8 to 1.8.10
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.8.8 to 1.8.10.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.8.8...v1.8.10)

---
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-08-14 03:36:03 +00:00
Matthias
2c5a7ceab5 Improve typing of stoploss reinit 2023-08-13 13:21:46 +02:00
Matthias
3ecaedb7d8 use FormatStrings in trade_model 2023-08-13 11:11:10 +02:00
Matthias
1ca3cd086f Fix missing . in interface docs 2023-08-13 10:32:37 +02:00
Matthias
72bd4e816d Simplify code, no longer log "could not find rate"
closes #9031
2023-08-12 16:10:37 +02:00
Matthias
716b1cd002 Improve ccxt tests 2023-08-10 20:05:21 +02:00
Matthias
6ce08548fb Further update ccxt test fixtures 2023-08-10 18:11:02 +02:00
Matthias
47adebd872 Merge pull request #9032 from freqtrade/online_test_refactor
Online test refactor
2023-08-10 09:39:54 +02:00
Matthias
ea257e3cbb Refactor online test fixtures into separate conftest module 2023-08-10 07:17:52 +02:00
Matthias
20763daa74 Simplify online tess by skipping non-available futures exchanges 2023-08-10 07:10:45 +02:00
Matthias
7e9389421a Move ccxt_compat tests to their own subfolder 2023-08-10 07:03:29 +02:00
Matthias
4b8569b80e Merge pull request #9014 from hippocritical/develop
bugfixes and false-positives for lookahead-analysis
2023-08-10 06:28:12 +02:00
Matthias
05e1828617 Improve Fee check 2023-08-09 20:26:08 +02:00
Matthias
32c3d96760 Merge pull request #9027 from freqtrade/remove_sandbox
Remove sandbox
2023-08-09 20:24:19 +02:00
Matthias
328a6f791e Improve stoploss mock 2023-08-09 19:55:27 +02:00
Matthias
b934644039 Fix tests, explicitly test for missing timerange 2023-08-09 18:36:20 +02:00
Matthias
4a62ebbf93 Don't hardcode fee, but use fee from the very first iteration. 2023-08-09 18:36:09 +02:00
Matthias
2069abe314 Remove custom fetch_funding_fees from bybit 2023-08-08 20:56:03 +02:00
Matthias
78cf8a1c09 Fix exchange bybit test 2023-08-08 20:31:10 +02:00
Matthias
565e2699b4 Re-set funding-fee history limit for bybit to 200 2023-08-08 20:29:57 +02:00
Matthias
62ad2cca1a Add active test for alternative futures rates (ensures history is loaded correctly). 2023-08-08 20:18:46 +02:00
Matthias
46bafa9d5d Merge pull request #9030 from jansmets/increase_bybit_ohlcv_candle_limit
Increase bybit ohlcv_candle_limit to 1000
2023-08-08 18:31:34 +02:00
Matthias
74cbfcaef4 Merge pull request #9028 from stash86/bt-metrics
add _timeout attribute to discord, otherwise it won't work
2023-08-08 18:20:57 +02:00
Jan Smets
ab156b6ad7 Increase bybit ohlcv_candle_limit to 1000 in tests 2023-08-08 12:28:28 +02:00
Jan Smets
1f23727ff7 Increase bybit ohlcv_candle_limit to 1000 2023-08-08 11:36:48 +02:00
Stefano Ariestasia
c88f71c638 add timeout to discord 2023-08-08 14:57:48 +09:00
Matthias
05bbc8e7aa Remove last sandbox occurance 2023-08-08 06:26:25 +02:00
Matthias
5e3e443d27 Remove Sandbox docs 2023-08-08 06:25:12 +02:00
Matthias
88d6f70abe Remove sandbox related code 2023-08-08 06:25:06 +02:00
Matthias
9c73e52dd1 Remove sandbox configuration options 2023-08-08 06:23:52 +02:00
Matthias
33d3c4f7d5 Improve backtestResponse in preparation for future update 2023-08-07 20:11:30 +02:00
Matthias
03150ee09a Ensure backpopulated "trade" attribute is immediately loaded. 2023-08-07 06:59:35 +02:00
Matthias
4b07720d0b Update test strategy to ensure we're using stake_amount 2023-08-07 06:59:16 +02:00
Matthias
096df99ba3 Merge pull request #9020 from freqtrade/dependabot/pip/develop/ccxt-4.0.50
Bump ccxt from 4.0.48 to 4.0.50
2023-08-07 06:46:48 +02:00
Matthias
f16832b07c Merge pull request #9023 from freqtrade/dependabot/pip/develop/jsonschema-4.18.6
Bump jsonschema from 4.18.5 to 4.18.6
2023-08-07 06:34:59 +02:00
Matthias
98310de996 Merge pull request #9021 from freqtrade/dependabot/pip/develop/orjson-3.9.3
Bump orjson from 3.9.2 to 3.9.3
2023-08-07 06:24:16 +02:00
Matthias
d37b2fbada Merge pull request #9022 from freqtrade/dependabot/pip/develop/fastapi-0.101.0
Bump fastapi from 0.100.1 to 0.101.0
2023-08-07 06:24:00 +02:00
dependabot[bot]
ae3c3d81c1 Bump jsonschema from 4.18.5 to 4.18.6
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.18.5 to 4.18.6.
- [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.18.5...v4.18.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-07 03:05:47 +00:00
dependabot[bot]
8deedc31c5 Bump fastapi from 0.100.1 to 0.101.0
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.100.1 to 0.101.0.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.100.1...0.101.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-07 03:05:27 +00:00
dependabot[bot]
8c3a0cf618 Bump orjson from 3.9.2 to 3.9.3
Bumps [orjson](https://github.com/ijl/orjson) from 3.9.2 to 3.9.3.
- [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.2...3.9.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-07 03:05:18 +00:00
dependabot[bot]
67ea6512ef Bump ccxt from 4.0.48 to 4.0.50
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.48 to 4.0.50.
- [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.48...4.0.50)

---
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-07 03:05:10 +00:00
Matthias
813ace12c9 Explain behavior in case of deposits
related to #8998
2023-08-06 17:11:33 +02:00
Matthias
cd6fc1652e Add rate-limited wallets call before adjust_trade-Position calls
closes #8998
2023-08-06 17:11:17 +02:00
Matthias
7d18261f58 Improve FAQ wording 2023-08-06 17:10:38 +02:00
Matthias
72d9e8a094 Fix indentation of strategy-updater in utils 2023-08-05 11:31:01 +02:00
Matthias
e174f9640d Improve docker docs with some hints about windows usage 2023-08-05 11:14:19 +02:00
hippocritical
25602ceac3 Added a fixed fee to 0.02 (any fixed value would suffice) since kucoin dynamically decides which pair gets which amount of fees and thereby producing false-positives upon verifying the entries/exits.
Added a check for timerange being set.
2023-08-05 08:24:47 +02:00
hippocritical
065899b426 Merge branch 'freqtrade:develop' into develop 2023-08-05 07:36:29 +02:00
yinon
bdf89efd11 pytorch - improve docs 2023-08-04 14:42:28 +00:00
yinon
23d2bad2a0 pytorch - set n_steps type as optional 2023-08-04 14:33:59 +00:00
yinon
9f69a45afd pytorch - documentation update 2023-08-04 13:46:30 +00:00
yinon
a3c6904fbc pytorch - naming refactor - max_iters to n_steps 2023-08-04 13:45:21 +00:00
yinon
d17bf6350d pytorch - trainer - revert load changes 2023-08-04 12:53:20 +00:00
yinon
777d25192c pytorch - bugfix - explicitly assign tensor to var as .to() is not inplace operation 2023-08-04 12:53:20 +00:00
yinon
836d7b885a pytorch - trainer - set default usage of n_epochs instead of max_iters 2023-08-04 12:53:19 +00:00
yinon
8ebfb731d8 Merge branch 'develop' into freqai-pytorch-bugfixes 2023-08-04 12:47:41 +00:00
Matthias
3e77bc3ba2 Merge pull request #9013 from freqtrade/feat/backtest_notes
Add backtest notes capability
2023-08-03 20:15:08 +02:00
hippocritical
365766c957 Merge branch 'freqtrade:develop' into develop 2023-08-03 18:44:00 +02:00
Matthias
81cd241954 Update API backtest to return proper metadata 2023-08-03 07:05:57 +02:00
Matthias
6d6111864e Test also backtest result list 2023-08-03 06:43:12 +02:00
Matthias
23a2b95994 Add test for updating metadata 2023-08-03 06:39:27 +02:00
Matthias
36b84241b1 Don't allow null as notes 2023-08-03 06:28:57 +02:00
Matthias
51879ffd2c move Notes to be a "API only" type 2023-08-03 06:17:06 +02:00
Matthias
0d71a74d8a Bump api version to 2.32 2023-08-03 06:17:06 +02:00
Matthias
78972604d0 Allow metadata file updating 2023-08-03 06:17:05 +02:00
Matthias
2f95c44777 Add "notes" to backtest result output 2023-08-03 06:17:05 +02:00
Matthias
3d3dcc68e0 Merge pull request #9009 from freqtrade/dependabot/pip/develop/ccxt-4.0.48
Bump ccxt from 4.0.47 to 4.0.48
2023-08-03 06:11:49 +02:00
Matthias
fede847fd9 Merge pull request #9010 from freqtrade/dependabot/pip/develop/jsonschema-4.18.5
Bump jsonschema from 4.18.4 to 4.18.5
2023-08-02 20:37:58 +02:00
Matthias
53c0d30f36 Update test for new kucoin behavior
related: https://github.com/ccxt/ccxt/pull/18745
2023-08-02 20:04:41 +02:00
hippocritical
fe6deef1bd Merge branch 'freqtrade:develop' into develop 2023-08-02 20:02:55 +02:00
Matthias
0e63335d2e Remove bitvavo temp. workaround 2023-08-02 20:01:31 +02:00
Matthias
494d58e79c Update tests for new output format (string-formatted dates are not relevant). 2023-08-02 19:52:34 +02:00
Matthias
3b416223e3 Bump pydantic to 2.1.1 2023-08-02 19:52:15 +02:00
Matthias
d78eb834c4 Convert to pydantic - jsonencoders (no longer exists) 2023-08-02 19:52:08 +02:00
Matthias
47850ce1b0 Don''t use deprecated pydantic methods 2023-08-02 19:51:50 +02:00
Matthias
bb18e1b45b Fix part of the backtest type error 2023-08-02 19:51:50 +02:00
Matthias
4b2a6a84f4 Remove more deprecated options 2023-08-02 19:51:50 +02:00
Matthias
505584dc48 pydantic 2 - update deprecated methods 2023-08-02 19:51:50 +02:00
Matthias
e36c545258 pydantic - root model 2023-08-02 19:51:47 +02:00
Matthias
cfdd01d295 Update most of Api schema to pydantic 2.0 2023-08-02 19:51:21 +02:00
Matthias
53c76160a7 Force pydantic > 2.0 2023-08-02 19:50:58 +02:00
Matthias
9b924f1f85 Convert ws_schemas to pydantic 2.0 2023-08-02 19:50:58 +02:00
Matthias
261a593ba5 Update tests for new output format (string-formatted dates are not relevant). 2023-08-02 19:48:59 +02:00
dependabot[bot]
02ec945a96 Bump pydantic from 1.10.11 to 2.1.1
Bumps [pydantic](https://github.com/pydantic/pydantic) from 1.10.11 to 2.1.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/v1.10.11...v2.1.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-02 17:45:59 +00:00
dependabot[bot]
2b7deb147d Bump jsonschema from 4.18.4 to 4.18.5
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.18.4 to 4.18.5.
- [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.18.4...v4.18.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-02 17:43:11 +00:00
Matthias
f2b240b16d Merge pull request #9008 from freqtrade/dependabot/pip/develop/mkdocs-1.5.2
Bump mkdocs from 1.5.1 to 1.5.2
2023-08-02 19:42:32 +02:00
dependabot[bot]
ac85c3527b Bump ccxt from 4.0.47 to 4.0.48
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.47 to 4.0.48.
- [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.47...4.0.48)

---
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-02 16:21:12 +00:00
dependabot[bot]
adbb131dc6 Bump mkdocs from 1.5.1 to 1.5.2
Bumps [mkdocs](https://github.com/mkdocs/mkdocs) from 1.5.1 to 1.5.2.
- [Release notes](https://github.com/mkdocs/mkdocs/releases)
- [Commits](https://github.com/mkdocs/mkdocs/compare/1.5.1...1.5.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-02 16:20:58 +00:00
Matthias
7a6f10f898 Merge pull request #9005 from freqtrade/dependabot/pip/develop/ruff-0.0.282
Bump ruff from 0.0.280 to 0.0.282
2023-08-02 18:20:10 +02:00
Matthias
482cc615cc Fix empty Path inits in tests 2023-08-02 17:57:49 +02:00
Matthias
d037d5d880 Merge pull request #8997 from stash86/bt-metrics
add second alternatives instead of using .range
2023-08-02 09:32:24 +02:00
Matthias
ae2df4fed3 Merge pull request #9007 from freqtrade/dependabot/pip/develop/rich-13.5.2
Bump rich from 13.5.1 to 13.5.2
2023-08-02 09:17:05 +02:00
Matthias
aeb7a8f90e Merge pull request #9006 from freqtrade/dependabot/pip/develop/ccxt-4.0.47
Bump ccxt from 4.0.45 to 4.0.47
2023-08-02 09:16:51 +02:00
dependabot[bot]
b91d7debea Bump rich from 13.5.1 to 13.5.2
Bumps [rich](https://github.com/Textualize/rich) from 13.5.1 to 13.5.2.
- [Release notes](https://github.com/Textualize/rich/releases)
- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Textualize/rich/compare/v13.5.1...v13.5.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-02 05:09:47 +00:00
dependabot[bot]
1778a6add6 Bump ccxt from 4.0.45 to 4.0.47
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.45 to 4.0.47.
- [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.45...4.0.47)

---
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-02 05:09:42 +00:00
dependabot[bot]
2a0a270f18 Bump ruff from 0.0.280 to 0.0.282
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.0.280 to 0.0.282.
- [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.280...v0.0.282)

---
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-02 05:09:27 +00:00
Matthias
dc93f122f0 Merge pull request #9003 from freqtrade/dependabot/pip/cryptography-41.0.3
Bump cryptography from 40.0.1 to 41.0.3
2023-08-02 07:08:26 +02:00
Matthias
e1fd3a6dc3 Fix formatting of bullet points 2023-08-02 07:01:59 +02:00
Matthias
66adeb0a5c Only bump non-arm cryptography 2023-08-02 06:42:50 +02:00
dependabot[bot]
1be1efbc4c Bump cryptography from 40.0.1 to 41.0.3
Bumps [cryptography](https://github.com/pyca/cryptography) from 40.0.1 to 41.0.3.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/40.0.1...41.0.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-02 01:42:29 +00:00
Matthias
acd005b726 Don't show 0.0.0.0 security warning when running in docker.
#9000
2023-08-01 20:17:07 +02:00
Stefano Ariestasia
c4d41659f2 add second alternatives instead of using .range 2023-08-01 16:15:20 +09:00
Matthias
3612956b7b Allow unbound stoploss
part of  #8976
2023-08-01 07:12:56 +02:00
Matthias
78670602dd Update binance leverage tiers 2023-08-01 07:09:44 +02:00
Matthias
33eecfa9ef Fix test typo 2023-08-01 06:32:23 +02:00
Matthias
30f6f470d3 Add filename to backtest result metadata 2023-07-31 21:22:22 +02:00
Matthias
c836bd8fa5 Add Get_backtest_resultlist typing 2023-07-31 21:22:22 +02:00
Matthias
5c68b0d38e Add BacktestMetadataType 2023-07-31 21:22:22 +02:00
Matthias
f546ee6569 Use list comprehension to get backtest-history 2023-07-31 21:22:22 +02:00
Matthias
730ae781a9 Add explicit test for get_backtest_metadata 2023-07-31 21:22:22 +02:00
Matthias
ec10d0706a Merge pull request #8994 from freqtrade/dependabot/pip/develop/ccxt-4.0.45
Bump ccxt from 4.0.44 to 4.0.45
2023-07-31 19:10:05 +02:00
Matthias
9d58384eae Merge pull request #8993 from freqtrade/dependabot/pip/develop/numpy-1.25.2
Bump numpy from 1.25.1 to 1.25.2
2023-07-31 19:09:52 +02:00
dependabot[bot]
4fd425260d Bump ccxt from 4.0.44 to 4.0.45
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.44 to 4.0.45.
- [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.44...4.0.45)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-31 15:55:46 +00:00
Matthias
dcdd7d57a6 Merge pull request #8992 from freqtrade/dependabot/pip/develop/rich-13.5.1
Bump rich from 13.5.0 to 13.5.1
2023-07-31 17:54:23 +02:00
dependabot[bot]
f1fb118d76 Bump numpy from 1.25.1 to 1.25.2
Bumps [numpy](https://github.com/numpy/numpy) from 1.25.1 to 1.25.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.25.1...v1.25.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-07-31 14:55:30 +00:00
dependabot[bot]
61da1877ae Bump rich from 13.5.0 to 13.5.1
Bumps [rich](https://github.com/Textualize/rich) from 13.5.0 to 13.5.1.
- [Release notes](https://github.com/Textualize/rich/releases)
- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Textualize/rich/compare/v13.5.0...v13.5.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-31 14:54:52 +00:00
Matthias
78b0609840 Merge pull request #8991 from freqtrade/dependabot/pip/develop/uvicorn-0.23.2
Bump uvicorn from 0.23.1 to 0.23.2
2023-07-31 16:54:10 +02:00
dependabot[bot]
6b163af99a Bump uvicorn from 0.23.1 to 0.23.2
Bumps [uvicorn](https://github.com/encode/uvicorn) from 0.23.1 to 0.23.2.
- [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.1...0.23.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-31 07:46:04 +00:00
Matthias
8030e65384 Merge pull request #8985 from freqtrade/dependabot/pip/develop/rich-13.5.0
Bump rich from 13.4.2 to 13.5.0
2023-07-31 09:33:10 +02:00
Matthias
c20e3a3075 Merge pull request #8989 from freqtrade/dependabot/pip/develop/ccxt-4.0.44
Bump ccxt from 4.0.36 to 4.0.44
2023-07-31 08:29:59 +02:00
Matthias
d6999fda6f Merge pull request #8986 from freqtrade/dependabot/pip/develop/markdown-3.4.4
Bump markdown from 3.3.7 to 3.4.4
2023-07-31 08:29:33 +02:00
Matthias
9c39499c5d Merge pull request #8987 from freqtrade/dependabot/pip/develop/mkdocs-material-9.1.21
Bump mkdocs-material from 9.1.19 to 9.1.21
2023-07-31 08:28:55 +02:00
dependabot[bot]
ce574af7c8 Bump mkdocs-material from 9.1.19 to 9.1.21
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.1.19 to 9.1.21.
- [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.1.19...9.1.21)

---
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-07-31 05:06:28 +00:00
Matthias
74edc202cf Merge pull request #8984 from freqtrade/dependabot/pip/develop/fastapi-0.100.1
Bump fastapi from 0.100.0 to 0.100.1
2023-07-31 07:05:43 +02:00
dependabot[bot]
ddd92a90b7 Bump markdown from 3.3.7 to 3.4.4
Bumps [markdown](https://github.com/Python-Markdown/markdown) from 3.3.7 to 3.4.4.
- [Changelog](https://github.com/Python-Markdown/markdown/blob/master/docs/change_log/release-2.6.md)
- [Commits](https://github.com/Python-Markdown/markdown/compare/3.3.7...3.4.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-31 05:04:57 +00:00
Matthias
3ee228428d Merge pull request #8983 from freqtrade/dependabot/pip/develop/mkdocs-1.5.1
Bump mkdocs from 1.4.3 to 1.5.1
2023-07-31 07:03:25 +02:00
Matthias
a60fd9c011 Merge pull request #8988 from freqtrade/dependabot/pip/develop/nbconvert-7.7.3
Bump nbconvert from 7.7.2 to 7.7.3
2023-07-31 07:02:19 +02:00
dependabot[bot]
370ea273cb Bump ccxt from 4.0.36 to 4.0.44
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.36 to 4.0.44.
- [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.36...4.0.44)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-31 03:35:38 +00:00
dependabot[bot]
bc86f12611 Bump nbconvert from 7.7.2 to 7.7.3
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.7.2 to 7.7.3.
- [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.2...v7.7.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-31 03:35:32 +00:00
dependabot[bot]
e5d5c4c50a Bump rich from 13.4.2 to 13.5.0
Bumps [rich](https://github.com/Textualize/rich) from 13.4.2 to 13.5.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.4.2...v13.5.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-07-31 03:35:10 +00:00
dependabot[bot]
a147f7a041 Bump fastapi from 0.100.0 to 0.100.1
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.100.0 to 0.100.1.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.100.0...0.100.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-07-31 03:35:06 +00:00
dependabot[bot]
b666adced4 Bump mkdocs from 1.4.3 to 1.5.1
Bumps [mkdocs](https://github.com/mkdocs/mkdocs) from 1.4.3 to 1.5.1.
- [Release notes](https://github.com/mkdocs/mkdocs/releases)
- [Commits](https://github.com/mkdocs/mkdocs/compare/1.4.3...1.5.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-31 03:35:00 +00:00
Matthias
1926e642cd Improve backtest_stats storing test 2023-07-30 19:49:20 +02:00
Matthias
1a1103c239 Add backtest-result typing 2023-07-30 10:54:03 +02:00
Matthias
3148cd39c2 Don't drop metadata from original dict when storing backtest results 2023-07-30 10:54:03 +02:00
Matthias
22006ebeea Merge pull request #8899 from freqtrade/dataformat/feather
Change default dataformat to feather
2023-07-30 09:08:43 +02:00
Matthias
d104fb13a0 Merge pull request #8978 from freqtrade/new_release
New Release 2023.7
2023-07-30 09:02:44 +02:00
Matthias
71737d8792 Remove half-commented test part 2023-07-29 20:08:20 +02:00
Matthias
6659d26131 Merge branch 'develop' into dataformat/feather 2023-07-29 20:04:12 +02:00
Matthias
047de2e0ff Bump version to 2023.7 2023-07-29 18:19:04 +02:00
Matthias
15dd8bec1c Bump dev version to 2023.8-dev 2023-07-29 18:18:03 +02:00
Matthias
ead9e6f116 Merge pull request #8977 from Bloodhunter4rc/patch-3
showcase.md - Change links to https
2023-07-29 17:09:20 +02:00
Bloodhunter4rc
b17918d8cf change link to https 2023-07-29 16:48:52 +02:00
Matthias
79910870a3 Fix bug resampling monthly candles
closes #8972
2023-07-29 08:58:30 +02:00
Matthias
e7e7a17183 Add test confirming #8972 2023-07-29 08:50:28 +02:00
Matthias
3fa31bfe20 Better explain ROI assumption on level change
closes #8975
2023-07-29 08:14:12 +02:00
Matthias
b2abdab7cd Fix bug where adjust_entry_price was called for exit orders
closes #8973
2023-07-28 07:16:32 +02:00
Matthias
fd7dfc95e3 Enhance dca integration test for adjust_entry checks 2023-07-28 07:16:12 +02:00
Matthias
797617abaa Fix test comment 2023-07-28 07:07:10 +02:00
Matthias
9a400d0e6f Allow comments and trailing commas in remotepairlist files
closes #8971
2023-07-27 18:05:22 +02:00
Matthias
8f18a52cdf Fix Typo in remote pairlist docs
related: #8971
2023-07-27 09:24:42 +02:00
Matthias
d638a4a0ff Raise proper error on strategy search
part of https://github.com/freqtrade/frequi/issues/1387
2023-07-27 07:03:35 +02:00
Matthias
bbf472e69b Improve errorhandling on webserver endpoint
Part of https://github.com/freqtrade/frequi/issues/1387
2023-07-27 06:52:34 +02:00
Matthias
83f45d0e65 Call static method as static method, not as if it were an instance method 2023-07-27 06:39:48 +02:00
Matthias
d6122585f7 Prevent pandas exception on Date assignment 2023-07-27 06:39:31 +02:00
Matthias
2fcff78756 Move comment to actually relevant line 2023-07-26 07:07:21 +02:00
Matthias
af1d2ee2a2 Merge pull request #8968 from Bloodhunter4rc/patch-2
Update showcase.md / Change Domain due to recent dns issues
2023-07-26 06:43:48 +02:00
Bloodhunter4rc
f56f5179d2 Update showcase.md
Change of domain due to recent dns issues.
2023-07-25 23:06:56 +02:00
Matthias
c2b40da762 Bump Api Version 2023-07-25 20:51:33 +02:00
Matthias
05e4b63091 Extract backtest_result deletion logic to separate function 2023-07-25 20:42:07 +02:00
Matthias
8b2abf4422 Remove .json from backtesting output 2023-07-25 20:41:28 +02:00
Matthias
997b80fd7b Allow deleting of backtest files 2023-07-25 20:34:45 +02:00
Matthias
5a7e822342 Improve security of get_backtest_history_result 2023-07-25 20:20:09 +02:00
Matthias
1d39cc18bf Add is_file_in_dir helper function 2023-07-25 20:19:23 +02:00
Matthias
e39af17207 Improve typing for is_relative_to 2023-07-25 20:07:44 +02:00
Matthias
4ce95dd1c3 Merge pull request #8955 from freqtrade/feat/bt_streaks
Backtesting - streak output
2023-07-25 18:06:11 +02:00
Matthias
47fca02ba0 Improve docstring 2023-07-25 07:06:42 +02:00
Matthias
ed2485dd57 Move generate_wins_draw_losses to bt_output (it's an output function, not a calculation) 2023-07-25 07:04:25 +02:00
Matthias
6dc15fad01 Merge pull request #8962 from freqtrade/dependabot/pip/develop/uvicorn-0.23.1
Bump uvicorn from 0.23.0 to 0.23.1
2023-07-25 06:38:13 +02:00
Matthias
27566a4c8a Merge pull request #8963 from freqtrade/dependabot/pip/develop/ccxt-4.0.36
Bump ccxt from 4.0.35 to 4.0.36
2023-07-25 06:37:56 +02:00
Matthias
3860a5a8c5 Merge pull request #8965 from freqtrade/dependabot/pip/develop/ruff-0.0.280
Bump ruff from 0.0.278 to 0.0.280
2023-07-25 06:37:42 +02:00
Matthias
235721d9d9 Merge pull request #8964 from freqtrade/dependabot/pip/develop/types-requests-2.31.0.2
Bump types-requests from 2.31.0.1 to 2.31.0.2
2023-07-24 21:37:11 +02:00
Matthias
5a057e4b94 per-commit bump types-requests 2023-07-24 17:34:39 +02:00
dependabot[bot]
b90e7d75c6 Bump ruff from 0.0.278 to 0.0.280
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.0.278 to 0.0.280.
- [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.278...v0.0.280)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-24 15:32:13 +00:00
dependabot[bot]
1c26a6600b Bump types-requests from 2.31.0.1 to 2.31.0.2
Bumps [types-requests](https://github.com/python/typeshed) from 2.31.0.1 to 2.31.0.2.
- [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-07-24 15:31:56 +00:00
dependabot[bot]
161446393d Bump ccxt from 4.0.35 to 4.0.36
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.35 to 4.0.36.
- [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.35...4.0.36)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-24 15:31:53 +00:00
dependabot[bot]
9df302f2f0 Bump uvicorn from 0.23.0 to 0.23.1
Bumps [uvicorn](https://github.com/encode/uvicorn) from 0.23.0 to 0.23.1.
- [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.0...0.23.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-24 15:31:45 +00:00
Matthias
e95fa83ea2 Merge pull request #8953 from freqtrade/dependabot/pip/develop/types-python-dateutil-2.8.19.14
Bump types-python-dateutil from 2.8.19.13 to 2.8.19.14
2023-07-24 16:52:39 +02:00
Matthias
b151a2c3e1 Merge pull request #8947 from freqtrade/dependabot/pip/develop/urllib3-2.0.4
Bump urllib3 from 2.0.3 to 2.0.4
2023-07-24 16:19:38 +02:00
Matthias
ce7f7d828d pre-commit bump dateuti 2023-07-24 15:49:25 +02:00
dependabot[bot]
7a69bdff6a Bump types-python-dateutil from 2.8.19.13 to 2.8.19.14
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19.13 to 2.8.19.14.
- [Commits](https://github.com/python/typeshed/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-24 13:34:35 +00:00
Matthias
1abb71d5a3 Merge pull request #8950 from freqtrade/dependabot/pip/develop/nbconvert-7.7.2
Bump nbconvert from 7.7.0 to 7.7.2
2023-07-24 15:34:10 +02:00
Matthias
2e57ad695f Merge pull request #8952 from freqtrade/dependabot/pip/develop/types-tabulate-0.9.0.3
Bump types-tabulate from 0.9.0.2 to 0.9.0.3
2023-07-24 15:33:49 +02:00
Matthias
bb36c9500f Bump pre-commit types tabulate 2023-07-24 14:12:52 +02:00
dependabot[bot]
235067c79f Bump nbconvert from 7.7.0 to 7.7.2
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.7.0 to 7.7.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.7.0...v7.7.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-24 12:12:06 +00:00
dependabot[bot]
11e604d613 Bump types-tabulate from 0.9.0.2 to 0.9.0.3
Bumps [types-tabulate](https://github.com/python/typeshed) from 0.9.0.2 to 0.9.0.3.
- [Commits](https://github.com/python/typeshed/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-24 12:12:03 +00:00
Matthias
f7505536ff Merge pull request #8954 from freqtrade/dependabot/pip/develop/types-cachetools-5.3.0.6
Bump types-cachetools from 5.3.0.5 to 5.3.0.6
2023-07-24 14:11:19 +02:00
Matthias
b096c857ae Merge pull request #8951 from freqtrade/dependabot/pip/develop/pyjwt-2.8.0
Bump pyjwt from 2.7.0 to 2.8.0
2023-07-24 10:03:49 +02:00
Matthias
b41b966443 pre-commit bump cachetools 2023-07-24 10:03:08 +02:00
Matthias
e01e712b8c Merge pull request #8948 from freqtrade/dependabot/pip/develop/ccxt-4.0.35
Bump ccxt from 4.0.34 to 4.0.35
2023-07-24 10:01:47 +02:00
Matthias
327b055468 Add consecutive wins/losses to backtest output 2023-07-24 07:22:33 +02:00
dependabot[bot]
221f242a4c Bump ccxt from 4.0.34 to 4.0.35
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.34 to 4.0.35.
- [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.34...4.0.35)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-24 05:19:04 +00:00
Matthias
a9d310ca00 Disable bitvavo candle test temporarily after downtime 2023-07-24 07:17:29 +02:00
Matthias
f26b49ee06 Ensure return value is an int, not a np.int 2023-07-24 07:09:19 +02:00
Matthias
380244f8b1 Improve calc_streak, rename method 2023-07-24 07:09:11 +02:00
Matthias
c01c9ee411 Merge pull request #8949 from freqtrade/dependabot/pip/develop/mkdocs-material-9.1.19
Bump mkdocs-material from 9.1.18 to 9.1.19
2023-07-24 07:07:12 +02:00
Matthias
0f046ceaf2 Implement calc_consecutive_losses 2023-07-24 06:36:24 +02:00
Matthias
a7bd6725f5 Add test to verify consecutive wins / losses calculation 2023-07-24 06:36:16 +02:00
dependabot[bot]
c61b72e5cc Bump urllib3 from 2.0.3 to 2.0.4
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.0.3 to 2.0.4.
- [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.3...2.0.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-24 04:33:05 +00:00
Matthias
e2a19402ec Merge pull request #8946 from freqtrade/dependabot/pip/develop/jsonschema-4.18.4
Bump jsonschema from 4.18.3 to 4.18.4
2023-07-24 06:32:06 +02:00
dependabot[bot]
d909fde4bb Bump types-cachetools from 5.3.0.5 to 5.3.0.6
Bumps [types-cachetools](https://github.com/python/typeshed) from 5.3.0.5 to 5.3.0.6.
- [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-07-24 03:44:45 +00:00
dependabot[bot]
2bb4af911c Bump pyjwt from 2.7.0 to 2.8.0
Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.7.0 to 2.8.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.7.0...2.8.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-24 03:44:20 +00:00
dependabot[bot]
00a392b262 Bump mkdocs-material from 9.1.18 to 9.1.19
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.1.18 to 9.1.19.
- [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.1.18...9.1.19)

---
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-07-24 03:44:05 +00:00
dependabot[bot]
6f5ba27251 Bump jsonschema from 4.18.3 to 4.18.4
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.18.3 to 4.18.4.
- [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.18.3...v4.18.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-24 03:43:35 +00:00
hippocritical
5b8800ee18 didnt intend to change the timerange itself, but the logger-output of the timerange 2023-07-23 20:20:15 +02:00
hippocritical
5bb74e448e Merge remote-tracking branch 'origin/develop' into develop 2023-07-23 20:08:27 +02:00
hippocritical
e4b488cb84 added stake_amount to a fixed 10k value.
In a combination with a wallet size of 1 billion it should never be able to run out of money avoiding false-positives of some users who just wanted to test a strategy without actually checking how the stake_amount-variable should be used in combination with the strategy-function custom_stake_amount.

reason: some strategies demand a custom_stake_amount of 1$ demanding a very large wallet-size (which already was set previously)
Others start with 100% of a slot size and subdivide the base-orders and safety-orders down to finish at 100% of a slot-size and use unlimited stake_amount.

Edited docs to reflect that change.
2023-07-23 20:05:29 +02:00
hippocritical
70fa175f57 Merge branch 'freqtrade:develop' into develop 2023-07-23 20:01:59 +02:00
Matthias
6ddbc8c00d Move generate_wins_draw_losses to bt_output (it's an output function, not a calculation) 2023-07-23 19:57:47 +02:00
hippocritical
ad428aa9b0 added stake_amount to a fixed 10k value.
In a combination with a wallet size of 1 billion it should never be able to run out of money avoiding false-positives of some users who just wanted to test a strategy without actually checking how the stake_amount-variable should be used in combination with the strategy-function custom_stake_amount

reason: some strategies demand a custom_stake_amount of 1$ demanding a very large wallet-size (which already was set previously)
Others start with 100% of a slot size and subdivide the base-orders and safety-orders down to finish at 100% of a slot-size and use unlimited stake_amount.

Edited docs to reflect that change too
2023-07-23 19:50:12 +02:00
Matthias
a00fcd68f8 Default to 0.0.0.0 if on API listen address for configs generated through docker 2023-07-23 19:44:43 +02:00
Matthias
fb7fb7f59c Add helper function detecting (prebuilt) docker environment 2023-07-23 19:38:30 +02:00
Matthias
d7916366bd Adjust webhook tests to include timeout 2023-07-23 19:21:55 +02:00
Matthias
ad82ad4407 webhook docs improvements 2023-07-23 18:28:49 +02:00
Matthias
8dfe43f370 Add timeout for webhooks 2023-07-23 18:28:43 +02:00
Matthias
4549fb349c Add security notice about IP whitelisting on bybit docs 2023-07-23 17:57:48 +02:00
Matthias
889a732e06 Enhance bybit documentation 2023-07-23 17:57:04 +02:00
hippocritical
1ab357dc32 added mentioning which pair + timerange + idx is biased for visibility and debugging purposes 2023-07-23 15:29:25 +02:00
hippocritical
a33be8a349 added dummy-varholders in case a not-last-trade is force-exit and else the indexes would shift ruining the analysis and making debugging easier (since the same ID will always be the same ID again) 2023-07-23 13:48:54 +02:00
hippocritical
a5f5293bc8 added logger-output when something is skipped or aborted 2023-07-23 11:23:02 +02:00
Matthias
52ec2324dd Merge pull request #8943 from stash86/bt-metrics
merge to use  expectancy and expectancy ratio from data/metrics
2023-07-23 08:37:08 +02:00
Stefano Ariestasia
8f04225282 another test fix 2023-07-23 15:00:08 +09:00
Stefano Ariestasia
4c23771d39 fix expectancy test 2023-07-23 14:42:48 +09:00
Stefano Ariestasia
0eddc6b7ad update expectancy test 2023-07-23 14:27:45 +09:00
Matthias
787e94924d Update default expectancy ratio to 100 2023-07-23 07:20:59 +02:00
Matthias
955a63725a Improve resiliance when showing older backtest results 2023-07-22 19:43:20 +02:00
dependabot[bot]
27a36bfb40 Bump lightgbm from 3.3.5 to 4.0.0 (#8923)
* Bump lightgbm from 3.3.5 to 4.0.0

Bumps [lightgbm](https://github.com/microsoft/LightGBM) from 3.3.5 to 4.0.0.
- [Release notes](https://github.com/microsoft/LightGBM/releases)
- [Commits](https://github.com/microsoft/LightGBM/compare/v3.3.5...v4.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>

* fix: ensure freqai lightgbm variants conform to v4.0.0

* remove random file

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: robcaulk <rob.caulk@gmail.com>
2023-07-22 15:30:58 +02:00
Stefano Ariestasia
e5f01ab2e8 pre-commit fix 2023-07-22 17:45:58 +09:00
Stefano Ariestasia
40d7d05e4e merge 2 expectancy functions 2023-07-22 17:29:43 +09:00
Matthias
14d2e3e88e Merge pull request #8941 from SitoCH/develop
Map BUSD to correct coingecko id
2023-07-22 08:33:17 +02:00
Stefano Ariestasia
c6ee8fcf54 remove unused check 2023-07-22 12:20:35 +09:00
Stefano Ariestasia
3552fa431b fix test 2023-07-22 11:40:52 +09:00
Stefano Ariestasia
3dd33cde00 fix test 2023-07-22 11:39:10 +09:00
Stefano Ariestasia
ee3b69ea63 fix test 2023-07-22 11:37:22 +09:00
Stefano Ariestasia
b0639ab319 flake8 2023-07-22 11:29:08 +09:00
Stefano Ariestasia
cfd8b068e7 add test for expectancy 2023-07-22 11:25:53 +09:00
Stefano Ariestasia
8621dc96e7 fix tests 2023-07-22 09:44:24 +09:00
Stefano Ariestasia
11f24aff97 flake8 2023-07-22 09:19:36 +09:00
Stefano Ariestasia
dcc3ef1309 flake8 fix 2023-07-22 09:18:22 +09:00
Stefano Ariestasia
4812bcc28b flake8 fiz 2023-07-22 09:13:24 +09:00
Stefano Ariestasia
c048e7229a modify expectancy and expectancy ratio 2023-07-22 08:36:51 +09:00
Simone Grignola
4ea3f41d48 Map BUSD to correct coingecko id 2023-07-21 20:49:37 +00:00
Matthias
6874123974 Bump ccxt to 4.0.34
closes #8913
2023-07-21 21:11:30 +02:00
Matthias
8d332fb99e Ensure /pair_history endpoint correctly respects startup_candle_count
closes https://github.com/freqtrade/frequi/issues/1379
2023-07-21 20:58:26 +02:00
Matthias
f4933a9cff Improve test for pair_history
Verifies that startup_candle_count is verified correctly.
2023-07-21 20:57:05 +02:00
Matthias
4369e3cdeb trim_dataframe should enforce kwargs for non-required arguments 2023-07-21 20:33:41 +02:00
Matthias
9bfe96d4d6 Simplify advise calls by extracting that part into a method. 2023-07-21 20:27:52 +02:00
Matthias
91bf8abf38 Add comment to clarify usage of trim_dataframes 2023-07-21 20:22:44 +02:00
Matthias
9c1fea0e7b Add winrate to several bt metrics 2023-07-20 20:51:38 +02:00
Matthias
ac2147727f Update test for updated cost logic 2023-07-20 19:51:45 +02:00
Matthias
ea45349235 Completely remove "fee_cost_in_contracts" functionality 2023-07-20 19:51:45 +02:00
Matthias
e734ab52de okx fees are not in contracts. 2023-07-20 19:51:45 +02:00
Matthias
75628403b0 Invert order_props_in_contracts logic - cost is almost never in contracts 2023-07-20 19:51:45 +02:00
Matthias
b3642749fd Merge pull request #8940 from freqtrade/dependabot/pip/aiohttp-3.8.5
Bump aiohttp from 3.8.4 to 3.8.5
2023-07-20 19:41:29 +02:00
dependabot[bot]
f735973bf8 Bump aiohttp from 3.8.4 to 3.8.5
Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.8.4 to 3.8.5.
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/v3.8.5/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.8.4...v3.8.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-20 16:04:06 +00:00
Matthias
bdb778cb9f Merge pull request #8912 from froggleston/rpc_expectancy
Add expectancy to RPC calls and telegram
2023-07-19 20:21:09 +02:00
Matthias
ab5b272868 Fix double-%% 2023-07-19 19:53:00 +02:00
Matthias
49d6b0afb8 Merge pull request #8937 from freqtrade/froggleston-bt-analysis-docs-1
Add built-in trade fields in indicator list docs
2023-07-19 19:41:24 +02:00
Robert Davey
bb5a12dc11 Add built-in trade fields in indicator list docs
There are some trade- and candle-related fields that are always available to output on the indicator-list so have updated the docs to include the most commonly used ones.
2023-07-19 11:11:10 +01:00
Matthias
0539c6bf26 Merge pull request #8918 from freqtrade/dependabot/pip/develop/ta-lib-0.4.27
Bump ta-lib from 0.4.26 to 0.4.27
2023-07-19 06:48:34 +02:00
froggleston
f95f954df7 Convert winrate to ratio instead of % in calculations 2023-07-18 22:25:17 +01:00
Matthias
5ee4586989 use find-links for windows install 2023-07-18 21:14:55 +02:00
Matthias
9c39fd6e92 Update cached binance lev-tiers file 2023-07-18 20:25:55 +02:00
Matthias
c8ee48bc98 Update comment on install script 2023-07-18 20:20:57 +02:00
Matthias
ef52a7a328 Simplify windows install sscript 2023-07-18 20:20:20 +02:00
Matthias
635ab73706 Update path for install_windows helper script 2023-07-18 20:19:40 +02:00
Matthias
c4d38e6de6 Add new ta-lib windows wheel 2023-07-18 20:19:30 +02:00
Matthias
dd8a8b0f1f Merge pull request #8934 from freqtrade/fix/docker-compose
Update docker-compose-freqai.yml
2023-07-18 20:07:59 +02:00
Matthias
8fd96118a5 Bump pydantic to latest 1.10 version 2023-07-18 20:02:24 +02:00
Matthias
db0cad04ab Pin pydantic to <2.0 for now 2023-07-18 18:25:44 +02:00
Robert Caulk
d64d0e9f94 Update docker-compose-freqai.yml 2023-07-18 15:03:20 +02:00
Matthias
adda506499 Merge pull request #8920 from freqtrade/dependabot/pip/develop/ruff-0.0.278
Bump ruff from 0.0.277 to 0.0.278
2023-07-17 19:57:32 +02:00
Robert Caulk
c8525959ee Merge pull request #8932 from hom-bahrani/patch-1
Update freqai-feature-engineering.md
2023-07-17 19:13:18 +02:00
Matthias
2b95a0a7e5 Merge pull request #8931 from freqtrade/chore/remove-inlier-metric
chore: remove inlier metric
2023-07-17 18:24:41 +02:00
Matthias
c64c10e76f Use Fstrings in hyperopt-tools 2023-07-17 18:20:26 +02:00
Matthias
b9c439cdd9 Merge pull request #8929 from freqtrade/dependabot/pip/develop/ccxt-4.0.29
Bump ccxt from 4.0.28 to 4.0.29
2023-07-17 18:16:07 +02:00
dependabot[bot]
d8ba2b5df3 Bump ccxt from 4.0.28 to 4.0.29
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.28 to 4.0.29.
- [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.28...4.0.29)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-17 13:44:51 +00:00
Matthias
5e37dd901d Merge pull request #8930 from freqtrade/dependabot/pip/develop/nbconvert-7.7.0
Bump nbconvert from 7.6.0 to 7.7.0
2023-07-17 15:44:05 +02:00
Matthias
031ac01b8d Merge pull request #8922 from freqtrade/dependabot/pip/develop/sqlalchemy-2.0.19
Bump sqlalchemy from 2.0.18 to 2.0.19
2023-07-17 15:43:45 +02:00
froggleston
6ccc12f337 Fix calcs, rename ratio, add docs 2023-07-17 14:16:22 +01:00
Hom Bahrani
8738b8d551 Update freqai-feature-engineering.md
It seems that the closing parenthesis ) is missing at the end of line 65 in the pipeline example
2023-07-17 13:59:09 +01:00
dependabot[bot]
f2ff85421a Bump nbconvert from 7.6.0 to 7.7.0
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.6.0 to 7.7.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.6.0...v7.7.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-07-17 11:16:30 +00:00
Matthias
cb5a67e9e0 Bump sqlalchemy pre-commit 2023-07-17 13:12:58 +02:00
Matthias
ca934c7568 Merge pull request #8926 from freqtrade/dependabot/github_actions/develop/pypa/gh-action-pypi-publish-1.8.8
Bump pypa/gh-action-pypi-publish from 1.8.7 to 1.8.8
2023-07-17 13:12:01 +02:00
robcaulk
6f0204fcd3 chore: remove inlier metric 2023-07-17 13:03:43 +02:00
Matthias
c81adf76c2 Merge pull request #8921 from freqtrade/dependabot/pip/develop/ccxt-4.0.28
Bump ccxt from 4.0.17 to 4.0.28
2023-07-17 10:30:16 +02:00
dependabot[bot]
78de614910 Bump ta-lib from 0.4.26 to 0.4.27
Bumps [ta-lib](https://github.com/ta-lib/ta-lib-python) from 0.4.26 to 0.4.27.
- [Changelog](https://github.com/TA-Lib/ta-lib-python/blob/master/CHANGELOG)
- [Commits](https://github.com/ta-lib/ta-lib-python/compare/TA_Lib-0.4.26...TA_Lib-0.4.27)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-17 07:36:12 +00:00
Matthias
201a8fe0ba Merge pull request #8925 from freqtrade/dependabot/pip/develop/jsonschema-4.18.3
Bump jsonschema from 4.18.0 to 4.18.3
2023-07-17 09:34:54 +02:00
dependabot[bot]
e5221932e8 Bump ruff from 0.0.277 to 0.0.278
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.0.277 to 0.0.278.
- [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.277...v0.0.278)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-17 05:02:21 +00:00
Matthias
3d5889060d Merge pull request #8919 from freqtrade/dependabot/pip/develop/pytest-asyncio-0.21.1
Bump pytest-asyncio from 0.21.0 to 0.21.1
2023-07-17 07:01:13 +02:00
Matthias
68c3c764b7 Merge pull request #8914 from freqtrade/fix/8877
Dry-run open balance should include realized profit
2023-07-17 06:47:10 +02:00
Matthias
fba89d2082 Merge pull request #8916 from freqtrade/dependabot/pip/develop/uvicorn-0.23.0
Bump uvicorn from 0.22.0 to 0.23.0
2023-07-17 06:44:23 +02:00
Matthias
7823ed6cc0 Merge pull request #8917 from freqtrade/dependabot/pip/develop/pymdown-extensions-10.1
Bump pymdown-extensions from 10.0.1 to 10.1
2023-07-17 06:41:00 +02:00
dependabot[bot]
c23ff9d7c2 Bump pypa/gh-action-pypi-publish from 1.8.7 to 1.8.8
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.8.7 to 1.8.8.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.8.7...v1.8.8)

---
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-07-17 03:58:46 +00:00
dependabot[bot]
5f82108aae Bump jsonschema from 4.18.0 to 4.18.3
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.18.0 to 4.18.3.
- [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.18.0...v4.18.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-17 03:51:14 +00:00
dependabot[bot]
454baa7b5b Bump sqlalchemy from 2.0.18 to 2.0.19
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.18 to 2.0.19.
- [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-07-17 03:51:00 +00:00
dependabot[bot]
69e9691730 Bump ccxt from 4.0.17 to 4.0.28
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.17 to 4.0.28.
- [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.17...4.0.28)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-17 03:50:49 +00:00
dependabot[bot]
8c8b315994 Bump pytest-asyncio from 0.21.0 to 0.21.1
Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.21.0 to 0.21.1.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.21.0...v0.21.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-17 03:50:33 +00:00
dependabot[bot]
e8ff5cb783 Bump pymdown-extensions from 10.0.1 to 10.1
Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 10.0.1 to 10.1.
- [Release notes](https://github.com/facelessuser/pymdown-extensions/releases)
- [Commits](https://github.com/facelessuser/pymdown-extensions/compare/10.0.1...10.1.0)

---
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-07-17 03:50:26 +00:00
dependabot[bot]
256a8c686e Bump uvicorn from 0.22.0 to 0.23.0
Bumps [uvicorn](https://github.com/encode/uvicorn) from 0.22.0 to 0.23.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.22.0...0.23.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-07-17 03:50:21 +00:00
Matthias
69ddbe3944 Merge pull request #8909 from freqtrade/backtest_adjustment
introduce order.stake_amount
2023-07-16 20:03:46 +02:00
froggleston
79f7f82c59 Fix telegram output 2023-07-16 16:52:06 +01:00
Matthias
35714c469b Add explicit dry_wallet test 2023-07-16 16:06:23 +02:00
Matthias
cf9ba527bb Include realized_profit in update_dry
closes #8877
2023-07-16 16:06:23 +02:00
Matthias
d0e0e156b1 Update tests to account for realized profit/loss 2023-07-16 16:06:23 +02:00
Matthias
8a55423ac7 Add asserts for wallet size 2023-07-16 16:04:00 +02:00
Matthias
66131d5103 Improve integration test assertions 2023-07-15 20:55:56 +02:00
froggleston
1fd2a2532d Reduce trade stats function complexity 2023-07-15 17:06:52 +01:00
froggleston
9d36dc7ac6 Fix line length 2023-07-15 16:59:33 +01:00
froggleston
59cb9e39dd Fix another trailing whitespace 2023-07-15 16:55:24 +01:00
froggleston
d4b282d6f7 Fix expectancy calc and tests 2023-07-15 16:51:45 +01:00
froggleston
e57bb6bc97 Add api schema entries 2023-07-15 16:27:58 +01:00
froggleston
3ce17b740b Fix flake8 problems 2023-07-15 16:25:19 +01:00
froggleston
7eced953b3 Merge in develop changes 2023-07-15 16:16:08 +01:00
Matthias
768a7b47ec Fix some futures symbol naming in tests 2023-07-15 17:14:57 +02:00
froggleston
096cb0d1ee Add tests, fix winrate calc 2023-07-15 16:09:13 +01:00
froggleston
4235ab0c7e Add expectancy and winrate to telegram 2023-07-15 15:39:47 +01:00
froggleston
6e56f84fe3 Add expectancy and winrate to rpc trade statistics 2023-07-15 15:32:52 +01:00
Matthias
ff14208105 Improve logic for from_json special case 2023-07-15 15:23:15 +02:00
Matthias
626ea6b119 Add backtesting support for order.stake_amount 2023-07-15 14:55:22 +02:00
Yinon Polak
d61f512e20 pytorch - trainer - clean code 2023-07-15 14:43:05 +03:00
Yinon Polak
77f1584713 pytorch - trainer - bugfix step tensorboard step usage 2023-07-15 14:37:44 +03:00
Matthias
d8c0621887 Add stake amount property to order object 2023-07-15 10:14:08 +02:00
Matthias
d1662db813 Merge pull request #8907 from freqtrade/dependabot/pip/cryptography-41.0.2
Bump cryptography from 40.0.1 to 41.0.2
2023-07-15 10:10:21 +02:00
Matthias
17296fdf9c Use proper cost for order
closes #8906
2023-07-15 09:02:17 +02:00
Matthias
e4cd29d88c Add test for trade.cost 2023-07-15 09:02:01 +02:00
Matthias
eeec1b0b38 Don't bump armhv crypto dependency
needs https://piwheels.org/project/cryptography/  to work again.
2023-07-15 08:18:29 +02:00
dependabot[bot]
e043fdba50 Bump cryptography from 40.0.1 to 41.0.2
Bumps [cryptography](https://github.com/pyca/cryptography) from 40.0.1 to 41.0.2.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/40.0.1...41.0.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-15 01:04:17 +00:00
Matthias
7f0e1c27c6 Fix realized_profit for trade from_json 2023-07-14 07:35:58 +02:00
Matthias
bdff34017a Merge pull request #8867 from freqtrade/doc/commmunityshowcase
Add community showcase
2023-07-14 06:43:14 +02:00
Yinon Polak
ffcba45b1b pytorch - mypy fixes 2023-07-13 21:36:14 +03:00
Yinon Polak
9fb0ce664c pytorch - ruff fixes 2023-07-13 21:32:46 +03:00
Yinon Polak
5734358d91 pytorch - trainer - add assertion that either n_epochs or max_iters is been set. 2023-07-13 20:59:33 +03:00
Matthias
7280d6bb3b Merge pull request #8890 from freqtrade/dependabot/pip/develop/pyarrow-12.0.1
Bump pyarrow from 12.0.0 to 12.0.1
2023-07-13 19:58:25 +02:00
Yinon Polak
7d28dad209 pytorch - add n_epochs param to trainer 2023-07-13 20:41:38 +03:00
Matthias
061e930eb1 Merge pull request #8901 from freqtrade/fix/8841
Avoid false-triggering "dust-eating" logic for rebuys
2023-07-13 18:06:33 +02:00
yinon
588ffeedc1 pytorch - trainer - reomve max_n_eval_batches arg from estimate loss method 2023-07-13 15:40:40 +00:00
yinon
49a7de4ebd pytorch - trainer - add device arg to load method 2023-07-13 15:39:47 +00:00
yinon
0c9aa86885 pytorch - data convertor - create tensor directly on device, simplify code 2023-07-13 15:38:58 +00:00
yinon
9cb45a3810 pytorch - bugfix - explicitly assign tensor to var as .to() is not inplace operation 2023-07-13 15:37:50 +00:00
Matthias
240606c5a4 Only run once for an order 2023-07-13 07:14:20 +02:00
Matthias
6134764d5e Don't wrongly eat into dust on rebuys
closes #8841
2023-07-13 07:07:15 +02:00
Matthias
45a9c304b6 Add test for new conditional behavior 2023-07-13 07:07:15 +02:00
Matthias
c970ae8add Add pyarrow pi wheel 2023-07-13 06:40:49 +02:00
Matthias
b593205ad9 No need to use .get() for properties with default values 2023-07-12 18:29:12 +02:00
Matthias
5399253786 Update documentation in regards to data-format 2023-07-12 18:23:51 +02:00
Matthias
2babb36fc2 Update final tests 2023-07-12 18:23:31 +02:00
Matthias
ec2960a167 Fix dtype ... 2023-07-12 18:23:31 +02:00
Matthias
1c5d20e9a3 Fix some tests, restore 1m json data 2023-07-12 18:23:31 +02:00
Matthias
a1efd6b783 Update further tests to use feather 2023-07-12 18:23:31 +02:00
Matthias
1d77497f64 Fix test 2023-07-12 18:23:31 +02:00
Matthias
586692b73f TMP: remove full json data 2023-07-12 18:23:31 +02:00
Matthias
4d3740d4ce Update default datahandler class 2023-07-12 18:23:30 +02:00
Matthias
15aa1fd876 Add new feather data 2023-07-12 18:23:30 +02:00
Matthias
578110488c Update cli-options default 2023-07-12 18:23:30 +02:00
Matthias
08fdb3a47d Update documentation 2023-07-12 18:23:30 +02:00
Matthias
cca8c4e5b8 Update default dataformat to feather 2023-07-12 18:23:30 +02:00
Matthias
3cf419cbcd Fix ill-used type on order backpopulate mapping 2023-07-12 18:22:41 +02:00
Matthias
8ad32e7498 Merge pull request #8898 from jansmets/bybit_ohlcv_history
bybit provides up to 2years of historic ohlcv data on any timefame.
2023-07-12 18:16:11 +02:00
Matthias
722b5569bd Add Freqtrade backtest project 2023-07-12 18:06:37 +02:00
Jan Smets
e8fe5a4f17 bybit provides up to 2years of historic ohlcv data on any timefame. 2023-07-12 11:39:32 +02:00
Matthias
a314175565 Merge pull request #8882 from freqtrade/dependabot/pip/develop/orjson-3.9.2
Bump orjson from 3.9.1 to 3.9.2
2023-07-11 06:06:50 +02:00
Matthias
9505f380bf Merge pull request #8892 from freqtrade/dependabot/pip/develop/time-machine-2.11.0
Bump time-machine from 2.10.0 to 2.11.0
2023-07-10 20:53:18 +02:00
dependabot[bot]
127ca83dea Bump orjson from 3.9.1 to 3.9.2
Bumps [orjson](https://github.com/ijl/orjson) from 3.9.1 to 3.9.2.
- [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.1...3.9.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-10 17:51:56 +00:00
Matthias
5acfe2c89c Merge pull request #8891 from freqtrade/dependabot/pip/develop/fastapi-0.100.0
Bump fastapi from 0.99.1 to 0.100.0
2023-07-10 19:50:56 +02:00
Matthias
aa5a5ce8e1 Merge pull request #8887 from freqtrade/dependabot/pip/develop/sqlalchemy-2.0.18
Bump sqlalchemy from 2.0.17 to 2.0.18
2023-07-10 19:50:03 +02:00
Matthias
e8eb28996d Merge pull request #8888 from freqtrade/dependabot/pip/develop/jsonschema-4.18.0
Bump jsonschema from 4.17.3 to 4.18.0
2023-07-10 19:49:07 +02:00
Matthias
9af9caae09 Merge pull request #8889 from freqtrade/dependabot/pip/develop/ccxt-4.0.17
Bump ccxt from 4.0.15 to 4.0.17
2023-07-10 19:48:50 +02:00
Matthias
a0fff43648 Add fee_base to json output 2023-07-10 19:47:37 +02:00
dependabot[bot]
b7bd1eba6f Bump time-machine from 2.10.0 to 2.11.0
Bumps [time-machine](https://github.com/adamchainz/time-machine) from 2.10.0 to 2.11.0.
- [Changelog](https://github.com/adamchainz/time-machine/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/adamchainz/time-machine/compare/2.10.0...2.11.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-07-10 16:16:34 +00:00
dependabot[bot]
6d63b9400b Bump fastapi from 0.99.1 to 0.100.0
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.99.1 to 0.100.0.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.99.1...0.100.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-07-10 16:16:30 +00:00
dependabot[bot]
e0ba2f3a15 Bump pyarrow from 12.0.0 to 12.0.1
Bumps [pyarrow](https://github.com/apache/arrow) from 12.0.0 to 12.0.1.
- [Commits](https://github.com/apache/arrow/compare/go/v12.0.0...go/v12.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-10 16:16:25 +00:00
dependabot[bot]
7d16012f61 Bump ccxt from 4.0.15 to 4.0.17
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.15 to 4.0.17.
- [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.15...4.0.17)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-10 16:16:19 +00:00
dependabot[bot]
4a422cac5b Bump jsonschema from 4.17.3 to 4.18.0
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.17.3 to 4.18.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.17.3...v4.18.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-07-10 16:16:12 +00:00
Matthias
884594a967 Bump sqlalchemy pre-commit 2023-07-10 18:09:08 +02:00
Matthias
c7c5c41f41 Merge pull request #8885 from freqtrade/dependabot/pip/develop/ccxt-4.0.15
Bump ccxt from 4.0.14 to 4.0.15
2023-07-10 18:07:42 +02:00
dependabot[bot]
12d89a9061 Bump sqlalchemy from 2.0.17 to 2.0.18
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.17 to 2.0.18.
- [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-07-10 08:43:16 +00:00
Matthias
7d117e8ca2 Merge pull request #8886 from freqtrade/dependabot/pip/develop/python-telegram-bot-20.4
Bump python-telegram-bot from 20.3 to 20.4
2023-07-10 10:42:11 +02:00
Matthias
f6322bd02d Merge pull request #8884 from freqtrade/dependabot/pip/develop/numpy-1.25.1
Bump numpy from 1.25.0 to 1.25.1
2023-07-10 07:53:18 +02:00
Matthias
a3aafffbd2 Merge pull request #8883 from freqtrade/dependabot/pip/develop/mkdocs-material-9.1.18
Bump mkdocs-material from 9.1.17 to 9.1.18
2023-07-10 07:23:19 +02:00
Matthias
52b4a2c921 Merge pull request #8881 from freqtrade/dependabot/pip/develop/prompt-toolkit-3.0.39
Bump prompt-toolkit from 3.0.38 to 3.0.39
2023-07-10 07:22:54 +02:00
Matthias
32857f50ea Merge pull request #8879 from freqtrade/dependabot/pip/develop/ruff-0.0.277
Bump ruff from 0.0.275 to 0.0.277
2023-07-10 07:22:37 +02:00
Matthias
40945b4eff Merge pull request #8878 from freqtrade/dependabot/pip/develop/joblib-1.3.1
Bump joblib from 1.2.0 to 1.3.1
2023-07-10 07:22:14 +02:00
Matthias
1dbc294b80 Improve order __REPR__ with date 2023-07-10 07:11:29 +02:00
Matthias
5bc84dca56 Fix from_json with new attributes 2023-07-10 06:38:18 +02:00
Matthias
8c0e66008a Remove wrong/faulty "default" comment from cli options 2023-07-10 06:12:46 +02:00
dependabot[bot]
4a1a197943 Bump python-telegram-bot from 20.3 to 20.4
Bumps [python-telegram-bot](https://github.com/python-telegram-bot/python-telegram-bot) from 20.3 to 20.4.
- [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.3...v20.4)

---
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-07-10 04:00:59 +00:00
dependabot[bot]
43f6a7e3c9 Bump ccxt from 4.0.14 to 4.0.15
Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.0.14 to 4.0.15.
- [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.14...4.0.15)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-10 04:00:46 +00:00
dependabot[bot]
1bece11eb3 Bump numpy from 1.25.0 to 1.25.1
Bumps [numpy](https://github.com/numpy/numpy) from 1.25.0 to 1.25.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.0...v1.25.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-10 04:00:27 +00:00
dependabot[bot]
3c1cd72430 Bump mkdocs-material from 9.1.17 to 9.1.18
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.1.17 to 9.1.18.
- [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.1.17...9.1.18)

---
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-07-10 03:59:59 +00:00
dependabot[bot]
1ca2a8d638 Bump prompt-toolkit from 3.0.38 to 3.0.39
Bumps [prompt-toolkit](https://github.com/prompt-toolkit/python-prompt-toolkit) from 3.0.38 to 3.0.39.
- [Changelog](https://github.com/prompt-toolkit/python-prompt-toolkit/blob/master/CHANGELOG)
- [Commits](https://github.com/prompt-toolkit/python-prompt-toolkit/compare/3.0.38...3.0.39)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-10 03:59:21 +00:00
dependabot[bot]
7359a76b77 Bump ruff from 0.0.275 to 0.0.277
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.0.275 to 0.0.277.
- [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.275...v0.0.277)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-10 03:59:01 +00:00
dependabot[bot]
75e6315aac Bump joblib from 1.2.0 to 1.3.1
Bumps [joblib](https://github.com/joblib/joblib) from 1.2.0 to 1.3.1.
- [Changelog](https://github.com/joblib/joblib/blob/master/CHANGES.rst)
- [Commits](https://github.com/joblib/joblib/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-10 03:58:40 +00:00
Matthias
d68eac92b8 Merge pull request #8874 from freqtrade/improve/convert_data
Improve/convert data
2023-07-09 17:14:12 +02:00
Matthias
b4957a2e37 Update converter test 2023-07-09 15:37:56 +02:00
Matthias
448f02960f Improve behavior for convert-data 2023-07-09 15:36:44 +02:00
Matthias
5a43dd4766 don't hard-default --timeframes via argparse 2023-07-09 15:32:51 +02:00
Matthias
10f34563f8 Improve default for --candle-types 2023-07-09 15:02:47 +02:00
Matthias
d8d0a60322 Merge pull request #8872 from freqtrade/ccxt_bump
bump ccxt to 4.0.14
2023-07-09 14:49:27 +02:00
Matthias
4c6eee8dfe Update proxy documentation to correspond to new ccxt mode 2023-07-09 13:52:46 +02:00
Matthias
a598b8554d Bump ccxt and ccxt min requirement 2023-07-09 13:48:14 +02:00
Matthias
511023ee10 Fix typo in comment 2023-07-09 13:47:57 +02:00
Matthias
8212a5af77 Merge pull request #8819 from Bloodhunter4rc/remotepairlist
Remotepairlist - add blacklist mode
2023-07-09 12:42:25 +02:00
Matthias
af5fc76dc6 Add test for different processing modes 2023-07-09 11:51:43 +02:00
Matthias
e6ee55a69b Improve some test coverage 2023-07-09 11:37:06 +02:00
Matthias
4dda9c6daa Add explicit test for short-desc 2023-07-09 11:36:13 +02:00
Matthias
5da5369ca4 Update parameter sequence to make more sense 2023-07-09 11:09:59 +02:00
Matthias
ea04210eb3 Merge pull request #8869 from stash86/patch-1
Update my link
2023-07-09 10:38:18 +02:00
Stefano Ariestasia
e64327f353 Update my link 2023-07-09 17:12:21 +09:00
Bloodhunter4rc
4d4ec11a8a - print 2023-07-09 09:53:31 +02:00
Bloodhunter4rc
4f77e3f595 Merge branch 'remotepairlist' of https://github.com/Bloodhunter4rc/freqtrade into remotepairlist 2023-07-09 09:44:19 +02:00
Bloodhunter4rc
0b68ca6cb3 use pairlist_pos remove unused check, fixed Test 2023-07-09 09:42:33 +02:00
Bloodhunter4rc
0c2eb8dc58 Merge branch 'freqtrade:develop' into remotepairlist 2023-07-09 09:15:56 +02:00
Matthias
b2106ef4a2 Update frequenthippo link description 2023-07-09 07:35:02 +02:00
Bloodhunter4rc
ee1fa34df2 Add 'processing_mode' , blacklist checks 2023-07-08 18:05:46 +02:00
Matthias
c4b0f24cd7 Use USD for kraken tests, as it has more volume. 2023-07-08 13:26:31 +02:00
Matthias
a1d50dbfa2 Add community showcase 2023-07-08 13:06:12 +02:00
Matthias
8436f9ade4 Merge pull request #8802 from freqtrade/dependabot/pip/develop/numpy-1.25.0
Bump numpy from 1.24.3 to 1.25.0
2023-07-08 10:32:27 +02:00
Matthias
2e78f7503e Merge branch 'develop' into dependabot/pip/develop/numpy-1.25.0 2023-07-08 09:52:33 +02:00
Matthias
5c0f5588a6 Simplify sort_values in PerformanceFilter
Avoids potential regression in numpy 1.25.0 - which doesn't keep prior sort order in chained sort_values calls.
2023-07-08 09:49:01 +02:00
Matthias
3d6d006e84 Merge branch 'develop' into pr/Bloodhunter4rc/8819 2023-07-08 07:37:00 +02:00
Matthias
1c5ea317e6 Add mode as parameter for the UI 2023-07-08 07:31:55 +02:00
Matthias
31faad776e Merge branch 'stable' into develop 2023-07-07 20:31:35 +02:00
Matthias
eea95f79aa Merge pull request #8862 from freqtrade/new_release
New release 2023.6
2023-07-07 20:08:27 +02:00
Matthias
f020daa357 Merge pull request #8864 from freqtrade/dependabot/pip/develop/ccxt-4.0.12
Bump ccxt from 3.1.44 to 4.0.12
2023-07-07 15:46:08 +02:00
Matthias
dacbcdb710 Merge pull request #8865 from freqtrade/online_test_trade_history
Online test trade history
2023-07-07 13:55:21 +02:00
Matthias
a9e239ca7a Don't use future date for downloading new trade data
closes #8860
2023-07-07 11:23:34 +02:00
Matthias
65550335ee Add explicit online test for get_trade_history
part of #8860
2023-07-07 11:15:15 +02:00
Matthias
01db789d42 Improve release documentation 2023-07-07 10:56:41 +02:00
Matthias
6fe0895e74 Merge pull request #8847 from freqtrade/dependabot/pip/develop/scipy-1.11.1
Bump scipy from 1.10.1 to 1.11.1
2023-07-07 10:45:47 +02:00
dependabot[bot]
c93a27af7d Bump ccxt from 3.1.44 to 4.0.12
Bumps [ccxt](https://github.com/ccxt/ccxt) from 3.1.44 to 4.0.12.
- [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/3.1.44...4.0.12)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-07 08:22:16 +00:00
Matthias
67ce7917cc Merge pull request #8863 from freqtrade/robcaulk-patch-1
Bump datasieve 0.1.7
2023-07-07 10:21:23 +02:00
Matthias
9b447cdf1e Bump pandas to 2.0.3 2023-07-07 09:37:14 +02:00
Robert Caulk
98ba0042d8 Bump datasieve 0.1.7 2023-07-07 09:27:09 +02:00
Matthias
f64b9503f9 scipy 1.11 doesn't support python 3.8 any longer 2023-07-07 09:08:32 +02:00
Matthias
e734a664b4 bump develop-version to 2023.7.dev 2023-07-07 08:59:10 +02:00
Matthias
942f0b4fbd Move format_ms_time to datetime_helpers 2023-07-07 08:59:07 +02:00
Matthias
a2ba466918 Merge pull request #8851 from freqtrade/dependabot/pip/develop/stable-baselines3-2.0.0
Bump stable-baselines3 from 2.0.0a13 to 2.0.0
2023-07-07 08:51:45 +02:00
Matthias
7ba459db88 Version bump to 2023.6 2023-07-07 08:45:06 +02:00
Matthias
ab39144af8 Merge branch 'stable' into new_release 2023-07-07 08:44:49 +02:00
Matthias
092e30a159 Attempt CI without brew update 2023-07-06 21:22:03 +02:00
Matthias
e6db5bd193 Pin numpy for python < 3.8 2023-07-06 21:09:06 +02:00
Matthias
5cd08ce554 Merge pull request #8825 from freqtrade/dependabot/pip/develop/ruff-0.0.275
Bump ruff from 0.0.272 to 0.0.275
2023-07-04 20:47:28 +02:00
Matthias
e51085ebc6 Merge pull request #8853 from freqtrade/dependabot/pip/develop/fastapi-0.99.1
Bump fastapi from 0.98.0 to 0.99.1
2023-07-03 16:13:18 +02:00
Matthias
817b6f9bde Merge pull request #8852 from freqtrade/dependabot/pip/develop/ast-comments-1.1.0
Bump ast-comments from 1.0.1 to 1.1.0
2023-07-03 11:09:03 +02:00
Matthias
b204a93d1c Merge pull request #8858 from freqtrade/dependabot/github_actions/develop/pypa/gh-action-pypi-publish-1.8.7
Bump pypa/gh-action-pypi-publish from 1.8.6 to 1.8.7
2023-07-03 10:49:22 +02:00
dependabot[bot]
977bfa08b7 Bump pypa/gh-action-pypi-publish from 1.8.6 to 1.8.7
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.8.6 to 1.8.7.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.8.6...v1.8.7)

---
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-07-03 03:42:51 +00:00
dependabot[bot]
ba6cba31be Bump fastapi from 0.98.0 to 0.99.1
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.98.0 to 0.99.1.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.98.0...0.99.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-03 03:29:53 +00:00
dependabot[bot]
1880f9ffa1 Bump ast-comments from 1.0.1 to 1.1.0
Bumps [ast-comments](https://github.com/t3rn0/ast-comments) from 1.0.1 to 1.1.0.
- [Commits](https://github.com/t3rn0/ast-comments/compare/1.0.1...1.1.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-07-03 03:29:48 +00:00
dependabot[bot]
9d3dda4e12 Bump stable-baselines3 from 2.0.0a13 to 2.0.0
Bumps [stable-baselines3](https://github.com/DLR-RM/stable-baselines3) from 2.0.0a13 to 2.0.0.
- [Release notes](https://github.com/DLR-RM/stable-baselines3/releases)
- [Commits](https://github.com/DLR-RM/stable-baselines3/commits/v2.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-03 03:29:40 +00:00
Matthias
0310a26b80 Fix documentation typo 2023-07-02 16:44:47 +00:00
Matthias
86956908d0 Merge branch 'develop' into dependabot/pip/develop/ruff-0.0.275 2023-07-02 18:35:43 +02:00
dependabot[bot]
b204da3317 Bump scipy from 1.10.1 to 1.11.1
Bumps [scipy](https://github.com/scipy/scipy) from 1.10.1 to 1.11.1.
- [Release notes](https://github.com/scipy/scipy/releases)
- [Commits](https://github.com/scipy/scipy/compare/v1.10.1...v1.11.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-01 05:43:10 +00:00
Matthias
e16c433cb8 Merge pull request #8829 from freqtrade/dependabot/pip/develop/mypy-1.4.1
Bump mypy from 1.3.0 to 1.4.1
2023-06-30 17:52:14 +02:00
Matthias
c5510491e5 Merge pull request #8830 from freqtrade/dependabot/pip/develop/sqlalchemy-2.0.17
Bump sqlalchemy from 2.0.16 to 2.0.17
2023-06-30 09:18:24 +02:00
Matthias
29725440c8 Simplify RPCMessageType schema definition 2023-06-29 12:28:25 +00:00
Matthias
accc1b509b Simplify class setups without inheritance 2023-06-29 12:16:10 +00:00
Matthias
4b06b4772d sqlalchemy - pre-commit 2023-06-29 11:53:58 +00:00
Matthias
a90b7c0bf5 Merge pull request #8835 from freqtrade/fix/pca-components
make sure default PCA behavior reduces parameter space size
2023-06-26 19:14:44 +02:00
Matthias
c4168055f9 Merge pull request #8831 from freqtrade/dependabot/pip/develop/fastapi-0.98.0
Bump fastapi from 0.97.0 to 0.98.0
2023-06-26 15:18:37 +02:00
dependabot[bot]
b12dbd2bea Bump ruff from 0.0.272 to 0.0.275
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.0.272 to 0.0.275.
- [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.272...v0.0.275)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-26 13:17:59 +00:00
dependabot[bot]
be07ea5d4f Bump mypy from 1.3.0 to 1.4.1
Bumps [mypy](https://github.com/python/mypy) from 1.3.0 to 1.4.1.
- [Commits](https://github.com/python/mypy/compare/v1.3.0...v1.4.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-26 13:17:23 +00:00
Matthias
e729c5f9fd Merge pull request #8828 from freqtrade/dependabot/pip/develop/pytest-7.4.0
Bump pytest from 7.3.2 to 7.4.0
2023-06-26 15:17:02 +02:00
Matthias
5c8181fdd3 Merge pull request #8826 from freqtrade/dependabot/pip/develop/nbconvert-7.6.0
Bump nbconvert from 7.5.0 to 7.6.0
2023-06-26 15:16:11 +02:00
Matthias
3329279b71 Merge pull request #8827 from freqtrade/dependabot/pip/develop/mkdocs-material-9.1.17
Bump mkdocs-material from 9.1.16 to 9.1.17
2023-06-26 15:15:53 +02:00
robcaulk
6b201d525e make sure default PCA behavior reduces parameter space size 2023-06-26 14:42:59 +02:00
dependabot[bot]
8c2098c262 Bump fastapi from 0.97.0 to 0.98.0
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.97.0 to 0.98.0.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.97.0...0.98.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-06-26 03:58:27 +00:00
dependabot[bot]
6274197f85 Bump sqlalchemy from 2.0.16 to 2.0.17
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.16 to 2.0.17.
- [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-06-26 03:58:21 +00:00
dependabot[bot]
ae42d57a26 Bump pytest from 7.3.2 to 7.4.0
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.3.2 to 7.4.0.
- [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.3.2...7.4.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-26 03:57:31 +00:00
dependabot[bot]
2d2699b0ad Bump mkdocs-material from 9.1.16 to 9.1.17
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.1.16 to 9.1.17.
- [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.1.16...9.1.17)

---
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-06-26 03:57:21 +00:00
dependabot[bot]
fec4cb3cf9 Bump nbconvert from 7.5.0 to 7.6.0
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.5.0 to 7.6.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.5.0...v7.6.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-06-26 03:57:07 +00:00
Matthias
4a886e1b97 Merge pull request #8824 from freqtrade/refactor/optimize_reports
Refactor/optimize reports
2023-06-25 19:29:22 +02:00
Matthias
2c36a09b4f Merge pull request #8823 from freqtrade/fix/outlier-check
Fix/outlier check
2023-06-25 19:28:55 +02:00
Matthias
1717f86702 Extract edge output to proper module 2023-06-25 17:45:01 +02:00
Matthias
72504e62ad Extract btstorage methods 2023-06-25 17:42:58 +02:00
Matthias
65e8359908 Improve naming of new file 2023-06-25 17:11:13 +02:00
Matthias
794bca1379 Split optimize report generation from visualization 2023-06-25 17:09:57 +02:00
Matthias
5e084ad2e5 convert optimize_reports to a package 2023-06-25 17:08:41 +02:00
robcaulk
fca73531cf fix: use .shape instead of index for outliers 2023-06-25 16:34:44 +02:00
robcaulk
9da28e5328 bump datasieve 2023-06-25 15:44:24 +02:00
robcaulk
fd420738cd ensure outlier-check is returning as a numpy array from datasieve 2023-06-25 15:43:02 +02:00
Matthias
48e8965322 Don't add header if it's not needed 2023-06-25 15:35:57 +02:00
Bloodhunter4rc
ce1b90885e support wildcards 2023-06-24 21:32:20 +02:00
Matthias
5f98530ef9 Catch and send exceptions from websockets 2023-06-24 20:26:05 +02:00
Matthias
69087c30e7 Don't overwrite "type" with a variable 2023-06-24 20:18:24 +02:00
Bloodhunter4rc
d534f88d1c unnecessary lines removed. 2023-06-24 14:36:31 +02:00
Bloodhunter4rc
caca070c1a added tests 2023-06-24 14:31:30 +02:00
Bloodhunter4rc
36b33fb407 add mode to set the pairlist to blacklist additional to whitelist
adhere to _number_pairs
2023-06-24 12:38:31 +02:00
Matthias
6e143d4a5d Merge pull request #8818 from freqtrade/self
Use Self typing
2023-06-23 19:50:01 +02:00
Matthias
757c6dc5ca Use Self typing 2023-06-23 18:15:06 +02:00
Matthias
01dfca80ab Improve stop test behavior 2023-06-20 19:16:21 +02:00
Matthias
2f7b29ed34 Fix test_tsl_on_exchange_compatible_with_edge 2023-06-20 19:08:55 +02:00
Matthias
b49a118764 Fix exit_timeout test 2023-06-20 18:14:16 +02:00
Matthias
c7683a7b61 Improve docs wording 2023-06-20 06:57:48 +02:00
Matthias
5d60c62645 align list blocks 2023-06-20 06:55:19 +02:00
Matthias
96c2ca67e9 Add usage note for pairs.json file 2023-06-20 06:51:40 +02:00
Matthias
b0e5fb3940 Improve structure of download-data documentation 2023-06-20 06:50:59 +02:00
Matthias
8c54036fa5 Move Downloading tip from pairs file section 2023-06-20 06:45:56 +02:00
Matthias
859f7ff3de be explicit when loading pairs file. 2023-06-19 18:29:37 +02:00
dependabot[bot]
b2c87c3591 Bump numpy from 1.24.3 to 1.25.0
Bumps [numpy](https://github.com/numpy/numpy) from 1.24.3 to 1.25.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.24.3...v1.25.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-06-19 16:05:34 +00:00
Matthias
62f4bd27ec Merge pull request #8806 from freqtrade/dependabot/pip/develop/ccxt-3.1.44
Bump ccxt from 3.1.34 to 3.1.44
2023-06-19 17:59:05 +02:00
Robert Caulk
26c06e38be Merge pull request #8804 from freqtrade/dependabot/pip/develop/xgboost-1.7.6
Bump xgboost from 1.7.5 to 1.7.6
2023-06-19 14:35:34 +02:00
Matthias
78451447ac Merge pull request #8798 from freqtrade/dependabot/pip/develop/mkdocs-material-9.1.16
Bump mkdocs-material from 9.1.15 to 9.1.16
2023-06-19 14:25:58 +02:00
Matthias
0f7720dec0 Merge pull request #8801 from freqtrade/dependabot/pip/develop/pytest-mock-3.11.1
Bump pytest-mock from 3.10.0 to 3.11.1
2023-06-19 14:25:32 +02:00
Matthias
b9fe364d9c Merge pull request #8805 from freqtrade/dependabot/pip/develop/pre-commit-3.3.3
Bump pre-commit from 3.3.2 to 3.3.3
2023-06-19 13:06:07 +02:00
Matthias
97e7b60656 Merge pull request #8803 from freqtrade/dependabot/pip/develop/filelock-3.12.2
Bump filelock from 3.12.1 to 3.12.2
2023-06-19 13:05:42 +02:00
Matthias
936e49e8ee Merge pull request #8807 from freqtrade/dependabot/pip/develop/rich-13.4.2
Bump rich from 13.4.1 to 13.4.2
2023-06-19 13:05:11 +02:00
dependabot[bot]
6bc3439cb7 Bump pytest-mock from 3.10.0 to 3.11.1
Bumps [pytest-mock](https://github.com/pytest-dev/pytest-mock) from 3.10.0 to 3.11.1.
- [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.10.0...v3.11.1)

---
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-06-19 05:08:12 +00:00
Matthias
ec72c91b17 Merge pull request #8800 from freqtrade/dependabot/pip/develop/time-machine-2.10.0
Bump time-machine from 2.9.0 to 2.10.0
2023-06-19 07:01:56 +02:00
Matthias
2809379b56 Merge pull request #8799 from freqtrade/dependabot/pip/develop/nbconvert-7.5.0
Bump nbconvert from 7.4.0 to 7.5.0
2023-06-19 07:01:38 +02:00
dependabot[bot]
e965b2e454 Bump rich from 13.4.1 to 13.4.2
Bumps [rich](https://github.com/Textualize/rich) from 13.4.1 to 13.4.2.
- [Release notes](https://github.com/Textualize/rich/releases)
- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Textualize/rich/compare/v13.4.1...v13.4.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-19 03:58:02 +00:00
dependabot[bot]
d82a0ad7b5 Bump ccxt from 3.1.34 to 3.1.44
Bumps [ccxt](https://github.com/ccxt/ccxt) from 3.1.34 to 3.1.44.
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/3.1.34...3.1.44)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-19 03:57:35 +00:00
dependabot[bot]
f04598c5e5 Bump pre-commit from 3.3.2 to 3.3.3
Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 3.3.2 to 3.3.3.
- [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.2...v3.3.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-19 03:57:29 +00:00
dependabot[bot]
f82d52c6d3 Bump xgboost from 1.7.5 to 1.7.6
Bumps [xgboost](https://github.com/dmlc/xgboost) from 1.7.5 to 1.7.6.
- [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.5...v1.7.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-19 03:57:17 +00:00
dependabot[bot]
fc0548ce0b Bump filelock from 3.12.1 to 3.12.2
Bumps [filelock](https://github.com/tox-dev/py-filelock) from 3.12.1 to 3.12.2.
- [Release notes](https://github.com/tox-dev/py-filelock/releases)
- [Changelog](https://github.com/tox-dev/py-filelock/blob/main/docs/changelog.rst)
- [Commits](https://github.com/tox-dev/py-filelock/compare/3.12.1...3.12.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-19 03:57:02 +00:00
dependabot[bot]
8cc763b664 Bump time-machine from 2.9.0 to 2.10.0
Bumps [time-machine](https://github.com/adamchainz/time-machine) from 2.9.0 to 2.10.0.
- [Changelog](https://github.com/adamchainz/time-machine/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/adamchainz/time-machine/compare/2.9.0...2.10.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-06-19 03:56:44 +00:00
dependabot[bot]
ed90e77ea0 Bump nbconvert from 7.4.0 to 7.5.0
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.4.0 to 7.5.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.4.0...v7.5.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-06-19 03:56:40 +00:00
dependabot[bot]
1eb691d461 Bump mkdocs-material from 9.1.15 to 9.1.16
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.1.15 to 9.1.16.
- [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.1.15...9.1.16)

---
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-06-19 03:56:37 +00:00
Matthias
571dea6e9c Fix wrong final status on bg-tasks 2023-06-18 15:45:26 +02:00
Matthias
02071df8fa Merge pull request #8692 from freqtrade/feat/outsource-data-pipeline
Outsource data pipeline handling to improve flexibility
2023-06-18 13:39:36 +02:00
Robert Caulk
cca4fa1178 Update BaseClassifierModel.py 2023-06-18 11:31:03 +02:00
Robert Caulk
7e2f857aa5 Update BasePyTorchClassifier.py 2023-06-18 11:30:33 +02:00
Matthias
3d72d32845 Merge pull request #8369 from hippocritical/develop
backtest - lookahead_analysis
2023-06-18 08:29:08 +02:00
Matthias
52db6ac7d7 Use proper log level 2023-06-17 20:35:23 +02:00
Matthias
d94f3e7679 Add explicit tests for download-data
(without the command part)
2023-06-17 20:00:24 +02:00
Matthias
7af14d1985 Fix random test failure 2023-06-17 18:26:08 +02:00
Matthias
44a38e8362 Update download data tests 2023-06-17 18:22:47 +02:00
Matthias
0be4084eac Don't allow downloading wrong pairs
Prior to this, BTC/USDT:USDT could be downloaded to the spot directory, as it was filtered inproperly.
2023-06-17 18:14:58 +02:00
Matthias
937734365f Improve typehint for markets 2023-06-17 18:04:41 +02:00
Matthias
66b34edc0b Clarify variable name 2023-06-17 18:03:57 +02:00
Matthias
6f0f954686 Adjust mocks for new import location 2023-06-17 17:53:12 +02:00
Matthias
7453ff2fb5 Migrate download-data out of commands section 2023-06-17 17:53:12 +02:00
Matthias
b8ab6fe42b Improve wording of check command 2023-06-17 17:53:12 +02:00
Matthias
e0d5242a45 Reduce download-data verbosity 2023-06-17 17:53:12 +02:00
Robert Caulk
402a247c92 Merge pull request #8760 from initrv/rl-action-masks
Add MaskablePPO support
2023-06-17 16:28:43 +02:00
robcaulk
886b86f7c5 chore: bump datasieve 2023-06-17 16:14:48 +02:00
robcaulk
b0ab400ff3 fix: ensure test_size=0 is still accommodated 2023-06-17 15:39:33 +02:00
Matthias
bf872e8ed4 Simplify comparison depth 2023-06-17 14:25:46 +02:00
robcaulk
447feb16b4 Merge remote-tracking branch 'origin/develop' into use-datasieve 2023-06-17 13:26:35 +02:00
robcaulk
636f5753e1 Merge remote-tracking branch 'origin/feat/outsource-data-pipeline' into use-datasieve 2023-06-17 13:26:14 +02:00
robcaulk
11ff454b3b fix: ensure that a user setting up their own pipeline wont have conflicts with DI_values 2023-06-17 13:21:31 +02:00
Matthias
6bb75f0dd4 Simplify import if only one element is used 2023-06-17 10:12:36 +02:00
Matthias
1567cd2849 Use DOCS_LINK throughout 2023-06-17 09:10:54 +02:00
Matthias
34e7e3efea Simplify imports 2023-06-17 08:40:09 +02:00
Matthias
2c7aa9f721 Update doc wording 2023-06-17 08:37:38 +02:00
Matthias
24e806f081 Improve resiliance by using non-exchange controlled order attributes. 2023-06-16 19:58:35 +02:00
Matthias
b0396af4c4 Merge pull request #8791 from freqtrade/ci/catboost
Remove old version pin for catboost
2023-06-16 18:20:34 +02:00
Matthias
efaa959bfa Merge pull request #8790 from freqtrade/docs/link-to-articles
Add links to more FreqAI learning content
2023-06-16 18:20:05 +02:00
Matthias
7939716a5e Improve formatting of telegram /status messages 2023-06-16 18:00:22 +02:00
Matthias
4f834c8964 Remove old version pin for catboost 2023-06-16 15:15:40 +02:00
Robert Caulk
ffd7394adb Update freqai.md 2023-06-16 15:10:11 +02:00
Robert Caulk
2107dce2cd Update freqai-feature-engineering.md 2023-06-16 15:03:49 +02:00
robcaulk
72101f059d feat: ensure full backwards compatibility 2023-06-16 13:20:35 +02:00
robcaulk
75ec19062c chore: make DOCS_LINK in constants.py, ensure datasieve is added to setup.py 2023-06-16 13:06:21 +02:00
Matthias
64fcb1ed11 Better pin scikit-learn
caused by #7896
2023-06-16 10:15:45 +02:00
Matthias
dec3c0f374 Remove environment.yml completely 2023-06-16 07:02:40 +02:00
Matthias
1b86bf8a1d Don't include non-used parameters in command structure 2023-06-16 06:58:34 +02:00
Matthias
2cd9043c51 Make documentation discoverable / linked 2023-06-16 06:44:55 +02:00
Matthias
b3ef024e9e Don't use PurePosixPath 2023-06-15 20:43:05 +02:00
Matthias
964bf76469 Invert parameters for initialize_single_lookahead_analysis
otherwise their order is reversed before calling LookaheadAnalysis for no good reason
2023-06-15 20:42:26 +02:00
Matthias
ad74e65673 Simplify configuration setup 2023-06-15 20:26:45 +02:00
Matthias
ac36ba6592 Improve arguments file formatting 2023-06-15 20:15:44 +02:00
Matthias
ca88cac08b Remove unused code file 2023-06-15 06:39:00 +02:00
Matthias
d211bf47f1 Merge pull request #8767 from freqtrade/dependabot/pip/develop/stable-baselines3-2.0.0a13
Bump stable-baselines3 from 2.0.0a10 to 2.0.0a13
2023-06-15 06:06:44 +02:00
Matthias
11d7e7925e Fix random test failures 2023-06-14 20:34:18 +02:00
hippocritical
bc4d1c5326 Merge branch 'freqtrade:develop' into develop 2023-06-13 18:59:31 +02:00
Matthias
10b93f080a Merge pull request #8770 from freqtrade/dependabot/pip/develop/fastapi-0.97.0
Bump fastapi from 0.96.0 to 0.97.0
2023-06-13 10:56:02 +02:00
hippocritical
876ce85cd8 Merge branch 'freqtrade:develop' into develop 2023-06-12 23:04:02 +02:00
Matthias
9a7794c520 Improve behavior for when stoploss cancels without content
closes #8761
2023-06-12 20:29:23 +02:00
Matthias
1a4d94a6f3 OKX stop should convert contracts to amount 2023-06-12 20:01:26 +02:00
Matthias
1e44cfe2fc Improve stoploss test 2023-06-12 18:20:36 +02:00
Matthias
502090c199 Merge pull request #8765 from freqtrade/dependabot/pip/develop/ccxt-3.1.34
Bump ccxt from 3.1.23 to 3.1.34
2023-06-12 13:44:15 +02:00
Matthias
385d9d30b7 Merge pull request #8775 from freqtrade/dependabot/pip/develop/plotly-5.15.0
Bump plotly from 5.14.1 to 5.15.0
2023-06-12 13:33:33 +02:00
dependabot[bot]
e763e2ad35 Bump ccxt from 3.1.23 to 3.1.34
Bumps [ccxt](https://github.com/ccxt/ccxt) from 3.1.23 to 3.1.34.
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/3.1.23...3.1.34)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-12 08:08:05 +00:00
Matthias
a89c647255 Merge pull request #8769 from freqtrade/dependabot/pip/develop/sqlalchemy-2.0.16
Bump sqlalchemy from 2.0.15 to 2.0.16
2023-06-12 10:01:59 +02:00
dependabot[bot]
1beaf6f05c Bump plotly from 5.14.1 to 5.15.0
Bumps [plotly](https://github.com/plotly/plotly.py) from 5.14.1 to 5.15.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.14.1...v5.15.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-06-12 07:26:38 +00:00
Matthias
21949c0446 bump sqlalchemy pre-commit 2023-06-12 09:23:58 +02:00
Matthias
6e6bccfd3e Merge pull request #8773 from freqtrade/dependabot/pip/develop/urllib3-2.0.3
Bump urllib3 from 2.0.2 to 2.0.3
2023-06-12 08:48:10 +02:00
Matthias
a7f882a7fe Merge pull request #8772 from freqtrade/dependabot/pip/develop/ruff-0.0.272
Bump ruff from 0.0.270 to 0.0.272
2023-06-12 08:47:50 +02:00
Matthias
0c4dab37d7 Merge pull request #8771 from freqtrade/dependabot/pip/develop/pytest-7.3.2
Bump pytest from 7.3.1 to 7.3.2
2023-06-12 08:47:32 +02:00
Matthias
1af4fa0419 Merge pull request #8774 from freqtrade/dependabot/pip/develop/orjson-3.9.1
Bump orjson from 3.9.0 to 3.9.1
2023-06-12 08:46:49 +02:00
Matthias
37495884d4 Merge pull request #8768 from freqtrade/dependabot/pip/develop/filelock-3.12.1
Bump filelock from 3.12.0 to 3.12.1
2023-06-12 08:13:32 +02:00
dependabot[bot]
2e087750e0 Bump fastapi from 0.96.0 to 0.97.0
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.96.0 to 0.97.0.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.96.0...0.97.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-06-12 05:12:52 +00:00
Matthias
64e803356a Merge pull request #8766 from freqtrade/dependabot/pip/develop/pydantic-1.10.9
Bump pydantic from 1.10.8 to 1.10.9
2023-06-12 07:07:03 +02:00
dependabot[bot]
7172bc0af3 Bump orjson from 3.9.0 to 3.9.1
Bumps [orjson](https://github.com/ijl/orjson) from 3.9.0 to 3.9.1.
- [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.0...3.9.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-12 03:58:02 +00:00
dependabot[bot]
feb6e5c466 Bump urllib3 from 2.0.2 to 2.0.3
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.0.2 to 2.0.3.
- [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.2...2.0.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-12 03:58:01 +00:00
dependabot[bot]
8b27b408c7 Bump ruff from 0.0.270 to 0.0.272
Bumps [ruff](https://github.com/charliermarsh/ruff) from 0.0.270 to 0.0.272.
- [Release notes](https://github.com/charliermarsh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/BREAKING_CHANGES.md)
- [Commits](https://github.com/charliermarsh/ruff/compare/v0.0.270...v0.0.272)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-12 03:57:45 +00:00
dependabot[bot]
a9515dee81 Bump pytest from 7.3.1 to 7.3.2
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.3.1 to 7.3.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.3.1...7.3.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-06-12 03:57:33 +00:00
dependabot[bot]
71064c02e5 Bump sqlalchemy from 2.0.15 to 2.0.16
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.15 to 2.0.16.
- [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-06-12 03:57:05 +00:00
dependabot[bot]
66dc1fd339 Bump filelock from 3.12.0 to 3.12.1
Bumps [filelock](https://github.com/tox-dev/py-filelock) from 3.12.0 to 3.12.1.
- [Release notes](https://github.com/tox-dev/py-filelock/releases)
- [Changelog](https://github.com/tox-dev/py-filelock/blob/main/docs/changelog.rst)
- [Commits](https://github.com/tox-dev/py-filelock/compare/3.12.0...3.12.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-12 03:56:52 +00:00
dependabot[bot]
7542909e18 Bump stable-baselines3 from 2.0.0a10 to 2.0.0a13
Bumps [stable-baselines3](https://github.com/DLR-RM/stable-baselines3) from 2.0.0a10 to 2.0.0a13.
- [Release notes](https://github.com/DLR-RM/stable-baselines3/releases)
- [Commits](https://github.com/DLR-RM/stable-baselines3/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-12 03:56:48 +00:00
dependabot[bot]
a39f23a5c7 Bump pydantic from 1.10.8 to 1.10.9
Bumps [pydantic](https://github.com/pydantic/pydantic) from 1.10.8 to 1.10.9.
- [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/v1.10.8...v1.10.9)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-12 03:56:43 +00:00
hippocritical
d748cf6531 Merge branch 'freqtrade:develop' into develop 2023-06-11 22:55:03 +02:00
hippocritical
663cfc6211 fixing tests 2023-06-11 22:53:21 +02:00
steam
bdb535d0e6 add maskable eval callback multiproc 2023-06-11 22:20:15 +03:00
steam
5dee86eda7 fix action_masks typing list 2023-06-11 21:44:57 +03:00
steam
c36547a563 add maskable eval callback 2023-06-11 20:05:53 +03:00
steam
afd54d39a5 add action_masks 2023-06-11 20:00:12 +03:00
Matthias
5844756ba1 Add test and fix for stop-price == limit price
closes #8758
2023-06-11 17:20:35 +02:00
Matthias
4a800fe467 Add explicit test for get_stop_limit_rate 2023-06-11 17:17:41 +02:00
Matthias
fd940dbba2 Merge pull request #8530 from freqtrade/feat/pairlistconfig
Provide pairlists via API
2023-06-11 12:43:38 +02:00
Matthias
320b3e20a6 Use correct variable for candle-type when loading data
closes #8757
2023-06-11 11:58:18 +02:00
Matthias
fc11c79b77 Fix not working date format output 2023-06-11 08:51:20 +02:00
Matthias
87e144a95a Update webserver tags 2023-06-11 08:24:16 +02:00
Matthias
9ef814689e Update endpoint in rest-client 2023-06-11 08:18:01 +02:00
hippocritical
2bd66fbb47 Merge branch 'freqtrade:develop' into develop 2023-06-11 00:21:04 +02:00
hippocritical
9eceb2f38c Merge remote-tracking branch 'origin/develop' into develop 2023-06-11 00:20:02 +02:00
hippocritical
1da1972c18 added test for config overrides 2023-06-11 00:18:34 +02:00
Matthias
e332fbfb47 Add explicit test for okx get_stop_params 2023-06-10 16:56:41 +02:00
Matthias
2806110869 Add explicit test for okx cancel_stop 2023-06-10 16:56:41 +02:00
Matthias
cfe88f06d2 Improve behavior of okx rebuys when using stop on exchange
closes #8755
2023-06-10 16:56:41 +02:00
robcaulk
ad8a4897ce remove unnecessary example in feature_engineering.md 2023-06-10 16:13:28 +02:00
Matthias
4f15b30339 Merge pull request #8590 from AchmadFathoni/develop
Fix disrepancy in freqai doc code example
2023-06-10 15:27:01 +02:00
robcaulk
229ee643cd revert change to deal with FT pinning old scikit-learn version 2023-06-10 13:24:09 +02:00
robcaulk
41e37f9d32 improve docs, update doc strings 2023-06-10 13:11:47 +02:00
robcaulk
d9bdd879ab improve migration doc 2023-06-10 13:00:59 +02:00
robcaulk
f8d7c2e21d add migration guide, add protections and migration assistance 2023-06-10 12:48:27 +02:00
robcaulk
4cdd6bc6c3 avoid using ram for unnecessary train_df, fix some deprecation warnings 2023-06-10 12:07:03 +02:00
robcaulk
e246259792 avoid manual pipeline validation 2023-06-10 11:40:57 +02:00
Matthias
3523f564bd Improve Log reduction and corresponding test 2023-06-10 09:44:20 +02:00
Matthias
265d782af8 Implement the requested changes. 2023-06-10 09:30:34 +02:00
hippocritical
94ca2988a0 updated docs 2023-06-09 23:32:58 +02:00
hippocritical
6656740f21 Moved config overrides to its' own function
Added config overrides to dry_run_wallet and max_open_trades to avoid false positives.
2023-06-09 22:11:30 +02:00
Matthias
99842402f7 Further reduce unnecessary output 2023-06-09 07:18:35 +02:00
Matthias
16b3363970 Fix type problem 2023-06-09 07:16:06 +02:00
Matthias
b89390c06b Reduce log verbosity during bias tester runs 2023-06-09 07:15:36 +02:00
Matthias
c8e827d483 Merge branch 'develop' into pr/hippocritical/8369 2023-06-09 07:03:25 +02:00
Matthias
fc8c6b06ad Extract set-log-levels from main logging module 2023-06-09 06:59:08 +02:00
Matthias
e3056b141a Move logging tests to dedicated test file 2023-06-09 06:51:12 +02:00
Matthias
05ea36f03b Fix performance when running tons of backtests 2023-06-09 06:45:34 +02:00
Matthias
6b736c49d4 Dont persist Backtesting to avoid memory leak 2023-06-08 20:13:28 +02:00
robcaulk
33b028b104 ensure data kitchen thread count is propagated to pipeline 2023-06-08 12:33:08 +02:00
robcaulk
88337b6c5e convert to using constants in data_drawer. Remove unneeded check_if_pred_in_spaces function 2023-06-08 12:19:42 +02:00
robcaulk
e39e40dc60 improve documentation of pipeline building/customization 2023-06-08 11:56:31 +02:00
Matthias
317e0b5f2b Avoid nested loops in telegram for force* scenarios
closes #8731
2023-06-08 07:08:06 +02:00
Matthias
4404d112a9 Merge pull request #8749 from freqtrade/dependabot/docker/python-3.11.4-slim-bullseye
Bump python from 3.10.11-slim-bullseye to 3.11.4-slim-bullseye
2023-06-08 06:30:36 +02:00
dependabot[bot]
f81139b97c Bump python from 3.10.11-slim-bullseye to 3.11.4-slim-bullseye
Bumps python from 3.10.11-slim-bullseye to 3.11.4-slim-bullseye.

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-08 03:56:43 +00:00
robcaulk
14557f2d32 merge develop into outsource-data-pipeline 2023-06-07 19:24:21 +02:00
robcaulk
f10f00f5e8 Merge remote-tracking branch 'origin' into use-datasieve 2023-06-07 19:23:36 +02:00
hippocritical
675a97c1cb Merge branch 'freqtrade:develop' into develop 2023-06-07 19:22:42 +02:00
robcaulk
c066f014e3 fix docs 2023-06-07 18:36:07 +02:00
robcaulk
6d39adc739 bump datasieve version 2023-06-07 18:29:49 +02:00
robcaulk
135aaa2be2 update docs, improve the interaction with define_data_pipeline 2023-06-07 18:26:49 +02:00
robcaulk
dc577d2a1a update to new datasieve interface, add noise to pipeline 2023-06-07 17:58:27 +02:00
robcaulk
4d4589becd fix isort in tests 2023-06-07 14:00:00 +02:00
robcaulk
f7f88aa14d fix pickle file name 2023-06-07 09:28:56 +02:00
robcaulk
17d74429b5 Merge remote-tracking branch 'origin/feat/outsource-data-pipeline' into use-datasieve 2023-06-07 09:08:09 +02:00
robcaulk
5ac141f72b convert to new datasieve api 2023-06-06 21:05:51 +02:00
Matthias
0b8ef1b880 Fix devcontainer invalid key 2023-06-05 21:13:52 +02:00
Matthias
c269eef77e Remove unnecessary calc_profit_ratio call 2023-06-05 21:10:29 +02:00
Matthias
21172802de Devcontainer image should contain as many dependencies as possible 2023-06-05 20:30:46 +02:00
Matthias
17b8cb2f7c Merge pull request #8738 from freqtrade/dependabot/pip/develop/ccxt-3.1.23
Bump ccxt from 3.1.13 to 3.1.23
2023-06-05 18:06:29 +02:00
dependabot[bot]
6ec91d11ae Bump ccxt from 3.1.13 to 3.1.23
Bumps [ccxt](https://github.com/ccxt/ccxt) from 3.1.13 to 3.1.23.
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/3.1.13...3.1.23)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-05 07:40:33 +00:00
Matthias
984dec12df Merge pull request #8739 from freqtrade/dependabot/pip/develop/pandas-2.0.2
Bump pandas from 2.0.1 to 2.0.2
2023-06-05 09:39:55 +02:00
Matthias
11f2bbdd08 Merge pull request #8740 from freqtrade/dependabot/pip/develop/types-requests-2.31.0.1
Bump types-requests from 2.31.0.0 to 2.31.0.1
2023-06-05 09:39:37 +02:00
Matthias
41f5c32526 Merge pull request #8741 from freqtrade/dependabot/pip/develop/mkdocs-material-9.1.15
Bump mkdocs-material from 9.1.14 to 9.1.15
2023-06-05 08:25:52 +02:00
Matthias
4dcb6395ef Bump pre-commit requests types 2023-06-05 07:13:09 +02:00
Matthias
46ad8afeb9 Merge pull request #8736 from freqtrade/dependabot/pip/develop/orjson-3.9.0
Bump orjson from 3.8.14 to 3.9.0
2023-06-05 07:10:27 +02:00
Matthias
49891967f2 Merge pull request #8734 from freqtrade/dependabot/pip/develop/fastapi-0.96.0
Bump fastapi from 0.95.2 to 0.96.0
2023-06-05 07:07:38 +02:00
Matthias
4acb0830e3 Merge pull request #8735 from freqtrade/dependabot/pip/develop/rich-13.4.1
Bump rich from 13.3.5 to 13.4.1
2023-06-05 07:07:20 +02:00
dependabot[bot]
e61659a2bc Bump mkdocs-material from 9.1.14 to 9.1.15
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.1.14 to 9.1.15.
- [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.1.14...9.1.15)

---
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-06-05 03:57:43 +00:00
dependabot[bot]
c2125698a7 Bump types-requests from 2.31.0.0 to 2.31.0.1
Bumps [types-requests](https://github.com/python/typeshed) from 2.31.0.0 to 2.31.0.1.
- [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-06-05 03:57:22 +00:00
dependabot[bot]
093181e8f2 Bump pandas from 2.0.1 to 2.0.2
Bumps [pandas](https://github.com/pandas-dev/pandas) from 2.0.1 to 2.0.2.
- [Release notes](https://github.com/pandas-dev/pandas/releases)
- [Commits](https://github.com/pandas-dev/pandas/compare/v2.0.1...v2.0.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-05 03:57:15 +00:00
dependabot[bot]
bdaf230bd1 Bump orjson from 3.8.14 to 3.9.0
Bumps [orjson](https://github.com/ijl/orjson) from 3.8.14 to 3.9.0.
- [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.8.14...3.9.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-05 03:56:45 +00:00
dependabot[bot]
9dcab313b5 Bump rich from 13.3.5 to 13.4.1
Bumps [rich](https://github.com/Textualize/rich) from 13.3.5 to 13.4.1.
- [Release notes](https://github.com/Textualize/rich/releases)
- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Textualize/rich/compare/v13.3.5...v13.4.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-05 03:56:40 +00:00
dependabot[bot]
c9bbeedd88 Bump fastapi from 0.95.2 to 0.96.0
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.95.2 to 0.96.0.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.95.2...0.96.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-06-05 03:56:37 +00:00
Robert Caulk
94bc91ef57 Update tests/freqai/test_freqai_datakitchen.py
Co-authored-by: Matthias <xmatthias@outlook.com>
2023-06-04 21:50:13 +02:00
Matthias
7a726da691 Update cached binance leverage tiers 2023-06-04 20:28:08 +02:00
Matthias
71b81ee7cd Add margin_mode to pairlists callback 2023-06-04 13:25:39 +02:00
Matthias
f61ae9c7e2 Merge branch 'develop' into feat/pairlistconfig 2023-06-04 08:33:45 +02:00
Matthias
12e31208e1 Update typedDict type used with pydantic 2023-06-03 12:33:44 +02:00
Matthias
ac7419e975 Split trademode response value into trade_mode and margin-mode 2023-06-03 11:58:55 +02:00
Matthias
72f4e1475c Bump api version 2023-06-03 11:58:55 +02:00
Matthias
74254bb893 Add /exchanges endpoint to list available exchanges 2023-06-03 11:58:55 +02:00
Matthias
54bf1634c7 Refactor validExchangesType to separate types package 2023-06-03 11:58:55 +02:00
Matthias
6f928b826f Update types for build_exchange_list_entry 2023-06-03 11:58:55 +02:00
Matthias
cc04f3279a bump pre-commit mypy version 2023-06-03 11:58:55 +02:00
Matthias
fcb960185e Clarify function naming 2023-06-03 11:58:55 +02:00
Matthias
250ae2d006 Enhance list-exchanges with more information 2023-06-03 11:58:55 +02:00
Matthias
b5d1017779 Update list_exchanges to use a dict internally 2023-06-03 11:58:55 +02:00
Matthias
26ed17fa02 Merge pull request #8725 from freqtrade/dependabot/pip/cryptography-41.0.0
Bump cryptography from 40.0.1 to 41.0.1
2023-06-03 11:32:51 +02:00
Matthias
e890bc0718 Don't bump pi version, but bump regular version 2023-06-03 08:30:38 +02:00
Matthias
10ea2b44c7 Update test line length 2023-06-03 06:59:22 +02:00
Matthias
d9d1735333 Extract ExchangePayload updating 2023-06-03 06:57:25 +02:00
Matthias
48328fb29d reset candle_type_def 2023-06-03 06:52:25 +02:00
dependabot[bot]
49c0fdf367 Bump cryptography from 40.0.1 to 41.0.0
Bumps [cryptography](https://github.com/pyca/cryptography) from 40.0.1 to 41.0.0.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/40.0.1...41.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-02 20:23:40 +00:00
Matthias
ac046d6a2d Allow setting the exchange explicitly 2023-06-02 10:14:11 +02:00
Matthias
af16ce874c Allow webserver mode to cache multiple exchanges 2023-06-02 09:50:40 +02:00
Matthias
e2594e7494 Align tests to use webserver mode 2023-06-01 20:46:28 +02:00
Matthias
77e3e9e899 Move pairlists and background tasks API's to separate file 2023-06-01 20:40:12 +02:00
Matthias
cafc9479b7 Merge branch 'develop' into feat/pairlistconfig 2023-06-01 20:33:28 +02:00
Matthias
8f02050fde Merge pull request #8721 from freqtrade/robcaulk-patch-1
Update freqai.md
2023-06-01 20:12:52 +02:00
Matthias
565c0496d9 Bump httpx min requirement 2023-06-01 20:10:57 +02:00
Matthias
d0f900f567 set HTTPX level to warning
closes #8717
2023-06-01 20:09:59 +02:00
Robert Caulk
30dd63fcb9 Update freqai.md 2023-06-01 15:54:05 +02:00
Matthias
8aee368f60 auto-inject webserver mode dependency 2023-06-01 07:07:02 +02:00
Matthias
e0d9603e99 Raise correct httperrorcode for webserver-only endpoitns 2023-06-01 07:03:35 +02:00
Matthias
88ecb935b9 Add "failed" state to bgjob task response 2023-05-31 20:22:22 +02:00
Matthias
9c6fee3841 Enable gate futures for spread-filter again
closes #8687
2023-05-31 17:14:22 +02:00
Matthias
5fc8426b9b Improve handling of order cancelation failures with force_exit
closes #8708
2023-05-31 17:06:51 +02:00
Matthias
430cd24bbc Invert order (exit trade 3 before trade 4) 2023-05-31 15:00:09 +02:00
Matthias
08d040db14 Slightly update force_exit test 2023-05-31 14:59:41 +02:00
Matthias
5311614d54 Update force exit wording 2023-05-31 14:33:09 +02:00
Matthias
193d88c9c8 Double-check cancelling stop order didn't close the trade 2023-05-31 14:12:03 +02:00
Matthias
1f543666f4 Improve test for reload-markets timings, fix bug
closes #8714
2023-05-31 11:46:31 +02:00
Matthias
fd955028a8 Update tests for new background method 2023-05-31 07:08:27 +02:00
Matthias
7bccf2129f Introduce background_job endpoints 2023-05-31 07:00:20 +02:00
robcaulk
f6a32f4ffd bump version 2023-05-29 23:35:24 +02:00
Matthias
b666c418bb Don't use variables for simple debug values 2023-05-29 17:33:11 +02:00
Matthias
af1dbf7dff Extract get_rate_from_ticker from get_rate method 2023-05-29 17:31:57 +02:00
Matthias
f074383d6a Extract orderbook logic into separate method 2023-05-29 17:24:04 +02:00
robcaulk
785f0d396f bump datasieve version 2023-05-29 16:44:53 +02:00
Matthias
6315516d50 Improve volumepairlist defaults 2023-05-29 15:18:46 +02:00
robcaulk
6237806817 bump datasieve to 0.0.8 2023-05-29 15:18:28 +02:00
robcaulk
e572653616 bring classifier/rl up to new paradigm. ensure tests pass. remove old code. add documentation, add new example transform 2023-05-29 13:33:29 +02:00
Matthias
12e8e29b4e Merge pull request #8703 from freqtrade/dependabot/pip/develop/types-requests-2.31.0.0
Bump types-requests from 2.30.0.0 to 2.31.0.0
2023-05-29 08:39:51 +02:00
Matthias
5ecf93e84b Merge pull request #8705 from freqtrade/dependabot/pip/develop/ccxt-3.1.13
Bump ccxt from 3.1.5 to 3.1.13
2023-05-29 08:39:32 +02:00
Matthias
9f1bdc19aa Bump ruff pre-commit version 2023-05-29 08:10:29 +02:00
Matthias
35836479de Bump requests pre-commit dependency 2023-05-29 08:09:56 +02:00
Matthias
e03e8547c0 Merge pull request #8707 from freqtrade/dependabot/pip/develop/orjson-3.8.14
Bump orjson from 3.8.12 to 3.8.14
2023-05-29 08:08:36 +02:00
Matthias
bcd27f5517 Merge pull request #8706 from freqtrade/dependabot/pip/develop/ruff-0.0.270
Bump ruff from 0.0.269 to 0.0.270
2023-05-29 08:08:21 +02:00
Matthias
ce02a3ff33 Merge pull request #8704 from freqtrade/dependabot/pip/develop/cachetools-5.3.1
Bump cachetools from 5.3.0 to 5.3.1
2023-05-29 08:08:06 +02:00
Matthias
85de8ca63f Merge pull request #8702 from freqtrade/dependabot/pip/develop/pytest-cov-4.1.0
Bump pytest-cov from 4.0.0 to 4.1.0
2023-05-29 08:07:46 +02:00
Matthias
4c54640800 Merge pull request #8701 from freqtrade/dependabot/pip/develop/pydantic-1.10.8
Bump pydantic from 1.10.7 to 1.10.8
2023-05-29 08:07:29 +02:00
dependabot[bot]
cb7a0f9bff Bump orjson from 3.8.12 to 3.8.14
Bumps [orjson](https://github.com/ijl/orjson) from 3.8.12 to 3.8.14.
- [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.8.12...3.8.14)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-29 03:57:23 +00:00
dependabot[bot]
90808683e2 Bump ruff from 0.0.269 to 0.0.270
Bumps [ruff](https://github.com/charliermarsh/ruff) from 0.0.269 to 0.0.270.
- [Release notes](https://github.com/charliermarsh/ruff/releases)
- [Changelog](https://github.com/charliermarsh/ruff/blob/main/BREAKING_CHANGES.md)
- [Commits](https://github.com/charliermarsh/ruff/compare/v0.0.269...v0.0.270)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-29 03:57:13 +00:00
dependabot[bot]
8fdec5f3a6 Bump ccxt from 3.1.5 to 3.1.13
Bumps [ccxt](https://github.com/ccxt/ccxt) from 3.1.5 to 3.1.13.
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/3.1.5...3.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-05-29 03:57:05 +00:00
dependabot[bot]
4e9a43ebf6 Bump cachetools from 5.3.0 to 5.3.1
Bumps [cachetools](https://github.com/tkem/cachetools) from 5.3.0 to 5.3.1.
- [Changelog](https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tkem/cachetools/compare/v5.3.0...v5.3.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-29 03:56:56 +00:00
dependabot[bot]
3bc390cb2e Bump types-requests from 2.30.0.0 to 2.31.0.0
Bumps [types-requests](https://github.com/python/typeshed) from 2.30.0.0 to 2.31.0.0.
- [Commits](https://github.com/python/typeshed/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-29 03:56:53 +00:00
dependabot[bot]
12af6ea766 Bump pytest-cov from 4.0.0 to 4.1.0
Bumps [pytest-cov](https://github.com/pytest-dev/pytest-cov) from 4.0.0 to 4.1.0.
- [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-cov/compare/v4.0.0...v4.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-29 03:56:50 +00:00
dependabot[bot]
51ba4d14e9 Bump pydantic from 1.10.7 to 1.10.8
Bumps [pydantic](https://github.com/pydantic/pydantic) from 1.10.7 to 1.10.8.
- [Release notes](https://github.com/pydantic/pydantic/releases)
- [Changelog](https://github.com/pydantic/pydantic/blob/v1.10.8/HISTORY.md)
- [Commits](https://github.com/pydantic/pydantic/compare/v1.10.7...v1.10.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-29 03:56:46 +00:00
hippocritical
6b3b5f201d export_to_csv: Added forced conversion of float64 to int to remove the .0 values once and for all ... 2023-05-28 22:13:29 +02:00
hippocritical
fc887efd4b Merge branch 'freqtrade:develop' into develop 2023-05-28 20:53:39 +02:00
hippocritical
0874b1a959 Merge remote-tracking branch 'origin/develop' into develop 2023-05-28 20:53:16 +02:00
hippocritical
eec7837167 - modified help-string for the cli-option lookahead_analysis_exportfilename
- moved doc from utils.md to lookahead-analysis.md and modified it (unfinished)
- added a check to automatically edit the config['backtest_cache'] to be 'none'
- adjusted test_lookahead_helper_export_to_csv to catch the new catching of errors
- adjusted test_lookahead_helper_text_table_lookahead_analysis_instances to catch the new catching of errors
- changed lookahead_analysis.start result-reporting to show that not enough trades were caught including x of y
2023-05-28 20:52:58 +02:00
Matthias
1317de8c1c Add rudimentary description per pairlist 2023-05-28 18:21:23 +02:00
Matthias
dbb92f686f Merge pull request #8696 from freqtrade/feat/no_roi
allow no / empty minimal_roi
2023-05-28 15:36:01 +02:00
hippocritical
aa8eb14461 Merge branch 'freqtrade:develop' into develop 2023-05-28 12:11:29 +02:00
Matthias
3d05669f61 Merge branch 'develop' into feat/pairlistconfig 2023-05-28 10:01:43 +02:00
Matthias
8a86169256 Better handling of shift 2023-05-28 09:59:57 +02:00
Matthias
8ec0469b11 Fix volatilityfilter behavior
closes #8698
2023-05-28 09:53:53 +02:00
hippocritical
9bb25be880 modified help-string for the cli-option lookahead_analysis_exportfilename
moved doc from utils.md to lookahead-analysis.md and modified it (unfinished)
added a check to automatically edit the config['backtest_cache'] to be 'none'
2023-05-27 22:31:47 +02:00
hippocritical
0ed84fbcc1 added test_initialize_single_lookahead_analysis
A check for a random variable should be enough, right? :)
2023-05-27 20:47:59 +02:00
hippocritical
a7426755bc added a check for bias1.
Looking at has_bias should be enough to statisfy the test.
The tests could be extended with thecking the buy/sell signals and the dataframe itself -
but this should be sufficient for now.
2023-05-27 20:35:45 +02:00
Matthias
df5e6409a4 Bump develop version to 2023.6-dev 2023-05-27 20:18:39 +02:00
Matthias
5649d1d4da Convert minimal_roi to list comprehension 2023-05-27 19:57:12 +02:00
Matthias
36c82ad67c Update documentation for min_roi 2023-05-27 19:40:02 +02:00
Matthias
35a388bf9a Don't force min_roi to have content 2023-05-27 19:39:00 +02:00
hippocritical
ee37693729 Merge branch 'freqtrade:develop' into develop 2023-05-27 19:23:01 +02:00
hippocritical
05f0b32e3b Merge remote-tracking branch 'origin/develop' into develop 2023-05-27 19:22:23 +02:00
hippocritical
636298bb71 added test_lookahead_helper_export_to_csv 2023-05-27 19:15:35 +02:00
robcaulk
31e19add27 start transition toward outsourcing the data pipeline with objective of improving pipeline flexibility 2023-05-26 18:40:14 +02:00
hippocritical
eb31b574c1 added returns to text_table_lookahead_analysis_instances
filled in test_lookahead_helper_text_table_lookahead_analysis_instances
2023-05-26 12:55:54 +02:00
hippocritical
9366c77e42 Merge branch 'freqtrade:develop' into develop 2023-05-26 08:38:32 +02:00
Matthias
af7afa80a9 remove gone-wrong import 2023-05-26 06:44:48 +02:00
Matthias
9e75c768c0 Improve responses for evaluate get endpoints 2023-05-24 21:01:39 +02:00
Matthias
4c52109fa3 Handle pairlist evaluation errors gracefully 2023-05-24 20:37:23 +02:00
Matthias
c2010d160f Merge branch 'develop' into feat/pairlistconfig 2023-05-22 19:59:20 +02:00
Matthias
33e25434b4 Change statuscode to 202 2023-05-22 19:43:27 +02:00
Matthias
756e1f5d5b Test pairlist evaluation 2023-05-21 10:08:32 +02:00
Matthias
01984a06af Extract pairlist evaluation from sub-method 2023-05-21 09:58:38 +02:00
Matthias
7cc8da23c2 Update test for available pairlist 2023-05-21 09:56:46 +02:00
Matthias
bf9a6dd6e7 Merge branch 'develop' into feat/pairlistconfig 2023-05-21 09:54:17 +02:00
Matthias
818a3342b9 move pairlist evaluation to the background 2023-05-21 09:38:14 +02:00
Matthias
680e7ba98f Get exchange through DI 2023-05-21 09:21:22 +02:00
Matthias
5ad6652e55 Merge branch 'develop' into feat/pairlistconfig 2023-05-21 09:15:50 +02:00
Matthias
70a0c2e625 Fix test mishap 2023-05-21 08:21:08 +02:00
Matthias
3e6a2bf9b0 Add parameters for analysis tests ... 2023-05-20 20:12:04 +02:00
Matthias
104fa9e32d Use logger, not the logging module 2023-05-20 19:58:14 +02:00
Matthias
e73cd1487e Add somewhat sensible assert 2023-05-20 19:57:26 +02:00
Matthias
9869a21951 Move strategy to it's own directory to avoid having other 2023-05-20 19:51:54 +02:00
Matthias
3f5c18a035 Add some tests as todo 2023-05-20 19:51:54 +02:00
Matthias
e183707979 Further test lookahead_helpers 2023-05-20 19:51:54 +02:00
Matthias
ceddcd9242 Move most of the logic to lookahead_analysis helper 2023-05-20 19:51:54 +02:00
Matthias
d8af0dc9c4 Slightly improve testcase 2023-05-20 19:51:54 +02:00
Matthias
1c4a7c7a05 Split Lookahead helper to separate file 2023-05-20 19:51:54 +02:00
Matthias
7b9f82c71a Remove needless check for "None" list 2023-05-20 19:51:54 +02:00
hippocritical
5142b6bc0d Merge branch 'freqtrade:develop' into develop 2023-05-20 19:50:31 +02:00
Matthias
209eb63ede Add startup test case 2023-05-20 11:28:52 +02:00
Matthias
2e675efa13 Initial fix - test 2023-05-20 11:15:30 +02:00
Matthias
073dac8d5f Move lookahead analysis tests to optimize subdir 2023-05-20 11:08:22 +02:00
Matthias
a0edbe4797 Switch to using config instead of args. 2023-05-20 11:06:50 +02:00
Matthias
2e79aaae00 Remove usage of args.
It's clumsy to use and prevents specifying settings in the configuration.
2023-05-20 11:02:13 +02:00
Matthias
5488789bc4 Arguments should be in the configuration. 2023-05-20 11:01:42 +02:00
hippocritical
b2ecfd28a7 Merge branch 'freqtrade:develop' into develop 2023-05-18 19:12:25 +02:00
hippocritical
7a5f457b2f Merge branch 'freqtrade:develop' into develop 2023-05-17 22:14:51 +02:00
hippocritical
36f14249d4 Merge branch 'freqtrade:develop' into develop 2023-05-13 22:41:02 +02:00
hippocritical
7d871faf04 added exportfilename to args_to_config
introduced strategy_test_v3_with_lookahead_bias.py for checking lookahead_bias#
introduced test_lookahead_analysis which currently is broken
2023-05-13 22:40:11 +02:00
hippocritical
91ce1cb2ae removed overwrite_existing_exportfilename_content (won't use it myself, wouldn't make sense for others to not overwrite something they re-calculated)
switched from args to config (args still work)
renamed exportfilename to lookahead_analysis_exportfilename so if users decide to put something into it then it won't compete with other configurations
2023-05-10 22:41:27 +02:00
hippocritical
9aac367534 Merge remote-tracking branch 'origin/develop' into develop 2023-05-08 22:58:30 +02:00
hippocritical
b8357c36ca Merge branch 'freqtrade:develop' into develop 2023-05-08 22:58:03 +02:00
hippocritical
b252bdd3c7 made purging of config.freqai.identifier variable 2023-05-08 22:35:13 +02:00
hippocritical
ac4aa8ed2b Merge branch 'freqtrade:develop' into develop 2023-05-06 21:59:04 +02:00
hippocritical
2306c74dc1 adjusted code to matthias' specifications
did not change the code so that it only loads data once yet.
2023-05-06 21:56:11 +02:00
Achmad Fathoni
5abd616ae9 Fix disrepancy in freqai doc code example 2023-05-02 23:01:51 +07:00
hippocritical
ce979b21f9 Merge branch 'freqtrade:develop' into develop 2023-04-30 10:20:40 +02:00
Matthias
8e0788cf5f Merge branch 'develop' into feat/pairlistconfig 2023-04-27 20:40:55 +02:00
Matthias
877d53f439 Add airlists test endpoint (so pairlist configurations can be tested) 2023-04-27 20:35:24 +02:00
Matthias
3d4be92cc6 Add option pairlist parameter type 2023-04-21 19:30:32 +02:00
Matthias
c5bf029701 Better type response 2023-04-20 19:38:55 +02:00
Matthias
9e4f9798e6 Add pairlist "is-generator" to api 2023-04-20 19:33:36 +02:00
Matthias
3ef2a57bca Add "is_pairlist_generator" field to pairlists 2023-04-20 19:33:33 +02:00
Matthias
e20b94d836 Add more filter param descriptions 2023-04-20 07:22:12 +02:00
Matthias
4636de30cd Improve pairlistparam types 2023-04-20 07:03:27 +02:00
Matthias
2ea157d9d3 Add some more pairlist parameter definitions 2023-04-20 06:58:05 +02:00
Matthias
987da010c9 Start pairlist parameter listing 2023-04-19 21:08:44 +02:00
Matthias
5ad352fdf1 add /pairlists to rest client 2023-04-19 21:08:28 +02:00
Matthias
2df80fc49a Add /pairlists endpoint to api 2023-04-19 18:35:52 +02:00
hippocritical
e990b9fb13 Merge branch 'freqtrade:develop' into develop 2023-04-18 16:55:10 +02:00
hippocritical
2b416d3b62 - Added a first version of docs (needs checking)
- optimized pairs for entry_varholder and exit_varholder to only check a single pair instead of all pairs.
- bias-check of freqai strategies now possible
- added condition to not crash when compared_df is empty (meaning no differences have been found)
2023-04-16 23:47:10 +02:00
hippocritical
d5c98a3c39 Merge branch 'freqtrade:develop' into develop 2023-04-15 14:31:27 +02:00
hippocritical
46b97d2be4 Merge remote-tracking branch 'origin/develop' into develop 2023-04-15 14:31:12 +02:00
hippocritical
767442198e saving and updating the csv file now works
open ended timeranges now work
if a file fails then it will not report as non-bias, but report in the table as error and the csv file will not have it listed.
2023-04-15 14:29:52 +02:00
hippocritical
a9ef4c3ab0 partial progress commit:
added terminal tabulate-output
added yet non-working csv output using pandas
2023-04-12 21:03:59 +02:00
hippocritical
e5e63d5bee Merge branch 'freqtrade:develop' into develop 2023-04-10 08:26:51 +02:00
hippocritical
0fb155d6ee Merge branch 'freqtrade:develop' into develop 2023-04-03 20:17:36 +02:00
hippocritical
bad2cdabf2 Merge branch 'freqtrade:develop' into develop 2023-03-29 20:51:59 +02:00
hippocritical
7bd55971dc strategy_updater:
removed args_common_optimize for strategy-updater

backtest_lookahead_bias_checker:
added args and cli-options for minimum and target trade amounts
fixed code according to best-practice coding requests of matthias (CamelCase etc)
2023-03-28 22:20:00 +02:00
hippocritical
efefcb240b Merge branch 'freqtrade:develop' into develop 2023-03-24 22:37:21 +01:00
hippocritical
f57787882d Merge remote-tracking branch 'origin/develop' into develop 2023-03-22 12:44:29 +01:00
hippocritical
d12a7ff18b freqtrades' merge broke my side, fixed it by porting it over to my develop branch, no changes with this commit logic-wise. 2023-03-22 12:32:39 +01:00
286 changed files with 9768 additions and 5040 deletions

View File

@@ -1,11 +1,12 @@
FROM freqtradeorg/freqtrade:develop
FROM freqtradeorg/freqtrade:develop_freqairl
USER root
# Install dependencies
COPY requirements-dev.txt /freqtrade/
RUN apt-get update \
&& apt-get -y install git mercurial sudo vim build-essential \
&& apt-get -y install --no-install-recommends apt-utils dialog \
&& apt-get -y install --no-install-recommends git sudo vim build-essential \
&& apt-get clean \
&& mkdir -p /home/ftuser/.vscode-server /home/ftuser/.vscode-server-insiders /home/ftuser/commandhistory \
&& echo "export PROMPT_COMMAND='history -a'" >> /home/ftuser/.bashrc \

View File

@@ -19,23 +19,24 @@
"postCreateCommand": "freqtrade create-userdir --userdir user_data/",
"workspaceFolder": "/workspaces/freqtrade",
"settings": {
"terminal.integrated.shell.linux": "/bin/bash",
"editor.insertSpaces": true,
"files.trimTrailingWhitespace": true,
"[markdown]": {
"files.trimTrailingWhitespace": false,
"customizations": {
"settings": {
"terminal.integrated.shell.linux": "/bin/bash",
"editor.insertSpaces": true,
"files.trimTrailingWhitespace": true,
"[markdown]": {
"files.trimTrailingWhitespace": false,
},
"python.pythonPath": "/usr/local/bin/python",
},
"python.pythonPath": "/usr/local/bin/python",
},
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"ms-python.python",
"ms-python.vscode-pylance",
"davidanson.vscode-markdownlint",
"ms-azuretools.vscode-docker",
"vscode-icons-team.vscode-icons",
],
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"ms-python.python",
"ms-python.vscode-pylance",
"davidanson.vscode-markdownlint",
"ms-azuretools.vscode-docker",
"vscode-icons-team.vscode-icons",
],
}
}

View File

@@ -10,7 +10,7 @@ updates:
directory: "/"
schedule:
interval: weekly
open-pull-requests-limit: 10
open-pull-requests-limit: 15
target-branch: develop
- package-ecosystem: "github-actions"

View File

@@ -136,6 +136,7 @@ jobs:
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
check-latest: true
- name: Cache_dependencies
uses: actions/cache@v3
@@ -159,7 +160,8 @@ jobs:
- name: Installation - macOS
if: runner.os == 'macOS'
run: |
brew update
# brew update
# TODO: Should be the brew upgrade
# homebrew fails to update python due to unlinking failures
# https://github.com/actions/runner-images/issues/6817
rm /usr/local/bin/2to3 || true
@@ -459,7 +461,7 @@ jobs:
python setup.py sdist bdist_wheel
- name: Publish to PyPI (Test)
uses: pypa/gh-action-pypi-publish@v1.8.6
uses: pypa/gh-action-pypi-publish@v1.8.10
if: (github.event_name == 'release')
with:
user: __token__
@@ -467,7 +469,7 @@ jobs:
repository_url: https://test.pypi.org/legacy/
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@v1.8.6
uses: pypa/gh-action-pypi-publish@v1.8.10
if: (github.event_name == 'release')
with:
user: __token__

View File

@@ -8,17 +8,17 @@ repos:
# stages: [push]
- repo: https://github.com/pre-commit/mirrors-mypy
rev: "v1.0.1"
rev: "v1.5.0"
hooks:
- id: mypy
exclude: build_helpers
additional_dependencies:
- types-cachetools==5.3.0.5
- types-cachetools==5.3.0.6
- types-filelock==3.2.7
- types-requests==2.30.0.0
- types-tabulate==0.9.0.2
- types-python-dateutil==2.8.19.13
- SQLAlchemy==2.0.15
- types-requests==2.31.0.2
- types-tabulate==0.9.0.3
- types-python-dateutil==2.8.19.14
- SQLAlchemy==2.0.20
# stages: [push]
- repo: https://github.com/pycqa/isort
@@ -30,7 +30,7 @@ repos:
- repo: https://github.com/charliermarsh/ruff-pre-commit
# Ruff version.
rev: 'v0.0.263'
rev: 'v0.0.270'
hooks:
- id: ruff

View File

@@ -1,8 +1,14 @@
# .readthedocs.yml
version: 2
build:
image: latest
os: "ubuntu-22.04"
tools:
python: "3.11"
python:
version: 3.8
setup_py_install: false
install:
- requirements: docs/requirements-docs.txt
mkdocs:
configuration: mkdocs.yml

View File

@@ -1,4 +1,4 @@
FROM python:3.10.11-slim-bullseye as base
FROM python:3.11.4-slim-bullseye as base
# Setup env
ENV LANG C.UTF-8

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -8,8 +8,9 @@ if [ -n "$2" ] || [ ! -f "${INSTALL_LOC}/lib/libta_lib.a" ]; then
tar zxvf ta-lib-0.4.0-src.tar.gz
cd ta-lib \
&& sed -i.bak "s|0.00000001|0.000000000000000001 |g" src/ta_func/ta_utility.h \
&& curl 'https://raw.githubusercontent.com/gcc-mirror/gcc/master/config.guess' -o config.guess \
&& curl 'https://raw.githubusercontent.com/gcc-mirror/gcc/master/config.sub' -o config.sub \
&& echo "Downloading gcc config.guess and config.sub" \
&& curl -s 'https://raw.githubusercontent.com/gcc-mirror/gcc/master/config.guess' -o config.guess \
&& curl -s 'https://raw.githubusercontent.com/gcc-mirror/gcc/master/config.sub' -o config.sub \
&& ./configure --prefix=${INSTALL_LOC}/ \
&& make
if [ $? -ne 0 ]; then

View File

@@ -1,21 +1,11 @@
# Downloads don't work automatically, since the URL is regenerated via javascript.
# Downloaded from https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib
# vendored Wheels compiled via https://github.com/xmatthias/ta-lib-python/tree/ta_bundled_040
python -m pip install --upgrade pip wheel
$pyv = python -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')"
if ($pyv -eq '3.8') {
pip install build_helpers\TA_Lib-0.4.26-cp38-cp38-win_amd64.whl
}
if ($pyv -eq '3.9') {
pip install build_helpers\TA_Lib-0.4.26-cp39-cp39-win_amd64.whl
}
if ($pyv -eq '3.10') {
pip install build_helpers\TA_Lib-0.4.26-cp310-cp310-win_amd64.whl
}
if ($pyv -eq '3.11') {
pip install build_helpers\TA_Lib-0.4.26-cp311-cp311-win_amd64.whl
}
pip install --find-links=build_helpers\ --prefer-binary TA-Lib
pip install -r requirements-dev.txt
pip install -e .

View File

@@ -89,7 +89,6 @@
],
"exchange": {
"name": "binance",
"sandbox": false,
"key": "your_exchange_key",
"secret": "your_exchange_secret",
"password": "",
@@ -206,6 +205,6 @@
"recursive_strategy_search": false,
"add_config_files": [],
"reduce_df_footprint": false,
"dataformat_ohlcv": "json",
"dataformat_trades": "jsongz"
"dataformat_ohlcv": "feather",
"dataformat_trades": "feather"
}

View File

@@ -32,5 +32,5 @@ services:
--logfile /freqtrade/user_data/logs/freqtrade.log
--db-url sqlite:////freqtrade/user_data/tradesv3.sqlite
--config /freqtrade/user_data/config.json
--freqai-model XGBoostClassifier
--strategy SampleStrategy
--freqaimodel XGBoostRegressor
--strategy FreqaiExampleStrategy

View File

@@ -103,6 +103,22 @@ The indicators have to be present in your strategy's main DataFrame (either for
timeframe or for informative timeframes) otherwise they will simply be ignored in the script
output.
There are a range of candle and trade-related fields that are included in the analysis so are
automatically accessible by including them on the indicator-list, and these include:
- **open_date :** trade open datetime
- **close_date :** trade close datetime
- **min_rate :** minimum price seen throughout the position
- **max_rate :** maxiumum price seen throughout the position
- **open :** signal candle open price
- **close :** signal candle close price
- **high :** signal candle high price
- **low :** signal candle low price
- **volume :** signal candle volumne
- **profit_ratio :** trade profit ratio
- **profit_abs :** absolute profit return of the trade
### Filtering the trade output by date
To show only trades between dates within your backtested timerange, supply the usual `timerange` option in `YYYYMMDD-[YYYYMMDD]` format:

View File

@@ -136,7 +136,7 @@ class MyAwesomeStrategy(IStrategy):
### Dynamic parameters
Parameters can also be defined dynamically, but must be available to the instance once the * [`bot_start()` callback](strategy-callbacks.md#bot-start) has been called.
Parameters can also be defined dynamically, but must be available to the instance once the [`bot_start()` callback](strategy-callbacks.md#bot-start) has been called.
``` python

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -305,7 +305,7 @@ A backtesting result will look like that:
| Sharpe | 2.97 |
| Calmar | 6.29 |
| Profit factor | 1.11 |
| Expectancy | -0.15 |
| Expectancy (Ratio) | -0.15 (-0.05) |
| Avg. stake amount | 0.001 BTC |
| Total trade volume | 0.429 BTC |
| | |
@@ -324,6 +324,7 @@ A backtesting result will look like that:
| Days win/draw/lose | 12 / 82 / 25 |
| Avg. Duration Winners | 4:23:00 |
| Avg. Duration Loser | 6:55:00 |
| Max Consecutive Wins / Loss | 3 / 4 |
| Rejected Entry signals | 3089 |
| Entry/Exit Timeouts | 0 / 0 |
| Canceled Trade Entries | 34 |
@@ -409,7 +410,7 @@ It contains some useful key metrics about performance of your strategy on backte
| Sharpe | 2.97 |
| Calmar | 6.29 |
| Profit factor | 1.11 |
| Expectancy | -0.15 |
| Expectancy (Ratio) | -0.15 (-0.05) |
| Avg. stake amount | 0.001 BTC |
| Total trade volume | 0.429 BTC |
| | |
@@ -428,6 +429,7 @@ It contains some useful key metrics about performance of your strategy on backte
| Days win/draw/lose | 12 / 82 / 25 |
| Avg. Duration Winners | 4:23:00 |
| Avg. Duration Loser | 6:55:00 |
| Max Consecutive Wins / Loss | 3 / 4 |
| Rejected Entry signals | 3089 |
| Entry/Exit Timeouts | 0 / 0 |
| Canceled Trade Entries | 34 |
@@ -467,6 +469,7 @@ It contains some useful key metrics about performance of your strategy on backte
- `Best day` / `Worst day`: Best and worst day based on daily profit.
- `Days win/draw/lose`: Winning / Losing days (draws are usually days without closed trade).
- `Avg. Duration Winners` / `Avg. Duration Loser`: Average durations for winning and losing trades.
- `Max Consecutive Wins / Loss`: Maximum consecutive wins/losses in a row.
- `Rejected Entry signals`: Trade entry signals that could not be acted upon due to `max_open_trades` being reached.
- `Entry/Exit Timeouts`: Entry/exit orders which did not fill (only applicable if custom pricing is used).
- `Canceled Trade Entries`: Number of trades that have been canceled by user request via `adjust_entry_price`.
@@ -534,6 +537,7 @@ Since backtesting lacks some detailed information about what happens within a ca
- ROI
- exits are compared to high - but the ROI value is used (e.g. ROI = 2%, high=5% - so the exit will be at 2%)
- exits are never "below the candle", so a ROI of 2% may result in a exit at 2.4% if low was at 2.4% profit
- ROI entries which came into effect on the triggering candle (e.g. `120: 0.02` for 1h candles, from `60: 0.05`) will use the candle's open as exit rate
- Force-exits caused by `<N>=-1` ROI entries use low as exit value, unless N falls on the candle open (e.g. `120: -1` for 1h candles)
- Stoploss exits happen exactly at stoploss price, even if low was lower, but the loss will be `2 * fees` higher than the stoploss price
- Stoploss is evaluated before ROI within one candle. So you can often see more trades with the `stoploss` exit reason comparing to the results obtained with the same strategy in the Dry Run/Live Trade modes

View File

@@ -7,7 +7,7 @@ This page provides you some basic concepts on how Freqtrade works and operates.
* **Strategy**: Your trading strategy, telling the bot what to do.
* **Trade**: Open position.
* **Open Order**: Order which is currently placed on the exchange, and is not yet complete.
* **Pair**: Tradable pair, usually in the format of Base/Quote (e.g. XRP/USDT).
* **Pair**: Tradable pair, usually in the format of Base/Quote (e.g. `XRP/USDT` for spot, `XRP/USDT:USDT` for futures).
* **Timeframe**: Candle length to use (e.g. `"5m"`, `"1h"`, ...).
* **Indicators**: Technical indicators (SMA, EMA, RSI, ...).
* **Limit order**: Limit orders which execute at the defined limit price or better.
@@ -20,6 +20,20 @@ This page provides you some basic concepts on how Freqtrade works and operates.
All profit calculations of Freqtrade include fees. For Backtesting / Hyperopt / Dry-run modes, the exchange default fee is used (lowest tier on the exchange). For live operations, fees are used as applied by the exchange (this includes BNB rebates etc.).
## Pair naming
Freqtrade follows the [ccxt naming convention](https://docs.ccxt.com/#/README?id=consistency-of-base-and-quote-currencies) for currencies.
Using the wrong naming convention in the wrong market will usually result in the bot not recognizing the pair, usually resulting in errors like "this pair is not available".
### Spot pair naming
For spot pairs, naming will be `base/quote` (e.g. `ETH/USDT`).
### Futures pair naming
For futures pairs, naming will be `base/quote:settle` (e.g. `ETH/USDT:USDT`).
## Bot execution logic
Starting freqtrade in dry-run or live mode (using `freqtrade trade`) will start the bot and start the bot iteration loop.

View File

@@ -3,7 +3,7 @@
This page explains the different parameters of the bot and how to run it.
!!! Note
If you've used `setup.sh`, don't forget to activate your virtual environment (`source .env/bin/activate`) before running freqtrade commands.
If you've used `setup.sh`, don't forget to activate your virtual environment (`source .venv/bin/activate`) before running freqtrade commands.
!!! Warning "Up-to-date clock"
The clock on the system running the bot must be accurate, synchronized to a NTP server frequently enough to avoid problems with communication to the exchanges.

View File

@@ -188,7 +188,6 @@ Mandatory parameters are marked as **Required**, which means that they are requi
| `max_entry_position_adjustment` | Maximum additional order(s) for each open trade on top of the first entry Order. Set it to `-1` for unlimited additional orders. [More information here](strategy-callbacks.md#adjust-trade-position). <br> [Strategy Override](#parameters-in-the-strategy). <br>*Defaults to `-1`.*<br> **Datatype:** Positive Integer or -1
| | **Exchange**
| `exchange.name` | **Required.** Name of the exchange class to use. [List below](#user-content-what-values-for-exchangename). <br> **Datatype:** String
| `exchange.sandbox` | Use the 'sandbox' version of the exchange, where the exchange provides a sandbox for risk-free integration. See [here](sandbox-testing.md) in more details.<br> **Datatype:** Boolean
| `exchange.key` | API key to use for the exchange. Only required when you are in production mode.<br>**Keep it in secret, do not disclose publicly.** <br> **Datatype:** String
| `exchange.secret` | API secret to use for the exchange. Only required when you are in production mode.<br>**Keep it in secret, do not disclose publicly.** <br> **Datatype:** String
| `exchange.password` | API password to use for the exchange. Only required when you are in production mode and for exchanges that use password for API requests.<br>**Keep it in secret, do not disclose publicly.** <br> **Datatype:** String
@@ -251,8 +250,8 @@ Mandatory parameters are marked as **Required**, which means that they are requi
| `db_url` | Declares database URL to use. NOTE: This defaults to `sqlite:///tradesv3.dryrun.sqlite` if `dry_run` is `true`, and to `sqlite:///tradesv3.sqlite` for production instances. <br> **Datatype:** String, SQLAlchemy connect string
| `logfile` | Specifies logfile name. Uses a rolling strategy for log file rotation for 10 files with the 1MB limit per file. <br> **Datatype:** String
| `add_config_files` | Additional config files. These files will be loaded and merged with the current config file. The files are resolved relative to the initial file.<br> *Defaults to `[]`*. <br> **Datatype:** List of strings
| `dataformat_ohlcv` | Data format to use to store historical candle (OHLCV) data. <br> *Defaults to `json`*. <br> **Datatype:** String
| `dataformat_trades` | Data format to use to store historical trades data. <br> *Defaults to `jsongz`*. <br> **Datatype:** String
| `dataformat_ohlcv` | Data format to use to store historical candle (OHLCV) data. <br> *Defaults to `feather`*. <br> **Datatype:** String
| `dataformat_trades` | Data format to use to store historical trades data. <br> *Defaults to `feather`*. <br> **Datatype:** String
| `reduce_df_footprint` | Recast all numeric columns to float32/int32, with the objective of reducing ram/disk usage (and decreasing train/inference timing in FreqAI). (Currently only affects FreqAI use-cases) <br> **Datatype:** Boolean. <br> Default: `False`.
### Parameters in the strategy
@@ -682,16 +681,14 @@ To use a proxy for exchange connections - you will have to define the proxies as
{
"exchange": {
"ccxt_config": {
"aiohttp_proxy": "http://addr:port",
"proxies": {
"http": "http://addr:port",
"https": "http://addr:port"
},
"httpsProxy": "http://addr:port",
}
}
}
```
For more information on available proxy types, please consult the [ccxt proxy documentation](https://docs.ccxt.com/#/README?id=proxy).
## Next step
Now you have configured your config.json, the next step is to [start your bot](bot-usage.md).

View File

@@ -27,7 +27,7 @@ For this to work, first activate your virtual environment and run the following
``` bash
# Activate virtual environment
source .env/bin/activate
source .venv/bin/activate
pip install ipykernel
ipython kernel install --user --name=freqtrade

View File

@@ -6,7 +6,7 @@ To download data (candles / OHLCV) needed for backtesting and hyperoptimization
If no additional parameter is specified, freqtrade will download data for `"1m"` and `"5m"` timeframes for the last 30 days.
Exchange and pairs will come from `config.json` (if specified using `-c/--config`).
Otherwise `--exchange` becomes mandatory.
Without provided configuration, `--exchange` becomes mandatory.
You can use a relative timerange (`--days 20`) or an absolute starting point (`--timerange 20200101-`). For incremental downloads, the relative approach should be used.
@@ -27,11 +27,11 @@ usage: freqtrade download-data [-h] [-v] [--logfile FILE] [-V] [-c PATH]
[--exchange EXCHANGE]
[-t TIMEFRAMES [TIMEFRAMES ...]] [--erase]
[--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}]
[--data-format-trades {json,jsongz,hdf5}]
[--data-format-trades {json,jsongz,hdf5,feather}]
[--trading-mode {spot,margin,futures}]
[--prepend]
optional arguments:
options:
-h, --help show this help message and exit
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space-
@@ -48,8 +48,7 @@ optional arguments:
--dl-trades Download trades instead of OHLCV data. The bot will
resample trades to the desired timeframe as specified
as --timeframes/-t.
--exchange EXCHANGE Exchange name (default: `bittrex`). Only valid if no
config is provided.
--exchange EXCHANGE Exchange name. Only valid if no config is provided.
-t TIMEFRAMES [TIMEFRAMES ...], --timeframes TIMEFRAMES [TIMEFRAMES ...]
Specify which tickers to download. Space-separated
list. Default: `1m 5m`.
@@ -57,17 +56,18 @@ optional arguments:
exchange/pairs/timeframes.
--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}
Storage format for downloaded candle (OHLCV) data.
(default: `json`).
--data-format-trades {json,jsongz,hdf5}
(default: `feather`).
--data-format-trades {json,jsongz,hdf5,feather}
Storage format for downloaded trades data. (default:
`jsongz`).
`feather`).
--trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures}
Select Trading mode
--prepend Allow data prepending. (Data-appending is disabled)
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
@@ -83,40 +83,47 @@ Common arguments:
```
!!! Tip "Downloading all data for one quote currency"
Often, you'll want to download data for all pairs of a specific quote-currency. In such cases, you can use the following shorthand:
`freqtrade download-data --exchange binance --pairs .*/USDT <...>`. The provided "pairs" string will be expanded to contain all active pairs on the exchange.
To also download data for inactive (delisted) pairs, add `--include-inactive-pairs` to the command.
!!! Note "Startup period"
`download-data` is a strategy-independent command. The idea is to download a big chunk of data once, and then iteratively increase the amount of data stored.
For that reason, `download-data` does not care about the "startup-period" defined in a strategy. It's up to the user to download additional days if the backtest should start at a specific point in time (while respecting startup period).
### Pairs file
### Start download
In alternative to the whitelist from `config.json`, a `pairs.json` file can be used.
If you are using Binance for example:
- create a directory `user_data/data/binance` and copy or create the `pairs.json` file in that directory.
- update the `pairs.json` file to contain the currency pairs you are interested in.
A very simple command (assuming an available `config.json` file) can look as follows.
```bash
mkdir -p user_data/data/binance
touch user_data/data/binance/pairs.json
freqtrade download-data --exchange binance
```
The format of the `pairs.json` file is a simple json list.
Mixing different stake-currencies is allowed for this file, since it's only used for downloading.
This will download historical candle (OHLCV) data for all the currency pairs defined in the configuration.
``` json
[
"ETH/BTC",
"ETH/USDT",
"BTC/USDT",
"XRP/ETH"
]
Alternatively, specify the pairs directly
```bash
freqtrade download-data --exchange binance --pairs ETH/USDT XRP/USDT BTC/USDT
```
!!! Tip "Downloading all data for one quote currency"
Often, you'll want to download data for all pairs of a specific quote-currency. In such cases, you can use the following shorthand:
`freqtrade download-data --exchange binance --pairs .*/USDT <...>`. The provided "pairs" string will be expanded to contain all active pairs on the exchange.
To also download data for inactive (delisted) pairs, add `--include-inactive-pairs` to the command.
or as regex (in this case, to download all active USDT pairs)
```bash
freqtrade download-data --exchange binance --pairs .*/USDT
```
### Other Notes
* To use a different directory than the exchange specific default, use `--datadir user_data/data/some_directory`.
* To change the exchange used to download the historical data from, please use a different configuration file (you'll probably need to adjust rate limits etc.)
* To use `pairs.json` from some other directory, use `--pairs-file some_other_dir/pairs.json`.
* To download historical candle (OHLCV) data for only 10 days, use `--days 10` (defaults to 30 days).
* To download historical candle (OHLCV) data from a fixed starting point, use `--timerange 20200101-` - which will download all data from January 1st, 2020.
* Use `--timeframes` to specify what timeframe download the historical candle (OHLCV) data for. Default is `--timeframes 1m 5m` which will download 1-minute and 5-minute data.
* To use exchange, timeframe and list of pairs as defined in your configuration file, use the `-c/--config` option. With this, the script uses the whitelist defined in the config as the list of currency pairs to download data for and does not require the pairs.json file. You can combine `-c/--config` with most other options.
??? Note "Permission denied errors"
If your configuration directory `user_data` was made by docker, you may get the following error:
@@ -131,39 +138,7 @@ Mixing different stake-currencies is allowed for this file, since it's only used
sudo chown -R $UID:$GID user_data
```
### Start download
Then run:
```bash
freqtrade download-data --exchange binance
```
This will download historical candle (OHLCV) data for all the currency pairs you defined in `pairs.json`.
Alternatively, specify the pairs directly
```bash
freqtrade download-data --exchange binance --pairs ETH/USDT XRP/USDT BTC/USDT
```
or as regex (to download all active USDT pairs)
```bash
freqtrade download-data --exchange binance --pairs .*/USDT
```
### Other Notes
- To use a different directory than the exchange specific default, use `--datadir user_data/data/some_directory`.
- To change the exchange used to download the historical data from, please use a different configuration file (you'll probably need to adjust rate limits etc.)
- To use `pairs.json` from some other directory, use `--pairs-file some_other_dir/pairs.json`.
- To download historical candle (OHLCV) data for only 10 days, use `--days 10` (defaults to 30 days).
- To download historical candle (OHLCV) data from a fixed starting point, use `--timerange 20200101-` - which will download all data from January 1st, 2020.
- Use `--timeframes` to specify what timeframe download the historical candle (OHLCV) data for. Default is `--timeframes 1m 5m` which will download 1-minute and 5-minute data.
- To use exchange, timeframe and list of pairs as defined in your configuration file, use the `-c/--config` option. With this, the script uses the whitelist defined in the config as the list of currency pairs to download data for and does not require the pairs.json file. You can combine `-c/--config` with most other options.
#### Download additional data before the current timerange
### Download additional data before the current timerange
Assuming you downloaded all data from 2022 (`--timerange 20220101-`) - but you'd now like to also backtest with earlier data.
You can do so by using the `--prepend` flag, combined with `--timerange` - specifying an end-date.
@@ -182,7 +157,7 @@ Freqtrade currently supports the following data-formats:
* `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 (OHLCV only)
* `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.
@@ -238,7 +213,36 @@ Size has been taken from the BTC/USDT 1m spot combination for the timerange spec
To have a best performance/size mix, we recommend the use of either feather or parquet.
#### Sub-command convert data
### Pairs file
In alternative to the whitelist from `config.json`, a `pairs.json` file can be used.
If you are using Binance for example:
* create a directory `user_data/data/binance` and copy or create the `pairs.json` file in that directory.
* update the `pairs.json` file to contain the currency pairs you are interested in.
```bash
mkdir -p user_data/data/binance
touch user_data/data/binance/pairs.json
```
The format of the `pairs.json` file is a simple json list.
Mixing different stake-currencies is allowed for this file, since it's only used for downloading.
``` json
[
"ETH/BTC",
"ETH/USDT",
"BTC/USDT",
"XRP/ETH"
]
```
!!! Note
The `pairs.json` file is only used when no configuration is loaded (implicitly by naming, or via `--config` flag).
You can force the usage of this file via `--pairs-file pairs.json` - however we recommend to use the pairlist from within the configuration, either via `exchange.pair_whitelist` or `pairs` setting in the configuration.
## Sub-command convert data
```
usage: freqtrade convert-data [-h] [-v] [--logfile FILE] [-V] [-c PATH]
@@ -251,7 +255,7 @@ usage: freqtrade convert-data [-h] [-v] [--logfile FILE] [-V] [-c PATH]
[--trading-mode {spot,margin,futures}]
[--candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...]]
optional arguments:
options:
-h, --help show this help message and exit
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space-
@@ -262,19 +266,20 @@ optional arguments:
Destination format for data conversion.
--erase Clean all existing data for the selected
exchange/pairs/timeframes.
--exchange EXCHANGE Exchange name (default: `bittrex`). Only valid if no
config is provided.
--exchange EXCHANGE Exchange name. Only valid if no config is provided.
-t TIMEFRAMES [TIMEFRAMES ...], --timeframes TIMEFRAMES [TIMEFRAMES ...]
Specify which tickers to download. Space-separated
list. Default: `1m 5m`.
--trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures}
Select Trading mode
--candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...]
Select candle type to use
Select candle type to convert. Defaults to all
available types.
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
@@ -287,10 +292,9 @@ Common arguments:
Path to directory with historical backtesting data.
--userdir PATH, --user-data-dir PATH
Path to userdata directory.
```
##### Example converting data
### Example converting data
The following command will convert all candle (OHLCV) data available in `~/.freqtrade/data/binance` from json to jsongz, saving diskspace in the process.
It'll also remove original json data files (`--erase` parameter).
@@ -299,7 +303,7 @@ It'll also remove original json data files (`--erase` parameter).
freqtrade convert-data --format-from json --format-to jsongz --datadir ~/.freqtrade/data/binance -t 5m 15m --erase
```
#### Sub-command convert trade data
## Sub-command convert trade data
```
usage: freqtrade convert-trade-data [-h] [-v] [--logfile FILE] [-V] [-c PATH]
@@ -310,7 +314,7 @@ usage: freqtrade convert-trade-data [-h] [-v] [--logfile FILE] [-V] [-c PATH]
{json,jsongz,hdf5,feather,parquet}
[--erase] [--exchange EXCHANGE]
optional arguments:
options:
-h, --help show this help message and exit
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space-
@@ -321,12 +325,12 @@ optional arguments:
Destination format for data conversion.
--erase Clean all existing data for the selected
exchange/pairs/timeframes.
--exchange EXCHANGE Exchange name (default: `bittrex`). Only valid if no
config is provided.
--exchange EXCHANGE Exchange name. Only valid if no config is provided.
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
@@ -342,7 +346,7 @@ Common arguments:
```
##### Example converting trades
### Example converting trades
The following command will convert all available trade-data in `~/.freqtrade/data/kraken` from jsongz to json.
It'll also remove original jsongz data files (`--erase` parameter).
@@ -351,7 +355,7 @@ It'll also remove original jsongz data files (`--erase` parameter).
freqtrade convert-trade-data --format-from jsongz --format-to json --datadir ~/.freqtrade/data/kraken --erase
```
### Sub-command trades to ohlcv
## Sub-command trades to ohlcv
When you need to use `--dl-trades` (kraken only) to download data, conversion of trades data to ohlcv data is the last step.
This command will allow you to repeat this last step for additional timeframes without re-downloading the data.
@@ -363,9 +367,9 @@ usage: freqtrade trades-to-ohlcv [-h] [-v] [--logfile FILE] [-V] [-c PATH]
[-t TIMEFRAMES [TIMEFRAMES ...]]
[--exchange EXCHANGE]
[--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}]
[--data-format-trades {json,jsongz,hdf5}]
[--data-format-trades {json,jsongz,hdf5,feather}]
optional arguments:
options:
-h, --help show this help message and exit
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space-
@@ -373,18 +377,18 @@ optional arguments:
-t TIMEFRAMES [TIMEFRAMES ...], --timeframes TIMEFRAMES [TIMEFRAMES ...]
Specify which tickers to download. Space-separated
list. Default: `1m 5m`.
--exchange EXCHANGE Exchange name (default: `bittrex`). Only valid if no
config is provided.
--exchange EXCHANGE Exchange name. Only valid if no config is provided.
--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}
Storage format for downloaded candle (OHLCV) data.
(default: `json`).
--data-format-trades {json,jsongz,hdf5}
(default: `feather`).
--data-format-trades {json,jsongz,hdf5,feather}
Storage format for downloaded trades data. (default:
`jsongz`).
`feather`).
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
@@ -400,13 +404,13 @@ Common arguments:
```
#### Example trade-to-ohlcv conversion
### Example trade-to-ohlcv conversion
``` bash
freqtrade trades-to-ohlcv --exchange kraken -t 5m 1h 1d --pairs BTC/EUR ETH/EUR
```
### Sub-command list-data
## Sub-command list-data
You can get a list of downloaded data using the `list-data` sub-command.
@@ -418,13 +422,12 @@ usage: freqtrade list-data [-h] [-v] [--logfile FILE] [-V] [-c PATH] [-d PATH]
[--trading-mode {spot,margin,futures}]
[--show-timerange]
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.
--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}
Storage format for downloaded candle (OHLCV) data.
(default: `json`).
(default: `feather`).
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space-
separated.
@@ -435,7 +438,8 @@ optional arguments:
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
@@ -451,7 +455,7 @@ Common arguments:
```
#### Example list-data
### Example list-data
```bash
> freqtrade list-data --userdir ~/.freqtrade/user_data/
@@ -465,12 +469,12 @@ ETH/BTC 5m, 15m, 30m, 1h, 2h, 4h, 6h, 12h, 1d
ETH/USDT 5m, 15m, 30m, 1h, 2h, 4h
```
### Trades (tick) data
## Trades (tick) data
By default, `download-data` sub-command downloads Candles (OHLCV) data. Some exchanges also provide historic trade-data via their API.
This data can be useful if you need many different timeframes, since it is only downloaded once, and then resampled locally to the desired timeframes.
Since this data is large by default, the files use gzip by default. They are stored in your data-directory with the naming convention of `<pair>-trades.json.gz` (`ETH_BTC-trades.json.gz`). Incremental mode is also supported, as for historic OHLCV data, so downloading the data once per week with `--days 8` will create an incremental data-repository.
Since this data is large by default, the files use the feather fileformat by default. They are stored in your data-directory with the naming convention of `<pair>-trades.feather` (`ETH_BTC-trades.feather`). Incremental mode is also supported, as for historic OHLCV data, so downloading the data once per week with `--days 8` will create an incremental data-repository.
To use this mode, simply add `--dl-trades` to your call. This will swap the download method to download trades, and resamples the data locally.

View File

@@ -77,7 +77,7 @@ def test_method_to_test(caplog):
### Debug configuration
To debug freqtrade, we recommend VSCode with the following launch configuration (located in `.vscode/launch.json`).
To debug freqtrade, we recommend VSCode (with the Python extension) with the following launch configuration (located in `.vscode/launch.json`).
Details will obviously vary between setups - but this should work to get you started.
``` json
@@ -102,6 +102,19 @@ This method can also be used to debug a strategy, by setting the breakpoints wit
A similar setup can also be taken for Pycharm - using `freqtrade` as module name, and setting the command line arguments as "parameters".
??? Tip "Correct venv usage"
When using a virtual environment (which you should), make sure that your Editor is using the correct virtual environment to avoid problems or "unknown import" errors.
#### Vscode
You can select the correct environment in VSCode with the command "Python: Select Interpreter" - which will show you environments the extension detected.
If your environment has not been detected, you can also pick a path manually.
#### Pycharm
In pycharm, you can select the appropriate Environment in the "Run/Debug Configurations" window.
![Pycharm debug configuration](assets/pycharm_debug.png)
!!! Note "Startup directory"
This assumes that you have the repository checked out, and the editor is started at the repository root level (so setup.py is at the top level of your repository).
@@ -453,7 +466,13 @@ Once the PR against stable is merged (best right after merging):
* Use the button "Draft a new release" in the Github UI (subsection releases).
* Use the version-number specified as tag.
* Use "stable" as reference (this step comes after the above PR is merged).
* Use the above changelog as release comment (as codeblock)
* Use the above changelog as release comment (as codeblock).
* Use the below snippet for the new release
??? Tip "Release template"
````
--8<-- "includes/release_template.md"
````
## Releases

View File

@@ -14,6 +14,9 @@ Start by downloading and installing Docker / Docker Desktop for your platform:
Freqtrade documentation assumes the use of Docker desktop (or the docker compose plugin).
While the docker-compose standalone installation still works, it will require changing all `docker compose` commands from `docker compose` to `docker-compose` to work (e.g. `docker compose up -d` will become `docker-compose up -d`).
??? Warning "Docker on windows"
If you just installed docker on a windows system, make sure to reboot your system, otherwise you might encounter unexplainable Problems related to network connectivity to docker containers.
## Freqtrade with docker
Freqtrade provides an official Docker image on [Dockerhub](https://hub.docker.com/r/freqtradeorg/freqtrade/), as well as a [docker compose file](https://github.com/freqtrade/freqtrade/blob/stable/docker-compose.yml) ready for usage.
@@ -78,7 +81,7 @@ If you've selected to enable FreqUI in the `new-config` step, you will have freq
You can now access the UI by typing localhost:8080 in your browser.
??? Note "UI Access on a remote servers"
??? Note "UI Access on a remote server"
If you're running on a VPS, you should consider using either a ssh tunnel, or setup a VPN (openVPN, wireguard) to connect to your bot.
This will ensure that freqUI is not directly exposed to the internet, which is not recommended for security reasons (freqUI does not support https out of the box).
Setup of these tools is not part of this tutorial, however many good tutorials can be found on the internet.
@@ -128,7 +131,7 @@ All freqtrade arguments will be available by running `docker compose run --rm fr
!!! Note "`docker compose run --rm`"
Including `--rm` will remove the container after completion, and is highly recommended for all modes except trading mode (running with `freqtrade trade` command).
??? Note "Using docker without docker"
??? Note "Using docker without docker compose"
"`docker compose run --rm`" will require a compose file to be provided.
Some freqtrade commands that don't require authentication such as `list-pairs` can be run with "`docker run --rm`" instead.
For example `docker run --rm freqtradeorg/freqtrade:stable list-pairs --exchange binance --quote BTC --print-json`.
@@ -172,7 +175,7 @@ You can then run `docker compose build --pull` to build the docker image, and ru
### Plotting with docker
Commands `freqtrade plot-profit` and `freqtrade plot-dataframe` ([Documentation](plotting.md)) are available by changing the image to `*_plot` in your docker-compose.yml file.
Commands `freqtrade plot-profit` and `freqtrade plot-dataframe` ([Documentation](plotting.md)) are available by changing the image to `*_plot` in your `docker-compose.yml` file.
You can then use these commands as follows:
``` bash
@@ -203,16 +206,20 @@ docker compose -f docker/docker-compose-jupyter.yml build --no-cache
### Docker on Windows
* Error: `"Timestamp for this request is outside of the recvWindow."`
* The market api requests require a synchronized clock but the time in the docker container shifts a bit over time into the past.
To fix this issue temporarily you need to run `wsl --shutdown` and restart docker again (a popup on windows 10 will ask you to do so).
A permanent solution is either to host the docker container on a linux host or restart the wsl from time to time with the scheduler.
* Error: `"Timestamp for this request is outside of the recvWindow."`
The market api requests require a synchronized clock but the time in the docker container shifts a bit over time into the past.
To fix this issue temporarily you need to run `wsl --shutdown` and restart docker again (a popup on windows 10 will ask you to do so).
A permanent solution is either to host the docker container on a linux host or restart the wsl from time to time with the scheduler.
``` bash
taskkill /IM "Docker Desktop.exe" /F
wsl --shutdown
start "" "C:\Program Files\Docker\Docker\Docker Desktop.exe"
```
``` bash
taskkill /IM "Docker Desktop.exe" /F
wsl --shutdown
start "" "C:\Program Files\Docker\Docker\Docker Desktop.exe"
```
* Cannot connect to the API (Windows)
If you're on windows and just installed Docker (desktop), make sure to reboot your System. Docker can have problems with network connectivity without a restart.
You should obviously also make sure to have your [settings](#accessing-the-ui) accordingly.
!!! Warning
Due to the above, we do not recommend the usage of docker on windows for production setups, but only for experimentation, datadownload and backtesting.

View File

@@ -259,10 +259,17 @@ The configuration parameter `exchange.unknown_fee_rate` can be used to specify t
Futures trading on bybit is currently supported for USDT markets, and will use isolated futures mode.
Users with unified accounts (there's no way back) can create a Sub-account which will start as "non-unified", and can therefore use isolated futures.
On startup, freqtrade will set the position mode to "One-way Mode" for the whole (sub)account. This avoids making this call over and over again (slowing down bot operations), but means that changes to this setting may result in exceptions and errors.
On startup, freqtrade will set the position mode to "One-way Mode" for the whole (sub)account. This avoids making this call over and over again (slowing down bot operations), but means that changes to this setting may result in exceptions and errors
As bybit doesn't provide funding rate history, the dry-run calculation is used for live trades as well.
API Keys for live futures trading (Subaccount on non-unified) must have the following permissions:
* Read-write
* Contract - Orders
* Contract - Positions
We do strongly recommend to limit all API keys to the IP you're going to use it from.
!!! Tip "Stoploss on Exchange"
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.

View File

@@ -20,7 +20,7 @@ Futures trading is supported for selected exchanges. Please refer to the [docume
* When you work with your strategy & hyperopt file you should use a proper code editor like VSCode or PyCharm. A good code editor will provide syntax highlighting as well as line numbers, making it easy to find syntax errors (most likely pointed out by Freqtrade during startup).
## Freqtrade common issues
## Freqtrade common questions
### Can freqtrade open multiple positions on the same pair in parallel?
@@ -36,7 +36,7 @@ Running the bot with `freqtrade trade --config config.json` shows the output `fr
This could be caused by the following reasons:
* The virtual environment is not active.
* Run `source .env/bin/activate` to activate the virtual environment.
* Run `source .venv/bin/activate` to activate the virtual environment.
* The installation did not complete successfully.
* Please check the [Installation documentation](installation.md).
@@ -78,6 +78,14 @@ Where possible (e.g. on binance), the use of the exchange's dedicated fee curren
On binance, it's sufficient to have BNB in your account, and have "Pay fees in BNB" enabled in your profile. Your BNB balance will slowly decline (as it's used to pay fees) - but you'll no longer encounter dust (Freqtrade will include the fees in the profit calculations).
Other exchanges don't offer such possibilities, where it's simply something you'll have to accept or move to a different exchange.
### I deposited more funds to the exchange, but my bot doesn't recognize this
Freqtrade will update the exchange balance when necessary (Before placing an order).
RPC calls (Telegram's `/balance`, API calls to `/balance`) can trigger an update at max. once per hour.
If `adjust_trade_position` is enabled (and the bot has open trades eligible for position adjustments) - then the wallets will be refreshed once per hour.
To force an immediate update, you can use `/reload_config` - which will restart the bot.
### I want to use incomplete candles
Freqtrade will not provide incomplete candles to strategies. Using incomplete candles will lead to repainting and consequently to strategies with "ghost" buys, which are impossible to both backtest, and verify after they happened.

View File

@@ -43,10 +43,10 @@ The FreqAI strategy requires including the following lines of code in the standa
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# the model will return all labels created by user in `set_freqai_labels()`
# the model will return all labels created by user in `set_freqai_targets()`
# (& appended targets), an indication of whether or not the prediction should be accepted,
# the target mean/std values for each of the labels created by user in
# `feature_engineering_*` for each training period.
# `set_freqai_targets()` for each training period.
dataframe = self.freqai.start(dataframe, metadata, self)
@@ -160,7 +160,7 @@ Below are the values you can expect to include/use inside a typical strategy dat
|------------|-------------|
| `df['&*']` | Any dataframe column prepended with `&` in `set_freqai_targets()` is treated as a training target (label) inside FreqAI (typically following the naming convention `&-s*`). For example, to predict the close price 40 candles into the future, you would set `df['&-s_close'] = df['close'].shift(-self.freqai_info["feature_parameters"]["label_period_candles"])` with `"label_period_candles": 40` in the config. FreqAI makes the predictions and gives them back under the same key (`df['&-s_close']`) to be used in `populate_entry/exit_trend()`. <br> **Datatype:** Depends on the output of the model.
| `df['&*_std/mean']` | Standard deviation and mean values of the defined labels during training (or live tracking with `fit_live_predictions_candles`). Commonly used to understand the rarity of a prediction (use the z-score as shown in `templates/FreqaiExampleStrategy.py` and explained [here](#creating-a-dynamic-target-threshold) to evaluate how often a particular prediction was observed during training or historically with `fit_live_predictions_candles`). <br> **Datatype:** Float.
| `df['do_predict']` | Indication of an outlier data point. The return value is integer between -2 and 2, which lets you know if the prediction is trustworthy or not. `do_predict==1` means that the prediction is trustworthy. If the Dissimilarity Index (DI, see details [here](freqai-feature-engineering.md#identifying-outliers-with-the-dissimilarity-index-di)) of the input data point is above the threshold defined in the config, FreqAI will subtract 1 from `do_predict`, resulting in `do_predict==0`. If `use_SVM_to_remove_outliers()` is active, the Support Vector Machine (SVM, see details [here](freqai-feature-engineering.md#identifying-outliers-using-a-support-vector-machine-svm)) may also detect outliers in training and prediction data. In this case, the SVM will also subtract 1 from `do_predict`. If the input data point was considered an outlier by the SVM but not by the DI, or vice versa, the result will be `do_predict==0`. If both the DI and the SVM considers the input data point to be an outlier, the result will be `do_predict==-1`. As with the SVM, if `use_DBSCAN_to_remove_outliers` is active, DBSCAN (see details [here](freqai-feature-engineering.md#identifying-outliers-with-dbscan)) may also detect outliers and subtract 1 from `do_predict`. Hence, if both the SVM and DBSCAN are active and identify a datapoint that was above the DI threshold as an outlier, the result will be `do_predict==-2`. A particular case is when `do_predict == 2`, which means that the model has expired due to exceeding `expired_hours`. <br> **Datatype:** Integer between -2 and 2.
| `df['do_predict']` | Indication of an outlier data point. The return value is integer between -2 and 2, which lets you know if the prediction is trustworthy or not. `do_predict==1` means that the prediction is trustworthy. If the Dissimilarity Index (DI, see details [here](freqai-feature-engineering.md#identifying-outliers-with-the-dissimilarity-index-di)) of the input data point is above the threshold defined in the config, FreqAI will subtract 1 from `do_predict`, resulting in `do_predict==0`. If `use_SVM_to_remove_outliers` is active, the Support Vector Machine (SVM, see details [here](freqai-feature-engineering.md#identifying-outliers-using-a-support-vector-machine-svm)) may also detect outliers in training and prediction data. In this case, the SVM will also subtract 1 from `do_predict`. If the input data point was considered an outlier by the SVM but not by the DI, or vice versa, the result will be `do_predict==0`. If both the DI and the SVM considers the input data point to be an outlier, the result will be `do_predict==-1`. As with the SVM, if `use_DBSCAN_to_remove_outliers` is active, DBSCAN (see details [here](freqai-feature-engineering.md#identifying-outliers-with-dbscan)) may also detect outliers and subtract 1 from `do_predict`. Hence, if both the SVM and DBSCAN are active and identify a datapoint that was above the DI threshold as an outlier, the result will be `do_predict==-2`. A particular case is when `do_predict == 2`, which means that the model has expired due to exceeding `expired_hours`. <br> **Datatype:** Integer between -2 and 2.
| `df['DI_values']` | Dissimilarity Index (DI) values are proxies for the level of confidence FreqAI has in the prediction. A lower DI means the prediction is close to the training data, i.e., higher prediction confidence. See details about the DI [here](freqai-feature-engineering.md#identifying-outliers-with-the-dissimilarity-index-di). <br> **Datatype:** Float.
| `df['%*']` | Any dataframe column prepended with `%` in `feature_engineering_*()` is treated as a training feature. For example, you can include the RSI in the training feature set (similar to in `templates/FreqaiExampleStrategy.py`) by setting `df['%-rsi']`. See more details on how this is done [here](freqai-feature-engineering.md). <br> **Note:** Since the number of features prepended with `%` can multiply very quickly (10s of thousands of features are easily engineered using the multiplictative functionality of, e.g., `include_shifted_candles` and `include_timeframes` as described in the [parameter table](freqai-parameter-table.md)), these features are removed from the dataframe that is returned from FreqAI to the strategy. To keep a particular type of feature for plotting purposes, you would prepend it with `%%`. <br> **Datatype:** Depends on the output of the model.

View File

@@ -180,6 +180,9 @@ You can ask for each of the defined features to be included also for informative
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`
$= 3 * 3 * 3 * 2 * 2 = 108$.
!!! note "Learn more about creative feature engineering"
Check out our [medium article](https://emergentmethods.medium.com/freqai-from-price-to-prediction-6fadac18b665) geared toward helping users learn how to creatively engineer features.
### Gain finer control over `feature_engineering_*` functions with `metadata`
@@ -209,41 +212,7 @@ Another example, where the user wants to use live metrics from the trade databas
You need to set the standard dictionary in the config so that FreqAI can return proper dataframe shapes. These values will likely be overridden by the prediction model, but in the case where the model has yet to set them, or needs a default initial value, the pre-set values are what will be returned.
## Feature normalization
FreqAI is strict when it comes to data normalization. The train features, $X^{train}$, are always normalized to [-1, 1] using a shifted min-max normalization:
$$X^{train}_{norm} = 2 * \frac{X^{train} - X^{train}.min()}{X^{train}.max() - X^{train}.min()} - 1$$
All other data (test data and unseen prediction data in dry/live/backtest) is always automatically normalized to the training feature space according to industry standards. FreqAI stores all the metadata required to ensure that test and prediction features will be properly normalized and that predictions are properly denormalized. For this reason, it is not recommended to eschew industry standards and modify FreqAI internals - however - advanced users can do so by inheriting `train()` in their custom `IFreqaiModel` and using their own normalization functions.
## Data dimensionality reduction with Principal Component Analysis
You can reduce the dimensionality of your features by activating the `principal_component_analysis` in the config:
```json
"freqai": {
"feature_parameters" : {
"principal_component_analysis": true
}
}
```
This will perform PCA on the features and reduce their dimensionality so that the explained variance of the data set is >= 0.999. Reducing data dimensionality makes training the model faster and hence allows for more up-to-date models.
## Inlier metric
The `inlier_metric` is a metric aimed at quantifying how similar the features of a data point are to the most recent historical data points.
You define the lookback window by setting `inlier_metric_window` and FreqAI computes the distance between the present time point and each of the previous `inlier_metric_window` lookback points. A Weibull function is fit to each of the lookback distributions and its cumulative distribution function (CDF) is used to produce a quantile for each lookback point. The `inlier_metric` is then computed for each time point as the average of the corresponding lookback quantiles. The figure below explains the concept for an `inlier_metric_window` of 5.
![inlier-metric](assets/freqai_inlier-metric.jpg)
FreqAI adds the `inlier_metric` to the training features and hence gives the model access to a novel type of temporal information.
This function does **not** remove outliers from the data set.
## Weighting features for temporal importance
### Weighting features for temporal importance
FreqAI allows you to set a `weight_factor` to weight recent data more strongly than past data via an exponential function:
@@ -253,13 +222,103 @@ where $W_i$ is the weight of data point $i$ in a total set of $n$ data points. B
![weight-factor](assets/freqai_weight-factor.jpg)
## Building the data pipeline
By default, FreqAI builds a dynamic pipeline based on user congfiguration settings. The default settings are robust and designed to work with a variety of methods. These two steps are a `MinMaxScaler(-1,1)` and a `VarianceThreshold` which removes any column that has 0 variance. Users can activate other steps with more configuration parameters. For example if users add `use_SVM_to_remove_outliers: true` to the `freqai` config, then FreqAI will automatically add the [`SVMOutlierExtractor`](#identifying-outliers-using-a-support-vector-machine-svm) to the pipeline. Likewise, users can add `principal_component_analysis: true` to the `freqai` config to activate PCA. The [DissimilarityIndex](#identifying-outliers-with-the-dissimilarity-index-di) is activated with `DI_threshold: 1`. Finally, noise can also be added to the data with `noise_standard_deviation: 0.1`. Finally, users can add [DBSCAN](#identifying-outliers-with-dbscan) outlier removal with `use_DBSCAN_to_remove_outliers: true`.
!!! note "More information available"
Please review the [parameter table](freqai-parameter-table.md) for more information on these parameters.
### Customizing the pipeline
Users are encouraged to customize the data pipeline to their needs by building their own data pipeline. This can be done by simply setting `dk.feature_pipeline` to their desired `Pipeline` object inside their `IFreqaiModel` `train()` function, or if they prefer not to touch the `train()` function, they can override `define_data_pipeline`/`define_label_pipeline` functions in their `IFreqaiModel`:
!!! note "More information available"
FreqAI uses the the [`DataSieve`](https://github.com/emergentmethods/datasieve) pipeline, which follows the SKlearn pipeline API, but adds, among other features, coherence between the X, y, and sample_weight vector point removals, feature removal, feature name following.
```python
from datasieve.transforms import SKLearnWrapper, DissimilarityIndex
from datasieve.pipeline import Pipeline
from sklearn.preprocessing import QuantileTransformer, StandardScaler
from freqai.base_models import BaseRegressionModel
class MyFreqaiModel(BaseRegressionModel):
"""
Some cool custom model
"""
def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen, **kwargs) -> Any:
"""
My custom fit function
"""
model = cool_model.fit()
return model
def define_data_pipeline(self) -> Pipeline:
"""
User defines their custom feature pipeline here (if they wish)
"""
feature_pipeline = Pipeline([
('qt', SKLearnWrapper(QuantileTransformer(output_distribution='normal'))),
('di', ds.DissimilarityIndex(di_threshold=1))
])
return feature_pipeline
def define_label_pipeline(self) -> Pipeline:
"""
User defines their custom label pipeline here (if they wish)
"""
label_pipeline = Pipeline([
('qt', SKLearnWrapper(StandardScaler())),
])
return label_pipeline
```
Here, you are defining the exact pipeline that will be used for your feature set during training and prediction. You can use *most* SKLearn transformation steps by wrapping them in the `SKLearnWrapper` class as shown above. In addition, you can use any of the transformations available in the [`DataSieve` library](https://github.com/emergentmethods/datasieve).
You can easily add your own transformation by creating a class that inherits from the datasieve `BaseTransform` and implementing your `fit()`, `transform()` and `inverse_transform()` methods:
```python
from datasieve.transforms.base_transform import BaseTransform
# import whatever else you need
class MyCoolTransform(BaseTransform):
def __init__(self, **kwargs):
self.param1 = kwargs.get('param1', 1)
def fit(self, X, y=None, sample_weight=None, feature_list=None, **kwargs):
# do something with X, y, sample_weight, or/and feature_list
return X, y, sample_weight, feature_list
def transform(self, X, y=None, sample_weight=None,
feature_list=None, outlier_check=False, **kwargs):
# do something with X, y, sample_weight, or/and feature_list
return X, y, sample_weight, feature_list
def inverse_transform(self, X, y=None, sample_weight=None, feature_list=None, **kwargs):
# do/dont do something with X, y, sample_weight, or/and feature_list
return X, y, sample_weight, feature_list
```
!!! note "Hint"
You can define this custom class in the same file as your `IFreqaiModel`.
### Migrating a custom `IFreqaiModel` to the new Pipeline
If you have created your own custom `IFreqaiModel` with a custom `train()`/`predict()` function, *and* you still rely on `data_cleaning_train/predict()`, then you will need to migrate to the new pipeline. If your model does *not* rely on `data_cleaning_train/predict()`, then you do not need to worry about this migration.
More details about the migration can be found [here](strategy_migration.md#freqai---new-data-pipeline).
## Outlier detection
Equity and crypto markets suffer from a high level of non-patterned noise in the form of outlier data points. FreqAI implements a variety of methods to identify such outliers and hence mitigate risk.
### Identifying outliers with the Dissimilarity Index (DI)
The Dissimilarity Index (DI) aims to quantify the uncertainty associated with each prediction made by the model.
The Dissimilarity Index (DI) aims to quantify the uncertainty associated with each prediction made by the model.
You can tell FreqAI to remove outlier data points from the training/test data sets using the DI by including the following statement in the config:
@@ -271,7 +330,7 @@ You can tell FreqAI to remove outlier data points from the training/test data se
}
```
The DI allows predictions which are outliers (not existent in the model feature space) to be thrown out due to low levels of certainty. To do so, FreqAI measures the distance between each training data point (feature vector), $X_{a}$, and all other training data points:
Which will add `DissimilarityIndex` step to your `feature_pipeline` and set the threshold to 1. The DI allows predictions which are outliers (not existent in the model feature space) to be thrown out due to low levels of certainty. To do so, FreqAI measures the distance between each training data point (feature vector), $X_{a}$, and all other training data points:
$$ d_{ab} = \sqrt{\sum_{j=1}^p(X_{a,j}-X_{b,j})^2} $$
@@ -305,9 +364,9 @@ You can tell FreqAI to remove outlier data points from the training/test data se
}
```
The SVM will be trained on the training data and any data point that the SVM deems to be beyond the feature space will be removed.
Which will add `SVMOutlierExtractor` step to your `feature_pipeline`. The SVM will be trained on the training data and any data point that the SVM deems to be beyond the feature space will be removed.
FreqAI uses `sklearn.linear_model.SGDOneClassSVM` (details are available on scikit-learn's webpage [here](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDOneClassSVM.html) (external website)) and you can elect to provide additional parameters for the SVM, such as `shuffle`, and `nu`.
You can elect to provide additional parameters for the SVM, such as `shuffle`, and `nu` via the `feature_parameters.svm_params` dictionary in the config.
The parameter `shuffle` is by default set to `False` to ensure consistent results. If it is set to `True`, running the SVM multiple times on the same data set might result in different outcomes due to `max_iter` being to low for the algorithm to reach the demanded `tol`. Increasing `max_iter` solves this issue but causes the procedure to take longer time.
@@ -325,7 +384,7 @@ You can configure FreqAI to use DBSCAN to cluster and remove outliers from the t
}
```
DBSCAN is an unsupervised machine learning algorithm that clusters data without needing to know how many clusters there should be.
Which will add the `DataSieveDBSCAN` step to your `feature_pipeline`. This is an unsupervised machine learning algorithm that clusters data without needing to know how many clusters there should be.
Given a number of data points $N$, and a distance $\varepsilon$, DBSCAN clusters the data set by setting all data points that have $N-1$ other data points within a distance of $\varepsilon$ as *core points*. A data point that is within a distance of $\varepsilon$ from a *core point* but that does not have $N-1$ other data points within a distance of $\varepsilon$ from itself is considered an *edge point*. A cluster is then the collection of *core points* and *edge points*. Data points that have no other data points at a distance $<\varepsilon$ are considered outliers. The figure below shows a cluster with $N = 3$.

View File

@@ -42,7 +42,6 @@ Mandatory parameters are marked as **Required** and have to be set in one of the
| `use_SVM_to_remove_outliers` | Train a support vector machine to detect and remove outliers from the training dataset, as well as from incoming data points. See details about how it works [here](freqai-feature-engineering.md#identifying-outliers-using-a-support-vector-machine-svm). <br> **Datatype:** Boolean.
| `svm_params` | All parameters available in Sklearn's `SGDOneClassSVM()`. See details about some select parameters [here](freqai-feature-engineering.md#identifying-outliers-using-a-support-vector-machine-svm). <br> **Datatype:** Dictionary.
| `use_DBSCAN_to_remove_outliers` | Cluster data using the DBSCAN algorithm to identify and remove outliers from training and prediction data. See details about how it works [here](freqai-feature-engineering.md#identifying-outliers-with-dbscan). <br> **Datatype:** Boolean.
| `inlier_metric_window` | If set, FreqAI adds an `inlier_metric` to the training feature set and set the lookback to be the `inlier_metric_window`, i.e., the number of previous time points to compare the current candle to. Details of how the `inlier_metric` is computed can be found [here](freqai-feature-engineering.md#inlier-metric). <br> **Datatype:** Integer. <br> Default: `0`.
| `noise_standard_deviation` | If set, FreqAI adds noise to the training features with the aim of preventing overfitting. FreqAI generates random deviates from a gaussian distribution with a standard deviation of `noise_standard_deviation` and adds them to all data points. `noise_standard_deviation` should be kept relative to the normalized space, i.e., between -1 and 1. In other words, since data in FreqAI is always normalized to be between -1 and 1, `noise_standard_deviation: 0.05` would result in 32% of the data being randomly increased/decreased by more than 2.5% (i.e., the percent of data falling within the first standard deviation). <br> **Datatype:** Integer. <br> Default: `0`.
| `outlier_protection_percentage` | Enable to prevent outlier detection methods from discarding too much data. If more than `outlier_protection_percentage` % of points are detected as outliers by the SVM or DBSCAN, FreqAI will log a warning message and ignore outlier detection, i.e., the original dataset will be kept intact. If the outlier protection is triggered, no predictions will be made based on the training dataset. <br> **Datatype:** Float. <br> Default: `30`.
| `reverse_train_test_order` | Split the feature dataset (see below) and use the latest data split for training and test on historical split of the data. This allows the model to be trained up to the most recent data point, while avoiding overfitting. However, you should be careful to understand the unorthodox nature of this parameter before employing it. <br> **Datatype:** Boolean. <br> Default: `False` (no reversal).
@@ -101,12 +100,12 @@ Mandatory parameters are marked as **Required** and have to be set in one of the
#### trainer_kwargs
| Parameter | Description |
|------------|-------------|
| | **Model training parameters within the `freqai.model_training_parameters.model_kwargs` sub dictionary**
| `max_iters` | The number of training iterations to run. iteration here refers to the number of times we call self.optimizer.step(). used to calculate n_epochs. <br> **Datatype:** int. <br> Default: `100`.
| `batch_size` | The size of the batches to use during training.. <br> **Datatype:** int. <br> Default: `64`.
| `max_n_eval_batches` | The maximum number batches to use for evaluation.. <br> **Datatype:** int, optional. <br> Default: `None`.
| Parameter | Description |
|--------------|-------------|
| | **Model training parameters within the `freqai.model_training_parameters.model_kwargs` sub dictionary**
| `n_epochs` | The `n_epochs` parameter is a crucial setting in the PyTorch training loop that determines the number of times the entire training dataset will be used to update the model's parameters. An epoch represents one full pass through the entire training dataset. Overrides `n_steps`. Either `n_epochs` or `n_steps` must be set. <br><br> **Datatype:** int. optional. <br> Default: `10`.
| `n_steps` | An alternative way of setting `n_epochs` - the number of training iterations to run. Iteration here refer to the number of times we call `optimizer.step()`. Ignored if `n_epochs` is set. A simplified version of the function: <br><br> n_epochs = n_steps / (n_obs / batch_size) <br><br> The motivation here is that `n_steps` is easier to optimize and keep stable across different n_obs - the number of data points. <br> <br> **Datatype:** int. optional. <br> Default: `None`.
| `batch_size` | The size of the batches to use during training. <br><br> **Datatype:** int. <br> Default: `64`.
### Additional parameters

View File

@@ -20,7 +20,7 @@ With the current framework, we aim to expose the training environment via the co
We envision the majority of users focusing their effort on creative design of the `calculate_reward()` function [details here](#creating-a-custom-reward-function), while leaving the rest of the environment untouched. Other users may not touch the environment at all, and they will only play with the configuration settings and the powerful feature engineering that already exists in FreqAI. Meanwhile, we enable advanced users to create their own model classes entirely.
The framework is built on stable_baselines3 (torch) and OpenAI gym for the base environment class. But generally speaking, the model class is well isolated. Thus, the addition of competing libraries can be easily integrated into the existing framework. For the environment, it is inheriting from `gym.env` which means that it is necessary to write an entirely new environment in order to switch to a different library.
The framework is built on stable_baselines3 (torch) and OpenAI gym for the base environment class. But generally speaking, the model class is well isolated. Thus, the addition of competing libraries can be easily integrated into the existing framework. For the environment, it is inheriting from `gym.Env` which means that it is necessary to write an entirely new environment in order to switch to a different library.
### Important considerations
@@ -173,7 +173,7 @@ class MyCoolRLModel(ReinforcementLearner):
"""
class MyRLEnv(Base5ActionRLEnv):
"""
User made custom environment. This class inherits from BaseEnvironment and gym.env.
User made custom environment. This class inherits from BaseEnvironment and gym.Env.
Users can override any functions from those parent classes. Here is an example
of a user customized `calculate_reward()` function.
@@ -254,7 +254,7 @@ FreqAI also provides a built in episodic summary logger called `self.tensorboard
```python
class MyRLEnv(Base5ActionRLEnv):
"""
User made custom environment. This class inherits from BaseEnvironment and gym.env.
User made custom environment. This class inherits from BaseEnvironment and gym.Env.
Users can override any functions from those parent classes. Here is an example
of a user customized `calculate_reward()` function.
"""

View File

@@ -76,7 +76,7 @@ pip install -r requirements-freqai.txt
### Usage with docker
If you are using docker, a dedicated tag with FreqAI dependencies is available as `:freqai`. As such - you can replace the image line in your docker compose file with `image: freqtradeorg/freqtrade:develop_freqai`. This image contains the regular FreqAI dependencies. Similar to native installs, Catboost will not be available on ARM based devices.
If you are using docker, a dedicated tag with FreqAI dependencies is available as `:freqai`. As such - you can replace the image line in your docker compose file with `image: freqtradeorg/freqtrade:develop_freqai`. This image contains the regular FreqAI dependencies. Similar to native installs, Catboost will not be available on ARM based devices. If you would like to use PyTorch or Reinforcement learning, you should use the torch or RL tags, `image: freqtradeorg/freqtrade:develop_freqaitorch`, `image: freqtradeorg/freqtrade:develop_freqairl`.
!!! note "docker-compose-freqai.yml"
We do provide an explicit docker-compose file for this in `docker/docker-compose-freqai.yml` - which can be used via `docker compose -f docker/docker-compose-freqai.yml run ...` - or can be copied to replace the original docker file. This docker-compose file also contains a (disabled) section to enable GPU resources within docker containers. This obviously assumes the system has GPU resources available.
@@ -107,6 +107,13 @@ This is for performance reasons - FreqAI relies on making quick predictions/retr
it needs to download all the training data at the beginning of a dry/live instance. FreqAI stores and appends
new candles automatically for future retrains. This means that if new pairs arrive later in the dry run due to a volume pairlist, it will not have the data ready. However, FreqAI does work with the `ShufflePairlist` or a `VolumePairlist` which keeps the total pairlist constant (but reorders the pairs according to volume).
## Additional learning materials
Here we compile some external materials that provide deeper looks into various components of FreqAI:
- [Real-time head-to-head: Adaptive modeling of financial market data using XGBoost and CatBoost](https://emergentmethods.medium.com/real-time-head-to-head-adaptive-modeling-of-financial-market-data-using-xgboost-and-catboost-995a115a7495)
- [FreqAI - from price to prediction](https://emergentmethods.medium.com/freqai-from-price-to-prediction-6fadac18b665)
## Credits
FreqAI is developed by a group of individuals who all contribute specific skillsets to the project.

View File

@@ -31,7 +31,7 @@ The docker-image includes hyperopt dependencies, no further action needed.
### Easy installation script (setup.sh) / Manual installation
```bash
source .env/bin/activate
source .venv/bin/activate
pip install -r requirements-hyperopt.txt
```
@@ -433,9 +433,14 @@ While this strategy is most likely too simple to provide consistent profit, it s
`range` property may also be used with `DecimalParameter` and `CategoricalParameter`. `RealParameter` does not provide this property due to infinite search space.
??? Hint "Performance tip"
During normal hyperopting, indicators are calculated once and supplied to each epoch, linearly increasing RAM usage as a factor of increasing cores. As this also has performance implications, hyperopt provides `--analyze-per-epoch` which will move the execution of `populate_indicators()` to the epoch process, calculating a single value per parameter per epoch instead of using the `.range` functionality. In this case, `.range` functionality will only return the actually used value. This will reduce RAM usage, but increase CPU usage. However, your hyperopting run will be less likely to fail due to Out Of Memory (OOM) issues.
During normal hyperopting, indicators are calculated once and supplied to each epoch, linearly increasing RAM usage as a factor of increasing cores. As this also has performance implications, there are two alternatives to reduce RAM usage
In either case, you should try to use space ranges as small as possible this will improve CPU/RAM usage in both scenarios.
* Move `ema_short` and `ema_long` calculations from `populate_indicators()` to `populate_entry_trend()`. Since `populate_entry_trend()` gonna be calculated every epochs, you don't need to use `.range` functionality.
* hyperopt provides `--analyze-per-epoch` which will move the execution of `populate_indicators()` to the epoch process, calculating a single value per parameter per epoch instead of using the `.range` functionality. In this case, `.range` functionality will only return the actually used value.
These alternatives will reduce RAM usage, but increase CPU usage. However, your hyperopting run will be less likely to fail due to Out Of Memory (OOM) issues.
Whether you are using `.range` functionality or the alternatives above, you should try to use space ranges as small as possible since this will improve CPU/RAM usage.
## Optimizing protections

View File

@@ -184,6 +184,8 @@ The RemotePairList is defined in the pairlists section of the configuration sett
"pairlists": [
{
"method": "RemotePairList",
"mode": "whitelist",
"processing_mode": "filter",
"pairlist_url": "https://example.com/pairlist",
"number_assets": 10,
"refresh_period": 1800,
@@ -194,6 +196,14 @@ The RemotePairList is defined in the pairlists section of the configuration sett
]
```
The optional `mode` option specifies if the pairlist should be used as a `blacklist` or as a `whitelist`. The default value is "whitelist".
The optional `processing_mode` option in the RemotePairList configuration determines how the retrieved pairlist is processed. It can have two values: "filter" or "append".
In "filter" mode, the retrieved pairlist is used as a filter. Only the pairs present in both the original pairlist and the retrieved pairlist are included in the final pairlist. Other pairs are filtered out.
In "append" mode, the retrieved pairlist is added to the original pairlist. All pairs from both lists are included in the final pairlist without any filtering.
The `pairlist_url` option specifies the URL of the remote server where the pairlist is located, or the path to a local file (if file:/// is prepended). This allows the user to use either a remote server or a local file as the source for the pairlist.
The user is responsible for providing a server or local file that returns a JSON object with the following structure:
@@ -201,7 +211,7 @@ The user is responsible for providing a server or local file that returns a JSON
```json
{
"pairs": ["XRP/USDT", "ETH/USDT", "LTC/USDT"],
"refresh_period": 1800,
"refresh_period": 1800
}
```

View File

@@ -0,0 +1,37 @@
## Highlighted changes
- ...
### How to update
As always, you can update your bot using one of the following commands:
#### docker-compose
```bash
docker-compose pull
docker-compose up -d
```
#### Installation via setup script
```
# Deactivate venv and run
./setup.sh --update
```
#### Plain native installation
```
git pull
pip install -U -r requirements.txt
```
<details>
<summary>Expand full changelog</summary>
```
<Paste your changelog here>
```
</details>

11
docs/includes/showcase.md Normal file
View File

@@ -0,0 +1,11 @@
This section will highlight a few projects from members of the community.
!!! Note
The projects below are for the most part not maintained by the freqtrade , therefore use your own caution before using them.
- [Example freqtrade strategies](https://github.com/freqtrade/freqtrade-strategies/)
- [FrequentHippo - Grafana dashboard with dry/live runs and backtests](http://frequenthippo.ddns.net:3000/) (by hippocritical).
- [Online pairlist generator](https://remotepairlist.com/) (by Blood4rc).
- [Freqtrade Backtesting Project](https://bt.robot.co.network/) (by Blood4rc).
- [Freqtrade analysis notebook](https://github.com/froggleston/freqtrade_analysis_notebook) (by Froggleston).
- [TUI for freqtrade](https://github.com/froggleston/freqtrade-frogtrade9000) (by Froggleston).
- [Bot Academy](https://botacademy.ddns.net/) (by stash86) - Blog about crypto bot projects.

View File

@@ -63,6 +63,10 @@ Exchanges confirmed working by the community:
- [X] [Bitvavo](https://bitvavo.com/)
- [X] [Kucoin](https://www.kucoin.com/)
## Community showcase
--8<-- "includes/showcase.md"
## Requirements
### Hardware requirements

View File

@@ -143,11 +143,11 @@ If you are on Debian, Ubuntu or MacOS, freqtrade provides the script to install
### Activate your virtual environment
Each time you open a new terminal, you must run `source .env/bin/activate` to activate your virtual environment.
Each time you open a new terminal, you must run `source .venv/bin/activate` to activate your virtual environment.
```bash
# then activate your .env
source ./.env/bin/activate
# activate virtual environment
source ./.venv/bin/activate
```
### Congratulations
@@ -172,7 +172,7 @@ 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.
* Mandatory software as: `ta-lib`
* Setup your virtualenv under `.env/`
* Setup your virtualenv under `.venv/`
This option is a combination of installation tasks and `--reset`
@@ -225,11 +225,11 @@ rm -rf ./ta-lib*
You will run freqtrade in separated `virtual environment`
```bash
# create virtualenv in directory /freqtrade/.env
python3 -m venv .env
# create virtualenv in directory /freqtrade/.venv
python3 -m venv .venv
# run virtualenv
source .env/bin/activate
source .venv/bin/activate
```
#### Install python dependencies
@@ -286,7 +286,7 @@ cd freqtrade
#### Freqtrade install: Conda Environment
```bash
conda create --name freqtrade python=3.10
conda create --name freqtrade python=3.11
```
!!! Note "Creating Conda Environment"
@@ -383,7 +383,7 @@ You've made it this far, so you have successfully installed freqtrade.
freqtrade create-userdir --userdir user_data
# Step 2 - Create a new configuration file
freqtrade new-config --config config.json
freqtrade new-config --config user_data/config.json
```
You are ready to run, read [Bot Configuration](configuration.md), remember to start with `dry_run: True` and verify that everything is working.
@@ -393,7 +393,7 @@ To learn how to setup your configuration, please refer to the [Bot Configuration
### Start the Bot
```bash
freqtrade trade --config config.json --strategy SampleStrategy
freqtrade trade --config user_data/config.json --strategy SampleStrategy
```
!!! Warning
@@ -411,8 +411,8 @@ If you used (1)`Script` or (2)`Manual` installation, you need to run the bot in
# if:
bash: freqtrade: command not found
# then activate your .env
source ./.env/bin/activate
# then activate your virtual environment
source ./.venv/bin/activate
```
### MacOS installation error

View File

@@ -64,7 +64,7 @@ You will also have to pick a "margin mode" (explanation below) - with freqtrade
##### Pair namings
Freqtrade follows the [ccxt naming conventions for futures](https://docs.ccxt.com/en/latest/manual.html?#perpetual-swap-perpetual-future).
Freqtrade follows the [ccxt naming conventions for futures](https://docs.ccxt.com/#/README?id=perpetual-swap-perpetual-future).
A futures pair will therefore have the naming of `base/quote:settle` (e.g. `ETH/USDT:USDT`).
### Margin mode

103
docs/lookahead-analysis.md Normal file
View File

@@ -0,0 +1,103 @@
# Lookahead analysis
This page explains how to validate your strategy in terms of look ahead bias.
Checking look ahead bias is the bane of any strategy since it is sometimes very easy to introduce backtest bias -
but very hard to detect.
Backtesting initializes all timestamps at once and calculates all indicators in the beginning.
This means that if your indicators or entry/exit signals could look into future candles and falsify your backtest.
Lookahead-analysis 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 backtesting since it internally chains backtests and pokes at the strategy to provoke it to show look ahead bias.
This is done by not looking at the strategy itself - but at the results it returned.
The results are things like changed indicator-values and moved entries/exits compared to the full backtest.
You can use commands of [Backtesting](backtesting.md).
It also supports the lookahead-analysis of freqai strategies.
- `--cache` is forced to "none".
- `--max-open-trades` is forced to be at least equal to the number of pairs.
- `--dry-run-wallet` is forced to be basically infinite (1 billion).
- `--stake-amount` is forced to be a static 10000 (10k).
Those are set to avoid users accidentally generating false positives.
## Lookahead-analysis command reference
```
usage: freqtrade lookahead-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}]
[--max-open-trades INT]
[--stake-amount STAKE_AMOUNT]
[--fee FLOAT] [-p PAIRS [PAIRS ...]]
[--enable-protections]
[--dry-run-wallet DRY_RUN_WALLET]
[--timeframe-detail TIMEFRAME_DETAIL]
[--strategy-list STRATEGY_LIST [STRATEGY_LIST ...]]
[--export {none,trades,signals}]
[--export-filename PATH]
[--breakdown {day,week,month} [{day,week,month} ...]]
[--cache {none,day,week,month}]
[--freqai-backtest-live-models]
[--minimum-trade-amount INT]
[--targeted-trade-amount INT]
[--lookahead-analysis-exportfilename LOOKAHEAD_ANALYSIS_EXPORTFILENAME]
options:
--minimum-trade-amount INT
Minimum trade amount for lookahead-analysis
--targeted-trade-amount INT
Targeted trade amount for lookahead analysis
--lookahead-analysis-exportfilename LOOKAHEAD_ANALYSIS_EXPORTFILENAME
Use this csv-filename to store lookahead-analysis-
results
```
!!! Note ""
The above Output was reduced to options `lookahead-analysis` adds on top of regular backtesting commands.
### Summary
Checks a given strategy for look ahead bias via lookahead-analysis
Look ahead bias means that the backtest uses data from future candles thereby not making it viable beyond backtesting
and producing false hopes for the one backtesting.
### Introduction
Many strategies - without the programmer knowing - have fallen prey to look ahead bias.
Any backtest will populate the full dataframe including all time stamps at the beginning.
If the programmer is not careful or oblivious how things work internally
(which sometimes can be really hard to find out) then it will just look into the future making the strategy amazing
but not realistic.
This command is made to try to verify the validity in the form of the aforementioned look ahead bias.
### How does the command work?
It will start with a backtest of all pairs to generate a baseline for indicators and entries/exits.
After the backtest ran, it will look if the `minimum-trade-amount` is met
and if not cancel the lookahead-analysis for this strategy.
After setting the baseline it will then do additional runs for every entry and exit separately.
When a verification-backtest is done, it will compare the indicators as the signal (either entry or exit) and report the bias.
After all signals have been verified or falsified a result-table will be generated for the user to see.
### Caveats
- `lookahead-analysis` can only verify / falsify the trades it calculated and verified.
If the strategy has many different signals / signal types, it's up to you to select appropriate parameters to ensure that all signals have triggered at least once. Not triggered signals will not have been verified.
This could lead to a false-negative (the strategy will then be reported as non-biased).
- `lookahead-analysis` has access to everything that backtesting has too.
Please don't provoke any configs like enabling position stacking.
If you decide to do so, then make doubly sure that you won't ever run out of `max_open_trades` amount and neither leftover money in your wallet.

View File

@@ -1,6 +1,6 @@
markdown==3.3.7
mkdocs==1.4.3
mkdocs-material==9.1.14
markdown==3.4.4
mkdocs==1.5.2
mkdocs-material==9.2.1
mdx_truly_sane_lists==1.3
pymdown-extensions==10.0.1
pymdown-extensions==10.1
jinja2==3.1.2

View File

@@ -1,121 +0,0 @@
# Sandbox API testing
Some exchanges provide sandboxes or testbeds for risk-free testing, while running the bot against a real exchange.
With some configuration, freqtrade (in combination with ccxt) provides access to these.
This document is an overview to configure Freqtrade to be used with sandboxes.
This can be useful to developers and trader alike.
!!! Warning
Sandboxes usually have very low volume, and either a very wide spread, or no orders available at all.
Therefore, sandboxes will usually not do a good job of showing you how a strategy would work in real trading.
## Exchanges known to have a sandbox / testnet
* [binance](https://testnet.binance.vision/)
* [coinbasepro](https://public.sandbox.pro.coinbase.com)
* [gemini](https://exchange.sandbox.gemini.com/)
* [huobipro](https://www.testnet.huobi.pro/)
* [kucoin](https://sandbox.kucoin.com/)
* [phemex](https://testnet.phemex.com/)
!!! Note
We did not test correct functioning of all of the above testnets. Please report your experiences with each sandbox.
---
## Configure a Sandbox account
When testing your API connectivity, make sure to use the appropriate sandbox / testnet URL.
In general, you should follow these steps to enable an exchange's sandbox:
* Figure out if an exchange has a sandbox (most likely by using google or the exchange's support documents)
* Create a sandbox account (often the sandbox-account requires separate registration)
* [Add some test assets to account](#add-test-funds)
* Create API keys
### Add test funds
Usually, sandbox exchanges allow depositing funds directly via web-interface.
You should make sure to have a realistic amount of funds available to your test-account, so results are representable of your real account funds.
!!! Warning
Test exchanges will **NEVER** require your real credit card or banking details!
## Configure freqtrade to use a exchange's sandbox
### Sandbox URLs
Freqtrade makes use of CCXT which in turn provides a list of URLs to Freqtrade.
These include `['test']` and `['api']`.
* `[Test]` if available will point to an Exchanges sandbox.
* `[Api]` normally used, and resolves to live API target on the exchange.
To make use of sandbox / test add "sandbox": true, to your config.json
```json
"exchange": {
"name": "coinbasepro",
"sandbox": true,
"key": "5wowfxemogxeowo;heiohgmd",
"secret": "/ZMH1P62rCVmwefewrgcewX8nh4gob+lywxfwfxwwfxwfNsH1ySgvWCUR/w==",
"password": "1bkjfkhfhfu6sr",
"outdated_offset": 5
"pair_whitelist": [
"BTC/USD"
]
},
"datadir": "user_data/data/coinbasepro_sandbox"
```
Also the following information:
* api-key (created for the sandbox webpage)
* api-secret (noted earlier)
* password (the passphrase - noted earlier)
!!! Tip "Different data directory"
We also recommend to set `datadir` to something identifying downloaded data as sandbox data, to avoid having sandbox data mixed with data from the real exchange.
This can be done by adding the `"datadir"` key to the configuration.
Now, whenever you use this configuration, your data directory will be set to this directory.
---
## You should now be ready to test your sandbox
Ensure Freqtrade logs show the sandbox URL, and trades made are shown in sandbox. Also make sure to select a pair which shows at least some decent value (which very often is BTC/<somestablecoin>).
## Common problems with sandbox exchanges
Sandbox exchange instances often have very low volume, which can cause some problems which usually are not seen on a real exchange instance.
### Old Candles problem
Since Sandboxes often have low volume, candles can be quite old and show no volume.
To disable the error "Outdated history for pair ...", best increase the parameter `"outdated_offset"` to a number that seems realistic for the sandbox you're using.
### Unfilled orders
Sandboxes often have very low volumes - which means that many trades can go unfilled, or can go unfilled for a very long time.
To mitigate this, you can try to match the first order on the opposite orderbook side using the following configuration:
``` jsonc
"order_types": {
"entry": "limit",
"exit": "limit"
// ...
},
"entry_pricing": {
"price_side": "other",
// ...
},
"exit_pricing":{
"price_side": "other",
// ...
},
```
The configuration is similar to the suggested configuration for market orders - however by using limit-orders you can avoid moving the price too much, and you can set the worst price you might get.

View File

@@ -750,7 +750,7 @@ class DigDeeperStrategy(IStrategy):
# Hope you have a deep wallet!
try:
# This returns first order stake size
stake_amount = filled_entries[0].cost
stake_amount = filled_entries[0].stake_amount
# This then calculates current safety order size
stake_amount = stake_amount * (1 + (count_of_entries * 0.25))
return stake_amount

View File

@@ -342,16 +342,12 @@ The above configuration would therefore mean:
The calculation does include fees.
To disable ROI completely, set it to an insanely high number:
To disable ROI completely, set it to an empty dictionary:
```python
minimal_roi = {
"0": 100
}
minimal_roi = {}
```
While technically not completely disabled, this would exit once the trade reaches 10000% Profit.
To use times based on candle duration (timeframe), the following snippet can be handy.
This will allow you to change the timeframe for the strategy, and ROI times will still be set as candles (e.g. after 3 candles ...)

View File

@@ -728,3 +728,86 @@ Targets now get their own, dedicated method.
return dataframe
```
### FreqAI - New data Pipeline
If you have created your own custom `IFreqaiModel` with a custom `train()`/`predict()` function, *and* you still rely on `data_cleaning_train/predict()`, then you will need to migrate to the new pipeline. If your model does *not* rely on `data_cleaning_train/predict()`, then you do not need to worry about this migration. That means that this migration guide is relevant for a very small percentage of power-users. If you stumbled upon this guide by mistake, feel free to inquire in depth about your problem in the Freqtrade discord server.
The conversion involves first removing `data_cleaning_train/predict()` and replacing them with a `define_data_pipeline()` and `define_label_pipeline()` function to your `IFreqaiModel` class:
```python linenums="1" hl_lines="11-14 47-49 55-57"
class MyCoolFreqaiModel(BaseRegressionModel):
"""
Some cool custom IFreqaiModel you made before Freqtrade version 2023.6
"""
def train(
self, unfiltered_df: DataFrame, pair: str, dk: FreqaiDataKitchen, **kwargs
) -> Any:
# ... your custom stuff
# Remove these lines
# data_dictionary = dk.make_train_test_datasets(features_filtered, labels_filtered)
# self.data_cleaning_train(dk)
# data_dictionary = dk.normalize_data(data_dictionary)
# (1)
# Add these lines. Now we control the pipeline fit/transform ourselves
dd = dk.make_train_test_datasets(features_filtered, labels_filtered)
dk.feature_pipeline = self.define_data_pipeline(threads=dk.thread_count)
dk.label_pipeline = self.define_label_pipeline(threads=dk.thread_count)
(dd["train_features"],
dd["train_labels"],
dd["train_weights"]) = dk.feature_pipeline.fit_transform(dd["train_features"],
dd["train_labels"],
dd["train_weights"])
(dd["test_features"],
dd["test_labels"],
dd["test_weights"]) = dk.feature_pipeline.transform(dd["test_features"],
dd["test_labels"],
dd["test_weights"])
dd["train_labels"], _, _ = dk.label_pipeline.fit_transform(dd["train_labels"])
dd["test_labels"], _, _ = dk.label_pipeline.transform(dd["test_labels"])
# ... your custom code
return model
def predict(
self, unfiltered_df: DataFrame, dk: FreqaiDataKitchen, **kwargs
) -> Tuple[DataFrame, npt.NDArray[np.int_]]:
# ... your custom stuff
# Remove these lines:
# self.data_cleaning_predict(dk)
# (2)
# Add these lines:
dk.data_dictionary["prediction_features"], outliers, _ = dk.feature_pipeline.transform(
dk.data_dictionary["prediction_features"], outlier_check=True)
# Remove this line
# pred_df = dk.denormalize_labels_from_metadata(pred_df)
# (3)
# Replace with these lines
pred_df, _, _ = dk.label_pipeline.inverse_transform(pred_df)
if self.freqai_info.get("DI_threshold", 0) > 0:
dk.DI_values = dk.feature_pipeline["di"].di_values
else:
dk.DI_values = np.zeros(outliers.shape[0])
dk.do_predict = outliers
# ... your custom code
return (pred_df, dk.do_predict)
```
1. Data normalization and cleaning is now homogenized with the new pipeline definition. This is created in the new `define_data_pipeline()` and `define_label_pipeline()` functions. The `data_cleaning_train()` and `data_cleaning_predict()` functions are no longer used. You can override `define_data_pipeline()` to create your own custom pipeline if you wish.
2. Data normalization and cleaning is now homogenized with the new pipeline definition. This is created in the new `define_data_pipeline()` and `define_label_pipeline()` functions. The `data_cleaning_train()` and `data_cleaning_predict()` functions are no longer used. You can override `define_data_pipeline()` to create your own custom pipeline if you wish.
3. Data denormalization is done with the new pipeline. Replace this with the lines below.

View File

@@ -287,12 +287,17 @@ Return a summary of your profit/loss and performance.
> **Best Performing:** `PAY/BTC: 50.23%`
> **Trading volume:** `0.5 BTC`
> **Profit factor:** `1.04`
> **Win / Loss:** `102 / 36`
> **Winrate:** `73.91%`
> **Expectancy (Ratio):** `4.87 (1.66)`
> **Max Drawdown:** `9.23% (0.01255 BTC)`
The relative profit of `1.2%` is the average profit per trade.
The relative profit of `15.2 Σ%` is be based on the starting capital - so in this case, the starting capital was `0.00485701 * 1.152 = 0.00738 BTC`.
Starting capital is either taken from the `available_capital` setting, or calculated by using current wallet size - profits.
Profit Factor is calculated as gross profits / gross losses - and should serve as an overall metric for the strategy.
Expectancy corresponds to the average return per currency unit at risk, i.e. the winrate and the risk-reward ratio (the average gain of winning trades compared to the average loss of losing trades).
Expectancy Ratio is expected profit or loss of a subsequent trade based on the performance of all past trades.
Max drawdown corresponds to the backtesting metric `Absolute Drawdown (Account)` - calculated as `(Absolute Drawdown) / (DrawdownHigh + startingBalance)`.
Bot started date will refer to the date the bot was first started. For older bots, this will default to the first trade's open date.

View File

@@ -141,7 +141,8 @@ Most properties here can be None as they are dependant on the exchange response.
`amount` | float | Amount in base currency
`filled` | float | Filled amount (in base currency)
`remaining` | float | Remaining amount
`cost` | float | Cost of the order - usually average * filled
`cost` | float | Cost of the order - usually average * filled (*Exchange dependant on futures, may contain the cost with or without leverage and may be in contracts.*)
`stake_amount` | float | Stake amount used for this order. *Added in 2023.7.*
`order_date` | datetime | Order creation date **use `order_date_utc` instead**
`order_date_utc` | datetime | Order creation date (in UTC)
`order_fill_date` | datetime | Order fill date **use `order_fill_utc` instead**

View File

@@ -967,7 +967,7 @@ Print trades with id 2 and 3 as json
freqtrade show-trades --db-url sqlite:///tradesv3.sqlite --trade-ids 2 3 --print-json
```
### Strategy-Updater
## Strategy-Updater
Updates listed strategies or all strategies within the strategies folder to be v3 compliant.
If the command runs without --strategy-list then all strategies inside the strategies folder will be converted.

View File

@@ -80,12 +80,18 @@ When using the Form-Encoded or JSON-Encoded configuration you can configure any
The result would be a POST request with e.g. `Status: running` body and `Content-Type: text/plain` header.
Optional parameters are available to enable automatic retries for webhook messages. The `webhook.retries` parameter can be set for the maximum number of retries the webhook request should attempt if it is unsuccessful (i.e. HTTP response status is not 200). By default this is set to `0` which is disabled. An additional `webhook.retry_delay` parameter can be set to specify the time in seconds between retry attempts. By default this is set to `0.1` (i.e. 100ms). Note that increasing the number of retries or retry delay may slow down the trader if there are connectivity issues with the webhook. Example configuration for retries:
## Additional configurations
The `webhook.retries` parameter can be set for the maximum number of retries the webhook request should attempt if it is unsuccessful (i.e. HTTP response status is not 200). By default this is set to `0` which is disabled. An additional `webhook.retry_delay` parameter can be set to specify the time in seconds between retry attempts. By default this is set to `0.1` (i.e. 100ms). Note that increasing the number of retries or retry delay may slow down the trader if there are connectivity issues with the webhook.
You can also specify `webhook.timeout` - which defines how long the bot will wait until it assumes the other host as unresponsive (defaults to 10s).
Example configuration for retries:
```json
"webhook": {
"enabled": true,
"url": "https://<YOURHOOKURL>",
"timeout": 10,
"retries": 3,
"retry_delay": 0.2,
"status": {
@@ -109,6 +115,8 @@ Custom messages can be sent to Webhook endpoints via the `self.dp.send_msg()` fu
Different payloads can be configured for different events. Not all fields are necessary, but you should configure at least one of the dicts, otherwise the webhook will never be called.
## Webhook Message types
### Entry
The fields in `webhook.entry` are filled when the bot executes a long/short. Parameters are filled using string.format.

View File

@@ -31,8 +31,8 @@ Other versions must be downloaded from the above link.
``` powershell
cd \path\freqtrade
python -m venv .env
.env\Scripts\activate.ps1
python -m venv .venv
.venv\Scripts\activate.ps1
# optionally install ta-lib from wheel
# Eventually adjust the below filename to match the downloaded wheel
pip install --find-links build_helpers\ TA-Lib -U

View File

@@ -1,5 +1,5 @@
""" Freqtrade bot """
__version__ = '2023.5.1'
__version__ = '2023.8'
if 'dev' in __version__:
from pathlib import Path

View File

@@ -19,7 +19,8 @@ from freqtrade.commands.list_commands import (start_list_exchanges, start_list_f
start_list_markets, start_list_strategies,
start_list_timeframes, start_show_trades)
from freqtrade.commands.optimize_commands import (start_backtesting, start_backtesting_show,
start_edge, start_hyperopt)
start_edge, start_hyperopt,
start_lookahead_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

27
freqtrade/commands/arguments.py Normal file → Executable file
View File

@@ -67,8 +67,7 @@ ARGS_BUILD_STRATEGY = ["user_data_dir", "strategy", "template"]
ARGS_CONVERT_DATA = ["pairs", "format_from", "format_to", "erase", "exchange"]
ARGS_CONVERT_DATA_OHLCV = ARGS_CONVERT_DATA + ["timeframes", "trading_mode",
"candle_types"]
ARGS_CONVERT_DATA_OHLCV = ARGS_CONVERT_DATA + ["timeframes", "trading_mode", "candle_types"]
ARGS_CONVERT_TRADES = ["pairs", "timeframes", "exchange", "dataformat_ohlcv", "dataformat_trades"]
@@ -117,7 +116,11 @@ NO_CONF_REQURIED = ["convert-data", "convert-trade-data", "download-data", "list
NO_CONF_ALLOWED = ["create-userdir", "list-exchanges", "new-strategy"]
ARGS_STRATEGY_UTILS = ["strategy_list", "strategy_path", "recursive_strategy_search"]
ARGS_STRATEGY_UPDATER = ["strategy_list", "strategy_path", "recursive_strategy_search"]
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"]
class Arguments:
@@ -201,8 +204,9 @@ class Arguments:
start_install_ui, start_list_data, start_list_exchanges,
start_list_freqAI_models, start_list_markets,
start_list_strategies, start_list_timeframes,
start_new_config, start_new_strategy, start_plot_dataframe,
start_plot_profit, start_show_trades, start_strategy_update,
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)
subparsers = self.parser.add_subparsers(dest='command',
@@ -451,4 +455,15 @@ class Arguments:
'files to the current version',
parents=[_common_parser])
strategy_updater_cmd.set_defaults(func=start_strategy_update)
self._build_args(optionlist=ARGS_STRATEGY_UTILS, parser=strategy_updater_cmd)
self._build_args(optionlist=ARGS_STRATEGY_UPDATER, parser=strategy_updater_cmd)
# Add lookahead_analysis subcommand
lookahead_analayis_cmd = subparsers.add_parser(
'lookahead-analysis',
help="Check for potential look ahead bias.",
parents=[_common_parser, _strategy_parser])
lookahead_analayis_cmd.set_defaults(func=start_lookahead_analysis)
self._build_args(optionlist=ARGS_LOOKAHEAD_ANALYSIS,
parser=lookahead_analayis_cmd)

View File

@@ -5,11 +5,12 @@ from typing import Any, Dict, List
from questionary import Separator, prompt
from freqtrade.configuration.detect_environment import running_in_docker
from freqtrade.configuration.directory_operations import chown_user_directory
from freqtrade.constants import UNLIMITED_STAKE_AMOUNT
from freqtrade.exceptions import OperationalException
from freqtrade.exchange import MAP_EXCHANGE_CHILDCLASS, available_exchanges
from freqtrade.misc import render_template
from freqtrade.util import render_template
logger = logging.getLogger(__name__)
@@ -104,7 +105,7 @@ def ask_user_config() -> Dict[str, Any]:
"type": "select",
"name": "exchange_name",
"message": "Select exchange",
"choices": lambda x: [
"choices": [
"binance",
"binanceus",
"bittrex",
@@ -179,7 +180,7 @@ def ask_user_config() -> Dict[str, Any]:
"name": "api_server_listen_addr",
"message": ("Insert Api server Listen Address (0.0.0.0 for docker, "
"otherwise best left untouched)"),
"default": "127.0.0.1",
"default": "127.0.0.1" if not running_in_docker() else "0.0.0.0",
"when": lambda x: x['api_server']
},
{

29
freqtrade/commands/cli_options.py Normal file → Executable file
View File

@@ -381,7 +381,7 @@ AVAILABLE_CLI_OPTIONS = {
),
"candle_types": Arg(
'--candle-types',
help='Select candle type to use',
help='Select candle type to convert. Defaults to all available types.',
choices=[c.value for c in CandleType],
nargs='+',
),
@@ -435,13 +435,13 @@ AVAILABLE_CLI_OPTIONS = {
),
"dataformat_ohlcv": Arg(
'--data-format-ohlcv',
help='Storage format for downloaded candle (OHLCV) data. (default: `json`).',
help='Storage format for downloaded candle (OHLCV) data. (default: `feather`).',
choices=constants.AVAILABLE_DATAHANDLERS,
),
"dataformat_trades": Arg(
'--data-format-trades',
help='Storage format for downloaded trades data. (default: `jsongz`).',
choices=constants.AVAILABLE_DATAHANDLERS_TRADES,
help='Storage format for downloaded trades data. (default: `feather`).',
choices=constants.AVAILABLE_DATAHANDLERS,
),
"show_timerange": Arg(
'--show-timerange',
@@ -450,14 +450,12 @@ AVAILABLE_CLI_OPTIONS = {
),
"exchange": Arg(
'--exchange',
help=f'Exchange name (default: `{constants.DEFAULT_EXCHANGE}`). '
f'Only valid if no config is provided.',
help='Exchange name. Only valid if no config is provided.',
),
"timeframes": Arg(
'-t', '--timeframes',
help='Specify which tickers to download. Space-separated list. '
'Default: `1m 5m`.',
default=['1m', '5m'],
nargs='+',
),
"prepend_data": Arg(
@@ -690,4 +688,21 @@ AVAILABLE_CLI_OPTIONS = {
help='Run backtest with ready models.',
action='store_true'
),
"minimum_trade_amount": Arg(
'--minimum-trade-amount',
help='Minimum trade amount for lookahead-analysis',
type=check_int_positive,
metavar='INT',
),
"targeted_trade_amount": Arg(
'--targeted-trade-amount',
help='Targeted trade amount for lookahead analysis',
type=check_int_positive,
metavar='INT',
),
"lookahead_analysis_exportfilename": Arg(
'--lookahead-analysis-exportfilename',
help="Use this csv-filename to store lookahead-analysis-results",
type=str
),
}

View File

@@ -1,18 +1,16 @@
import logging
import sys
from collections import defaultdict
from datetime import datetime, timedelta
from typing import Any, Dict, List
from typing import Any, Dict
from freqtrade.configuration import TimeRange, setup_utils_configuration
from freqtrade.constants import DATETIME_PRINT_FORMAT, Config
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, refresh_backtest_ohlcv_data,
refresh_backtest_trades_data)
from freqtrade.enums import CandleType, RunMode, TradingMode
from freqtrade.data.history import convert_trades_to_ohlcv, download_data_main
from freqtrade.enums import RunMode, TradingMode
from freqtrade.exceptions import OperationalException
from freqtrade.exchange import market_is_active, timeframe_to_minutes
from freqtrade.plugins.pairlist.pairlist_helpers import dynamic_expand_pairlist, expand_pairlist
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
@@ -20,7 +18,7 @@ from freqtrade.util.binance_mig import migrate_binance_futures_data
logger = logging.getLogger(__name__)
def _data_download_sanity(config: Config) -> None:
def _check_data_config_download_sanity(config: Config) -> None:
if 'days' in config and 'timerange' in config:
raise OperationalException("--days and --timerange are mutually exclusive. "
"You can only specify one or the other.")
@@ -37,78 +35,14 @@ def start_download_data(args: Dict[str, Any]) -> None:
"""
config = setup_utils_configuration(args, RunMode.UTIL_EXCHANGE)
_data_download_sanity(config)
timerange = TimeRange()
if 'days' in config:
time_since = (datetime.now() - timedelta(days=config['days'])).strftime("%Y%m%d")
timerange = TimeRange.parse_timerange(f'{time_since}-')
if 'timerange' in config:
timerange = timerange.parse_timerange(config['timerange'])
# Remove stake-currency to skip checks which are not relevant for datadownload
config['stake_currency'] = ''
pairs_not_available: List[str] = []
# Init exchange
exchange = ExchangeResolver.load_exchange(config, validate=False)
markets = [p for p, m in exchange.markets.items() if market_is_active(m)
or config.get('include_inactive')]
expanded_pairs = dynamic_expand_pairlist(config, markets)
# Manual validations of relevant settings
if not config['exchange'].get('skip_pair_validation', False):
exchange.validate_pairs(expanded_pairs)
logger.info(f"About to download pairs: {expanded_pairs}, "
f"intervals: {config['timeframes']} to {config['datadir']}")
for timeframe in config['timeframes']:
exchange.validate_timeframes(timeframe)
_check_data_config_download_sanity(config)
try:
if config.get('download_trades'):
if config.get('trading_mode') == 'futures':
raise OperationalException("Trade download not supported for futures.")
pairs_not_available = refresh_backtest_trades_data(
exchange, pairs=expanded_pairs, datadir=config['datadir'],
timerange=timerange, new_pairs_days=config['new_pairs_days'],
erase=bool(config.get('erase')), data_format=config['dataformat_trades'])
# Convert downloaded trade data to different timeframes
convert_trades_to_ohlcv(
pairs=expanded_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'],
)
else:
if not exchange.get_option('ohlcv_has_history', True):
raise OperationalException(
f"Historic klines not available for {exchange.name}. "
"Please use `--dl-trades` instead for this exchange "
"(will unfortunately take a long time)."
)
migrate_binance_futures_data(config)
pairs_not_available = refresh_backtest_ohlcv_data(
exchange, pairs=expanded_pairs, timeframes=config['timeframes'],
datadir=config['datadir'], timerange=timerange,
new_pairs_days=config['new_pairs_days'],
erase=bool(config.get('erase')), data_format=config['dataformat_ohlcv'],
trading_mode=config.get('trading_mode', 'spot'),
prepend=config.get('prepend_data', False)
)
download_data_main(config)
except KeyboardInterrupt:
sys.exit("SIGINT received, aborting ...")
finally:
if pairs_not_available:
logger.info(f"Pairs [{','.join(pairs_not_available)}] not available "
f"on exchange {exchange.name}.")
def start_convert_trades(args: Dict[str, Any]) -> None:
@@ -123,6 +57,8 @@ def start_convert_trades(args: Dict[str, Any]) -> None:
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)
@@ -152,11 +88,10 @@ def start_convert_data(args: Dict[str, Any], ohlcv: bool = True) -> None:
config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)
if ohlcv:
migrate_binance_futures_data(config)
candle_types = [CandleType.from_string(ct) for ct in config.get('candle_types', ['spot'])]
for candle_type in candle_types:
convert_ohlcv_format(config,
convert_from=args['format_from'], convert_to=args['format_to'],
erase=args['erase'], candle_type=candle_type)
convert_ohlcv_format(config,
convert_from=args['format_from'],
convert_to=args['format_to'],
erase=args['erase'])
else:
convert_trades_format(config,
convert_from=args['format_from'], convert_to=args['format_to'],

View File

@@ -10,7 +10,7 @@ from freqtrade.configuration.directory_operations import copy_sample_files, crea
from freqtrade.constants import USERPATH_STRATEGIES
from freqtrade.enums import RunMode
from freqtrade.exceptions import OperationalException
from freqtrade.misc import render_template, render_template_with_fallback
from freqtrade.util import render_template, render_template_with_fallback
logger = logging.getLogger(__name__)
@@ -35,6 +35,10 @@ def deploy_new_strategy(strategy_name: str, strategy_path: Path, subtemplate: st
Deploy new strategy from template to strategy_path
"""
fallback = 'full'
attributes = render_template_with_fallback(
templatefile=f"strategy_subtemplates/strategy_attributes_{subtemplate}.j2",
templatefallbackfile=f"strategy_subtemplates/strategy_attributes_{fallback}.j2",
)
indicators = render_template_with_fallback(
templatefile=f"strategy_subtemplates/indicators_{subtemplate}.j2",
templatefallbackfile=f"strategy_subtemplates/indicators_{fallback}.j2",
@@ -58,6 +62,7 @@ def deploy_new_strategy(strategy_name: str, strategy_path: Path, subtemplate: st
strategy_text = render_template(templatefile='base_strategy.py.j2',
arguments={"strategy": strategy_name,
"attributes": attributes,
"indicators": indicators,
"buy_trend": buy_trend,
"sell_trend": sell_trend,

View File

@@ -1,7 +1,7 @@
import csv
import logging
import sys
from typing import Any, Dict, List
from typing import Any, Dict, List, Union
import rapidjson
from colorama import Fore, Style
@@ -11,9 +11,10 @@ from tabulate import tabulate
from freqtrade.configuration import setup_utils_configuration
from freqtrade.enums import RunMode
from freqtrade.exceptions import OperationalException
from freqtrade.exchange import market_is_active, validate_exchanges
from freqtrade.exchange import list_available_exchanges, market_is_active
from freqtrade.misc import parse_db_uri_for_logging, plural
from freqtrade.resolvers import ExchangeResolver, StrategyResolver
from freqtrade.types import ValidExchangesType
logger = logging.getLogger(__name__)
@@ -25,18 +26,42 @@ def start_list_exchanges(args: Dict[str, Any]) -> None:
:param args: Cli args from Arguments()
:return: None
"""
exchanges = validate_exchanges(args['list_exchanges_all'])
exchanges = list_available_exchanges(args['list_exchanges_all'])
if args['print_one_column']:
print('\n'.join([e[0] for e in exchanges]))
print('\n'.join([e['name'] for e in exchanges]))
else:
headers = {
'name': 'Exchange name',
'supported': 'Supported',
'trade_modes': 'Markets',
'comment': 'Reason',
}
headers.update({'valid': 'Valid'} if args['list_exchanges_all'] else {})
def build_entry(exchange: ValidExchangesType, valid: bool):
valid_entry = {'valid': exchange['valid']} if valid else {}
result: Dict[str, Union[str, bool]] = {
'name': exchange['name'],
**valid_entry,
'supported': 'Official' if exchange['supported'] else '',
'trade_modes': ', '.join(
(f"{a['margin_mode']} " if a['margin_mode'] else '') + a['trading_mode']
for a in exchange['trade_modes']
),
'comment': exchange['comment'],
}
return result
if args['list_exchanges_all']:
print("All exchanges supported by the ccxt library:")
exchanges = [build_entry(e, True) for e in exchanges]
else:
print("Exchanges available for Freqtrade:")
exchanges = [e for e in exchanges if e[1] is not False]
exchanges = [build_entry(e, False) for e in exchanges if e['valid'] is not False]
print(tabulate(exchanges, headers=['Exchange name', 'Valid', 'reason']))
print(tabulate(exchanges, headers=headers, ))
def _print_objs_tabular(objs: List, print_colorized: bool) -> None:

View File

@@ -132,3 +132,15 @@ def start_edge(args: Dict[str, Any]) -> None:
# Initialize Edge object
edge_cli = EdgeCli(config)
edge_cli.start()
def start_lookahead_analysis(args: Dict[str, Any]) -> None:
"""
Start the backtest bias tester script
:param args: Cli args from Arguments()
:return: None
"""
from freqtrade.optimize.lookahead_analysis_helpers import LookaheadAnalysisSubFunctions
config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)
LookaheadAnalysisSubFunctions.start(config)

View File

@@ -7,9 +7,10 @@ def start_webserver(args: Dict[str, Any]) -> None:
"""
Main entry point for webserver mode
"""
from freqtrade.configuration import Configuration
from freqtrade.configuration import setup_utils_configuration
from freqtrade.rpc.api_server import ApiServer
# Initialize configuration
config = Configuration(args, RunMode.WEBSERVER).get_config()
config = setup_utils_configuration(args, RunMode.WEBSERVER)
ApiServer(config, standalone=True)

View File

@@ -3,4 +3,5 @@
from freqtrade.configuration.config_setup import setup_utils_configuration
from freqtrade.configuration.config_validation import validate_config_consistency
from freqtrade.configuration.configuration import Configuration
from freqtrade.configuration.detect_environment import running_in_docker
from freqtrade.configuration.timerange import TimeRange

View File

@@ -51,6 +51,8 @@ def validate_config_schema(conf: Dict[str, Any], preliminary: bool = False) -> D
conf_schema['required'] = constants.SCHEMA_BACKTEST_REQUIRED
else:
conf_schema['required'] = constants.SCHEMA_BACKTEST_REQUIRED_FINAL
elif conf.get('runmode', RunMode.OTHER) == RunMode.WEBSERVER:
conf_schema['required'] = constants.SCHEMA_MINIMAL_WEBSERVER
else:
conf_schema['required'] = constants.SCHEMA_MINIMAL_REQUIRED
try:

View File

@@ -203,7 +203,7 @@ class Configuration:
# This will override the strategy configuration
self._args_to_config(config, argname='timeframe',
logstring='Parameter -i/--timeframe detected ... '
'Using timeframe: {} ...')
'Using timeframe: {} ...')
self._args_to_config(config, argname='position_stacking',
logstring='Parameter --enable-position-stacking detected ...')
@@ -300,6 +300,9 @@ class Configuration:
self._args_to_config(config, argname='hyperoptexportfilename',
logstring='Using hyperopt file: {}')
self._args_to_config(config, argname='lookahead_analysis_exportfilename',
logstring='Saving lookahead analysis results into {} ...')
self._args_to_config(config, argname='epochs',
logstring='Parameter --epochs detected ... '
'Will run Hyperopt with for {} epochs ...'
@@ -474,6 +477,19 @@ class Configuration:
self._args_to_config(config, argname='analysis_csv_path',
logstring='Path to store analysis CSVs: {}')
self._args_to_config(config, argname='analysis_csv_path',
logstring='Path to store analysis CSVs: {}')
# Lookahead analysis results
self._args_to_config(config, argname='targeted_trade_amount',
logstring='Targeted Trade amount: {}')
self._args_to_config(config, argname='minimum_trade_amount',
logstring='Minimum Trade amount: {}')
self._args_to_config(config, argname='lookahead_analysis_exportfilename',
logstring='Path to store lookahead-analysis-results: {}')
def _process_runmode(self, config: Config) -> None:
self._args_to_config(config, argname='dry_run',
@@ -552,6 +568,7 @@ class Configuration:
# Fall back to /dl_path/pairs.json
pairs_file = config['datadir'] / 'pairs.json'
if pairs_file.exists():
logger.info(f'Reading pairs file "{pairs_file}".')
config['pairs'] = load_file(pairs_file)
if 'pairs' in config and isinstance(config['pairs'], list):
config['pairs'].sort()

View File

@@ -0,0 +1,8 @@
import os
def running_in_docker() -> bool:
"""
Check if we are running in a docker container
"""
return os.environ.get('FT_APP_ENV') == 'docker'

View File

@@ -3,6 +3,7 @@ import shutil
from pathlib import Path
from typing import Optional
from freqtrade.configuration.detect_environment import running_in_docker
from freqtrade.constants import (USER_DATA_FILES, USERPATH_FREQAIMODELS, USERPATH_HYPEROPTS,
USERPATH_NOTEBOOKS, USERPATH_STRATEGIES, Config)
from freqtrade.exceptions import OperationalException
@@ -30,8 +31,7 @@ def chown_user_directory(directory: Path) -> None:
Use Sudo to change permissions of the home-directory if necessary
Only applies when running in docker!
"""
import os
if os.environ.get('FT_APP_ENV') == 'docker':
if running_in_docker():
try:
import subprocess
subprocess.check_output(

View File

@@ -41,7 +41,7 @@ def flat_vars_to_nested_dict(env_dict: Dict[str, Any], prefix: str) -> Dict[str,
key = env_var.replace(prefix, '')
for k in reversed(key.split('__')):
val = {k.lower(): get_var_typed(val)
if type(val) != dict and k not in no_convert else val}
if not isinstance(val, dict) and k not in no_convert else val}
relevant_vars = deep_merge_dicts(val, relevant_vars)
return relevant_vars

View File

@@ -6,6 +6,8 @@ import re
from datetime import datetime, timezone
from typing import Optional
from typing_extensions import Self
from freqtrade.constants import DATETIME_PRINT_FORMAT
from freqtrade.exceptions import OperationalException
@@ -107,15 +109,15 @@ class TimeRange:
self.startts = int(min_date.timestamp() + timeframe_secs * startup_candles)
self.starttype = 'date'
@staticmethod
def parse_timerange(text: Optional[str]) -> 'TimeRange':
@classmethod
def parse_timerange(cls, text: Optional[str]) -> Self:
"""
Parse the value of the argument --timerange to determine what is the range desired
:param text: value from --timerange
:return: Start and End range period
"""
if not text:
return TimeRange(None, None, 0, 0)
return cls(None, None, 0, 0)
syntax = [(r'^-(\d{8})$', (None, 'date')),
(r'^(\d{8})-$', ('date', None)),
(r'^(\d{8})-(\d{8})$', ('date', 'date')),
@@ -156,5 +158,5 @@ class TimeRange:
if start > stop > 0:
raise OperationalException(
f'Start date is after stop date for timerange "{text}"')
return TimeRange(stype[0], stype[1], start, stop)
return cls(stype[0], stype[1], start, stop)
raise OperationalException(f'Incorrect syntax for timerange "{text}"')

View File

@@ -8,8 +8,8 @@ from typing import Any, Dict, List, Literal, Tuple
from freqtrade.enums import CandleType, PriceType, RPCMessageType
DOCS_LINK = "https://www.freqtrade.io/en/stable"
DEFAULT_CONFIG = 'config.json'
DEFAULT_EXCHANGE = 'bittrex'
PROCESS_THROTTLE_SECS = 5 # sec
HYPEROPT_EPOCH = 100 # epochs
RETRY_TIMEOUT = 30 # sec
@@ -38,8 +38,7 @@ AVAILABLE_PAIRLISTS = ['StaticPairList', 'VolumePairList', 'ProducerPairList', '
'ShuffleFilter', 'SpreadFilter', 'VolatilityFilter']
AVAILABLE_PROTECTIONS = ['CooldownPeriod',
'LowProfitPairs', 'MaxDrawdown', 'StoplossGuard']
AVAILABLE_DATAHANDLERS_TRADES = ['json', 'jsongz', 'hdf5', 'feather']
AVAILABLE_DATAHANDLERS = AVAILABLE_DATAHANDLERS_TRADES + ['parquet']
AVAILABLE_DATAHANDLERS = ['json', 'jsongz', 'hdf5', 'feather', 'parquet']
BACKTEST_BREAKDOWNS = ['day', 'week', 'month']
BACKTEST_CACHE_AGE = ['none', 'day', 'week', 'month']
BACKTEST_CACHE_DEFAULT = 'day'
@@ -50,6 +49,15 @@ DEFAULT_DATAFRAME_COLUMNS = ['date', 'open', 'high', 'low', 'close', 'volume']
# Don't modify sequence of DEFAULT_TRADES_COLUMNS
# it has wide consequences for stored trades files
DEFAULT_TRADES_COLUMNS = ['timestamp', 'id', 'type', 'side', 'price', 'amount', 'cost']
TRADES_DTYPES = {
'timestamp': 'int64',
'id': 'str',
'type': 'str',
'side': 'str',
'price': 'float64',
'amount': 'float64',
'cost': 'float64',
}
TRADING_MODES = ['spot', 'margin', 'futures']
MARGIN_MODES = ['cross', 'isolated', '']
@@ -65,6 +73,7 @@ TELEGRAM_SETTING_OPTIONS = ['on', 'off', 'silent']
WEBHOOK_FORMAT_OPTIONS = ['form', 'json', 'raw']
FULL_DATAFRAME_THRESHOLD = 100
CUSTOM_TAG_MAX_LENGTH = 255
DL_DATA_TIMEFRAMES = ['1m', '5m']
ENV_VAR_PREFIX = 'FREQTRADE__'
@@ -111,6 +120,8 @@ MINIMAL_CONFIG = {
}
}
__MESSAGE_TYPE_DICT: Dict[str, Dict[str, str]] = {x: {'type': 'object'} for x in RPCMessageType}
# Required json-schema for user specified config
CONF_SCHEMA = {
'type': 'object',
@@ -148,10 +159,9 @@ CONF_SCHEMA = {
'patternProperties': {
'^[0-9.]+$': {'type': 'number'}
},
'minProperties': 1
},
'amount_reserve_percent': {'type': 'number', 'minimum': 0.0, 'maximum': 0.5},
'stoploss': {'type': 'number', 'maximum': 0, 'exclusiveMaximum': True, 'minimum': -1},
'stoploss': {'type': 'number', 'maximum': 0, 'exclusiveMaximum': True},
'trailing_stop': {'type': 'boolean'},
'trailing_stop_positive': {'type': 'number', 'minimum': 0, 'maximum': 1},
'trailing_stop_positive_offset': {'type': 'number', 'minimum': 0, 'maximum': 1},
@@ -164,6 +174,9 @@ CONF_SCHEMA = {
'trading_mode': {'type': 'string', 'enum': TRADING_MODES},
'margin_mode': {'type': 'string', 'enum': MARGIN_MODES},
'reduce_df_footprint': {'type': 'boolean', 'default': False},
'minimum_trade_amount': {'type': 'number', 'default': 10},
'targeted_trade_amount': {'type': 'number', 'default': 20},
'lookahead_analysis_exportfilename': {'type': 'string'},
'liquidation_buffer': {'type': 'number', 'minimum': 0.0, 'maximum': 0.99},
'backtest_breakdown': {
'type': 'array',
@@ -351,7 +364,8 @@ CONF_SCHEMA = {
'format': {'type': 'string', 'enum': WEBHOOK_FORMAT_OPTIONS, 'default': 'form'},
'retries': {'type': 'integer', 'minimum': 0},
'retry_delay': {'type': 'number', 'minimum': 0},
**dict([(x, {'type': 'object'}) for x in RPCMessageType]),
**__MESSAGE_TYPE_DICT,
# **{x: {'type': 'object'} for x in RPCMessageType},
# Below -> Deprecated
'webhookentry': {'type': 'object'},
'webhookentrycancel': {'type': 'object'},
@@ -440,12 +454,12 @@ CONF_SCHEMA = {
'dataformat_ohlcv': {
'type': 'string',
'enum': AVAILABLE_DATAHANDLERS,
'default': 'json'
'default': 'feather'
},
'dataformat_trades': {
'type': 'string',
'enum': AVAILABLE_DATAHANDLERS_TRADES,
'default': 'jsongz'
'enum': AVAILABLE_DATAHANDLERS,
'default': 'feather'
},
'position_adjustment_enable': {'type': 'boolean'},
'max_entry_position_adjustment': {'type': ['integer', 'number'], 'minimum': -1},
@@ -455,7 +469,6 @@ CONF_SCHEMA = {
'type': 'object',
'properties': {
'name': {'type': 'string'},
'sandbox': {'type': 'boolean', 'default': False},
'key': {'type': 'string', 'default': ''},
'secret': {'type': 'string', 'default': ''},
'password': {'type': 'string', 'default': ''},
@@ -662,6 +675,9 @@ SCHEMA_MINIMAL_REQUIRED = [
'dataformat_ohlcv',
'dataformat_trades',
]
SCHEMA_MINIMAL_WEBSERVER = SCHEMA_MINIMAL_REQUIRED + [
'api_server',
]
CANCEL_REASON = {
"TIMEOUT": "cancelled due to timeout",

View File

@@ -5,16 +5,17 @@ import logging
from copy import copy
from datetime import datetime, timezone
from pathlib import Path
from typing import Any, Dict, List, Optional, Union
from typing import Any, Dict, List, Literal, Optional, Union
import numpy as np
import pandas as pd
from freqtrade.constants import LAST_BT_RESULT_FN, IntOrInf
from freqtrade.exceptions import OperationalException
from freqtrade.misc import json_load
from freqtrade.misc import file_dump_json, json_load
from freqtrade.optimize.backtest_caching import get_backtest_metadata_filename
from freqtrade.persistence import LocalTrade, Trade, init_db
from freqtrade.types import BacktestHistoryEntryType, BacktestResultType
logger = logging.getLogger(__name__)
@@ -128,7 +129,7 @@ def load_backtest_metadata(filename: Union[Path, str]) -> Dict[str, Any]:
raise OperationalException('Unexpected error while loading backtest metadata.') from e
def load_backtest_stats(filename: Union[Path, str]) -> Dict[str, Any]:
def load_backtest_stats(filename: Union[Path, str]) -> BacktestResultType:
"""
Load backtest statistics file.
:param filename: pathlib.Path object, or string pointing to the file.
@@ -147,21 +148,21 @@ def load_backtest_stats(filename: Union[Path, str]) -> Dict[str, Any]:
# Legacy list format does not contain metadata.
if isinstance(data, dict):
data['metadata'] = load_backtest_metadata(filename)
return data
def load_and_merge_backtest_result(strategy_name: str, filename: Path, results: Dict[str, Any]):
"""
Load one strategy from multi-strategy result
and merge it with results
Load one strategy from multi-strategy result and merge it with results
:param strategy_name: Name of the strategy contained in the result
:param filename: Backtest-result-filename to load
:param results: dict to merge the result to.
"""
bt_data = load_backtest_stats(filename)
for k in ('metadata', 'strategy'):
k: Literal['metadata', 'strategy']
for k in ('metadata', 'strategy'): # type: ignore
results[k][strategy_name] = bt_data[k][strategy_name]
results['metadata'][strategy_name]['filename'] = filename.stem
comparison = bt_data['strategy_comparison']
for i in range(len(comparison)):
if comparison[i]['key'] == strategy_name:
@@ -170,27 +171,67 @@ def load_and_merge_backtest_result(strategy_name: str, filename: Path, results:
def _get_backtest_files(dirname: Path) -> List[Path]:
# Weird glob expression here avoids including .meta.json files.
return list(reversed(sorted(dirname.glob('backtest-result-*-[0-9][0-9].json'))))
def get_backtest_resultlist(dirname: Path):
def get_backtest_result(filename: Path) -> List[BacktestHistoryEntryType]:
"""
Get backtest result read from metadata file
"""
return [
{
'filename': filename.stem,
'strategy': s,
'notes': v.get('notes', ''),
'run_id': v['run_id'],
'backtest_start_time': v['backtest_start_time'],
} for s, v in load_backtest_metadata(filename).items()
]
def get_backtest_resultlist(dirname: Path) -> List[BacktestHistoryEntryType]:
"""
Get list of backtest results read from metadata files
"""
results = []
for filename in _get_backtest_files(dirname):
metadata = load_backtest_metadata(filename)
if not metadata:
continue
for s, v in metadata.items():
results.append({
'filename': filename.name,
'strategy': s,
'run_id': v['run_id'],
'backtest_start_time': v['backtest_start_time'],
return [
{
'filename': filename.stem,
'strategy': s,
'run_id': v['run_id'],
'notes': v.get('notes', ''),
'backtest_start_time': v['backtest_start_time'],
}
for filename in _get_backtest_files(dirname)
for s, v in load_backtest_metadata(filename).items()
if v
]
})
return results
def delete_backtest_result(file_abs: Path):
"""
Delete backtest result file and corresponding metadata file.
"""
# *.meta.json
logger.info(f"Deleting backtest result file: {file_abs.name}")
file_abs_meta = file_abs.with_suffix('.meta.json')
file_abs.unlink()
file_abs_meta.unlink()
def update_backtest_metadata(filename: Path, strategy: str, content: Dict[str, Any]):
"""
Updates backtest metadata file with new content.
:raises: ValueError if metadata file does not exist, or strategy is not in this file.
"""
metadata = load_backtest_metadata(filename)
if not metadata:
raise ValueError("File does not exist.")
if strategy not in metadata:
raise ValueError("Strategy not in metadata.")
metadata[strategy].update(content)
# Write data again.
file_dump_json(get_backtest_metadata_filename(filename), metadata)
def find_existing_backtest_stats(dirname: Union[Path, str], run_ids: Dict[str, str],
@@ -211,7 +252,6 @@ def find_existing_backtest_stats(dirname: Union[Path, str], run_ids: Dict[str, s
'strategy_comparison': [],
}
# Weird glob expression here avoids including .meta.json files.
for filename in _get_backtest_files(dirname):
metadata = load_backtest_metadata(filename)
if not metadata:

View File

@@ -1,17 +1,16 @@
"""
Functions to convert data from one format to another
"""
import itertools
import logging
from operator import itemgetter
from typing import Dict, List
import numpy as np
import pandas as pd
from pandas import DataFrame, to_datetime
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS, Config, TradeList
from freqtrade.enums import CandleType
from freqtrade.constants import (DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS, TRADES_DTYPES,
Config, TradeList)
from freqtrade.enums import CandleType, TradingMode
logger = logging.getLogger(__name__)
@@ -96,8 +95,14 @@ def ohlcv_fill_up_missing_data(dataframe: DataFrame, timeframe: str, pair: str)
'volume': 'sum'
}
timeframe_minutes = timeframe_to_minutes(timeframe)
resample_interval = f'{timeframe_minutes}min'
if timeframe_minutes >= 43200 and timeframe_minutes < 525600:
# Monthly candles need special treatment to stick to the 1st of the month
resample_interval = f'{timeframe}S'
elif timeframe_minutes > 43200:
resample_interval = timeframe
# Resample to create "NAN" values
df = dataframe.resample(f'{timeframe_minutes}min', on='date').agg(ohlcv_dict)
df = dataframe.resample(resample_interval, on='date').agg(ohlcv_dict)
# Forwardfill close for missing columns
df['close'] = df['close'].fillna(method='ffill')
@@ -122,7 +127,7 @@ def ohlcv_fill_up_missing_data(dataframe: DataFrame, timeframe: str, pair: str)
return df
def trim_dataframe(df: DataFrame, timerange, df_date_col: str = 'date',
def trim_dataframe(df: DataFrame, timerange, *, df_date_col: str = 'date',
startup_candles: int = 0) -> DataFrame:
"""
Trim dataframe based on given timerange
@@ -189,15 +194,14 @@ def order_book_to_dataframe(bids: list, asks: list) -> DataFrame:
return frame
def trades_remove_duplicates(trades: List[List]) -> List[List]:
def trades_df_remove_duplicates(trades: pd.DataFrame) -> pd.DataFrame:
"""
Removes duplicates from the trades list.
Uses itertools.groupby to avoid converting to pandas.
Tests show it as being pretty efficient on lists of 4M Lists.
:param trades: List of Lists with constants.DEFAULT_TRADES_COLUMNS as columns
:return: same format as above, but with duplicates removed
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 [i for i, _ in itertools.groupby(sorted(trades, key=itemgetter(0)))]
return trades.drop_duplicates(subset=['timestamp', 'id'])
def trades_dict_to_list(trades: List[Dict]) -> TradeList:
@@ -209,7 +213,32 @@ def trades_dict_to_list(trades: List[Dict]) -> TradeList:
return [[t[col] for col in DEFAULT_TRADES_COLUMNS] for t in trades]
def trades_to_ohlcv(trades: TradeList, timeframe: str) -> DataFrame:
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.
@@ -219,12 +248,9 @@ def trades_to_ohlcv(trades: TradeList, timeframe: str) -> DataFrame:
"""
from freqtrade.exchange import timeframe_to_minutes
timeframe_minutes = timeframe_to_minutes(timeframe)
if not trades:
if trades.empty:
raise ValueError('Trade-list empty.')
df = pd.DataFrame(trades, columns=DEFAULT_TRADES_COLUMNS)
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms',
utc=True,)
df = df.set_index('timestamp')
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()
@@ -264,7 +290,6 @@ def convert_ohlcv_format(
convert_from: str,
convert_to: str,
erase: bool,
candle_type: CandleType
):
"""
Convert OHLCV from one format to another
@@ -272,7 +297,6 @@ def convert_ohlcv_format(
: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)
:param candle_type: Any of the enum CandleType (must match trading mode!)
"""
from freqtrade.data.history.idatahandler import get_datahandler
src = get_datahandler(config['datadir'], convert_from)
@@ -280,37 +304,45 @@ def convert_ohlcv_format(
timeframes = config.get('timeframes', [config.get('timeframe')])
logger.info(f"Converting candle (OHLCV) for timeframe {timeframes}")
if 'pairs' not in config:
config['pairs'] = []
# Check timeframes or fall back to timeframe.
for timeframe in timeframes:
config['pairs'].extend(src.ohlcv_get_pairs(
config['datadir'],
timeframe,
candle_type=candle_type
))
config['pairs'] = sorted(set(config['pairs']))
logger.info(f"Converting candle (OHLCV) data for {config['pairs']}")
candle_types = [CandleType.from_string(ct) for ct in config.get('candle_types', [
c.value for c in CandleType])]
logger.info(candle_types)
paircombs = src.ohlcv_get_available_data(config['datadir'], TradingMode.SPOT)
paircombs.extend(src.ohlcv_get_available_data(config['datadir'], TradingMode.FUTURES))
for timeframe in timeframes:
for pair in config['pairs']:
data = src.ohlcv_load(pair=pair, timeframe=timeframe,
timerange=None,
fill_missing=False,
drop_incomplete=False,
startup_candles=0,
candle_type=candle_type)
logger.info(f"Converting {len(data)} {timeframe} {candle_type} candles for {pair}")
if len(data) > 0:
trg.ohlcv_store(
pair=pair,
timeframe=timeframe,
data=data,
candle_type=candle_type
)
if erase and convert_from != convert_to:
logger.info(f"Deleting source data for {pair} / {timeframe}")
src.ohlcv_purge(pair=pair, timeframe=timeframe, candle_type=candle_type)
if 'pairs' in config:
# Filter pairs
paircombs = [comb for comb in paircombs if comb[0] in config['pairs']]
if 'timeframes' in config:
paircombs = [comb for comb in paircombs if comb[1] in config['timeframes']]
paircombs = [comb for comb in paircombs if comb[2] in candle_types]
paircombs = sorted(paircombs, key=lambda x: (x[0], x[1], x[2].value))
formatted_paircombs = '\n'.join([f"{pair}, {timeframe}, {candle_type}"
for pair, timeframe, candle_type in paircombs])
logger.info(f"Converting candle (OHLCV) data for the following pair combinations:\n"
f"{formatted_paircombs}")
for pair, timeframe, candle_type in paircombs:
data = src.ohlcv_load(pair=pair, timeframe=timeframe,
timerange=None,
fill_missing=False,
drop_incomplete=False,
startup_candles=0,
candle_type=candle_type)
logger.info(f"Converting {len(data)} {timeframe} {candle_type} candles for {pair}")
if len(data) > 0:
trg.ohlcv_store(
pair=pair,
timeframe=timeframe,
data=data,
candle_type=candle_type
)
if erase and convert_from != convert_to:
logger.info(f"Deleting source data for {pair} / {timeframe}")
src.ohlcv_purge(pair=pair, timeframe=timeframe, candle_type=candle_type)
def reduce_dataframe_footprint(df: DataFrame) -> DataFrame:

View File

@@ -17,7 +17,7 @@ from freqtrade.constants import (FULL_DATAFRAME_THRESHOLD, Config, ListPairsWith
from freqtrade.data.history import load_pair_history
from freqtrade.enums import CandleType, RPCMessageType, RunMode
from freqtrade.exceptions import ExchangeError, OperationalException
from freqtrade.exchange import Exchange, timeframe_to_seconds
from freqtrade.exchange import Exchange, timeframe_to_prev_date, timeframe_to_seconds
from freqtrade.exchange.types import OrderBook
from freqtrade.misc import append_candles_to_dataframe
from freqtrade.rpc import RPCManager
@@ -46,6 +46,8 @@ class DataProvider:
self.__rpc = rpc
self.__cached_pairs: Dict[PairWithTimeframe, Tuple[DataFrame, datetime]] = {}
self.__slice_index: Optional[int] = None
self.__slice_date: Optional[datetime] = None
self.__cached_pairs_backtesting: Dict[PairWithTimeframe, DataFrame] = {}
self.__producer_pairs_df: Dict[str,
Dict[PairWithTimeframe, Tuple[DataFrame, datetime]]] = {}
@@ -64,10 +66,19 @@ class DataProvider:
def _set_dataframe_max_index(self, limit_index: int):
"""
Limit analyzed dataframe to max specified index.
Only relevant in backtesting.
:param limit_index: dataframe index.
"""
self.__slice_index = limit_index
def _set_dataframe_max_date(self, limit_date: datetime):
"""
Limit infomrative dataframe to max specified index.
Only relevant in backtesting.
:param limit_date: "current date"
"""
self.__slice_date = limit_date
def _set_cached_df(
self,
pair: str,
@@ -284,7 +295,7 @@ class DataProvider:
def historic_ohlcv(
self,
pair: str,
timeframe: Optional[str] = None,
timeframe: str,
candle_type: str = ''
) -> DataFrame:
"""
@@ -307,10 +318,10 @@ class DataProvider:
timerange.subtract_start(tf_seconds * startup_candles)
self.__cached_pairs_backtesting[saved_pair] = load_pair_history(
pair=pair,
timeframe=timeframe or self._config['timeframe'],
timeframe=timeframe,
datadir=self._config['datadir'],
timerange=timerange,
data_format=self._config.get('dataformat_ohlcv', 'json'),
data_format=self._config['dataformat_ohlcv'],
candle_type=_candle_type,
)
@@ -354,7 +365,13 @@ class DataProvider:
data = self.ohlcv(pair=pair, timeframe=timeframe, candle_type=candle_type)
else:
# Get historical OHLCV data (cached on disk).
timeframe = timeframe or self._config['timeframe']
data = self.historic_ohlcv(pair=pair, timeframe=timeframe, candle_type=candle_type)
# Cut date to timeframe-specific date.
# This is necessary to prevent lookahead bias in callbacks through informative pairs.
if self.__slice_date:
cutoff_date = timeframe_to_prev_date(timeframe, self.__slice_date)
data = data.loc[data['date'] < cutoff_date]
if len(data) == 0:
logger.warning(f"No data found for ({pair}, {timeframe}, {candle_type}).")
return data

View File

@@ -6,7 +6,7 @@ Includes:
* download data from exchange and store to disk
"""
# flake8: noqa: F401
from .history_utils import (convert_trades_to_ohlcv, get_timerange, load_data, load_pair_history,
refresh_backtest_ohlcv_data, refresh_backtest_trades_data, refresh_data,
validate_backtest_data)
from .history_utils import (convert_trades_to_ohlcv, download_data_main, get_timerange, load_data,
load_pair_history, refresh_backtest_ohlcv_data,
refresh_backtest_trades_data, refresh_data, validate_backtest_data)
from .idatahandler import get_datahandler

View File

@@ -4,7 +4,7 @@ from typing import Optional
from pandas import DataFrame, read_feather, to_datetime
from freqtrade.configuration import TimeRange
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS, TradeList
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS
from freqtrade.enums import CandleType
from .idatahandler import IDataHandler
@@ -82,43 +82,41 @@ class FeatherDataHandler(IDataHandler):
"""
raise NotImplementedError()
def trades_store(self, pair: str, data: TradeList) -> None:
def _trades_store(self, pair: str, data: DataFrame) -> None:
"""
Store trades data (list of Dicts) to file
:param pair: Pair - used for filename
:param data: List of Lists containing trade data,
:param data: Dataframe containing trades
column sequence as in DEFAULT_TRADES_COLUMNS
"""
filename = self._pair_trades_filename(self._datadir, pair)
self.create_dir_if_needed(filename)
data.reset_index(drop=True).to_feather(filename, compression_level=9, compression='lz4')
tradesdata = DataFrame(data, columns=DEFAULT_TRADES_COLUMNS)
tradesdata.to_feather(filename, compression_level=9, compression='lz4')
def trades_append(self, pair: str, data: TradeList):
def trades_append(self, pair: str, data: DataFrame):
"""
Append data to existing files
:param pair: Pair - used for filename
:param data: List of Lists containing trade data,
:param data: Dataframe containing trades
column sequence as in DEFAULT_TRADES_COLUMNS
"""
raise NotImplementedError()
def _trades_load(self, pair: str, timerange: Optional[TimeRange] = None) -> TradeList:
def _trades_load(self, pair: str, timerange: Optional[TimeRange] = None) -> DataFrame:
"""
Load a pair from file, either .json.gz or .json
# TODO: respect timerange ...
:param pair: Load trades for this pair
:param timerange: Timerange to load trades for - currently not implemented
:return: List of trades
:return: Dataframe containing trades
"""
filename = self._pair_trades_filename(self._datadir, pair)
if not filename.exists():
return []
return DataFrame(columns=DEFAULT_TRADES_COLUMNS)
tradesdata = read_feather(filename)
return tradesdata.values.tolist()
return tradesdata
@classmethod
def _get_file_extension(cls):

View File

@@ -5,7 +5,7 @@ import numpy as np
import pandas as pd
from freqtrade.configuration import TimeRange
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS, TradeList
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS
from freqtrade.enums import CandleType
from .idatahandler import IDataHandler
@@ -100,42 +100,42 @@ class HDF5DataHandler(IDataHandler):
"""
raise NotImplementedError()
def trades_store(self, pair: str, data: TradeList) -> None:
def _trades_store(self, pair: str, data: pd.DataFrame) -> None:
"""
Store trades data (list of Dicts) to file
:param pair: Pair - used for filename
:param data: List of Lists containing trade data,
:param data: Dataframe containing trades
column sequence as in DEFAULT_TRADES_COLUMNS
"""
key = self._pair_trades_key(pair)
pd.DataFrame(data, columns=DEFAULT_TRADES_COLUMNS).to_hdf(
data.to_hdf(
self._pair_trades_filename(self._datadir, pair), key,
mode='a', complevel=9, complib='blosc',
format='table', data_columns=['timestamp']
)
def trades_append(self, pair: str, data: TradeList):
def trades_append(self, pair: str, data: pd.DataFrame):
"""
Append data to existing files
:param pair: Pair - used for filename
:param data: List of Lists containing trade data,
:param data: Dataframe containing trades
column sequence as in DEFAULT_TRADES_COLUMNS
"""
raise NotImplementedError()
def _trades_load(self, pair: str, timerange: Optional[TimeRange] = None) -> TradeList:
def _trades_load(self, pair: str, timerange: Optional[TimeRange] = None) -> pd.DataFrame:
"""
Load a pair from h5 file.
:param pair: Load trades for this pair
:param timerange: Timerange to load trades for - currently not implemented
:return: List of trades
:return: Dataframe containing trades
"""
key = self._pair_trades_key(pair)
filename = self._pair_trades_filename(self._datadir, pair)
if not filename.exists():
return []
return pd.DataFrame(columns=DEFAULT_TRADES_COLUMNS)
where = []
if timerange:
if timerange.starttype == 'date':
@@ -145,7 +145,7 @@ class HDF5DataHandler(IDataHandler):
trades: pd.DataFrame = pd.read_hdf(filename, key=key, mode="r", where=where)
trades[['id', 'type']] = trades[['id', 'type']].replace({np.nan: None})
return trades.values.tolist()
return trades
@classmethod
def _get_file_extension(cls):

View File

@@ -7,14 +7,19 @@ from typing import Dict, List, Optional, Tuple
from pandas import DataFrame, concat
from freqtrade.configuration import TimeRange
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS
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_remove_duplicates, trades_to_ohlcv)
trades_df_remove_duplicates, trades_list_to_df,
trades_to_ohlcv)
from freqtrade.data.history.idatahandler import IDataHandler, get_datahandler
from freqtrade.enums import CandleType
from freqtrade.exceptions import OperationalException
from freqtrade.exchange import Exchange
from freqtrade.misc import format_ms_time
from freqtrade.plugins.pairlist.pairlist_helpers import dynamic_expand_pairlist
from freqtrade.util import dt_ts, format_ms_time
from freqtrade.util.binance_mig import migrate_binance_futures_data
from freqtrade.util.datetime_helpers import dt_now
logger = logging.getLogger(__name__)
@@ -66,7 +71,7 @@ def load_data(datadir: Path,
fill_up_missing: bool = True,
startup_candles: int = 0,
fail_without_data: bool = False,
data_format: str = 'json',
data_format: str = 'feather',
candle_type: CandleType = CandleType.SPOT,
user_futures_funding_rate: Optional[int] = None,
) -> Dict[str, DataFrame]:
@@ -227,9 +232,11 @@ def _download_pair_history(pair: str, *,
)
logger.debug("Current Start: %s",
f"{data.iloc[0]['date']:DATETIME_PRINT_FORMAT}" if not data.empty else 'None')
f"{data.iloc[0]['date']:{DATETIME_PRINT_FORMAT}}"
if not data.empty else 'None')
logger.debug("Current End: %s",
f"{data.iloc[-1]['date']:DATETIME_PRINT_FORMAT}" if not data.empty else 'None')
f"{data.iloc[-1]['date']:{DATETIME_PRINT_FORMAT}}"
if not data.empty else 'None')
# Default since_ms to 30 days if nothing is given
new_data = exchange.get_historic_ohlcv(pair=pair,
@@ -252,10 +259,12 @@ def _download_pair_history(pair: str, *,
data = clean_ohlcv_dataframe(concat([data, new_dataframe], axis=0), timeframe, pair,
fill_missing=False, drop_incomplete=False)
logger.debug("New Start: %s",
f"{data.iloc[0]['date']:DATETIME_PRINT_FORMAT}" if not data.empty else 'None')
logger.debug("New Start: %s",
f"{data.iloc[0]['date']:{DATETIME_PRINT_FORMAT}}"
if not data.empty else 'None')
logger.debug("New End: %s",
f"{data.iloc[-1]['date']:DATETIME_PRINT_FORMAT}" if not data.empty else 'None')
f"{data.iloc[-1]['date']:{DATETIME_PRINT_FORMAT}}"
if not data.empty else 'None')
data_handler.ohlcv_store(pair, timeframe, data=data, candle_type=candle_type)
return True
@@ -290,7 +299,7 @@ def refresh_backtest_ohlcv_data(exchange: Exchange, pairs: List[str], timeframes
continue
for timeframe in timeframes:
logger.info(f'Downloading pair {pair}, interval {timeframe}.')
logger.debug(f'Downloading pair {pair}, {candle_type}, interval {timeframe}.')
process = f'{idx}/{len(pairs)}'
_download_pair_history(pair=pair, process=process,
datadir=datadir, exchange=exchange,
@@ -342,24 +351,27 @@ def _download_trades_history(exchange: Exchange,
# DEFAULT_TRADES_COLUMNS: 0 -> timestamp
# DEFAULT_TRADES_COLUMNS: 1 -> id
if trades and since < trades[0][0]:
if not trades.empty and since > 0 and since < trades.iloc[0]['timestamp']:
# since is before the first trade
logger.info(f"Start earlier than available data. Redownloading trades for {pair}...")
trades = []
logger.info(f"Start ({trades.iloc[0]['date']:{DATETIME_PRINT_FORMAT}}) earlier than "
f"available data. Redownloading trades for {pair}...")
trades = trades_list_to_df([])
if not since:
since = int((datetime.now() - timedelta(days=-new_pairs_days)).timestamp()) * 1000
from_id = trades[-1][1] if trades else None
if trades and since < trades[-1][0]:
from_id = trades.iloc[-1]['id'] if not trades.empty else None
if not trades.empty and since < trades.iloc[-1]['timestamp']:
# Reset since to the last available point
# - 5 seconds (to ensure we're getting all trades)
since = trades[-1][0] - (5 * 1000)
since = trades.iloc[-1]['timestamp'] - (5 * 1000)
logger.info(f"Using last trade date -5s - Downloading trades for {pair} "
f"since: {format_ms_time(since)}.")
logger.debug(f"Current Start: {format_ms_time(trades[0][0]) if trades else 'None'}")
logger.debug(f"Current End: {format_ms_time(trades[-1][0]) if trades else 'None'}")
if not since:
since = dt_ts(dt_now() - timedelta(days=new_pairs_days))
logger.debug("Current Start: %s", 'None' if trades.empty else
f"{trades.iloc[0]['date']:{DATETIME_PRINT_FORMAT}}")
logger.debug("Current End: %s", 'None' if trades.empty else
f"{trades.iloc[-1]['date']:{DATETIME_PRINT_FORMAT}}")
logger.info(f"Current Amount of trades: {len(trades)}")
# Default since_ms to 30 days if nothing is given
@@ -368,13 +380,16 @@ def _download_trades_history(exchange: Exchange,
until=until,
from_id=from_id,
)
trades.extend(new_trades[1])
new_trades_df = trades_list_to_df(new_trades[1])
trades = concat([trades, new_trades_df], axis=0)
# Remove duplicates to make sure we're not storing data we don't need
trades = trades_remove_duplicates(trades)
trades = trades_df_remove_duplicates(trades)
data_handler.trades_store(pair, data=trades)
logger.debug(f"New Start: {format_ms_time(trades[0][0])}")
logger.debug(f"New End: {format_ms_time(trades[-1][0])}")
logger.debug("New Start: %s", 'None' if trades.empty else
f"{trades.iloc[0]['date']:{DATETIME_PRINT_FORMAT}}")
logger.debug("New End: %s", 'None' if trades.empty else
f"{trades.iloc[-1]['date']:{DATETIME_PRINT_FORMAT}}")
logger.info(f"New Amount of trades: {len(trades)}")
return True
@@ -387,7 +402,7 @@ def _download_trades_history(exchange: Exchange,
def refresh_backtest_trades_data(exchange: Exchange, pairs: List[str], datadir: Path,
timerange: TimeRange, new_pairs_days: int = 30,
erase: bool = False, data_format: str = 'jsongz') -> List[str]:
erase: bool = False, data_format: str = 'feather') -> List[str]:
"""
Refresh stored trades data for backtesting and hyperopt operations.
Used by freqtrade download-data subcommand.
@@ -420,8 +435,8 @@ def convert_trades_to_ohlcv(
datadir: Path,
timerange: TimeRange,
erase: bool = False,
data_format_ohlcv: str = 'json',
data_format_trades: str = 'jsongz',
data_format_ohlcv: str = 'feather',
data_format_trades: str = 'feather',
candle_type: CandleType = CandleType.SPOT
) -> None:
"""
@@ -479,3 +494,79 @@ def validate_backtest_data(data: DataFrame, pair: str, min_date: datetime,
logger.warning("%s has missing frames: expected %s, got %s, that's %s missing values",
pair, expected_frames, dflen, expected_frames - dflen)
return found_missing
def download_data_main(config: Config) -> None:
timerange = TimeRange()
if 'days' in config:
time_since = (datetime.now() - timedelta(days=config['days'])).strftime("%Y%m%d")
timerange = TimeRange.parse_timerange(f'{time_since}-')
if 'timerange' in config:
timerange = timerange.parse_timerange(config['timerange'])
# Remove stake-currency to skip checks which are not relevant for datadownload
config['stake_currency'] = ''
pairs_not_available: List[str] = []
# Init exchange
from freqtrade.resolvers.exchange_resolver import ExchangeResolver
exchange = ExchangeResolver.load_exchange(config, validate=False)
available_pairs = [
p for p in exchange.get_markets(
tradable_only=True, active_only=not config.get('include_inactive')
).keys()
]
expanded_pairs = dynamic_expand_pairlist(config, available_pairs)
if 'timeframes' not in config:
config['timeframes'] = DL_DATA_TIMEFRAMES
# Manual validations of relevant settings
if not config['exchange'].get('skip_pair_validation', False):
exchange.validate_pairs(expanded_pairs)
logger.info(f"About to download pairs: {expanded_pairs}, "
f"intervals: {config['timeframes']} to {config['datadir']}")
for timeframe in config['timeframes']:
exchange.validate_timeframes(timeframe)
# Start downloading
try:
if config.get('download_trades'):
if config.get('trading_mode') == 'futures':
raise OperationalException("Trade download not supported for futures.")
pairs_not_available = refresh_backtest_trades_data(
exchange, pairs=expanded_pairs, datadir=config['datadir'],
timerange=timerange, new_pairs_days=config['new_pairs_days'],
erase=bool(config.get('erase')), data_format=config['dataformat_trades'])
# Convert downloaded trade data to different timeframes
convert_trades_to_ohlcv(
pairs=expanded_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'],
)
else:
if not exchange.get_option('ohlcv_has_history', True):
raise OperationalException(
f"Historic klines not available for {exchange.name}. "
"Please use `--dl-trades` instead for this exchange "
"(will unfortunately take a long time)."
)
migrate_binance_futures_data(config)
pairs_not_available = refresh_backtest_ohlcv_data(
exchange, pairs=expanded_pairs, timeframes=config['timeframes'],
datadir=config['datadir'], timerange=timerange,
new_pairs_days=config['new_pairs_days'],
erase=bool(config.get('erase')), data_format=config['dataformat_ohlcv'],
trading_mode=config.get('trading_mode', 'spot'),
prepend=config.get('prepend_data', False)
)
finally:
if pairs_not_available:
logger.info(f"Pairs [{','.join(pairs_not_available)}] not available "
f"on exchange {exchange.name}.")

View File

@@ -15,8 +15,9 @@ from pandas import DataFrame
from freqtrade import misc
from freqtrade.configuration import TimeRange
from freqtrade.constants import ListPairsWithTimeframes, TradeList
from freqtrade.data.converter import clean_ohlcv_dataframe, trades_remove_duplicates, trim_dataframe
from freqtrade.constants import DEFAULT_TRADES_COLUMNS, ListPairsWithTimeframes
from freqtrade.data.converter import (clean_ohlcv_dataframe, trades_convert_types,
trades_df_remove_duplicates, trim_dataframe)
from freqtrade.enums import CandleType, TradingMode
from freqtrade.exchange import timeframe_to_seconds
@@ -170,32 +171,42 @@ class IDataHandler(ABC):
return [cls.rebuild_pair_from_filename(match[0]) for match in _tmp if match]
@abstractmethod
def trades_store(self, pair: str, data: TradeList) -> None:
def _trades_store(self, pair: str, data: DataFrame) -> None:
"""
Store trades data (list of Dicts) to file
:param pair: Pair - used for filename
:param data: List of Lists containing trade data,
:param data: Dataframe containing trades
column sequence as in DEFAULT_TRADES_COLUMNS
"""
@abstractmethod
def trades_append(self, pair: str, data: TradeList):
def trades_append(self, pair: str, data: DataFrame):
"""
Append data to existing files
:param pair: Pair - used for filename
:param data: List of Lists containing trade data,
:param data: Dataframe containing trades
column sequence as in DEFAULT_TRADES_COLUMNS
"""
@abstractmethod
def _trades_load(self, pair: str, timerange: Optional[TimeRange] = None) -> TradeList:
def _trades_load(self, pair: str, timerange: Optional[TimeRange] = None) -> DataFrame:
"""
Load a pair from file, either .json.gz or .json
:param pair: Load trades for this pair
:param timerange: Timerange to load trades for - currently not implemented
:return: List of trades
:return: Dataframe containing trades
"""
def trades_store(self, pair: str, data: DataFrame) -> None:
"""
Store trades data (list of Dicts) to file
:param pair: Pair - used for filename
:param data: Dataframe containing trades
column sequence as in DEFAULT_TRADES_COLUMNS
"""
# Filter on expected columns (will remove the actual date column).
self._trades_store(pair, data[DEFAULT_TRADES_COLUMNS])
def trades_purge(self, pair: str) -> bool:
"""
Remove data for this pair
@@ -208,7 +219,7 @@ class IDataHandler(ABC):
return True
return False
def trades_load(self, pair: str, timerange: Optional[TimeRange] = None) -> TradeList:
def trades_load(self, pair: str, timerange: Optional[TimeRange] = None) -> DataFrame:
"""
Load a pair from file, either .json.gz or .json
Removes duplicates in the process.
@@ -216,7 +227,10 @@ class IDataHandler(ABC):
:param timerange: Timerange to load trades for - currently not implemented
:return: List of trades
"""
return trades_remove_duplicates(self._trades_load(pair, timerange=timerange))
trades = trades_df_remove_duplicates(self._trades_load(pair, timerange=timerange))
trades = trades_convert_types(trades)
return trades
@classmethod
def create_dir_if_needed(cls, datadir: Path):
@@ -427,6 +441,6 @@ def get_datahandler(datadir: Path, data_format: Optional[str] = None,
"""
if not data_handler:
HandlerClass = get_datahandlerclass(data_format or 'json')
HandlerClass = get_datahandlerclass(data_format or 'feather')
data_handler = HandlerClass(datadir)
return data_handler

View File

@@ -6,8 +6,8 @@ from pandas import DataFrame, read_json, to_datetime
from freqtrade import misc
from freqtrade.configuration import TimeRange
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, TradeList
from freqtrade.data.converter import trades_dict_to_list
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS
from freqtrade.data.converter import trades_dict_to_list, trades_list_to_df
from freqtrade.enums import CandleType
from .idatahandler import IDataHandler
@@ -94,45 +94,46 @@ class JsonDataHandler(IDataHandler):
"""
raise NotImplementedError()
def trades_store(self, pair: str, data: TradeList) -> None:
def _trades_store(self, pair: str, data: DataFrame) -> None:
"""
Store trades data (list of Dicts) to file
:param pair: Pair - used for filename
:param data: List of Lists containing trade data,
:param data: Dataframe containing trades
column sequence as in DEFAULT_TRADES_COLUMNS
"""
filename = self._pair_trades_filename(self._datadir, pair)
misc.file_dump_json(filename, data, is_zip=self._use_zip)
trades = data.values.tolist()
misc.file_dump_json(filename, trades, is_zip=self._use_zip)
def trades_append(self, pair: str, data: TradeList):
def trades_append(self, pair: str, data: DataFrame):
"""
Append data to existing files
:param pair: Pair - used for filename
:param data: List of Lists containing trade data,
:param data: Dataframe containing trades
column sequence as in DEFAULT_TRADES_COLUMNS
"""
raise NotImplementedError()
def _trades_load(self, pair: str, timerange: Optional[TimeRange] = None) -> TradeList:
def _trades_load(self, pair: str, timerange: Optional[TimeRange] = None) -> DataFrame:
"""
Load a pair from file, either .json.gz or .json
# TODO: respect timerange ...
:param pair: Load trades for this pair
:param timerange: Timerange to load trades for - currently not implemented
:return: List of trades
:return: Dataframe containing trades
"""
filename = self._pair_trades_filename(self._datadir, pair)
tradesdata = misc.file_load_json(filename)
if not tradesdata:
return []
return DataFrame(columns=DEFAULT_TRADES_COLUMNS)
if isinstance(tradesdata[0], dict):
# Convert trades dict to list
logger.info("Old trades format detected - converting")
tradesdata = trades_dict_to_list(tradesdata)
pass
return tradesdata
return trades_list_to_df(tradesdata, convert=False)
@classmethod
def _get_file_extension(cls):

View File

@@ -4,7 +4,7 @@ from typing import Optional
from pandas import DataFrame, read_parquet, to_datetime
from freqtrade.configuration import TimeRange
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, TradeList
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS, TradeList
from freqtrade.enums import CandleType
from .idatahandler import IDataHandler
@@ -81,25 +81,22 @@ class ParquetDataHandler(IDataHandler):
"""
raise NotImplementedError()
def trades_store(self, pair: str, data: TradeList) -> None:
def _trades_store(self, pair: str, data: DataFrame) -> None:
"""
Store trades data (list of Dicts) to file
:param pair: Pair - used for filename
:param data: List of Lists containing trade data,
:param data: Dataframe containing trades
column sequence as in DEFAULT_TRADES_COLUMNS
"""
# filename = self._pair_trades_filename(self._datadir, pair)
filename = self._pair_trades_filename(self._datadir, pair)
self.create_dir_if_needed(filename)
data.reset_index(drop=True).to_parquet(filename)
raise NotImplementedError()
# array = pa.array(data)
# array
# feather.write_feather(data, filename)
def trades_append(self, pair: str, data: TradeList):
def trades_append(self, pair: str, data: DataFrame):
"""
Append data to existing files
:param pair: Pair - used for filename
:param data: List of Lists containing trade data,
:param data: Dataframe containing trades
column sequence as in DEFAULT_TRADES_COLUMNS
"""
raise NotImplementedError()
@@ -112,14 +109,13 @@ class ParquetDataHandler(IDataHandler):
:param timerange: Timerange to load trades for - currently not implemented
:return: List of trades
"""
raise NotImplementedError()
# filename = self._pair_trades_filename(self._datadir, pair)
# tradesdata = misc.file_load_json(filename)
filename = self._pair_trades_filename(self._datadir, pair)
if not filename.exists():
return DataFrame(columns=DEFAULT_TRADES_COLUMNS)
# if not tradesdata:
# return []
tradesdata = read_parquet(filename)
# return tradesdata
return tradesdata
@classmethod
def _get_file_extension(cls):

View File

@@ -194,32 +194,35 @@ def calculate_cagr(days_passed: int, starting_balance: float, final_balance: flo
return (final_balance / starting_balance) ** (1 / (days_passed / 365)) - 1
def calculate_expectancy(trades: pd.DataFrame) -> float:
def calculate_expectancy(trades: pd.DataFrame) -> Tuple[float, float]:
"""
Calculate expectancy
:param trades: DataFrame containing trades (requires columns close_date and profit_abs)
:return: expectancy
:return: expectancy, expectancy_ratio
"""
if len(trades) == 0:
return 0
expectancy = 1
expectancy = 0
expectancy_ratio = 100
profit_sum = trades.loc[trades['profit_abs'] > 0, 'profit_abs'].sum()
loss_sum = abs(trades.loc[trades['profit_abs'] < 0, 'profit_abs'].sum())
nb_win_trades = len(trades.loc[trades['profit_abs'] > 0])
nb_loss_trades = len(trades.loc[trades['profit_abs'] < 0])
if len(trades) > 0:
winning_trades = trades.loc[trades['profit_abs'] > 0]
losing_trades = trades.loc[trades['profit_abs'] < 0]
profit_sum = winning_trades['profit_abs'].sum()
loss_sum = abs(losing_trades['profit_abs'].sum())
nb_win_trades = len(winning_trades)
nb_loss_trades = len(losing_trades)
if (nb_win_trades > 0) and (nb_loss_trades > 0):
average_win = profit_sum / nb_win_trades
average_loss = loss_sum / nb_loss_trades
risk_reward_ratio = average_win / average_loss
winrate = nb_win_trades / len(trades)
expectancy = ((1 + risk_reward_ratio) * winrate) - 1
elif nb_win_trades == 0:
expectancy = 0
average_win = (profit_sum / nb_win_trades) if nb_win_trades > 0 else 0
average_loss = (loss_sum / nb_loss_trades) if nb_loss_trades > 0 else 0
winrate = (nb_win_trades / len(trades))
loserate = (nb_loss_trades / len(trades))
return expectancy
expectancy = (winrate * average_win) - (loserate * average_loss)
if (average_loss > 0):
risk_reward_ratio = average_win / average_loss
expectancy_ratio = ((1 + risk_reward_ratio) * winrate) - 1
return expectancy, expectancy_ratio
def calculate_sortino(trades: pd.DataFrame, min_date: datetime, max_date: datetime,

View File

@@ -115,7 +115,7 @@ class Edge:
exchange=self.exchange,
timeframe=self.strategy.timeframe,
timerange=timerange_startup,
data_format=self.config.get('dataformat_ohlcv', 'json'),
data_format=self.config['dataformat_ohlcv'],
candle_type=self.config.get('candle_type_def', CandleType.SPOT),
)
# Download informative pairs too
@@ -132,7 +132,7 @@ class Edge:
exchange=self.exchange,
timeframe=timeframe,
timerange=timerange_startup,
data_format=self.config.get('dataformat_ohlcv', 'json'),
data_format=self.config['dataformat_ohlcv'],
candle_type=self.config.get('candle_type_def', CandleType.SPOT),
)
@@ -142,7 +142,7 @@ class Edge:
timeframe=self.strategy.timeframe,
timerange=self._timerange,
startup_candles=self.strategy.startup_candle_count,
data_format=self.config.get('dataformat_ohlcv', 'json'),
data_format=self.config['dataformat_ohlcv'],
candle_type=self.config.get('candle_type_def', CandleType.SPOT),
)
@@ -172,13 +172,7 @@ class Edge:
pair_data = pair_data.sort_values(by=['date'])
pair_data = pair_data.reset_index(drop=True)
df_analyzed = self.strategy.advise_exit(
dataframe=self.strategy.advise_entry(
dataframe=pair_data,
metadata={'pair': pair}
),
metadata={'pair': pair}
)[headers].copy()
df_analyzed = self.strategy.ft_advise_signals(pair_data, {'pair': pair})[headers].copy()
trades += self._find_trades_for_stoploss_range(df_analyzed, pair, self._stoploss_range)

View File

@@ -1,7 +1,7 @@
from enum import Enum
class MarginMode(Enum):
class MarginMode(str, Enum):
"""
Enum to distinguish between
cross margin/futures margin_mode and

View File

@@ -13,11 +13,11 @@ from freqtrade.exchange.exchange_utils import (ROUND_DOWN, ROUND_UP, amount_to_c
amount_to_contracts, amount_to_precision,
available_exchanges, ccxt_exchanges,
contracts_to_amount, date_minus_candles,
is_exchange_known_ccxt, market_is_active,
price_to_precision, timeframe_to_minutes,
timeframe_to_msecs, timeframe_to_next_date,
timeframe_to_prev_date, timeframe_to_seconds,
validate_exchange, validate_exchanges)
is_exchange_known_ccxt, list_available_exchanges,
market_is_active, price_to_precision,
timeframe_to_minutes, timeframe_to_msecs,
timeframe_to_next_date, timeframe_to_prev_date,
timeframe_to_seconds, validate_exchange)
from freqtrade.exchange.gate import Gate
from freqtrade.exchange.hitbtc import Hitbtc
from freqtrade.exchange.huobi import Huobi

View File

@@ -34,6 +34,7 @@ class Binance(Exchange):
"tickers_have_price": False,
"floor_leverage": True,
"stop_price_type_field": "workingType",
"order_props_in_contracts": ['amount', 'cost', 'filled', 'remaining'],
"stop_price_type_value_mapping": {
PriceType.LAST: "CONTRACT_PRICE",
PriceType.MARK: "MARK_PRICE",

File diff suppressed because it is too large Load Diff

View File

@@ -7,10 +7,10 @@ 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.exchange import Exchange
from freqtrade.exchange.common import retrier
from freqtrade.exchange.exchange_utils import timeframe_to_msecs
logger = logging.getLogger(__name__)
@@ -27,8 +27,8 @@ class Bybit(Exchange):
"""
_ft_has: Dict = {
"ohlcv_candle_limit": 200,
"ohlcv_has_history": False,
"ohlcv_candle_limit": 1000,
"ohlcv_has_history": True,
}
_ft_has_futures: Dict = {
"ohlcv_has_history": True,
@@ -91,28 +91,13 @@ class Bybit(Exchange):
except ccxt.BaseError as e:
raise OperationalException(e) from e
async def _fetch_funding_rate_history(
self,
pair: str,
timeframe: str,
limit: int,
since_ms: Optional[int] = None,
) -> List[List]:
"""
Fetch funding rate history
Necessary workaround until https://github.com/ccxt/ccxt/issues/15990 is fixed.
"""
params = {}
if since_ms:
until = since_ms + (timeframe_to_msecs(timeframe) * self._ft_has['ohlcv_candle_limit'])
params.update({'until': until})
# Funding rate
data = await self._api_async.fetch_funding_rate_history(
pair, since=since_ms,
params=params)
# Convert funding rate to candle pattern
data = [[x['timestamp'], x['fundingRate'], 0, 0, 0, 0] for x in data]
return data
def ohlcv_candle_limit(
self, timeframe: str, candle_type: CandleType, since_ms: Optional[int] = None) -> int:
if candle_type in (CandleType.FUNDING_RATE):
return 200
return super().ohlcv_candle_limit(timeframe, candle_type, since_ms)
def _lev_prep(self, pair: str, leverage: float, side: BuySell, accept_fail: bool = False):
if self.trading_mode != TradingMode.SPOT:

View File

@@ -5,6 +5,7 @@ Cryptocurrency Exchanges support
import asyncio
import inspect
import logging
import signal
from copy import deepcopy
from datetime import datetime, timedelta, timezone
from math import floor
@@ -80,9 +81,8 @@ class Exchange:
"mark_ohlcv_price": "mark",
"mark_ohlcv_timeframe": "8h",
"ccxt_futures_name": "swap",
"fee_cost_in_contracts": False, # Fee cost needs contract conversion
"needs_trading_fees": False, # use fetch_trading_fees to cache fees
"order_props_in_contracts": ['amount', 'cost', 'filled', 'remaining'],
"order_props_in_contracts": ['amount', 'filled', 'remaining'],
# Override createMarketBuyOrderRequiresPrice where ccxt has it wrong
"marketOrderRequiresPrice": False,
}
@@ -264,8 +264,6 @@ class Exchange:
except ccxt.BaseError as e:
raise OperationalException(f"Initialization of ccxt failed. Reason: {e}") from e
self.set_sandbox(api, exchange_config, name)
return api
@property
@@ -301,7 +299,7 @@ class Exchange:
return list((self._api.timeframes or {}).keys())
@property
def markets(self) -> Dict:
def markets(self) -> Dict[str, Any]:
"""exchange ccxt markets"""
if not self._markets:
logger.info("Markets were not loaded. Loading them now..")
@@ -466,16 +464,6 @@ class Exchange:
return amount_to_contract_precision(amount, self.get_precision_amount(pair),
self.precisionMode, contract_size)
def set_sandbox(self, api: ccxt.Exchange, exchange_config: dict, name: str) -> None:
if exchange_config.get('sandbox'):
if api.urls.get('test'):
api.urls['api'] = api.urls['test']
logger.info("Enabled Sandbox API on %s", name)
else:
logger.warning(
f"No Sandbox URL in CCXT for {name}, exiting. Please check your config.json")
raise OperationalException(f'Exchange {name} does not provide a sandbox api')
def _load_async_markets(self, reload: bool = False) -> None:
try:
if self._api_async:
@@ -581,7 +569,7 @@ class Exchange:
for pair in [f"{curr_1}/{curr_2}", f"{curr_2}/{curr_1}"]:
if pair in self.markets and self.markets[pair].get('active'):
return pair
raise ExchangeError(f"Could not combine {curr_1} and {curr_2} to get a valid pair.")
raise ValueError(f"Could not combine {curr_1} and {curr_2} to get a valid pair.")
def validate_timeframes(self, timeframe: Optional[str]) -> None:
"""
@@ -1148,8 +1136,8 @@ class Exchange:
else:
limit_rate = stop_price * (2 - limit_price_pct)
bad_stop_price = ((stop_price <= limit_rate) if side ==
"sell" else (stop_price >= limit_rate))
bad_stop_price = ((stop_price < limit_rate) if side ==
"sell" else (stop_price > limit_rate))
# Ensure rate is less than stop price
if bad_stop_price:
# This can for example happen if the stop / liquidation price is set to 0
@@ -1662,39 +1650,18 @@ class Exchange:
price_side = self._get_price_side(side, is_short, conf_strategy)
price_side_word = price_side.capitalize()
if conf_strategy.get('use_order_book', False):
order_book_top = conf_strategy.get('order_book_top', 1)
if order_book is None:
order_book = self.fetch_l2_order_book(pair, order_book_top)
logger.debug('order_book %s', order_book)
# top 1 = index 0
try:
obside: OBLiteral = 'bids' if price_side == 'bid' else 'asks'
rate = order_book[obside][order_book_top - 1][0]
except (IndexError, KeyError) as e:
logger.warning(
f"{pair} - {name} Price at location {order_book_top} from orderbook "
f"could not be determined. Orderbook: {order_book}"
)
raise PricingError from e
logger.debug(f"{pair} - {name} price from orderbook {price_side_word}"
f"side - top {order_book_top} order book {side} rate {rate:.8f}")
rate = self._get_rate_from_ob(pair, side, order_book, name, price_side,
order_book_top)
else:
logger.debug(f"Using Last {price_side_word} / Last Price")
logger.debug(f"Using Last {price_side.capitalize()} / Last Price")
if ticker is None:
ticker = self.fetch_ticker(pair)
ticker_rate = ticker[price_side]
if ticker['last'] and ticker_rate:
if side == 'entry' and ticker_rate > ticker['last']:
balance = conf_strategy.get('price_last_balance', 0.0)
ticker_rate = ticker_rate + balance * (ticker['last'] - ticker_rate)
elif side == 'exit' and ticker_rate < ticker['last']:
balance = conf_strategy.get('price_last_balance', 0.0)
ticker_rate = ticker_rate - balance * (ticker_rate - ticker['last'])
rate = ticker_rate
rate = self._get_rate_from_ticker(side, ticker, conf_strategy, price_side)
if rate is None:
raise PricingError(f"{name}-Rate for {pair} was empty.")
@@ -1703,6 +1670,43 @@ class Exchange:
return rate
def _get_rate_from_ticker(self, side: EntryExit, ticker: Ticker, conf_strategy: Dict[str, Any],
price_side: BidAsk) -> Optional[float]:
"""
Get rate from ticker.
"""
ticker_rate = ticker[price_side]
if ticker['last'] and ticker_rate:
if side == 'entry' and ticker_rate > ticker['last']:
balance = conf_strategy.get('price_last_balance', 0.0)
ticker_rate = ticker_rate + balance * (ticker['last'] - ticker_rate)
elif side == 'exit' and ticker_rate < ticker['last']:
balance = conf_strategy.get('price_last_balance', 0.0)
ticker_rate = ticker_rate - balance * (ticker_rate - ticker['last'])
rate = ticker_rate
return rate
def _get_rate_from_ob(self, pair: str, side: EntryExit, order_book: OrderBook, name: str,
price_side: BidAsk, order_book_top: int) -> float:
"""
Get rate from orderbook
:raises: PricingError if rate could not be determined.
"""
logger.debug('order_book %s', order_book)
# top 1 = index 0
try:
obside: OBLiteral = 'bids' if price_side == 'bid' else 'asks'
rate = order_book[obside][order_book_top - 1][0]
except (IndexError, KeyError) as e:
logger.warning(
f"{pair} - {name} Price at location {order_book_top} from orderbook "
f"could not be determined. Orderbook: {order_book}"
)
raise PricingError from e
logger.debug(f"{pair} - {name} price from orderbook {price_side.capitalize()}"
f"side - top {order_book_top} order book {side} rate {rate:.8f}")
return rate
def get_rates(self, pair: str, refresh: bool, is_short: bool) -> Tuple[float, float]:
entry_rate = None
exit_rate = None
@@ -1843,9 +1847,6 @@ class Exchange:
if fee_curr is None:
return None
fee_cost = float(fee['cost'])
if self._ft_has['fee_cost_in_contracts']:
# Convert cost via "contracts" conversion
fee_cost = self._contracts_to_amount(symbol, fee['cost'])
# Calculate fee based on order details
if fee_curr == self.get_pair_base_currency(symbol):
@@ -1864,7 +1865,7 @@ class Exchange:
tick = self.fetch_ticker(comb)
fee_to_quote_rate = safe_value_fallback2(tick, tick, 'last', 'ask')
except ExchangeError:
except (ValueError, ExchangeError):
fee_to_quote_rate = self._config['exchange'].get('unknown_fee_rate', None)
if not fee_to_quote_rate:
return None
@@ -2151,7 +2152,7 @@ class Exchange:
except IndexError:
logger.exception("Error loading %s. Result was %s.", pair, data)
return pair, timeframe, candle_type, [], self._ohlcv_partial_candle
logger.debug("Done fetching pair %s, interval %s ...", pair, timeframe)
logger.debug("Done fetching pair %s, %s interval %s...", pair, candle_type, timeframe)
return pair, timeframe, candle_type, data, self._ohlcv_partial_candle
except ccxt.NotSupported as e:
@@ -2253,20 +2254,24 @@ class Exchange:
from_id = t[-1][1]
trades.extend(t[:-1])
while True:
t = await self._async_fetch_trades(pair,
params={self._trades_pagination_arg: from_id})
if t:
# Skip last id since its the key for the next call
trades.extend(t[:-1])
if from_id == t[-1][1] or t[-1][0] > until:
logger.debug(f"Stopping because from_id did not change. "
f"Reached {t[-1][0]} > {until}")
# Reached the end of the defined-download period - add last trade as well.
trades.extend(t[-1:])
break
try:
t = await self._async_fetch_trades(pair,
params={self._trades_pagination_arg: from_id})
if t:
# Skip last id since its the key for the next call
trades.extend(t[:-1])
if from_id == t[-1][1] or t[-1][0] > until:
logger.debug(f"Stopping because from_id did not change. "
f"Reached {t[-1][0]} > {until}")
# Reached the end of the defined-download period - add last trade as well.
trades.extend(t[-1:])
break
from_id = t[-1][1]
else:
from_id = t[-1][1]
else:
break
except asyncio.CancelledError:
logger.debug("Async operation Interrupted, breaking trades DL loop.")
break
return (pair, trades)
@@ -2286,16 +2291,20 @@ class Exchange:
# DEFAULT_TRADES_COLUMNS: 0 -> timestamp
# DEFAULT_TRADES_COLUMNS: 1 -> id
while True:
t = await self._async_fetch_trades(pair, since=since)
if t:
since = t[-1][0]
trades.extend(t)
# Reached the end of the defined-download period
if until and t[-1][0] > until:
logger.debug(
f"Stopping because until was reached. {t[-1][0]} > {until}")
try:
t = await self._async_fetch_trades(pair, since=since)
if t:
since = t[-1][0]
trades.extend(t)
# Reached the end of the defined-download period
if until and t[-1][0] > until:
logger.debug(
f"Stopping because until was reached. {t[-1][0]} > {until}")
break
else:
break
else:
except asyncio.CancelledError:
logger.debug("Async operation Interrupted, breaking trades DL loop.")
break
return (pair, trades)
@@ -2344,9 +2353,16 @@ class Exchange:
raise OperationalException("This exchange does not support downloading Trades.")
with self._loop_lock:
return self.loop.run_until_complete(
self._async_get_trade_history(pair=pair, since=since,
until=until, from_id=from_id))
task = asyncio.ensure_future(self._async_get_trade_history(
pair=pair, since=since, until=until, from_id=from_id))
for sig in [signal.SIGINT, signal.SIGTERM]:
try:
self.loop.add_signal_handler(sig, task.cancel)
except NotImplementedError:
# Not all platforms implement signals (e.g. windows)
pass
return self.loop.run_until_complete(task)
@retrier
def _get_funding_fees_from_exchange(self, pair: str, since: Union[datetime, int]) -> float:

View File

@@ -9,7 +9,9 @@ import ccxt
from ccxt import (DECIMAL_PLACES, ROUND, ROUND_DOWN, ROUND_UP, SIGNIFICANT_DIGITS, TICK_SIZE,
TRUNCATE, decimal_to_precision)
from freqtrade.exchange.common import BAD_EXCHANGES, EXCHANGE_HAS_OPTIONAL, EXCHANGE_HAS_REQUIRED
from freqtrade.exchange.common import (BAD_EXCHANGES, EXCHANGE_HAS_OPTIONAL, EXCHANGE_HAS_REQUIRED,
SUPPORTED_EXCHANGES)
from freqtrade.types import ValidExchangesType
from freqtrade.util import FtPrecise
from freqtrade.util.datetime_helpers import dt_from_ts, dt_ts
@@ -55,14 +57,41 @@ def validate_exchange(exchange: str) -> Tuple[bool, str]:
return True, ''
def validate_exchanges(all_exchanges: bool) -> List[Tuple[str, bool, str]]:
def _build_exchange_list_entry(
exchange_name: str, exchangeClasses: Dict[str, Any]) -> ValidExchangesType:
valid, comment = validate_exchange(exchange_name)
result: ValidExchangesType = {
'name': exchange_name,
'valid': valid,
'supported': exchange_name.lower() in SUPPORTED_EXCHANGES,
'comment': comment,
'trade_modes': [{'trading_mode': 'spot', 'margin_mode': ''}],
}
if resolved := exchangeClasses.get(exchange_name.lower()):
supported_modes = [{'trading_mode': 'spot', 'margin_mode': ''}] + [
{'trading_mode': tm.value, 'margin_mode': mm.value}
for tm, mm in resolved['class']._supported_trading_mode_margin_pairs
]
result.update({
'trade_modes': supported_modes,
})
return result
def list_available_exchanges(all_exchanges: bool) -> List[ValidExchangesType]:
"""
:return: List of tuples with exchangename, valid, reason.
"""
exchanges = ccxt_exchanges() if all_exchanges else available_exchanges()
exchanges_valid = [
(e, *validate_exchange(e)) for e in exchanges
from freqtrade.resolvers.exchange_resolver import ExchangeResolver
subclassed = {e['name'].lower(): e for e in ExchangeResolver.search_all_objects({}, False)}
exchanges_valid: List[ValidExchangesType] = [
_build_exchange_list_entry(e, subclassed) for e in exchanges
]
return exchanges_valid

View File

@@ -33,9 +33,6 @@ class Gate(Exchange):
_ft_has_futures: Dict = {
"needs_trading_fees": True,
"marketOrderRequiresPrice": False,
"tickers_have_bid_ask": False,
"fee_cost_in_contracts": False, # Set explicitly to false for clarity
"order_props_in_contracts": ['amount', 'filled', 'remaining'],
"stop_price_type_field": "price_type",
"stop_price_type_value_mapping": {
PriceType.LAST: 0,

View File

@@ -32,7 +32,6 @@ class Okx(Exchange):
}
_ft_has_futures: Dict = {
"tickers_have_quoteVolume": False,
"fee_cost_in_contracts": True,
"stop_price_type_field": "slTriggerPxType",
"stop_price_type_value_mapping": {
PriceType.LAST: "last",
@@ -125,6 +124,20 @@ class Okx(Exchange):
params['posSide'] = self._get_posSide(side, reduceOnly)
return params
def __fetch_leverage_already_set(self, pair: str, leverage: float, side: BuySell) -> bool:
try:
res_lev = self._api.fetch_leverage(symbol=pair, params={
"mgnMode": self.margin_mode.value,
"posSide": self._get_posSide(side, False),
})
self._log_exchange_response('get_leverage', res_lev)
already_set = all(float(x['lever']) == leverage for x in res_lev['data'])
return already_set
except ccxt.BaseError:
# Assume all errors as "not set yet"
return False
@retrier
def _lev_prep(self, pair: str, leverage: float, side: BuySell, accept_fail: bool = False):
if self.trading_mode != TradingMode.SPOT and self.margin_mode is not None:
@@ -141,8 +154,11 @@ class Okx(Exchange):
except ccxt.DDoSProtection as e:
raise DDosProtection(e) from e
except (ccxt.NetworkError, ccxt.ExchangeError) as e:
raise TemporaryError(
f'Could not set leverage due to {e.__class__.__name__}. Message: {e}') from e
already_set = self.__fetch_leverage_already_set(pair, leverage, side)
if not already_set:
raise TemporaryError(
f'Could not set leverage due to {e.__class__.__name__}. Message: {e}'
) from e
except ccxt.BaseError as e:
raise OperationalException(e) from e
@@ -182,6 +198,7 @@ class Okx(Exchange):
order_reg['type'] = 'stoploss'
order_reg['status_stop'] = 'triggered'
return order_reg
order = self._order_contracts_to_amount(order)
order['type'] = 'stoploss'
return order

View File

@@ -2,7 +2,7 @@ import logging
import random
from abc import abstractmethod
from enum import Enum
from typing import Optional, Type, Union
from typing import List, Optional, Type, Union
import gymnasium as gym
import numpy as np
@@ -11,6 +11,8 @@ from gymnasium import spaces
from gymnasium.utils import seeding
from pandas import DataFrame
from freqtrade.exceptions import OperationalException
logger = logging.getLogger(__name__)
@@ -80,8 +82,9 @@ class BaseEnvironment(gym.Env):
self.can_short: bool = can_short
self.live: bool = live
if not self.live and self.add_state_info:
self.add_state_info = False
logger.warning("add_state_info is not available in backtesting. Deactivating.")
raise OperationalException("`add_state_info` is not available in backtesting. Change "
"parameter to false in your rl_config. See `add_state_info` "
"docs for more info.")
self.seed(seed)
self.reset_env(df, prices, window_size, reward_kwargs, starting_point)
@@ -141,6 +144,9 @@ class BaseEnvironment(gym.Env):
Unique to the environment action count. Must be inherited.
"""
def action_masks(self) -> List[bool]:
return [self._is_valid(action.value) for action in self.actions]
def seed(self, seed: int = 1):
self.np_random, seed = seeding.np_random(seed)
return [seed]

View File

@@ -13,7 +13,8 @@ import pandas as pd
import torch as th
import torch.multiprocessing
from pandas import DataFrame
from stable_baselines3.common.callbacks import EvalCallback
from sb3_contrib.common.maskable.callbacks import MaskableEvalCallback
from sb3_contrib.common.maskable.utils import is_masking_supported
from stable_baselines3.common.monitor import Monitor
from stable_baselines3.common.utils import set_random_seed
from stable_baselines3.common.vec_env import SubprocVecEnv, VecMonitor
@@ -48,7 +49,7 @@ class BaseReinforcementLearningModel(IFreqaiModel):
self.reward_params = self.freqai_info['rl_config']['model_reward_parameters']
self.train_env: Union[VecMonitor, SubprocVecEnv, gym.Env] = gym.Env()
self.eval_env: Union[VecMonitor, SubprocVecEnv, gym.Env] = gym.Env()
self.eval_callback: Optional[EvalCallback] = None
self.eval_callback: Optional[MaskableEvalCallback] = None
self.model_type = self.freqai_info['rl_config']['model_type']
self.rl_config = self.freqai_info['rl_config']
self.df_raw: DataFrame = DataFrame()
@@ -82,6 +83,9 @@ class BaseReinforcementLearningModel(IFreqaiModel):
if self.ft_params.get('use_DBSCAN_to_remove_outliers', False):
self.ft_params.update({'use_DBSCAN_to_remove_outliers': False})
logger.warning('User tried to use DBSCAN with RL. Deactivating DBSCAN.')
if self.ft_params.get('DI_threshold', False):
self.ft_params.update({'DI_threshold': False})
logger.warning('User tried to use DI_threshold with RL. Deactivating DI_threshold.')
if self.freqai_info['data_split_parameters'].get('shuffle', False):
self.freqai_info['data_split_parameters'].update({'shuffle': False})
logger.warning('User tried to shuffle training data. Setting shuffle to False')
@@ -107,27 +111,37 @@ class BaseReinforcementLearningModel(IFreqaiModel):
training_filter=True,
)
data_dictionary: Dict[str, Any] = dk.make_train_test_datasets(
dd: Dict[str, Any] = dk.make_train_test_datasets(
features_filtered, labels_filtered)
self.df_raw = copy.deepcopy(data_dictionary["train_features"])
self.df_raw = copy.deepcopy(dd["train_features"])
dk.fit_labels() # FIXME useless for now, but just satiating append methods
# normalize all data based on train_dataset only
prices_train, prices_test = self.build_ohlc_price_dataframes(dk.data_dictionary, pair, dk)
data_dictionary = dk.normalize_data(data_dictionary)
dk.feature_pipeline = self.define_data_pipeline(threads=dk.thread_count)
# data cleaning/analysis
self.data_cleaning_train(dk)
(dd["train_features"],
dd["train_labels"],
dd["train_weights"]) = dk.feature_pipeline.fit_transform(dd["train_features"],
dd["train_labels"],
dd["train_weights"])
if self.freqai_info.get('data_split_parameters', {}).get('test_size', 0.1) != 0:
(dd["test_features"],
dd["test_labels"],
dd["test_weights"]) = dk.feature_pipeline.transform(dd["test_features"],
dd["test_labels"],
dd["test_weights"])
logger.info(
f'Training model on {len(dk.data_dictionary["train_features"].columns)}'
f' features and {len(data_dictionary["train_features"])} data points'
f' features and {len(dd["train_features"])} data points'
)
self.set_train_and_eval_environments(data_dictionary, prices_train, prices_test, dk)
self.set_train_and_eval_environments(dd, prices_train, prices_test, dk)
model = self.fit(data_dictionary, dk)
model = self.fit(dd, dk)
logger.info(f"--------------------done training {pair}--------------------")
@@ -151,9 +165,11 @@ class BaseReinforcementLearningModel(IFreqaiModel):
self.train_env = self.MyRLEnv(df=train_df, prices=prices_train, **env_info)
self.eval_env = Monitor(self.MyRLEnv(df=test_df, prices=prices_test, **env_info))
self.eval_callback = EvalCallback(self.eval_env, deterministic=True,
render=False, eval_freq=len(train_df),
best_model_save_path=str(dk.data_path))
self.eval_callback = MaskableEvalCallback(self.eval_env, deterministic=True,
render=False, eval_freq=len(train_df),
best_model_save_path=str(dk.data_path),
use_masking=(self.model_type == 'MaskablePPO' and
is_masking_supported(self.eval_env)))
actions = self.train_env.get_actions()
self.tensorboard_callback = TensorboardCallback(verbose=1, actions=actions)
@@ -236,13 +252,10 @@ class BaseReinforcementLearningModel(IFreqaiModel):
unfiltered_df, dk.training_features_list, training_filter=False
)
filtered_dataframe = self.drop_ohlc_from_df(filtered_dataframe, dk)
dk.data_dictionary["prediction_features"] = self.drop_ohlc_from_df(filtered_dataframe, dk)
filtered_dataframe = dk.normalize_data_from_metadata(filtered_dataframe)
dk.data_dictionary["prediction_features"] = filtered_dataframe
# optional additional data cleaning/analysis
self.data_cleaning_predict(dk)
dk.data_dictionary["prediction_features"], _, _ = dk.feature_pipeline.transform(
dk.data_dictionary["prediction_features"], outlier_check=True)
pred_df = self.rl_model_predict(
dk.data_dictionary["prediction_features"], dk, self.model)

View File

@@ -17,8 +17,8 @@ logger = logging.getLogger(__name__)
class BaseClassifierModel(IFreqaiModel):
"""
Base class for regression type models (e.g. Catboost, LightGBM, XGboost etc.).
User *must* inherit from this class and set fit() and predict(). See example scripts
such as prediction_models/CatboostPredictionModel.py for guidance.
User *must* inherit from this class and set fit(). See example scripts
such as prediction_models/CatboostClassifier.py for guidance.
"""
def train(
@@ -50,21 +50,30 @@ class BaseClassifierModel(IFreqaiModel):
logger.info(f"-------------------- Training on data from {start_date} to "
f"{end_date} --------------------")
# split data into train/test data.
data_dictionary = dk.make_train_test_datasets(features_filtered, labels_filtered)
dd = dk.make_train_test_datasets(features_filtered, labels_filtered)
if not self.freqai_info.get("fit_live_predictions_candles", 0) or not self.live:
dk.fit_labels()
# normalize all data based on train_dataset only
data_dictionary = dk.normalize_data(data_dictionary)
dk.feature_pipeline = self.define_data_pipeline(threads=dk.thread_count)
# optional additional data cleaning/analysis
self.data_cleaning_train(dk)
(dd["train_features"],
dd["train_labels"],
dd["train_weights"]) = dk.feature_pipeline.fit_transform(dd["train_features"],
dd["train_labels"],
dd["train_weights"])
if self.freqai_info.get('data_split_parameters', {}).get('test_size', 0.1) != 0:
(dd["test_features"],
dd["test_labels"],
dd["test_weights"]) = dk.feature_pipeline.transform(dd["test_features"],
dd["test_labels"],
dd["test_weights"])
logger.info(
f"Training model on {len(dk.data_dictionary['train_features'].columns)} features"
)
logger.info(f"Training model on {len(data_dictionary['train_features'])} data points")
logger.info(f"Training model on {len(dd['train_features'])} data points")
model = self.fit(data_dictionary, dk)
model = self.fit(dd, dk)
end_time = time()
@@ -89,10 +98,11 @@ class BaseClassifierModel(IFreqaiModel):
filtered_df, _ = dk.filter_features(
unfiltered_df, dk.training_features_list, training_filter=False
)
filtered_df = dk.normalize_data_from_metadata(filtered_df)
dk.data_dictionary["prediction_features"] = filtered_df
self.data_cleaning_predict(dk)
dk.data_dictionary["prediction_features"], outliers, _ = dk.feature_pipeline.transform(
dk.data_dictionary["prediction_features"], outlier_check=True)
predictions = self.model.predict(dk.data_dictionary["prediction_features"])
if self.CONV_WIDTH == 1:
@@ -107,4 +117,10 @@ class BaseClassifierModel(IFreqaiModel):
pred_df = pd.concat([pred_df, pred_df_prob], axis=1)
if dk.feature_pipeline["di"]:
dk.DI_values = dk.feature_pipeline["di"].di_values
else:
dk.DI_values = np.zeros(outliers.shape[0])
dk.do_predict = outliers
return (pred_df, dk.do_predict)

View File

@@ -1,5 +1,6 @@
import logging
from typing import Dict, List, Tuple
from time import time
from typing import Any, Dict, List, Tuple
import numpy as np
import numpy.typing as npt
@@ -35,6 +36,7 @@ class BasePyTorchClassifier(BasePyTorchModel):
return dataframe
"""
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.class_name_to_index = None
@@ -68,9 +70,12 @@ class BasePyTorchClassifier(BasePyTorchModel):
filtered_df, _ = dk.filter_features(
unfiltered_df, dk.training_features_list, training_filter=False
)
filtered_df = dk.normalize_data_from_metadata(filtered_df)
dk.data_dictionary["prediction_features"] = filtered_df
self.data_cleaning_predict(dk)
dk.data_dictionary["prediction_features"], outliers, _ = dk.feature_pipeline.transform(
dk.data_dictionary["prediction_features"], outlier_check=True)
x = self.data_convertor.convert_x(
dk.data_dictionary["prediction_features"],
device=self.device
@@ -85,6 +90,13 @@ class BasePyTorchClassifier(BasePyTorchModel):
pred_df_prob = DataFrame(probs.detach().tolist(), columns=class_names)
pred_df = DataFrame(predicted_classes_str, columns=[dk.label_list[0]])
pred_df = pd.concat([pred_df, pred_df_prob], axis=1)
if dk.feature_pipeline["di"]:
dk.DI_values = dk.feature_pipeline["di"].di_values
else:
dk.DI_values = np.zeros(outliers.shape[0])
dk.do_predict = outliers
return (pred_df, dk.do_predict)
def encode_class_names(
@@ -149,3 +161,58 @@ class BasePyTorchClassifier(BasePyTorchModel):
)
return self.class_names
def train(
self, unfiltered_df: DataFrame, pair: str, dk: FreqaiDataKitchen, **kwargs
) -> Any:
"""
Filter the training data and train a model to it. Train makes heavy use of the datakitchen
for storing, saving, loading, and analyzing the data.
:param unfiltered_df: Full dataframe for the current training period
:return:
:model: Trained model which can be used to inference (self.predict)
"""
logger.info(f"-------------------- Starting training {pair} --------------------")
start_time = time()
features_filtered, labels_filtered = dk.filter_features(
unfiltered_df,
dk.training_features_list,
dk.label_list,
training_filter=True,
)
# split data into train/test data.
dd = dk.make_train_test_datasets(features_filtered, labels_filtered)
if not self.freqai_info.get("fit_live_predictions_candles", 0) or not self.live:
dk.fit_labels()
dk.feature_pipeline = self.define_data_pipeline(threads=dk.thread_count)
(dd["train_features"],
dd["train_labels"],
dd["train_weights"]) = dk.feature_pipeline.fit_transform(dd["train_features"],
dd["train_labels"],
dd["train_weights"])
if self.freqai_info.get('data_split_parameters', {}).get('test_size', 0.1) != 0:
(dd["test_features"],
dd["test_labels"],
dd["test_weights"]) = dk.feature_pipeline.transform(dd["test_features"],
dd["test_labels"],
dd["test_weights"])
logger.info(
f"Training model on {len(dk.data_dictionary['train_features'].columns)} features"
)
logger.info(f"Training model on {len(dd['train_features'])} data points")
model = self.fit(dd, dk)
end_time = time()
logger.info(f"-------------------- Done training {pair} "
f"({end_time - start_time:.2f} secs) --------------------")
return model

View File

@@ -1,12 +1,8 @@
import logging
from abc import ABC, abstractmethod
from time import time
from typing import Any
import torch
from pandas import DataFrame
from freqtrade.freqai.data_kitchen import FreqaiDataKitchen
from freqtrade.freqai.freqai_interface import IFreqaiModel
from freqtrade.freqai.torch.PyTorchDataConvertor import PyTorchDataConvertor
@@ -29,51 +25,6 @@ class BasePyTorchModel(IFreqaiModel, ABC):
self.splits = ["train", "test"] if test_size != 0 else ["train"]
self.window_size = self.freqai_info.get("conv_width", 1)
def train(
self, unfiltered_df: DataFrame, pair: str, dk: FreqaiDataKitchen, **kwargs
) -> Any:
"""
Filter the training data and train a model to it. Train makes heavy use of the datakitchen
for storing, saving, loading, and analyzing the data.
:param unfiltered_df: Full dataframe for the current training period
:return:
:model: Trained model which can be used to inference (self.predict)
"""
logger.info(f"-------------------- Starting training {pair} --------------------")
start_time = time()
features_filtered, labels_filtered = dk.filter_features(
unfiltered_df,
dk.training_features_list,
dk.label_list,
training_filter=True,
)
# split data into train/test data.
data_dictionary = dk.make_train_test_datasets(features_filtered, labels_filtered)
if not self.freqai_info.get("fit_live_predictions", 0) or not self.live:
dk.fit_labels()
# normalize all data based on train_dataset only
data_dictionary = dk.normalize_data(data_dictionary)
# optional additional data cleaning/analysis
self.data_cleaning_train(dk)
logger.info(
f"Training model on {len(dk.data_dictionary['train_features'].columns)} features"
)
logger.info(f"Training model on {len(data_dictionary['train_features'])} data points")
model = self.fit(data_dictionary, dk)
end_time = time()
logger.info(f"-------------------- Done training {pair} "
f"({end_time - start_time:.2f} secs) --------------------")
return model
@property
@abstractmethod
def data_convertor(self) -> PyTorchDataConvertor:

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