Compare commits

...

1765 Commits

Author SHA1 Message Date
robcaulk
6c96a2464f Merge remote-tracking branch 'origin/develop' into feat/convolutional-neural-net 2022-12-16 12:24:35 +01:00
Matthias
935275010f Remove some unused fixtures 2022-12-16 06:46:54 +01:00
Matthias
bc10bcaf61 Merge pull request #7901 from samgermain/delist-bibox
delisted bibox following ccxt PR https://github.com/ccxt/ccxt/pull/16067
2022-12-15 23:16:33 +01:00
Sam Germain
32d57f624e delisted bibox following ccxt PR https://github.com/ccxt/ccxt/pull/16067 2022-12-15 15:00:27 -05:00
Matthias
2828255435 Merge pull request #7842 from wizrds/feat/refactor-emc
Change to broadcasting single candles in Producer/Consumer
2022-12-15 19:47:29 +01:00
Matthias
b915872f66 Merge pull request #7899 from freqtrade/fix/multiproc-dp
Ensure data provider is passed to multiproc envs
2022-12-15 19:31:23 +01:00
robcaulk
581a5296cc fix docstrings to reflect new env_info changes 2022-12-15 16:50:08 +01:00
robcaulk
7b4abd5ef5 use a dictionary to make code more readable 2022-12-15 12:25:33 +01:00
Matthias
7a0eadbdf5 Don't recalc profit on closed trades 2022-12-15 07:05:07 +01:00
Matthias
33dce5cf10 Clarify partial exit calculation messaging 2022-12-15 07:05:07 +01:00
Matthias
ca2a878b86 Update test naming 2022-12-14 20:06:55 +01:00
Emre
d3ad5cb722 Merge branch 'fix/multiproc-dp' of https://github.com/freqtrade/freqtrade into fix/multiproc-dp 2022-12-14 22:04:43 +03:00
Emre
3af2251ce8 Fix add_state_info backtesting bug 2022-12-14 22:03:23 +03:00
Emre
2018da0767 Add env_info dict to base environment 2022-12-14 22:03:05 +03:00
Matthias
fa260e6560 Move "replace or append" decision to dataprovider 2022-12-14 19:56:54 +01:00
robcaulk
dac1c8ab89 fix isort 2022-12-14 18:28:52 +01:00
robcaulk
2285ca7d2a add dp to multiproc 2022-12-14 18:22:20 +01:00
Matthias
350cebb0a8 Merge pull request #7898 from initrv/patch-1
fix doc minimal_roi
2022-12-14 12:56:51 +01:00
initrv
de19d1cfbb fix doc minimal_roi 2022-12-14 13:36:07 +03:00
Matthias
97fee37072 Improve emc test 2022-12-14 07:22:51 +01:00
Matthias
1d92db7805 Change CI to actually run one 2 randomized point. 2022-12-13 19:23:40 +01:00
Matthias
3c2a802ec0 Merge pull request #7897 from freqtrade/revert-7884-dependabot/pip/develop/scikit-learn-1.2.0
Revert "Bump scikit-learn from 1.1.3 to 1.2.0"
2022-12-13 19:23:19 +01:00
Matthias
fed46d330f Revert "Bump scikit-learn from 1.1.3 to 1.2.0" 2022-12-13 18:14:56 +01:00
Matthias
c042d0146e Don't run gc_setup during tests 2022-12-13 17:14:28 +00:00
Robert Caulk
e6da646e2f Merge pull request #7866 from initrv/cleanup-tensorboard-callback
Cleanup tensorboard callback
2022-12-13 09:05:46 +01:00
Timothy Pogue
0dd3836cc7 fix rpc method docstring 2022-12-12 22:47:35 -07:00
Matthias
1c0c4fd420 Improve test 2022-12-12 22:47:35 -07:00
Matthias
a693495a6d Improve external_candle aggregation 2022-12-12 22:47:35 -07:00
Matthias
96edd31458 Test add_external_candle 2022-12-12 22:47:35 -07:00
Timothy Pogue
414c0ce050 change unused var 2022-12-12 22:47:35 -07:00
Timothy Pogue
6717dff19b update overlapping candle handling, move append to misc 2022-12-12 22:47:35 -07:00
Timothy Pogue
0602479f7d minor changes, update candle appending to support overlaps 2022-12-12 22:47:35 -07:00
Timothy Pogue
f1ebaf4730 fix tests 2022-12-12 22:47:35 -07:00
Timothy Pogue
49f6f40662 remove comment 2022-12-12 22:47:35 -07:00
Timothy Pogue
0d5b2eed94 fix same candle handling 2022-12-12 22:47:35 -07:00
Timothy Pogue
d376bf4052 fix indefinite reconnecting 2022-12-12 22:47:35 -07:00
Timothy Pogue
ccd1aa70a2 change log calls to debug, handle already received candle 2022-12-12 22:47:35 -07:00
Timothy Pogue
c050eb8b8b add candle difference calculation to dataprovider 2022-12-12 22:47:35 -07:00
Timothy Pogue
89338fa677 allow specifying channel send throttle 2022-12-12 22:47:35 -07:00
Timothy Pogue
d2c8487ecf update add_external_candle, fix breaking on ping error, handle empty dataframes 2022-12-12 22:47:35 -07:00
Timothy Pogue
fce1e9d6d0 update analyzed df request to allow specifying a single pair 2022-12-12 22:47:35 -07:00
Timothy Pogue
36a00e8de0 update add_external_candle returns 2022-12-12 22:47:35 -07:00
Timothy Pogue
4cbb3341d7 change how missing candles will be handled 2022-12-12 22:47:35 -07:00
Timothy Pogue
9660e445b8 use new channel apis in emc, extend analyzed df to include list of dates for candles 2022-12-12 22:47:35 -07:00
Matthias
3e4e6bb114 Merge pull request #7895 from freqtrade/fix-blosc-error-arm64
Temporarily downgrade blosc for arm64
2022-12-12 20:03:43 +01:00
Matthias
abc3badfb5 Improve shutdown behavior
closes #7882
2022-12-12 20:01:54 +01:00
Emre
5c984bf5c2 Temporarily downgrade blosc for arm64 2022-12-12 21:33:12 +03:00
Matthias
b328a18a97 Merge pull request #7890 from freqtrade/dependabot/pip/develop/xgboost-1.7.2
Bump xgboost from 1.7.1 to 1.7.2
2022-12-12 18:18:45 +01:00
Matthias
ff0577445e Merge pull request #7886 from freqtrade/dependabot/pip/develop/prompt-toolkit-3.0.36
Bump prompt-toolkit from 3.0.33 to 3.0.36
2022-12-12 14:52:39 +01:00
initrv
f940280d5e Fix tensorboard_log incrementing note 2022-12-12 14:35:44 +03:00
initrv
f9b7d35900 add increment param for tensorboard_log 2022-12-12 14:14:23 +03:00
Matthias
b53b3f435c Merge pull request #7888 from freqtrade/dependabot/pip/develop/ccxt-2.2.92
Bump ccxt from 2.2.67 to 2.2.92
2022-12-12 09:03:26 +01:00
Matthias
a55d0c0d81 Merge pull request #7891 from freqtrade/dependabot/pip/develop/python-telegram-bot-13.15
Bump python-telegram-bot from 13.14 to 13.15
2022-12-12 08:27:50 +01:00
Matthias
dee5b72835 Merge pull request #7892 from freqtrade/dependabot/pip/develop/filelock-3.8.2
Bump filelock from 3.8.0 to 3.8.2
2022-12-12 08:27:29 +01:00
Matthias
39bd6fb2d3 Merge pull request #7894 from freqtrade/dependabot/github_actions/develop/pypa/gh-action-pypi-publish-1.6.4
Bump pypa/gh-action-pypi-publish from 1.6.1 to 1.6.4
2022-12-12 07:11:34 +01:00
dependabot[bot]
de9784267a Bump filelock from 3.8.0 to 3.8.2
Bumps [filelock](https://github.com/tox-dev/py-filelock) from 3.8.0 to 3.8.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.8.0...3.8.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-12 05:39:16 +00:00
Matthias
61592e76b0 Merge pull request #7884 from freqtrade/dependabot/pip/develop/scikit-learn-1.2.0
Bump scikit-learn from 1.1.3 to 1.2.0
2022-12-12 06:38:29 +01:00
Matthias
dc8f68d410 Merge pull request #7885 from freqtrade/dependabot/pip/develop/blosc-1.11.0
Bump blosc from 1.10.6 to 1.11.0
2022-12-12 06:31:39 +01:00
dependabot[bot]
915e0ac62f Bump ccxt from 2.2.67 to 2.2.92
Bumps [ccxt](https://github.com/ccxt/ccxt) from 2.2.67 to 2.2.92.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/2.2.67...2.2.92)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-12 05:31:01 +00:00
dependabot[bot]
bc2b9981d3 Bump python-telegram-bot from 13.14 to 13.15
Bumps [python-telegram-bot](https://github.com/python-telegram-bot/python-telegram-bot) from 13.14 to 13.15.
- [Release notes](https://github.com/python-telegram-bot/python-telegram-bot/releases)
- [Changelog](https://github.com/python-telegram-bot/python-telegram-bot/blob/v13.15/CHANGES.rst)
- [Commits](https://github.com/python-telegram-bot/python-telegram-bot/compare/v13.14...v13.15)

---
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>
2022-12-12 05:30:55 +00:00
Matthias
686253e7cd Merge pull request #7887 from freqtrade/dependabot/pip/develop/nbconvert-7.2.6
Bump nbconvert from 7.2.5 to 7.2.6
2022-12-12 06:30:37 +01:00
Matthias
2d68b0f6f6 Merge pull request #7889 from freqtrade/dependabot/pip/develop/pytest-asyncio-0.20.3
Bump pytest-asyncio from 0.20.2 to 0.20.3
2022-12-12 06:30:14 +01:00
Matthias
f7a099f878 Merge pull request #7893 from freqtrade/dependabot/pip/develop/sqlalchemy-1.4.45
Bump sqlalchemy from 1.4.44 to 1.4.45
2022-12-12 06:29:49 +01:00
dependabot[bot]
2647c35f48 Bump pypa/gh-action-pypi-publish from 1.6.1 to 1.6.4
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.6.1 to 1.6.4.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.6.1...v1.6.4)

---
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>
2022-12-12 03:02:53 +00:00
dependabot[bot]
0344203372 Bump sqlalchemy from 1.4.44 to 1.4.45
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 1.4.44 to 1.4.45.
- [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>
2022-12-12 03:01:32 +00:00
dependabot[bot]
5a7b493d3e Bump xgboost from 1.7.1 to 1.7.2
Bumps [xgboost](https://github.com/dmlc/xgboost) from 1.7.1 to 1.7.2.
- [Release notes](https://github.com/dmlc/xgboost/releases)
- [Changelog](https://github.com/dmlc/xgboost/blob/master/NEWS.md)
- [Commits](https://github.com/dmlc/xgboost/compare/v1.7.1...v1.7.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-12 03:01:11 +00:00
dependabot[bot]
5625648011 Bump pytest-asyncio from 0.20.2 to 0.20.3
Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.20.2 to 0.20.3.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Changelog](https://github.com/pytest-dev/pytest-asyncio/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.20.2...v0.20.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-12 03:01:07 +00:00
dependabot[bot]
a35111e55e Bump nbconvert from 7.2.5 to 7.2.6
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.2.5 to 7.2.6.
- [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.2.5...v7.2.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-12 03:00:54 +00:00
dependabot[bot]
63d3a9ced6 Bump prompt-toolkit from 3.0.33 to 3.0.36
Bumps [prompt-toolkit](https://github.com/prompt-toolkit/python-prompt-toolkit) from 3.0.33 to 3.0.36.
- [Release notes](https://github.com/prompt-toolkit/python-prompt-toolkit/releases)
- [Changelog](https://github.com/prompt-toolkit/python-prompt-toolkit/blob/master/CHANGELOG)
- [Commits](https://github.com/prompt-toolkit/python-prompt-toolkit/compare/3.0.33...3.0.36)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-12 03:00:49 +00:00
dependabot[bot]
434eec7334 Bump blosc from 1.10.6 to 1.11.0
Bumps [blosc](https://github.com/blosc/python-blosc) from 1.10.6 to 1.11.0.
- [Release notes](https://github.com/blosc/python-blosc/releases)
- [Changelog](https://github.com/Blosc/python-blosc/blob/main/RELEASE_NOTES.rst)
- [Commits](https://github.com/blosc/python-blosc/compare/v1.10.6...v1.11.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-12 03:00:46 +00:00
dependabot[bot]
78c40f0535 Bump scikit-learn from 1.1.3 to 1.2.0
Bumps [scikit-learn](https://github.com/scikit-learn/scikit-learn) from 1.1.3 to 1.2.0.
- [Release notes](https://github.com/scikit-learn/scikit-learn/releases)
- [Commits](https://github.com/scikit-learn/scikit-learn/compare/1.1.3...1.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-12 03:00:40 +00:00
Matthias
42afdbb0e5 Merge pull request #7883 from freqtrade/fix/multioutput-bug
fix bug in MultiOutput* with conv_width = 1
2022-12-11 15:52:10 +01:00
robcaulk
0f6b98b69a merge develop into tensorboard cleanup 2022-12-11 15:38:32 +01:00
robcaulk
0fd8e214e4 add documentation for tensorboard_log, change how users interact with tensorboard_log 2022-12-11 15:31:29 +01:00
Matthias
888ba65367 Merge branch 'develop' into fix/multioutput-bug 2022-12-11 15:23:53 +01:00
initrv
cb8fc3c8c7 custom info to tensorboard_metrics 2022-12-11 15:37:45 +03:00
Robert Caulk
0f75ec9c97 Merge pull request #7860 from freqtrade/update-freqai-tf-handling
Ensure base tf to be include_timeframes
2022-12-11 12:50:07 +01:00
robcaulk
8c7ec07951 ensure predict_proba follows suit. Remove all lib specific params from example config 2022-12-11 12:39:31 +01:00
robcaulk
85f22b5c30 fix bug in MultiOutput* with conv_width = 1 2022-12-11 12:15:19 +01:00
Emre
6b9f3f2795 Fix test validation 2022-12-11 13:24:24 +03:00
Emre
272c3302e3 Merge remote-tracking branch 'origin/develop' into update-freqai-tf-handling 2022-12-11 13:12:45 +03:00
Matthias
980a5a9b52 Fix docs typo 2022-12-10 19:54:04 +01:00
Matthias
1da8ad69d9 improve more tests by freezing time 2022-12-08 14:33:16 +01:00
Matthias
da4914513a Merge pull request #7835 from rzhb/patch-1
update strategy_analysis_example.ipynb
2022-12-08 14:17:50 +01:00
Matthias
bbedc4b63e Stop clock to avoid random failures on slow CI runs 2022-12-08 14:15:29 +01:00
Matthias
39e19bd0c9 Merge pull request #7607 from matteoettam09/develop
Docker compose now in docker
2022-12-08 13:34:06 +01:00
Matthias
3d3a7033ed Improve Docker documentation wording 2022-12-08 08:46:16 +01:00
Matthias
fcbc1a8a07 Merge pull request #7868 from freqtrade/fix-add-state-info-bt
Fix add state info bt
2022-12-08 08:34:11 +01:00
Matthias
74e623fe5b Improve kraken test resiliance 2022-12-08 08:33:07 +01:00
robcaulk
2c3a310ce2 allow DI with CNN 2022-12-07 20:30:13 +01:00
robcaulk
71c6ff18c4 try to avoid possible memory leaks 2022-12-07 20:08:31 +01:00
robcaulk
b438cd4b3f add newline to end of freqai-configuration.md 2022-12-07 19:52:31 +01:00
robcaulk
7b3406914c flip add_state_info 2022-12-07 19:49:39 +01:00
robcaulk
9b4364ddc3 ensure that add_state_info is deactivated during backtesting 2022-12-07 19:49:14 +01:00
initrv
58604c747e cleanup tensorboard callback 2022-12-07 14:37:55 +03:00
robcaulk
6343fbf9e3 remove verbose from CNNPredictionModel 2022-12-07 00:02:02 +01:00
robcaulk
389ab7e44b add test for CNNPredictionModel 2022-12-06 23:50:34 +01:00
robcaulk
665eed3906 add documentation for CNN, allow it to interact with model_training_parameters 2022-12-06 23:26:07 +01:00
Robert Caulk
b9f6911a6a Merge pull request #7843 from smarmau/develop
freqai RL agent info during training
2022-12-06 20:06:41 +01:00
Matthias
e7195b7bfb Merge pull request #7862 from freqtrade/ws_newcandle
New websocket message "new_candle"
2022-12-06 07:07:32 +01:00
Robert Caulk
27b8f462dc Merge pull request #7837 from freqtrade/freqai_bt_from_predictions_improvement
freqAI backtesting - Perfomance improvement
2022-12-05 23:20:55 +01:00
Wagner Costa
c81b00fb37 Merge branch 'develop' into freqai_bt_from_predictions_improvement 2022-12-05 18:00:55 -03:00
Emre
227cdb0938 Change dict update order 2022-12-05 23:58:04 +03:00
Emre
26a61afa15 Move base tf logic to config validation 2022-12-05 23:54:15 +03:00
Emre
bc48099e48 Revert changes 2022-12-05 23:52:48 +03:00
robcaulk
9ce8255f24 isort. 2022-12-05 21:03:05 +01:00
robcaulk
72b1d1c9ae allow users to pass 0 test data 2022-12-05 20:55:05 +01:00
robcaulk
5826fae8ee Merge remote-tracking branch 'origin/develop' into feat/convolutional-neural-net 2022-12-05 20:40:19 +01:00
robcaulk
43c0d305a3 fix tensorflow version 2022-12-05 20:36:08 +01:00
robcaulk
62c69bf2b5 fix custom_info 2022-12-05 20:22:54 +01:00
Matthias
72472587dd Increase test range for api version test 2022-12-05 20:19:01 +01:00
Matthias
7c27eedda5 Bump API version 2022-12-05 19:56:33 +01:00
Matthias
24edc276ea Simplify new_candle message 2022-12-05 19:46:39 +01:00
Matthias
d30a872ed4 Move message-silencing list next to enum 2022-12-05 19:23:03 +01:00
Matthias
687eefa06e Improve emit_df testcase 2022-12-05 18:19:19 +01:00
Matthias
5e533b550f Emit a simple "new candle" message to allow UI's to refresh charts 2022-12-05 18:19:19 +01:00
Matthias
189fa64052 Add more dynamic to directory change 2022-12-05 18:14:16 +01:00
Emre
730fba956b Ensure base tf included in include_timeframes 2022-12-05 16:16:17 +03:00
Emre
e734b39929 Make model_training_parameters optional 2022-12-05 14:54:42 +03:00
Matthias
b0f430b5ac Merge pull request #7850 from freqtrade/dependabot/pip/develop/pytest-random-order-1.1.0
Bump pytest-random-order from 1.0.4 to 1.1.0
2022-12-05 08:50:52 +01:00
Matthias
261f9ac7dc Merge pull request #7851 from freqtrade/dependabot/pip/develop/ccxt-2.2.67
Bump ccxt from 2.2.36 to 2.2.67
2022-12-05 08:06:16 +01:00
Matthias
80f3908626 Merge pull request #7857 from freqtrade/dependabot/pip/develop/mkdocs-material-8.5.11
Bump mkdocs-material from 8.5.10 to 8.5.11
2022-12-05 08:00:23 +01:00
Matthias
4dfb35c165 Merge pull request #7858 from freqtrade/dependabot/pip/develop/orjson-3.8.3
Bump orjson from 3.8.2 to 3.8.3
2022-12-05 08:00:08 +01:00
Matthias
6e657f9911 Merge pull request #7859 from freqtrade/dependabot/github_actions/develop/pypa/gh-action-pypi-publish-1.6.1
Bump pypa/gh-action-pypi-publish from 1.5.1 to 1.6.1
2022-12-05 06:27:37 +01:00
dependabot[bot]
102ab91fa4 Bump orjson from 3.8.2 to 3.8.3
Bumps [orjson](https://github.com/ijl/orjson) from 3.8.2 to 3.8.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.8.2...3.8.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-05 05:23:02 +00:00
dependabot[bot]
179adea0e2 Bump ccxt from 2.2.36 to 2.2.67
Bumps [ccxt](https://github.com/ccxt/ccxt) from 2.2.36 to 2.2.67.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/2.2.36...2.2.67)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-05 05:22:42 +00:00
Matthias
d456ec7d5e Merge pull request #7856 from freqtrade/dependabot/pip/develop/fastapi-0.88.0
Bump fastapi from 0.87.0 to 0.88.0
2022-12-05 06:22:18 +01:00
Matthias
0bb4f108dd Merge pull request #7853 from freqtrade/dependabot/pip/develop/pandas-1.5.2
Bump pandas from 1.5.1 to 1.5.2
2022-12-05 06:21:46 +01:00
dependabot[bot]
82d4dca183 Bump mkdocs-material from 8.5.10 to 8.5.11
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 8.5.10 to 8.5.11.
- [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/8.5.10...8.5.11)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-05 05:21:15 +00:00
Matthias
cf0e5903c5 Merge pull request #7852 from freqtrade/dependabot/pip/develop/pymdown-extensions-9.9
Bump pymdown-extensions from 9.8 to 9.9
2022-12-05 06:20:23 +01:00
Matthias
4d19f98bef Merge pull request #7855 from freqtrade/dependabot/pip/develop/jsonschema-4.17.3
Bump jsonschema from 4.17.1 to 4.17.3
2022-12-05 06:19:43 +01:00
dependabot[bot]
2eb8f9f028 Bump pypa/gh-action-pypi-publish from 1.5.1 to 1.6.1
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.5.1 to 1.6.1.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.5.1...v1.6.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-05 03:03:47 +00:00
dependabot[bot]
66bb2c5253 Bump fastapi from 0.87.0 to 0.88.0
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.87.0 to 0.88.0.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.87.0...0.88.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-05 03:01:16 +00:00
dependabot[bot]
caae4441e5 Bump jsonschema from 4.17.1 to 4.17.3
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.17.1 to 4.17.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.17.1...v4.17.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-05 03:01:12 +00:00
dependabot[bot]
441069f363 Bump pandas from 1.5.1 to 1.5.2
Bumps [pandas](https://github.com/pandas-dev/pandas) from 1.5.1 to 1.5.2.
- [Release notes](https://github.com/pandas-dev/pandas/releases)
- [Changelog](https://github.com/pandas-dev/pandas/blob/main/RELEASE.md)
- [Commits](https://github.com/pandas-dev/pandas/compare/v1.5.1...v1.5.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-05 03:01:03 +00:00
dependabot[bot]
16bad8dca6 Bump pymdown-extensions from 9.8 to 9.9
Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 9.8 to 9.9.
- [Release notes](https://github.com/facelessuser/pymdown-extensions/releases)
- [Commits](https://github.com/facelessuser/pymdown-extensions/compare/9.8...9.9)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-05 03:00:56 +00:00
dependabot[bot]
133a081a39 Bump pytest-random-order from 1.0.4 to 1.1.0
Bumps [pytest-random-order](https://github.com/jbasko/pytest-random-order) from 1.0.4 to 1.1.0.
- [Release notes](https://github.com/jbasko/pytest-random-order/releases)
- [Commits](https://github.com/jbasko/pytest-random-order/compare/v1.0.4...v1.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-05 03:00:39 +00:00
Robert Caulk
f28b314266 Merge pull request #7849 from smarmau/patch-1
Update freqai-reinforcement-learning.md
2022-12-04 15:17:01 +01:00
robcaulk
d8565261e1 ignore initializer type 2022-12-04 14:10:33 +01:00
robcaulk
24766928ba reorganize/generalize tensorboard callback 2022-12-04 13:54:30 +01:00
Matthias
24d8585c33 Merge pull request #7840 from freqtrade/feature-plot-dir
Add plot_feature_importances output dir to docs
2022-12-04 12:53:44 +01:00
smarmau
f7b4fc5bbc Update freqai-reinforcement-learning.md
Change typo of default Tensorboard port to reflect correct port (6006)
2022-12-04 22:22:23 +11:00
robcaulk
38d3b4cab2 add details to doc plot_feature_importance doc 2022-12-04 11:29:21 +01:00
Matthias
310eba5932 Merge pull request #7735 from freqtrade/gc_improvements
Improve python GC behavior
2022-12-03 15:54:59 +01:00
Emre
ad7729e5d8 Fix function signature 2022-12-03 17:43:59 +03:00
smarmau
b2edc58089 fix flake8 2022-12-03 22:31:02 +11:00
smarmau
d6f45a12ae add multiproc fix flake8 2022-12-03 22:30:04 +11:00
smarmau
469aa0d43f add state/action info to callbacks 2022-12-03 21:16:46 +11:00
smarmau
075c8c23c8 add state/action info to callbacks 2022-12-03 21:16:04 +11:00
Matthias
0be82b4ed1 Merge pull request #7818 from freqtrade/dependabot/pip/develop/torch-1.13.0
Bump torch from 1.12.1 to 1.13.0
2022-12-02 15:52:34 +01:00
Robert Caulk
7ddf7ec0ae Update freqai-parameter-table.md 2022-12-02 11:28:00 +01:00
Matthias
4dc591a170 Merge pull request #7834 from freqtrade/fix-data-drawer-model-load
Fix sb3_contrib loading issue
2022-12-02 06:29:23 +01:00
Matthias
f2624112b0 Merge pull request #7833 from gaugau3000/develop
binance restricted locations and server location
2022-12-02 06:20:35 +01:00
Matthias
8a078a328e Merge pull request #7836 from freqtrade/fix-fees-rl
fix fees RL
2022-12-02 06:15:20 +01:00
Matthias
05424045b0 Temporarily disable since binance blocks US 2022-12-02 06:12:21 +01:00
Wagner Costa
77dc2c92a7 performance improvevemnts - backtest freqai from saved predictions 2022-12-01 12:53:19 -03:00
robcaulk
aceee67e2b Merge remote-tracking branch 'origin/develop' into gc_improvements 2022-12-01 14:32:19 +01:00
robcaulk
2b3e166dc2 fix fees RL 2022-12-01 10:10:28 +01:00
k
eb81cccede add download-data command
change directory
fix relative config path
2022-12-01 16:37:24 +08:00
Emre
396e666e9b Keep old behavior of model loading 2022-12-01 11:03:51 +03:00
Emre
4a9982f86b Fix sb3_contrib loading issue 2022-12-01 10:08:42 +03:00
Matthias
95651fcd5a Improve/simplify telegram exception handling
Move exceptionhandling to the decorator.
2022-12-01 06:27:25 +01:00
gautier pialat
59c7ce02f5 binance restricted locations and server location
Inform end user before he creates server in a binance restricted location
https://github.com/ccxt/ccxt/issues/15872
2022-11-30 21:29:34 +01:00
Matthias
dac4a35be2 Merge pull request #7828 from freqtrade/fix-state-info-rl
bring back market side setting in get_state_info
2022-11-30 19:57:28 +01:00
Robert Caulk
2bcd8e4e21 Merge pull request #7737 from freqtrade/backtest_fitlivepredictions
FreqAI - Backtesting enhancements and bug fix
2022-11-30 16:51:04 +01:00
Wagner Costa
79821ebb33 fix flake8 errors 2022-11-30 08:41:44 -03:00
robcaulk
e7f72d52b8 bring back market side setting in get_state_info 2022-11-30 12:36:26 +01:00
Wagner Costa
26e8a5766f Merge branch 'develop' into backtest_fitlivepredictions 2022-11-30 08:29:28 -03:00
Wagner Costa
17cf3c7e83 bug fixes and removed fillna from fit_live_predictions 2022-11-30 08:28:45 -03:00
Matthias
915524a161 Merge pull request #7827 from rzhb/patch-2
Update data-analysis.md
2022-11-30 06:45:27 +01:00
rzhb
10a45474e8 Update data-analysis.md
fix typo in code
2022-11-30 12:28:21 +08:00
robcaulk
4571aedb33 consolidate and clean code 2022-11-30 00:53:35 +01:00
Matthias
3c322bf7df Improve forceenter validation messages 2022-11-29 18:27:08 +01:00
Matthias
e6b8cb8ea9 Merge pull request #7795 from froggleston/entry_exit_date_print
Add date selection arguments to backtest-analysis printout
2022-11-29 16:56:58 +01:00
Wagner Costa
8ea58ab352 change BT prediction files to feather format 2022-11-29 10:38:35 -03:00
Wagner Costa
df979ece33 Merge branch 'develop' into backtest_fitlivepredictions 2022-11-29 09:39:15 -03:00
dependabot[bot]
b87545cd12 Bump torch from 1.12.1 to 1.13.0
Bumps [torch](https://github.com/pytorch/pytorch) from 1.12.1 to 1.13.0.
- [Release notes](https://github.com/pytorch/pytorch/releases)
- [Changelog](https://github.com/pytorch/pytorch/blob/master/RELEASE.md)
- [Commits](https://github.com/pytorch/pytorch/compare/v1.12.1...v1.13.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-29 07:46:38 +00:00
Robert Caulk
066d040fd3 Merge pull request #7814 from freqtrade/dependabot/pip/develop/sb3-contrib-1.6.2
Bump sb3-contrib from 1.6.1 to 1.6.2
2022-11-29 08:45:50 +01:00
Matthias
c3daddc629 Merge pull request #7809 from richardjozsa/develop
Improve the RL learning process
2022-11-29 06:28:36 +01:00
Matthias
100d65b20b Merge pull request #7822 from eltociear/patch-1
Fix typo in strategy_analysis_example.md
2022-11-29 06:24:36 +01:00
Matthias
5500c10f78 Improve CI file layout 2022-11-28 20:41:26 +01:00
Matthias
2c75b5e027 Extract "live" test from regular tests 2022-11-28 20:41:26 +01:00
Matthias
8efa8bc78a Update stable-baselines3 to 1.6.2 2022-11-28 19:35:17 +01:00
Matthias
e891c41760 Fix typo in ipynb, too. 2022-11-28 18:20:30 +01:00
Robert Caulk
c9cc87b4ac Merge pull request #7823 from freqtrade/fix/rl-model-type
Set model_type in base RL model
2022-11-28 18:07:36 +01:00
Emre
9cbfa12011 Directly set model_type in base RL model 2022-11-28 16:02:17 +03:00
Robert Davey
05a7fca242 Fix utils docs for backtesting-analysis 2022-11-28 12:12:45 +00:00
Matthias
1cdf5e0cfd Merge pull request #7812 from freqtrade/dependabot/pip/develop/jsonschema-4.17.1
Bump jsonschema from 4.17.0 to 4.17.1
2022-11-28 10:06:12 +01:00
Ikko Ashimine
9880e9ab60 Fix typo in strategy_analysis_example.md
seperate -> separate
2022-11-28 17:10:17 +09:00
Matthias
d67ca27f5e Merge pull request #7817 from freqtrade/dependabot/pip/develop/prompt-toolkit-3.0.33
Bump prompt-toolkit from 3.0.32 to 3.0.33
2022-11-28 08:12:11 +01:00
dependabot[bot]
dc03317cc8 Bump jsonschema from 4.17.0 to 4.17.1
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.17.0 to 4.17.1.
- [Release notes](https://github.com/python-jsonschema/jsonschema/releases)
- [Changelog](https://github.com/python-jsonschema/jsonschema/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/python-jsonschema/jsonschema/compare/v4.17.0...v4.17.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-28 07:02:54 +00:00
Matthias
f7ba1a4348 Merge pull request #7819 from freqtrade/dependabot/pip/develop/cryptography-38.0.4
Bump cryptography from 38.0.1 to 38.0.4
2022-11-28 08:02:22 +01:00
Matthias
98883fc909 Merge pull request #7815 from freqtrade/dependabot/pip/develop/urllib3-1.26.13
Bump urllib3 from 1.26.12 to 1.26.13
2022-11-28 08:01:10 +01:00
Matthias
40b274351c Merge pull request #7813 from freqtrade/dependabot/pip/develop/flake8-6.0.0
Bump flake8 from 5.0.4 to 6.0.0
2022-11-28 08:00:45 +01:00
Matthias
868c2061b7 Merge pull request #7816 from freqtrade/dependabot/pip/develop/pyarrow-10.0.1
Bump pyarrow from 10.0.0 to 10.0.1
2022-11-28 06:40:38 +01:00
Matthias
d73fd42769 Fix flake8 error introduced with 6.0 update 2022-11-28 06:38:35 +01:00
dependabot[bot]
9c28cc810d Bump cryptography from 38.0.1 to 38.0.4
Bumps [cryptography](https://github.com/pyca/cryptography) from 38.0.1 to 38.0.4.
- [Release notes](https://github.com/pyca/cryptography/releases)
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/38.0.1...38.0.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-28 05:33:45 +00:00
Matthias
8e60364f0d Merge pull request #7808 from freqtrade/fix-freqai-rl-reward-link
Fix custom reward function link
2022-11-28 06:33:24 +01:00
Matthias
51e773fe37 Merge pull request #7820 from freqtrade/dependabot/pip/develop/ccxt-2.2.36
Bump ccxt from 2.1.96 to 2.2.36
2022-11-28 06:32:17 +01:00
dependabot[bot]
348731598e Bump ccxt from 2.1.96 to 2.2.36
Bumps [ccxt](https://github.com/ccxt/ccxt) from 2.1.96 to 2.2.36.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/2.1.96...2.2.36)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-28 03:01:25 +00:00
dependabot[bot]
a46b09d400 Bump prompt-toolkit from 3.0.32 to 3.0.33
Bumps [prompt-toolkit](https://github.com/prompt-toolkit/python-prompt-toolkit) from 3.0.32 to 3.0.33.
- [Release notes](https://github.com/prompt-toolkit/python-prompt-toolkit/releases)
- [Changelog](https://github.com/prompt-toolkit/python-prompt-toolkit/blob/master/CHANGELOG)
- [Commits](https://github.com/prompt-toolkit/python-prompt-toolkit/compare/3.0.32...3.0.33)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-28 03:01:01 +00:00
dependabot[bot]
924bbad199 Bump pyarrow from 10.0.0 to 10.0.1
Bumps [pyarrow](https://github.com/apache/arrow) from 10.0.0 to 10.0.1.
- [Release notes](https://github.com/apache/arrow/releases)
- [Commits](https://github.com/apache/arrow/compare/go/v10.0.0...go/v10.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>
2022-11-28 03:00:58 +00:00
dependabot[bot]
5aec51a16c Bump urllib3 from 1.26.12 to 1.26.13
Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.12 to 1.26.13.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/1.26.13/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.12...1.26.13)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-28 03:00:55 +00:00
dependabot[bot]
7e75bc8fcf Bump sb3-contrib from 1.6.1 to 1.6.2
Bumps [sb3-contrib](https://github.com/Stable-Baselines-Team/stable-baselines3-contrib) from 1.6.1 to 1.6.2.
- [Release notes](https://github.com/Stable-Baselines-Team/stable-baselines3-contrib/releases)
- [Commits](https://github.com/Stable-Baselines-Team/stable-baselines3-contrib/compare/v1.6.1...v1.6.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-28 03:00:48 +00:00
dependabot[bot]
49e41925b0 Bump flake8 from 5.0.4 to 6.0.0
Bumps [flake8](https://github.com/pycqa/flake8) from 5.0.4 to 6.0.0.
- [Release notes](https://github.com/pycqa/flake8/releases)
- [Commits](https://github.com/pycqa/flake8/compare/5.0.4...6.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-28 03:00:42 +00:00
Emre
f21dbbd8bb Update imports of custom model 2022-11-28 00:06:02 +03:00
robcaulk
56518def42 isort 2022-11-27 21:06:01 +01:00
robcaulk
7fd6bc526e add randomize_starting_position to the rl_config 2022-11-27 21:03:13 +01:00
robcaulk
25e041b98e sneak in small change to FreqaiExampleHybridStrategy docstring and startup count 2022-11-27 20:50:03 +01:00
richardjozsa
64d4a52a56 Improve the RL learning process
Improve the RL learning process by selecting random start point for the agent, it can help to block the agent to only learn on the selected period of time, while improving the quality of the model.
2022-11-27 20:43:50 +01:00
robcaulk
67d9469277 small wording fix 2022-11-27 20:42:04 +01:00
Emre
a02da08065 Fix typo 2022-11-27 22:23:00 +03:00
Matthias
320535a227 improve tests doc wording 2022-11-27 20:07:44 +01:00
Joe Schr
a85602eb9c add "how to run tests" 2022-11-27 20:07:44 +01:00
Emre
5b5859238b Fix typo 2022-11-27 22:06:14 +03:00
Emre
fe00a65163 FIx custom reward link 2022-11-27 21:34:07 +03:00
robcaulk
57aaa390d0 start convolution neural network plugin 2022-11-27 17:42:03 +01:00
Matthias
f4025ee5de Merge pull request #7289 from freqtrade/feat/freqai-rl-dev
Add reinforcement learning module to FreqAI
2022-11-27 17:15:21 +01:00
Matthias
2219d2f491 Merge pull request #7707 from freqtrade/bt/full_detail
backtesting - use full detail timeframe
2022-11-27 16:09:23 +01:00
Matthias
cf000a4c00 Bump develop version to 2022.12-dev 2022-11-27 16:08:54 +01:00
Matthias
e4a3efc7d4 Don't use strategy.stoploss too often
discovered in #7760
2022-11-27 15:54:35 +01:00
Matthias
3fc367f536 Merge pull request #7771 from wizrds/feat/refactor-ws
Refactor WebSocket API for performance
2022-11-27 15:49:34 +01:00
Matthias
21d7406291 Temporary fix for kraken download
closes #7790
will be removed once the patch is in ccxt.
2022-11-27 15:16:43 +01:00
froggleston
1a3f88c7b9 Replace separate start/end date option with usual timerange option 2022-11-27 11:30:13 +00:00
Robert Caulk
732757e087 Merge pull request #7801 from initrv/patch-1
Fix 4ac update_total_profit
2022-11-27 12:29:07 +01:00
Matthias
79a7dd5bd1 Merge pull request #7799 from freqtrade/fix-init-extra-rets
Use default `extra_returns_per_train`
2022-11-27 07:58:42 +01:00
stm
51d21b413d Fix 4ac update_total_profit
_update_total_profit() must be executed before "self._position = Positions.Neutral" because _update_total_profit() calls get_unrealized_profit(), which returns 0 if position is neutral and total_profit is not updated
2022-11-26 23:35:20 +03:00
robcaulk
dba30393fb ensure extra_returns_per_train are set properly on first hist_preds build 2022-11-26 18:04:47 +01:00
froggleston
706bc9ebea Merge branch 'entry_exit_date_print' of github.com:froggleston/freqtrade into entry_exit_date_print 2022-11-26 16:59:27 +00:00
froggleston
4790aaaae1 Implement cli options for backtesting-analysis date filtering 2022-11-26 16:58:56 +00:00
Robert Davey
e1456e407b Merge branch 'freqtrade:develop' into entry_exit_date_print 2022-11-26 16:53:48 +00:00
Timothy Pogue
a26b3a9ca8 change sleep call back to 0.01 2022-11-26 09:40:22 -07:00
Matthias
9af62ad117 Add note to dev docs about freqUI release 2022-11-26 14:09:05 +01:00
Matthias
ce213b55a2 Bybit fix candle limit 2022-11-26 13:58:22 +01:00
robcaulk
b52f05923a fix list to array in constants.py 2022-11-26 13:47:47 +01:00
robcaulk
be890b52fd remove np import 2022-11-26 13:44:58 +01:00
robcaulk
aaaa5a5f64 add documentation for net_arch, other small changes 2022-11-26 13:44:58 +01:00
Matthias
fcf13580f1 Revert "offload initial df computation to thread"
This reverts commit f268187e9b.
2022-11-26 13:33:54 +01:00
Matthias
7b0a76fb70 Improve typehint 2022-11-26 13:33:26 +01:00
Matthias
7ebc8ee169 Fix missing Optional typehint 2022-11-26 13:32:18 +01:00
Matthias
8660ac9aa0 Fix import in docs 2022-11-26 13:12:44 +01:00
Matthias
cf2f12b472 Headers between Tables -> Tables can be jumped to directly 2022-11-26 13:06:21 +01:00
Matthias
bdfedb5fcb Improve typehints / reduce warnings from mypy 2022-11-26 13:03:07 +01:00
robcaulk
81fd2e588f ensure typing, remove unsued code 2022-11-26 12:11:59 +01:00
robcaulk
8dbfd2cacf improve docstring clarity about how to inherit from ReinforcementLearner, demonstrate inherittance with ReinforcementLearner_multiproc 2022-11-26 11:51:08 +01:00
robcaulk
9f13d99b99 improve parameter table, add better documentation for custom calculate_reward, add various helpful notes in docstrings etc 2022-11-26 11:32:39 +01:00
Timothy Pogue
bd95392eea fix formatted string in warning message :) 2022-11-25 13:10:22 -07:00
Timothy Pogue
4aa4c6f49d change sleep in channel send to 0 2022-11-25 13:08:41 -07:00
Timothy Pogue
f268187e9b offload initial df computation to thread 2022-11-25 12:56:33 -07:00
Timothy Pogue
afc00bc30a log warning if channel too far behind, add docstrings to message stream 2022-11-25 12:48:57 -07:00
froggleston
391817243c Tidy up complex functions 2022-11-25 16:12:15 +00:00
Matthias
756921b16a Update fthypt file 2022-11-25 17:05:49 +01:00
Matthias
79c041b62d Update tests for new export format 2022-11-25 16:57:58 +01:00
Matthias
8c014bd365 Export trade-counts to csv
closes #7789
2022-11-25 16:57:45 +01:00
Matthias
8ee8b6e943 Improve hyperopt list output
closes  #7789
2022-11-25 16:31:21 +01:00
Matthias
0f97ef0d7b Reset stoploss_order_id when order is canceled
closes #7766
2022-11-25 16:08:33 +01:00
Matthias
1b3e62bcbc Lock execute_entry to prevent timing hickups 2022-11-25 14:50:48 +01:00
Matthias
c593cdc438 Improve type hints 2022-11-25 14:48:06 +01:00
Matthias
5e6cda11ef Update method name for trade fee updating 2022-11-25 14:43:56 +01:00
Matthias
048119ad3d Improve doc wording around informative pair candle types
closes #7792
2022-11-25 14:20:41 +01:00
Matthias
b8d1862ca8 Update cached binance leverage tiers
closes #7794
2022-11-25 10:42:19 +01:00
Timothy Pogue
bcc8063eeb Merge branch 'develop' into feat/refactor-ws 2022-11-24 13:42:57 -07:00
Timothy Pogue
fc59b02255 prevent ws endpoint from running without valid token 2022-11-24 13:41:10 -07:00
Timothy Pogue
101dec461e close ws channel if can't accept 2022-11-24 11:35:50 -07:00
robcaulk
2e82e6784a move data_provider cleanup to shutdown() 2022-11-24 19:07:38 +01:00
robcaulk
73c458d47b use importlib instead of __import___ 2022-11-24 19:04:35 +01:00
robcaulk
00d2a01bf0 isort 2022-11-24 18:57:01 +01:00
robcaulk
4894d772ed merge develop into feat/freqai-rl-dev 2022-11-24 18:50:11 +01:00
robcaulk
3a07749fcc fix docstring 2022-11-24 18:46:54 +01:00
robcaulk
8855e36f57 reduce freqai testing time by reducing retrain frequency and number of features 2022-11-24 18:16:33 +01:00
robcaulk
44b042ba51 remove unused function 2022-11-24 17:53:26 +01:00
Matthias
8f1a8c752b Add freqairl docker build process 2022-11-24 07:00:12 +01:00
Matthias
e5fc21f577 Fix broken table rendering 2022-11-23 20:59:45 +01:00
Matthias
3d26659d5e Fix some doc typos 2022-11-23 20:09:55 +01:00
Matthias
c963fd720b Slightly change test setup for dry_run_order_fill 2022-11-23 18:17:14 +01:00
Robert Caulk
12e17b80fe Merge pull request #7791 from freqtrade/fix-m1-wheel-lightgbm
Enable --use-pep517 flag for freqai
2022-11-23 17:52:20 +01:00
Emre
335de760ed Enable --use-pep517 flag for freqai 2022-11-23 18:34:50 +03:00
Timothy Pogue
48242ca02b update catch block in cancel channel tasks 2022-11-22 12:43:45 -07:00
Matthias
7785c91c5d Merge pull request #7756 from wizrds/feat/secure-ws-conn
Support SSL in WebSocket connection
2022-11-22 19:18:16 +01:00
Wagner Costa
d09157efb8 update code to use one prediction file / pair 2022-11-22 15:15:42 -03:00
Matthias
bd05f85c26 Simplify ssl documentation 2022-11-22 18:11:18 +01:00
Timothy Pogue
a5442772fc ensure only broadcasting to subscribed topics 2022-11-22 09:42:09 -07:00
Wagner Costa
91779bb28b Merge branch 'develop' into backtest_fitlivepredictions 2022-11-22 13:09:48 -03:00
Wagner Costa
c01f25ddc9 update code to freqai_backtest_live_models only from historic predictions 2022-11-22 13:09:09 -03:00
Timothy Pogue
fff745fd83 add map to nginx config 2022-11-22 07:17:57 -07:00
Matthias
5a489ce71b Fix docs typo 2022-11-22 10:46:38 +01:00
Timothy Pogue
86ff711525 update docs on reverse proxy 2022-11-21 12:52:18 -07:00
Matthias
8cb2b4666d Improve proxy docs
closes #7769
2022-11-21 20:42:07 +01:00
Timothy Pogue
d9d7df70bf fix tests, log unknown errors 2022-11-21 12:21:40 -07:00
Matthias
0fa5217043 Improve protection setup
lock_pair should be called when the order closes, not when the exit order is placed.
it should also be called for stoploss orders, too.

closes #7783
2022-11-21 19:30:49 +01:00
Matthias
be80d91ca6 Merge pull request #7779 from freqtrade/dependabot/pip/develop/uvicorn-0.20.0
Bump uvicorn from 0.19.0 to 0.20.0
2022-11-21 18:08:27 +01:00
Matthias
450ebaa2cc Merge pull request #7778 from freqtrade/dependabot/pip/develop/types-requests-2.28.11.5
Bump types-requests from 2.28.11.4 to 2.28.11.5
2022-11-21 13:23:52 +01:00
Matthias
7c00ef8a76 Bump pre-commit requests version 2022-11-21 11:32:31 +01:00
Matthias
74be124a47 Merge pull request #7775 from freqtrade/dependabot/pip/develop/ccxt-2.1.96
Bump ccxt from 2.1.75 to 2.1.96
2022-11-21 11:31:48 +01:00
dependabot[bot]
adc1174d2e Bump types-requests from 2.28.11.4 to 2.28.11.5
Bumps [types-requests](https://github.com/python/typeshed) from 2.28.11.4 to 2.28.11.5.
- [Release notes](https://github.com/python/typeshed/releases)
- [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>
2022-11-21 10:30:22 +00:00
Matthias
69b2e31bdb Merge pull request #7773 from freqtrade/dependabot/pip/develop/types-python-dateutil-2.8.19.4
Bump types-python-dateutil from 2.8.19.3 to 2.8.19.4
2022-11-21 11:29:03 +01:00
Matthias
747dd9cb16 Merge pull request #7774 from freqtrade/dependabot/pip/develop/mypy-0.991
Bump mypy from 0.990 to 0.991
2022-11-21 07:12:19 +01:00
Matthias
2df0d613da Bump types-dateutil for precommit 2022-11-21 06:58:59 +01:00
dependabot[bot]
beec9e2d1a Bump mypy from 0.990 to 0.991
Bumps [mypy](https://github.com/python/mypy) from 0.990 to 0.991.
- [Release notes](https://github.com/python/mypy/releases)
- [Commits](https://github.com/python/mypy/compare/v0.990...v0.991)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-21 05:36:52 +00:00
Matthias
129f549793 Merge pull request #7781 from freqtrade/dependabot/pip/develop/orjson-3.8.2
Bump orjson from 3.8.1 to 3.8.2
2022-11-21 06:36:34 +01:00
Matthias
1456022dfe Merge pull request #7780 from freqtrade/dependabot/pip/develop/httpx-0.23.1
Bump httpx from 0.23.0 to 0.23.1
2022-11-21 06:35:55 +01:00
Matthias
0d615cfdd8 Merge pull request #7777 from freqtrade/dependabot/pip/develop/nbconvert-7.2.5
Bump nbconvert from 7.2.4 to 7.2.5
2022-11-21 06:35:40 +01:00
Matthias
3dc6a30d65 Merge pull request #7772 from freqtrade/dependabot/pip/develop/numpy-1.23.5
Bump numpy from 1.23.4 to 1.23.5
2022-11-21 06:35:19 +01:00
dependabot[bot]
f09fb2374b Bump orjson from 3.8.1 to 3.8.2
Bumps [orjson](https://github.com/ijl/orjson) from 3.8.1 to 3.8.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.8.1...3.8.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-21 03:02:47 +00:00
dependabot[bot]
8d1ee67ed4 Bump httpx from 0.23.0 to 0.23.1
Bumps [httpx](https://github.com/encode/httpx) from 0.23.0 to 0.23.1.
- [Release notes](https://github.com/encode/httpx/releases)
- [Changelog](https://github.com/encode/httpx/blob/master/CHANGELOG.md)
- [Commits](https://github.com/encode/httpx/compare/0.23.0...0.23.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-21 03:02:38 +00:00
dependabot[bot]
844334a7ea Bump uvicorn from 0.19.0 to 0.20.0
Bumps [uvicorn](https://github.com/encode/uvicorn) from 0.19.0 to 0.20.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.19.0...0.20.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-21 03:02:34 +00:00
dependabot[bot]
ec15ef0398 Bump nbconvert from 7.2.4 to 7.2.5
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.2.4 to 7.2.5.
- [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.2.4...v7.2.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-21 03:02:26 +00:00
dependabot[bot]
3f9dacc9be Bump ccxt from 2.1.75 to 2.1.96
Bumps [ccxt](https://github.com/ccxt/ccxt) from 2.1.75 to 2.1.96.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/2.1.75...2.1.96)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-21 03:02:15 +00:00
dependabot[bot]
5cce8f4f2d Bump types-python-dateutil from 2.8.19.3 to 2.8.19.4
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19.3 to 2.8.19.4.
- [Release notes](https://github.com/python/typeshed/releases)
- [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>
2022-11-21 03:02:00 +00:00
dependabot[bot]
0cb08024f1 Bump numpy from 1.23.4 to 1.23.5
Bumps [numpy](https://github.com/numpy/numpy) from 1.23.4 to 1.23.5.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v1.23.4...v1.23.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-21 03:01:59 +00:00
Timothy Pogue
edb817e2e6 add tutorial for ssl in docs 2022-11-20 19:19:28 -07:00
Timothy Pogue
106ac2ab4d fix tests, change to get call 2022-11-20 16:36:22 -07:00
Timothy Pogue
d2870d48ea change typing to async iterator 2022-11-20 16:24:44 -07:00
Timothy Pogue
48a1f2418f update typing, remove unneeded try block, readd sleep 2022-11-20 16:18:24 -07:00
Timothy Pogue
60a167bdef add dynamic send timeout 2022-11-20 14:09:45 -07:00
Timothy Pogue
dc79284c54 Merge branch 'develop' into feat/refactor-ws 2022-11-20 10:05:22 -07:00
Matthias
12b471c64b Prevent 2 parallel open orders through forceentry
this leads to forgetting the prior order

closes #7765
2022-11-20 09:28:14 +01:00
Wagner Costa Santos
fdc82af883 fix tests - update code to backtest with historic_predictions 2022-11-19 22:27:58 -03:00
Timothy Pogue
3714d7074b smaller throttle in channel send 2022-11-19 13:29:23 -07:00
Timothy Pogue
c1a73a5512 move sleep call in send, minor cleanup 2022-11-19 13:21:26 -07:00
Wagner Costa Santos
80d070e9ee update code to use historic_predictions for freqai_backtest_live_models 2022-11-19 14:15:58 -03:00
robcaulk
d02da279f8 document the simplifications of the training environment 2022-11-19 13:20:20 +01:00
Wagner Costa Santos
3d3195847c Merge branch 'develop' into backtest_fitlivepredictions 2022-11-18 17:53:34 -03:00
Timothy Pogue
98d87b3ba6 Merge branch 'develop' into feat/refactor-ws 2022-11-18 13:41:22 -07:00
Timothy Pogue
0cb6f71c02 better error handling, true async sending, more readable api 2022-11-18 13:32:27 -07:00
Matthias
4de9a46618 Merge pull request #7759 from wizrds/fix/pd-mem-leak
Fix Pandas to_json memory leak
2022-11-18 20:24:16 +01:00
Timothy Pogue
b6a8e421f1 remove redundant timestamp conversion in ws serializer 2022-11-18 09:43:39 -07:00
robcaulk
61a859ba4c remove tensorboard req from rl reqs 2022-11-18 17:30:03 +01:00
Matthias
12cd83453c Add warning when queue websocket queue becomes too full 2022-11-18 14:03:56 +01:00
Matthias
4c7bb79c86 Restore prior data transfer format 2022-11-18 13:59:29 +01:00
Timothy Pogue
ba493eb7a7 Merge fix/pd-mem-leak 2022-11-17 16:21:12 -07:00
robcaulk
387c905a86 merge develop into RL 2022-11-17 21:59:07 +01:00
robcaulk
60fcd8dce2 fix skipped mac test, fix RL bug in add_state_info, fix use of __import__, revise doc 2022-11-17 21:50:02 +01:00
robcaulk
91df79ff44 merge dev into backtest-live-predictions 2022-11-17 21:20:47 +01:00
Matthias
436b314c80 add safe_remaining
fixes #7757
2022-11-17 19:07:47 +00:00
Matthias
1975e942d6 Add test for no remaining
(kucoin case - https://github.com/freqtrade/freqtrade/issues/7757).
2022-11-17 19:07:47 +00:00
Matthias
48e5a45856 rpc_test: dont replicate whole response,
updating  what's changed improves readability
2022-11-17 19:07:47 +00:00
Timothy Pogue
49ecc83061 Merge branch 'develop' into fix/pd-mem-leak 2022-11-17 12:04:49 -07:00
Timothy Pogue
ce43fa5f43 small fix to websocketchannel and relay 2022-11-17 12:03:11 -07:00
Timothy Pogue
875e9ab447 change df serialization to avoid mem leak 2022-11-17 11:59:03 -07:00
Robert Caulk
cd6f87be17 Merge pull request #7728 from freqtrade/improve_timerange
Simplify timerange handling
2022-11-17 19:57:48 +01:00
Matthias
b929e0bb2b Merge branch 'develop' into gc_improvements 2022-11-17 19:55:03 +01:00
Matthias
9432bcd065 Fix telegram error on force_enter exception
closes #7727
2022-11-17 19:52:03 +01:00
Wagner Costa Santos
3903b04d3f save_live_data_backtest - added docs and tests 2022-11-17 15:20:07 -03:00
Timothy Pogue
a993cb512d change to get call in ws_client 2022-11-17 10:22:55 -07:00
Wagner Costa Santos
99bff9cbfa backtesting_from_live_saved_files - code refactoring 2022-11-17 10:30:51 -03:00
Wagner Costa Santos
913749c81b backtesting_from_live_saved_files - code refactoring 2022-11-17 10:30:16 -03:00
Wagner Costa Santos
b01e4e3dbf change default value - save_live_data_backtest as false 2022-11-17 10:14:30 -03:00
Wagner Costa Santos
1a19d90e2e Merge branch 'develop' into backtest_fitlivepredictions 2022-11-17 10:13:11 -03:00
Matthias
0a7f4fd3cc fix httpx test warning 2022-11-17 10:36:24 +00:00
Matthias
afcb86f422 Improve migration types 2022-11-17 10:25:51 +00:00
Matthias
93addbe5c3 Improve typechecking 2022-11-17 10:16:38 +00:00
Matthias
097af973d2 improve RPC testcase to cover open orders 2022-11-17 07:10:47 +01:00
Timothy Pogue
1380ddd066 update ws client 2022-11-15 22:44:02 -07:00
Matthias
019577f73d Temporarily Downgrade cryptography until piwheels has the new wheel available 2022-11-16 06:36:26 +01:00
Timothy Pogue
86e094e39b update docs 2022-11-15 22:33:42 -07:00
Timothy Pogue
6a1655c047 support ssl connections in emc 2022-11-15 22:26:54 -07:00
Timothy Pogue
442467e8ae remove old comments and code 2022-11-14 22:26:34 -07:00
Matthias
6deb2dfb61 Merge pull request #7744 from freqtrade/dependabot/pip/develop/mypy-0.990
Bump mypy from 0.982 to 0.990
2022-11-15 06:24:24 +01:00
Timothy Pogue
d713af045f remove main queue completely 2022-11-14 22:21:40 -07:00
Timothy Pogue
659c8c237f initial revision 2022-11-14 20:27:45 -07:00
Matthias
0a702cdd26 Ensure more methods are typechecked 2022-11-14 20:56:35 +01:00
Matthias
f27be7ada8 Configure mypy to old behavior
based on https://mypy-lang.blogspot.com/2022/11/mypy-0990-released.html release
2022-11-14 20:52:40 +01:00
Matthias
a951b49541 Use Generator when sending initial dataframes 2022-11-14 19:43:59 +01:00
Matthias
30b467906c Delist FTX, following ccxt's delisting. 2022-11-14 19:40:57 +01:00
Matthias
663039835d Merge pull request #7745 from freqtrade/dependabot/pip/develop/fastapi-0.87.0
Bump fastapi from 0.85.1 to 0.87.0
2022-11-14 15:19:52 +01:00
Matthias
c72ffad698 Add starlette test dependency 2022-11-14 13:08:29 +00:00
Matthias
2a1bfb8e57 Merge pull request #7746 from freqtrade/dependabot/pip/develop/types-python-dateutil-2.8.19.3
Bump types-python-dateutil from 2.8.19.2 to 2.8.19.3
2022-11-14 14:05:03 +01:00
Matthias
a689538b9a Merge pull request #7751 from freqtrade/dependabot/pip/develop/sqlalchemy-1.4.44
Bump sqlalchemy from 1.4.43 to 1.4.44
2022-11-14 09:39:47 +01:00
Matthias
e24f644251 Merge pull request #7742 from freqtrade/dependabot/pip/develop/cryptography-38.0.3
Bump cryptography from 38.0.1 to 38.0.3
2022-11-14 09:39:25 +01:00
Matthias
c12dcd9b9b update pre-commit dateutil 2022-11-14 08:40:09 +01:00
dependabot[bot]
4cece8720a Bump mypy from 0.982 to 0.990
Bumps [mypy](https://github.com/python/mypy) from 0.982 to 0.990.
- [Release notes](https://github.com/python/mypy/releases)
- [Commits](https://github.com/python/mypy/compare/v0.982...v0.990)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-14 07:33:06 +00:00
dependabot[bot]
721998521b Bump types-python-dateutil from 2.8.19.2 to 2.8.19.3
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19.2 to 2.8.19.3.
- [Release notes](https://github.com/python/typeshed/releases)
- [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>
2022-11-14 07:33:03 +00:00
dependabot[bot]
60449d9bec Bump cryptography from 38.0.1 to 38.0.3
Bumps [cryptography](https://github.com/pyca/cryptography) from 38.0.1 to 38.0.3.
- [Release notes](https://github.com/pyca/cryptography/releases)
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/38.0.1...38.0.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-14 07:32:31 +00:00
Matthias
5ca705ae3a Merge pull request #7747 from freqtrade/dependabot/pip/develop/types-requests-2.28.11.4
Bump types-requests from 2.28.11.2 to 2.28.11.4
2022-11-14 08:32:11 +01:00
Matthias
cf6aa0506f Merge pull request #7750 from freqtrade/dependabot/pip/develop/ccxt-2.1.75
Bump ccxt from 2.1.54 to 2.1.75
2022-11-14 08:31:41 +01:00
Matthias
849c028133 Merge pull request #7749 from freqtrade/dependabot/pip/develop/psutil-5.9.4
Bump psutil from 5.9.3 to 5.9.4
2022-11-14 08:28:38 +01:00
Matthias
cf9944c48d Merge pull request #7741 from freqtrade/dependabot/pip/develop/mkdocs-material-8.5.10
Bump mkdocs-material from 8.5.8 to 8.5.10
2022-11-14 08:03:39 +01:00
dependabot[bot]
cf5cda4df5 Bump sqlalchemy from 1.4.43 to 1.4.44
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 1.4.43 to 1.4.44.
- [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>
2022-11-14 06:04:54 +00:00
dependabot[bot]
7275d48516 Bump ccxt from 2.1.54 to 2.1.75
Bumps [ccxt](https://github.com/ccxt/ccxt) from 2.1.54 to 2.1.75.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/2.1.54...2.1.75)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-14 06:04:37 +00:00
dependabot[bot]
60de797dcc Bump psutil from 5.9.3 to 5.9.4
Bumps [psutil](https://github.com/giampaolo/psutil) from 5.9.3 to 5.9.4.
- [Release notes](https://github.com/giampaolo/psutil/releases)
- [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst)
- [Commits](https://github.com/giampaolo/psutil/compare/release-5.9.3...release-5.9.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-14 06:03:58 +00:00
Matthias
95fd4072fa Merge pull request #7701 from freqtrade/add-single-precision-freqai
add option to force single precision
2022-11-14 07:02:35 +01:00
Matthias
b2de070462 bump types-requests 2022-11-14 07:01:49 +01:00
Matthias
03d3492838 Merge pull request #7739 from freqtrade/dependabot/pip/develop/tensorboard-2.11.0
Bump tensorboard from 2.10.1 to 2.11.0
2022-11-14 06:55:24 +01:00
dependabot[bot]
9843fb2087 Bump mkdocs-material from 8.5.8 to 8.5.10
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 8.5.8 to 8.5.10.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/8.5.8...8.5.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-14 05:55:09 +00:00
Matthias
447635043e Merge pull request #7740 from freqtrade/dependabot/pip/develop/nbconvert-7.2.4
Bump nbconvert from 7.2.3 to 7.2.4
2022-11-14 06:54:47 +01:00
Matthias
5d92008293 Merge pull request #7743 from freqtrade/dependabot/pip/develop/pytest-asyncio-0.20.2
Bump pytest-asyncio from 0.20.1 to 0.20.2
2022-11-14 06:54:27 +01:00
Matthias
d22a22d161 Merge pull request #7748 from freqtrade/dependabot/pip/develop/pymdown-extensions-9.8
Bump pymdown-extensions from 9.7 to 9.8
2022-11-14 06:53:51 +01:00
dependabot[bot]
bbfcaca9e0 Bump pymdown-extensions from 9.7 to 9.8
Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 9.7 to 9.8.
- [Release notes](https://github.com/facelessuser/pymdown-extensions/releases)
- [Commits](https://github.com/facelessuser/pymdown-extensions/compare/9.7...9.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-14 03:02:26 +00:00
dependabot[bot]
48c4d8d2df Bump types-requests from 2.28.11.2 to 2.28.11.4
Bumps [types-requests](https://github.com/python/typeshed) from 2.28.11.2 to 2.28.11.4.
- [Release notes](https://github.com/python/typeshed/releases)
- [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>
2022-11-14 03:02:21 +00:00
dependabot[bot]
ce269b7984 Bump fastapi from 0.85.1 to 0.87.0
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.85.1 to 0.87.0.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.85.1...0.87.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-14 03:02:14 +00:00
dependabot[bot]
9d8d18d76b Bump pytest-asyncio from 0.20.1 to 0.20.2
Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.20.1 to 0.20.2.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Changelog](https://github.com/pytest-dev/pytest-asyncio/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.20.1...v0.20.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-14 03:01:42 +00:00
dependabot[bot]
001602e034 Bump nbconvert from 7.2.3 to 7.2.4
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.2.3 to 7.2.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.2.3...v7.2.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-14 03:01:11 +00:00
dependabot[bot]
3e6834e3f0 Bump tensorboard from 2.10.1 to 2.11.0
Bumps [tensorboard](https://github.com/tensorflow/tensorboard) from 2.10.1 to 2.11.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.10.1...2.11.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-14 03:01:08 +00:00
Matthias
42b29cd307 Fix constants type 2022-11-13 19:31:49 +01:00
robcaulk
bf4d5b432a ensure model_type is defined 2022-11-13 18:50:25 +01:00
robcaulk
6394ef4558 fix docstrings 2022-11-13 17:43:52 +01:00
robcaulk
c8d3e57712 add note that these environments are designed for short-long bots only. 2022-11-13 17:30:56 +01:00
robcaulk
c76afc255a explain how to choose environments, and how to customize them 2022-11-13 17:26:11 +01:00
robcaulk
96fafb7f56 remove limit_ram_use 2022-11-13 17:14:47 +01:00
robcaulk
b421521be3 help default ReinforcementLearner users by assigning the model_type automatically 2022-11-13 17:12:17 +01:00
robcaulk
90f168d1ff remove more user references. cleanup dataprovider 2022-11-13 17:06:06 +01:00
robcaulk
f8f553ec14 remove references to "the user" 2022-11-13 16:58:36 +01:00
robcaulk
388ca21200 update docs, fix bug in environment 2022-11-13 16:56:31 +01:00
robcaulk
3c249ba994 add doc for data_kitchen_thread_count` 2022-11-13 16:11:14 +01:00
robcaulk
1e9e7887aa fix constants.py, fix freqai test 2022-11-13 15:38:35 +01:00
robcaulk
af9e400562 add test coverage, fix bug in base environment. Ensure proper fee is used. 2022-11-13 15:31:37 +01:00
Matthias
a59d61472b Add test for dataframe footprint reduction 2022-11-13 15:29:37 +01:00
Matthias
942840da2d Improve setting wording to keep future possibilities open 2022-11-13 15:22:44 +01:00
robcaulk
81f800a79b switch to using FT calc_profi_pct, reverse entry/exit fees 2022-11-13 13:41:17 +01:00
robcaulk
e45d791c19 Merge remote-tracking branch 'origin/develop' into feat/freqai-rl-dev 2022-11-13 13:00:16 +01:00
Matthias
c6013e5819 Fix doc typo 2022-11-13 12:01:20 +01:00
Matthias
535c365b4a Disable ftx ccxt_compat tests
Their API is down due to being insolvent ...
2022-11-13 10:33:54 +01:00
Matthias
fed3bc6730 Simplify Websocket Init 2022-11-13 10:33:54 +01:00
Matthias
914bdbdd83 Remove FTX from list of supported exchanges 2022-11-12 20:32:17 +01:00
Matthias
d39b997489 Merge pull request #7736 from M451z/patch-1
Update README.md
2022-11-12 20:30:50 +01:00
Matthias
954da4fec9 Add "forcebuy error" exception log
part of #7727
2022-11-12 19:52:10 +01:00
robcaulk
259f87bd40 fix rl test; 2022-11-12 19:01:40 +01:00
robcaulk
e71a8b8ac1 add ability to integrate state info or not, and prevent state info integration during backtesting 2022-11-12 18:46:48 +01:00
Wagner Costa Santos
27fa9f1f4e backtest saved dataframe from live 2022-11-12 14:37:23 -03:00
Matthias
ee0e59157c Update join relationship of orders table to selectin
closes #6791 by slightly improving performance in this area.
2022-11-12 16:34:00 +01:00
Colt 1911
8c092d457c Update README.md
Removed the FTX option under the "Supported Exchange marketplaces" title, because of FTX bankrupt.
2022-11-12 18:28:51 +03:00
Matthias
7adca97358 Improve python GC behavior 2022-11-12 15:43:02 +01:00
Wagner Costa Santos
f9c6c538be Merge branch 'develop' into backtest_fitlivepredictions 2022-11-12 09:37:45 -03:00
robcaulk
9c6b97c678 ensure normalization acceleration methods are employed in RL 2022-11-12 12:01:59 +01:00
robcaulk
6746868ea7 store dataprovider to self instead of strategy 2022-11-12 11:33:03 +01:00
robcaulk
6ff0e66ddf ensure strat tests are updated 2022-11-12 11:13:31 +01:00
robcaulk
7a4bb040a5 merge develop into feat/freqai-rl-dev 2022-11-12 10:54:34 +01:00
robcaulk
214c622475 move dataframe converter to converter.py 2022-11-12 10:38:25 +01:00
robcaulk
9617d8143d Merge remote-tracking branch 'origin/develop' into add-single-precision-freqai 2022-11-12 10:21:38 +01:00
Matthias
e6172a68d7 Merge pull request #7730 from freqtrade/fix-metric-tracker
fix loading of metric tracker from disk
2022-11-11 20:01:26 +01:00
Robert Caulk
833578716c Merge pull request #7644 from markdregan/multi-target-classifier
Support for multi target multi-class classification (FreqaiMultiOutputRegressor for Classification)
2022-11-11 18:48:38 +01:00
robcaulk
790ff2a84b merge develop into add-single-prec 2022-11-11 18:08:51 +01:00
robcaulk
e46a57bbd0 move mem logs to debug 2022-11-11 18:05:32 +01:00
robcaulk
66514e84e4 add LightGBMClassifierMultiTarget. add test 2022-11-11 17:45:53 +01:00
robcaulk
054133955b fix loading of metric tracker from disk 2022-11-11 17:24:09 +01:00
Matthias
e34f0f60a5 Merge pull request #7724 from wassertim/bugfix/7723
Support git and local changes in dev containers
2022-11-10 21:05:36 +01:00
Matthias
4664d5e1d8 Split installation to onCreateCommand 2022-11-10 18:56:19 +00:00
Matthias
0f9c5f8d41 Simplify timerange handling 2022-11-10 18:28:18 +01:00
Matthias
57313dd961 Update some usages of timerange to new, simplified method 2022-11-10 18:11:39 +01:00
Matthias
3e676dbaa4 Add properties to simplify timerange handling 2022-11-10 16:33:57 +01:00
Matthias
7147f52e02 FreqAI also requires plotting dependencies
cloess #7726
2022-11-10 16:03:30 +01:00
Tim
be83e73411 add pip install 2022-11-10 08:42:47 +00:00
Matthias
88ad3fe43e Remove typo from main page 2022-11-10 07:32:55 +01:00
Matthias
22c419d5c4 Add warning about FTX 2022-11-10 07:14:10 +01:00
Matthias
9e17eabd0a Improve Bybit configuration 2022-11-10 07:09:54 +01:00
Tim
ec6ee7ead9 remove empty space 2022-11-09 21:06:14 +01:00
Tim
7953280513 remove github.copilot extension 2022-11-09 21:05:05 +01:00
Tim
037363f9ee support git and local changes in dev containers #7723 2022-11-09 19:53:09 +01:00
Matthias
d3006f7f3e Bump ccxt to 2.1.54
closes okx: #7720
2022-11-09 17:59:51 +01:00
Wagner Costa Santos
4f0f3e5b64 removed unnecessary code 2022-11-09 10:07:24 -03:00
Wagner Costa Santos
8ee95db927 refactoring backtesting_fit_live_predictions function 2022-11-09 09:51:42 -03:00
Wagner Costa Santos
3e57c18ac6 add fix_live_predictions function to backtesting 2022-11-08 18:20:39 -03:00
Matthias
f43f967040 Improve handling of unfilled stoploss orders in edge-cases 2022-11-08 20:34:18 +01:00
Matthias
ce3959a0c6 Merge pull request #7708 from freqtrade/improve_iteration
Improve iteration logic
2022-11-08 19:25:01 +01:00
Wagner Costa Santos
8d9988a942 enforce date column in backtesting freqai predictions files 2022-11-08 11:06:23 -03:00
Wagner Costa Santos
9c5ba0732a save predictions with date and merge by date 2022-11-08 10:32:18 -03:00
Robert Caulk
d59b3e2359 Merge pull request #7710 from freqtrade/dependabot/pip/develop/catboost-1.1.1
Bump catboost from 1.1 to 1.1.1
2022-11-08 11:22:29 +01:00
dependabot[bot]
ea489133ac Bump catboost from 1.1 to 1.1.1
Bumps [catboost](https://github.com/catboost/catboost) from 1.1 to 1.1.1.
- [Release notes](https://github.com/catboost/catboost/releases)
- [Changelog](https://github.com/catboost/catboost/blob/master/RELEASE.md)
- [Commits](https://github.com/catboost/catboost/compare/v1.1...v1.1.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-07 23:54:59 +00:00
Robert Caulk
c3d2df2f4e Merge pull request #7711 from freqtrade/dependabot/pip/develop/xgboost-1.7.1
Bump xgboost from 1.6.2 to 1.7.1
2022-11-08 00:53:51 +01:00
Matthias
426a26f268 Merge pull request #7475 from freqtrade/backtest_live_models
FreqAI - Backtest live/ready models
2022-11-07 20:39:49 +01:00
Matthias
884014a4b9 Fix some minor typos 2022-11-07 18:35:28 +00:00
Wagner Costa Santos
6559384286 Merge branch 'develop' into backtest_live_models 2022-11-07 15:14:10 -03:00
Matthias
8bc71f2025 Merge pull request #7709 from freqtrade/dependabot/pip/develop/jsonschema-4.17.0
Bump jsonschema from 4.16.0 to 4.17.0
2022-11-07 08:19:12 +01:00
Matthias
24df2d576e Merge pull request #7718 from freqtrade/dependabot/pip/develop/orjson-3.8.1
Bump orjson from 3.8.0 to 3.8.1
2022-11-07 08:18:30 +01:00
Matthias
5ba012c592 Disable "tick" in test_update_funding_fees_schedule
we only want to test run frequency, not time progression.
2022-11-07 07:18:09 +00:00
Matthias
05fc6a5e9f Merge pull request #7717 from freqtrade/dependabot/pip/develop/mkdocs-material-8.5.8
Bump mkdocs-material from 8.5.7 to 8.5.8
2022-11-07 07:54:48 +01:00
dependabot[bot]
850b04357e Bump mkdocs-material from 8.5.7 to 8.5.8
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 8.5.7 to 8.5.8.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/8.5.7...8.5.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-07 06:05:47 +00:00
Matthias
a90d91b576 Merge pull request #7714 from freqtrade/dependabot/pip/develop/progressbar2-4.2.0
Bump progressbar2 from 4.1.1 to 4.2.0
2022-11-07 07:04:56 +01:00
Matthias
95a1827af7 Merge pull request #7712 from freqtrade/dependabot/pip/develop/mkdocs-1.4.2
Bump mkdocs from 1.4.1 to 1.4.2
2022-11-07 07:04:02 +01:00
Matthias
689f936390 Merge pull request #7716 from freqtrade/dependabot/pip/develop/pytest-7.2.0
Bump pytest from 7.1.3 to 7.2.0
2022-11-07 07:03:34 +01:00
Matthias
031c472a23 Merge pull request #7715 from freqtrade/dependabot/pip/develop/prompt-toolkit-3.0.32
Bump prompt-toolkit from 3.0.31 to 3.0.32
2022-11-07 07:03:10 +01:00
Matthias
71580a7159 Merge pull request #7713 from freqtrade/dependabot/pip/develop/sqlalchemy-1.4.43
Bump sqlalchemy from 1.4.42 to 1.4.43
2022-11-07 06:57:46 +01:00
dependabot[bot]
d978ff6bfb Bump orjson from 3.8.0 to 3.8.1
Bumps [orjson](https://github.com/ijl/orjson) from 3.8.0 to 3.8.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.8.0...3.8.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-07 03:02:15 +00:00
dependabot[bot]
0bb57f738d Bump pytest from 7.1.3 to 7.2.0
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.1.3 to 7.2.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.1.3...7.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-07 03:01:54 +00:00
dependabot[bot]
37e066bd76 Bump prompt-toolkit from 3.0.31 to 3.0.32
Bumps [prompt-toolkit](https://github.com/prompt-toolkit/python-prompt-toolkit) from 3.0.31 to 3.0.32.
- [Release notes](https://github.com/prompt-toolkit/python-prompt-toolkit/releases)
- [Changelog](https://github.com/prompt-toolkit/python-prompt-toolkit/blob/master/CHANGELOG)
- [Commits](https://github.com/prompt-toolkit/python-prompt-toolkit/compare/3.0.31...3.0.32)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-07 03:01:47 +00:00
dependabot[bot]
224507dfa0 Bump progressbar2 from 4.1.1 to 4.2.0
Bumps [progressbar2](https://github.com/WoLpH/python-progressbar) from 4.1.1 to 4.2.0.
- [Release notes](https://github.com/WoLpH/python-progressbar/releases)
- [Changelog](https://github.com/wolph/python-progressbar/blob/develop/CHANGES.rst)
- [Commits](https://github.com/WoLpH/python-progressbar/compare/v4.1.1...v4.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-07 03:01:36 +00:00
dependabot[bot]
f174b41fd7 Bump sqlalchemy from 1.4.42 to 1.4.43
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 1.4.42 to 1.4.43.
- [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>
2022-11-07 03:01:30 +00:00
dependabot[bot]
01a31a6e01 Bump mkdocs from 1.4.1 to 1.4.2
Bumps [mkdocs](https://github.com/mkdocs/mkdocs) from 1.4.1 to 1.4.2.
- [Release notes](https://github.com/mkdocs/mkdocs/releases)
- [Commits](https://github.com/mkdocs/mkdocs/compare/1.4.1...1.4.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-07 03:01:08 +00:00
dependabot[bot]
1814f25601 Bump xgboost from 1.6.2 to 1.7.1
Bumps [xgboost](https://github.com/dmlc/xgboost) from 1.6.2 to 1.7.1.
- [Release notes](https://github.com/dmlc/xgboost/releases)
- [Changelog](https://github.com/dmlc/xgboost/blob/master/NEWS.md)
- [Commits](https://github.com/dmlc/xgboost/compare/v1.6.2...v1.7.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-07 03:01:03 +00:00
dependabot[bot]
3cbbfde6bc Bump jsonschema from 4.16.0 to 4.17.0
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.16.0 to 4.17.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.16.0...v4.17.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-07 03:00:40 +00:00
Matthias
29585b5ecd Improve worker iteration logic 2022-11-06 11:18:13 +01:00
Matthias
2068a44fd0 Add test for new behavior 2022-11-06 11:17:25 +01:00
Matthias
d48a9ae96d Add leverage to backtest results
closes #7574
2022-11-06 09:40:44 +01:00
Matthias
1d2b89bc13 Improve handling of get_fee to not allow impossible combinations 2022-11-06 09:16:03 +01:00
Matthias
3af177d8af bump ccxt to 2.1.33
closes #7700
2022-11-06 09:16:03 +01:00
Matthias
2c1330a4e2 Update docs to new behavior 2022-11-06 08:32:27 +01:00
Matthias
ded57fb301 Remove no longer valid test part 2022-11-05 20:32:31 +01:00
Matthias
d089fdae34 Fix current-time_det calculation 2022-11-05 20:02:36 +01:00
Matthias
5bd3e54b17 Add test for detail backtesting 2022-11-05 20:01:05 +01:00
Robert Caulk
820aad670c Merge pull request #7690 from freqtrade/track-current-candle
Track current candle in FreqAI
2022-11-05 17:35:05 +01:00
Emre
06a2957837 Merge branch 'develop' into add-single-precision-freqai 2022-11-05 19:15:12 +03:00
Emre
43bdd34964 Optimize reduce_dataframe_footprint function 2022-11-05 19:13:02 +03:00
Matthias
0888b53b5a Udpate current_time handling for detail loop 2022-11-05 17:02:27 +01:00
Matthias
29ba263c3c Update some test parameters 2022-11-05 17:02:27 +01:00
Matthias
a11d579bc2 Verify order fills on "detail" timeframe 2022-11-05 17:02:27 +01:00
Matthias
25b8d34fe2 Update backtesting test
Had bad behavior before, and didn't properly test what it was supposed to
2022-11-05 17:02:18 +01:00
robcaulk
53df607067 avoid duplicating features with okx/gateio, ensure inference timer gets logged 2022-11-05 15:42:19 +01:00
Matthias
6e09d552ac Properly handle and test ohlcv min_max with empty files 2022-11-05 13:14:35 +01:00
Matthias
a9ea84e2c4 Merge pull request #7702 from freqtrade/move-write-metric-param
move write_metrics_to_disk to proper place in param table
2022-11-04 18:25:34 +01:00
robcaulk
257c833831 add doc for single precision, dont allow half precision, add test 2022-11-04 18:10:04 +01:00
robcaulk
d4cfcbda24 move write_metrics_to_disk to proper place in param table 2022-11-04 17:53:15 +01:00
robcaulk
3ccc120f92 add option to force single precision 2022-11-04 17:42:10 +01:00
robcaulk
8bdc99a3d6 fix self-imposed bug 2022-11-04 16:41:38 +01:00
robcaulk
19d90b813a improve readibility in start_backtesting() 2022-11-04 16:10:46 +01:00
Wagner Costa Santos
8008c63319 Merge branch 'develop' into backtest_live_models 2022-11-04 09:09:39 -03:00
Wagner Costa Santos
a7acfb7ab7 fix dict key error 2022-11-04 09:02:28 -03:00
robcaulk
90c5bfb4b5 add default conv_width 2022-11-03 21:35:12 +01:00
robcaulk
05b309caf2 ensure colon replaced for cached attach 2022-11-03 21:17:48 +01:00
robcaulk
6938ed6584 change default conv_width to 1 2022-11-03 21:11:26 +01:00
robcaulk
444a068481 merge develop into track-current-candle 2022-11-03 21:09:08 +01:00
robcaulk
db942321ad fix bug with lightgbm and colons 2022-11-03 21:03:48 +01:00
Matthias
c2130ed3dd Merge pull request #7695 from freqtrade/fix_issue_7666
Fix inconsistent backtesting results - FreqAI
2022-11-03 19:52:48 +01:00
robcaulk
d721b50230 flake8 2022-11-03 19:13:24 +01:00
robcaulk
3ba1e221eb fix typo 2022-11-03 19:08:33 +01:00
robcaulk
6c4bdb8f67 remove special characters from feature names 2022-11-03 18:49:39 +01:00
Wagner Costa Santos
17798b3397 Merge branch 'develop' into backtest_live_models 2022-11-03 13:29:25 -03:00
Wagner Costa Santos
356d79b38a verify mean and std exists in model metadata 2022-11-03 13:27:56 -03:00
Wagner Costa Santos
cdf12cc541 Merge branch 'develop' into fix_issue_7666 2022-11-03 08:30:46 -03:00
Matthias
0aff8c4823 Merge pull request #7692 from wizrds/fix/ws-memory
Fix Memory Leak in Websockets
2022-11-03 07:17:01 +01:00
Matthias
ff619edebf Improve explanation comment as to why we're waiting ourselfs 2022-11-03 06:50:18 +01:00
Timothy Pogue
b749f3edd6 add latency measure from ping in emc and ws_client 2022-11-02 19:30:35 -06:00
Timothy Pogue
a0965606a5 update ws_client more verbosity, better readable time delta 2022-11-02 18:49:11 -06:00
Timothy Pogue
000b0c2198 prevent memory leaks from error in _broadcast_queue_data 2022-11-02 18:00:10 -06:00
Timothy Pogue
cbede2e27d refactor channel.send to avoid queue.put 2022-11-02 17:57:11 -06:00
Timothy Pogue
2dc55e89e6 better error handling channel send 2022-11-02 15:25:39 -06:00
Timothy Pogue
55bf195bfb remove debugging log calls 2022-11-02 14:21:34 -06:00
Timothy Pogue
c2bdaea84a change exception handling in channel send 2022-11-02 14:19:08 -06:00
Timothy Pogue
d848c27283 add task done to broadcast queue method 2022-11-02 13:30:42 -06:00
robcaulk
b3b756ec14 ensure test pass 2022-11-02 20:30:04 +01:00
Timothy Pogue
e25dea7e0e update channel disconnecting 2022-11-02 13:26:27 -06:00
robcaulk
ce92731132 ensure backwards compatitibility 2022-11-02 20:20:35 +01:00
Wagner Costa Santos
23b6915dde fix issue with different backtesting prediction size 2022-11-02 15:49:51 -03:00
Matthias
09e0a8d4df Merge pull request #7689 from freqtrade/add-pca-dbscan-tests
add integrated tests for PCA and DBSCAN
2022-11-02 19:41:37 +01:00
Matthias
2c3c7e1e3a Merge pull request #7663 from freqtrade/shuffle_list_enhance
Improve ShufflePairlist to shuffle only once per candle
2022-11-02 19:37:48 +01:00
robcaulk
1a38c10fc6 remove old code 2022-11-02 19:37:47 +01:00
robcaulk
255eb71270 start tracking the current candle in FreqAI, add robustness to corr_df caching and inference timer, add test for cache corr_df 2022-11-02 19:32:22 +01:00
robcaulk
63458a6130 isort 2022-11-02 18:40:13 +01:00
robcaulk
2afa185dc6 add integrated tests for PCA and DBSCAN 2022-11-02 18:34:56 +01:00
Matthias
2ed04916ae Merge pull request #7676 from freqtrade/dependabot/pip/develop/pyarrow-10.0.0
Bump pyarrow from 9.0.0 to 10.0.0
2022-11-02 08:14:55 +01:00
Matthias
d9f41e5570 Update pyarrow prebuilt wheel 2022-11-02 06:41:15 +01:00
Matthias
b82fc3fabd Merge pull request #7612 from freqtrade/reduce-indicator-population
avoid redundant indicator population for corr_pair list
2022-10-31 20:24:27 +01:00
Matthias
f5c694213b Merge pull request #7672 from freqtrade/dependabot/pip/develop/scikit-learn-1.1.3
Bump scikit-learn from 1.1.2 to 1.1.3
2022-10-31 19:27:33 +01:00
Matthias
4f1d1d4688 Merge pull request #7683 from freqtrade/add-statement-of-need
add statement of need to FreqAI docs
2022-10-31 18:59:45 +01:00
robcaulk
162056a362 fix flake8 2022-10-31 18:23:35 +01:00
robcaulk
97df232ac6 add a warning to __init__ for get_corr_dataframes 2022-10-31 18:18:00 +01:00
robcaulk
e6a70d95df Merge branch 'develop' into reduce-indicator-population 2022-10-31 18:13:55 +01:00
robcaulk
7b880a969a change elect to decide 2022-10-31 18:13:48 +01:00
robcaulk
fbc281e695 fix grammar, remove hyperlink 2022-10-31 18:10:31 +01:00
robcaulk
c3c6733b2d add statement of need to FreqAI docs 2022-10-31 18:03:53 +01:00
Matthias
0f2e540a64 Update windows documentation about 32bit Windows 2022-10-31 17:39:41 +01:00
Matthias
ef8007fc42 Merge pull request #7675 from freqtrade/dependabot/pip/develop/uvicorn-0.19.0
Bump uvicorn from 0.18.3 to 0.19.0
2022-10-31 17:33:58 +01:00
Matthias
b3f612ecfb Bump ccxt to 2.0.96 2022-10-31 17:21:52 +01:00
Matthias
735546ab89 Merge pull request #7674 from freqtrade/dependabot/pip/develop/nbconvert-7.2.3
Bump nbconvert from 7.2.1 to 7.2.3
2022-10-31 15:26:38 +01:00
robcaulk
66d8ed6c0b Merge remote-tracking branch 'origin/develop' into reduce-indicator-population 2022-10-31 09:42:01 +01:00
dependabot[bot]
aa3d6dc298 Bump uvicorn from 0.18.3 to 0.19.0
Bumps [uvicorn](https://github.com/encode/uvicorn) from 0.18.3 to 0.19.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.18.3...0.19.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-31 08:23:29 +00:00
Matthias
ccba651d37 Merge pull request #7671 from freqtrade/dependabot/pip/develop/plotly-5.11.0
Bump plotly from 5.10.0 to 5.11.0
2022-10-31 09:22:45 +01:00
Matthias
53bc72f27f Merge pull request #7680 from freqtrade/dependabot/pip/develop/psutil-5.9.3
Bump psutil from 5.9.2 to 5.9.3
2022-10-31 09:21:53 +01:00
Matthias
9c7e686db0 Merge pull request #7678 from freqtrade/dependabot/pip/develop/ccxt-2.0.90
Bump ccxt from 2.0.58 to 2.0.90
2022-10-31 08:50:10 +01:00
Matthias
ecd5e22960 Merge pull request #7673 from freqtrade/dependabot/pip/develop/pycoingecko-3.1.0
Bump pycoingecko from 3.0.0 to 3.1.0
2022-10-31 08:40:03 +01:00
Matthias
e010c01446 Merge pull request #7679 from freqtrade/dependabot/pip/develop/websockets-10.4
Bump websockets from 10.3 to 10.4
2022-10-31 08:36:28 +01:00
dependabot[bot]
be67eb9586 Bump psutil from 5.9.2 to 5.9.3
Bumps [psutil](https://github.com/giampaolo/psutil) from 5.9.2 to 5.9.3.
- [Release notes](https://github.com/giampaolo/psutil/releases)
- [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst)
- [Commits](https://github.com/giampaolo/psutil/compare/release-5.9.2...release-5.9.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-31 07:35:55 +00:00
Matthias
51c97d8099 Merge pull request #7677 from freqtrade/dependabot/pip/develop/colorama-0.4.6
Bump colorama from 0.4.5 to 0.4.6
2022-10-31 08:34:44 +01:00
dependabot[bot]
39f145e7ba Bump websockets from 10.3 to 10.4
Bumps [websockets](https://github.com/aaugustin/websockets) from 10.3 to 10.4.
- [Release notes](https://github.com/aaugustin/websockets/releases)
- [Commits](https://github.com/aaugustin/websockets/compare/10.3...10.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-31 03:01:55 +00:00
dependabot[bot]
ac86d19459 Bump ccxt from 2.0.58 to 2.0.90
Bumps [ccxt](https://github.com/ccxt/ccxt) from 2.0.58 to 2.0.90.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/2.0.58...2.0.90)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-31 03:01:52 +00:00
dependabot[bot]
7e12d03225 Bump colorama from 0.4.5 to 0.4.6
Bumps [colorama](https://github.com/tartley/colorama) from 0.4.5 to 0.4.6.
- [Release notes](https://github.com/tartley/colorama/releases)
- [Changelog](https://github.com/tartley/colorama/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tartley/colorama/compare/0.4.5...0.4.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-31 03:01:42 +00:00
dependabot[bot]
a5824f5cf2 Bump pyarrow from 9.0.0 to 10.0.0
Bumps [pyarrow](https://github.com/apache/arrow) from 9.0.0 to 10.0.0.
- [Release notes](https://github.com/apache/arrow/releases)
- [Commits](https://github.com/apache/arrow/compare/go/v9.0.0...go/v10.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-31 03:01:38 +00:00
dependabot[bot]
7348a8074e Bump nbconvert from 7.2.1 to 7.2.3
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.2.1 to 7.2.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.2.1...v7.2.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-31 03:01:31 +00:00
dependabot[bot]
30f0a4dba2 Bump pycoingecko from 3.0.0 to 3.1.0
Bumps [pycoingecko](https://github.com/man-c/pycoingecko) from 3.0.0 to 3.1.0.
- [Release notes](https://github.com/man-c/pycoingecko/releases)
- [Changelog](https://github.com/man-c/pycoingecko/blob/master/CHANGELOG.md)
- [Commits](https://github.com/man-c/pycoingecko/compare/3.0.0...3.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-31 03:01:22 +00:00
dependabot[bot]
eb01bed33a Bump scikit-learn from 1.1.2 to 1.1.3
Bumps [scikit-learn](https://github.com/scikit-learn/scikit-learn) from 1.1.2 to 1.1.3.
- [Release notes](https://github.com/scikit-learn/scikit-learn/releases)
- [Commits](https://github.com/scikit-learn/scikit-learn/compare/1.1.2...1.1.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-31 03:01:20 +00:00
dependabot[bot]
41c2dc2c68 Bump plotly from 5.10.0 to 5.11.0
Bumps [plotly](https://github.com/plotly/plotly.py) from 5.10.0 to 5.11.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.10.0...v5.11.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-31 03:01:16 +00:00
robcaulk
a49edfbaee add tests for CatboostClassifier 2022-10-30 18:08:10 +01:00
robcaulk
d59a7fa2f9 remove analysis_lock and realign example hybrid strat 2022-10-30 17:07:33 +01:00
Matthias
32a03a89c6 Merge pull request #7665 from freqtrade/update_ci
Update generic CI's to ubuntu 22.04
2022-10-30 15:55:09 +01:00
Matthias
707b224af5 Update generic CI's to ubuntu 22.04 2022-10-30 15:09:53 +01:00
Matthias
391c3f56f7 Add typehint to corr_pairlist 2022-10-30 13:28:01 +01:00
Matthias
bd051cb205 Remove pandas workaround for pi image 2022-10-30 12:44:39 +01:00
Mark Regan
7053f81fa8 simplified predict and predict_proba using super(). Added duplicate class label check. 2022-10-30 09:48:30 +00:00
Matthias
cf4af2175c Merge pull request #7662 from markdregan/backtest_extra_returns_fix
Fix missing f-string from PR #7611
2022-10-30 10:47:06 +01:00
robcaulk
a2843165e1 fix leftovers from merge 2022-10-30 10:31:38 +01:00
robcaulk
52e15b2070 Merge remote-tracking branch 'origin/develop' into feat/freqai-rl-dev 2022-10-30 10:16:39 +01:00
robcaulk
d1a0874683 merge develop into feat/freqai-rl-dev 2022-10-30 10:13:03 +01:00
robcaulk
fc53054d43 leverage list length knowledge, f-string change 2022-10-30 10:12:14 +01:00
Emre
f98c7a2423 Remove loop of normalization from metadata 2022-10-30 10:12:14 +01:00
Matthias
5c14aeddc6 Add "--log-file" alias for "--logfile" 2022-10-30 09:50:54 +01:00
Matthias
5013351143 Rename "shuffle" parameter to "shuffle_freq" 2022-10-30 09:48:55 +01:00
Matthias
a323acf343 Improve ShufflePairlist to shuffle only once per candle 2022-10-30 09:46:12 +01:00
Mark Regan
c26fda282f fix missing f-string from PR #7611 2022-10-30 08:19:59 +00:00
robcaulk
650bb8b7d7 ensure full pair string is used for caching dataframes. If not, revert to old behavior. Update docs. 2022-10-29 22:26:49 +02:00
Matthias
352adaf127 Improve readability of is_time_to_refresh function 2022-10-29 19:45:46 +02:00
Matthias
b7d2c14f2c Improve trading limits docs to mention upper limits
#7654
2022-10-29 09:29:22 +02:00
Matthias
c23a9475e6 Move exchange utilities into separate module 2022-10-29 09:29:17 +02:00
Matthias
801e91c39e Merge pull request #7618 from wizrds/fix/docker-config-record
Update function in FreqAI interface to record FreqAI config params
2022-10-29 08:56:20 +02:00
Matthias
54c7122cc3 Merge pull request #7647 from freqtrade/combine_stop
Combine stop logic
2022-10-28 19:38:40 +02:00
Matthias
777af5517d Version bump develop version to 2022.11-dev 2022-10-28 19:38:19 +02:00
Mark Regan
6ef82dd8b6 minor change to return 2022-10-27 12:41:12 +01:00
Matthias
9e0b39cddc Properly invert sign
fixes 98ba57ff
2022-10-27 06:56:33 +02:00
Mark Regan
1c98640129 Delete MultiTargetClassifierTestStrategy.py 2022-10-26 13:11:10 +01:00
Mark Regan
a9a3ceadf7 Delete config_test.json 2022-10-26 13:10:18 +01:00
Matthias
255f38537e Simplify stoploss behavior by combining more commonalities 2022-10-26 07:14:33 +02:00
Matthias
6e0ca058f4 Update function-head for _get_stop_params 2022-10-26 07:12:49 +02:00
Matthias
cf6b75a3f3 Use combined stoploss_adjust where possible 2022-10-26 07:12:42 +02:00
Matthias
d831d7d317 Rename Freqai hybrid example
closes #7645
2022-10-26 06:47:34 +02:00
Matthias
110db8b241 Merge pull request #7621 from wizrds/fix/channel-api
Improved WebSocketChannel API
2022-10-26 06:31:42 +02:00
Timothy Pogue
b9bf9edb02 update rapidjson opts 2022-10-25 14:12:13 -06:00
Timothy Pogue
fd5f31368c fix indent in initial df send 2022-10-25 14:08:28 -06:00
Robert Caulk
1f5e92c0e7 Merge pull request #7642 from smarmau/patch-3
Update freqai-running.md
2022-10-25 21:39:35 +02:00
Mark Regan
217add70bd add strat and config for testing on PR 2022-10-25 20:07:39 +01:00
Matthias
604f966c82 Enhance documentation with full space override sample
closes #7643
2022-10-25 20:27:38 +02:00
Matthias
d94c0039eb Add missing import to hyperopt docs 2022-10-25 20:20:51 +02:00
Matthias
3fa50077c9 Don't use pydantic to type-verify outgoing messages 2022-10-25 20:00:53 +02:00
Mark Regan
47056eded3 multi target classifier working but not for parallel 2022-10-25 18:24:27 +01:00
Matthias
1ef38f137d Fix XGBoost regressor "used before assignment" 2022-10-25 13:37:04 +02:00
smarmau
f12d40bd6b Update freqai-running.md
Updated the follower section of the docs to include parameters to make the config schema validate on start up for follow_mode
2022-10-25 20:59:39 +11:00
Matthias
283dab667d Fix pydantic version pin 2022-10-25 09:04:31 +00:00
Matthias
f70c00dd4c Improve variance around worker timing test 2022-10-25 06:14:42 +00:00
Timothy Pogue
51be45547f remove np object, make default str 2022-10-24 12:23:54 -06:00
Timothy Pogue
32600a113f fix broadcast 2022-10-24 12:21:17 -06:00
Matthias
f93b6eec63 Improve timing for worker throttling 2022-10-24 20:09:13 +02:00
Matthias
e969479525 Merge pull request #7619 from freqtrade/stop/usehighlow
Stop/usehighlow
2022-10-24 20:04:36 +02:00
Matthias
5bbd861512 Update binance sample config with better blacklist 2022-10-24 19:30:53 +02:00
Matthias
10bdaa8671 Merge pull request #7627 from freqtrade/dependabot/pip/develop/progressbar2-4.1.1
Bump progressbar2 from 4.0.0 to 4.1.1
2022-10-24 19:20:13 +02:00
Matthias
a12ac2e8c4 Merge pull request #7629 from freqtrade/dependabot/pip/develop/python-rapidjson-1.9
Bump python-rapidjson from 1.8 to 1.9
2022-10-24 18:13:16 +02:00
Matthias
6669714a73 Update mal-formatted docstrings 2022-10-24 18:12:17 +02:00
Matthias
dd45a3f500 Merge pull request #7631 from freqtrade/dependabot/pip/develop/types-python-dateutil-2.8.19.2
Bump types-python-dateutil from 2.8.19.1 to 2.8.19.2
2022-10-24 13:16:14 +02:00
Matthias
ba82cd9baa bump types-python-dateutil for pre-commit 2022-10-24 12:29:04 +02:00
Matthias
fd6ce6a9aa Merge pull request #7633 from freqtrade/dependabot/pip/develop/pandas-1.5.1
Bump pandas from 1.5.0 to 1.5.1
2022-10-24 12:28:11 +02:00
Matthias
7b7bb06291 Merge pull request #7634 from freqtrade/dependabot/pip/develop/scipy-1.9.3
Bump scipy from 1.9.2 to 1.9.3
2022-10-24 09:05:03 +02:00
Robert Caulk
137aa1756b Merge pull request #7593 from th0rntwig/prediction-shape
Fix constant PCA
2022-10-24 08:33:36 +02:00
Matthias
24fbbfc64b Merge pull request #7635 from freqtrade/dependabot/pip/develop/pyjwt-2.6.0
Bump pyjwt from 2.5.0 to 2.6.0
2022-10-24 08:26:43 +02:00
Matthias
d718b57cba Merge pull request #7632 from freqtrade/dependabot/pip/develop/pymdown-extensions-9.7
Bump pymdown-extensions from 9.6 to 9.7
2022-10-24 08:26:06 +02:00
Matthias
b9bc91a881 Bump correct pandas version 2022-10-24 08:25:39 +02:00
dependabot[bot]
afe0a29fb0 Bump pandas from 1.5.0 to 1.5.1
Bumps [pandas](https://github.com/pandas-dev/pandas) from 1.5.0 to 1.5.1.
- [Release notes](https://github.com/pandas-dev/pandas/releases)
- [Changelog](https://github.com/pandas-dev/pandas/blob/main/RELEASE.md)
- [Commits](https://github.com/pandas-dev/pandas/compare/v1.5.0...v1.5.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-24 06:22:46 +00:00
Matthias
71c8a51d90 Merge pull request #7628 from freqtrade/dependabot/pip/develop/ccxt-2.0.58
Bump ccxt from 2.0.25 to 2.0.58
2022-10-24 08:21:46 +02:00
dependabot[bot]
af89c83fa5 Bump pymdown-extensions from 9.6 to 9.7
Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 9.6 to 9.7.
- [Release notes](https://github.com/facelessuser/pymdown-extensions/releases)
- [Commits](https://github.com/facelessuser/pymdown-extensions/compare/9.6...9.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-24 04:39:32 +00:00
Matthias
57364b776c Merge pull request #7630 from freqtrade/dependabot/pip/develop/mkdocs-material-8.5.7
Bump mkdocs-material from 8.5.6 to 8.5.7
2022-10-24 06:38:51 +02:00
Matthias
d8893a9d85 Merge pull request #7626 from freqtrade/dependabot/pip/develop/pytest-asyncio-0.20.1
Bump pytest-asyncio from 0.19.0 to 0.20.1
2022-10-24 06:38:34 +02:00
Matthias
3a40ad87c6 Merge pull request #7615 from freqtrade/price_jump_warn
Add price jump warning
2022-10-24 06:27:53 +02:00
dependabot[bot]
06311b6a17 Bump pyjwt from 2.5.0 to 2.6.0
Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.5.0 to 2.6.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/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-24 03:03:19 +00:00
dependabot[bot]
0328cd5026 Bump scipy from 1.9.2 to 1.9.3
Bumps [scipy](https://github.com/scipy/scipy) from 1.9.2 to 1.9.3.
- [Release notes](https://github.com/scipy/scipy/releases)
- [Commits](https://github.com/scipy/scipy/compare/v1.9.2...v1.9.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-24 03:03:14 +00:00
dependabot[bot]
bde4fbbc59 Bump types-python-dateutil from 2.8.19.1 to 2.8.19.2
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19.1 to 2.8.19.2.
- [Release notes](https://github.com/python/typeshed/releases)
- [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>
2022-10-24 03:02:57 +00:00
dependabot[bot]
e516190b63 Bump mkdocs-material from 8.5.6 to 8.5.7
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 8.5.6 to 8.5.7.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/8.5.6...8.5.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-24 03:02:54 +00:00
dependabot[bot]
3480549f4e Bump python-rapidjson from 1.8 to 1.9
Bumps [python-rapidjson](https://github.com/python-rapidjson/python-rapidjson) from 1.8 to 1.9.
- [Release notes](https://github.com/python-rapidjson/python-rapidjson/releases)
- [Changelog](https://github.com/python-rapidjson/python-rapidjson/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-rapidjson/python-rapidjson/compare/v1.8...v1.9)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-24 03:02:50 +00:00
dependabot[bot]
54d029da7a Bump ccxt from 2.0.25 to 2.0.58
Bumps [ccxt](https://github.com/ccxt/ccxt) from 2.0.25 to 2.0.58.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/2.0.25...2.0.58)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-24 03:02:47 +00:00
dependabot[bot]
96f4de442a Bump progressbar2 from 4.0.0 to 4.1.1
Bumps [progressbar2](https://github.com/WoLpH/python-progressbar) from 4.0.0 to 4.1.1.
- [Release notes](https://github.com/WoLpH/python-progressbar/releases)
- [Changelog](https://github.com/wolph/python-progressbar/blob/develop/CHANGES.rst)
- [Commits](https://github.com/WoLpH/python-progressbar/compare/v4.0.0...v4.1.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-24 03:02:37 +00:00
dependabot[bot]
c29f96a643 Bump pytest-asyncio from 0.19.0 to 0.20.1
Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.19.0 to 0.20.1.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Changelog](https://github.com/pytest-dev/pytest-asyncio/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.19.0...v0.20.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-24 03:02:32 +00:00
robcaulk
4d2b7a74f1 move record params to utils, use rapidjson 2022-10-23 20:51:32 +02:00
Timothy Pogue
bb06745227 fix tests 2022-10-23 12:25:39 -06:00
Timothy Pogue
07e813dfa0 change param record to only get certain params 2022-10-23 12:09:07 -06:00
Timothy Pogue
94b65a007a fix message typing in channel manager, minor improvements 2022-10-23 11:42:59 -06:00
th0rntwig
49ff51f11f Change storage loc and fix test fail 2022-10-23 16:24:02 +02:00
Matthias
10090a36d5 simplify throttle 2022-10-23 14:52:10 +02:00
Matthias
d0571464db Improve test for worker throttle 2022-10-23 14:20:59 +02:00
Matthias
c36141594e Simplify "refresh" condition 2022-10-23 13:56:11 +02:00
Timothy Pogue
9cffa3ca2b add comment in channel 2022-10-22 21:03:57 -06:00
Timothy Pogue
4cbea0fd00 Merge branch 'develop' of https://github.com/wizrds/freqtrade into fix/channel-api 2022-10-22 21:03:31 -06:00
Timothy Pogue
3d7a311caa removed sleep calls, better channel sending 2022-10-22 19:02:05 -06:00
Timothy Pogue
c4a2ee05e7 fix freqai test 2022-10-22 09:31:55 -06:00
Timothy Pogue
2b6d00dde4 initial channel api change 2022-10-22 09:30:18 -06:00
Matthias
abcc6dadf2 use pre-built pyarrow for pi image 2022-10-22 15:57:11 +02:00
Matthias
47e93dd2b2 Update documentation 2022-10-22 15:21:39 +02:00
Matthias
3a9853db10 use high/low for custom stoploss evaluation in backtesting 2022-10-22 12:52:13 +02:00
Matthias
84a194bcab Simplify stoploss logic by removing redundant condition 2022-10-22 11:57:59 +02:00
Matthias
547fd28811 Price-jump detection should only run once 2022-10-22 08:43:37 +02:00
Matthias
0ff7a0771d Move price_jump_warn to dataloading
it's not relevant for live data, and should only run when loading data
from disk.
2022-10-22 08:37:30 +02:00
Timothy Pogue
4464e91256 use self.identifier in full path 2022-10-21 19:53:33 -06:00
Timothy Pogue
5ee3b8cbbb update config recording to use all configs, fix tests 2022-10-21 19:48:26 -06:00
Robert Caulk
a85826bf24 Merge pull request #7611 from markdregan/backtest_extra_returns
Make extra_returns_per_train data available during backtest
2022-10-21 17:13:22 +02:00
Matthias
b715d9c521 Improve fee handling
closes #7586
2022-10-21 16:30:14 +02:00
Robert Caulk
410a744ee9 Merge pull request #7613 from freqtrade/fix_typo_fit_live_predictions_candles
fix typos - live predictions candles
2022-10-21 16:19:40 +02:00
Matthias
d1591883a6 add missing datetime conversion in fromJson 2022-10-21 07:01:47 +02:00
Matthias
212b511bbe Remove explicit rateLimit setting for freqAI config 2022-10-21 06:44:25 +02:00
Matthias
bd424a877b Add Trade from_json method 2022-10-20 20:33:08 +02:00
Matthias
0aa840792b Move persistence tests to package 2022-10-20 20:05:15 +02:00
Matthias
f4814a7d59 Improve test resiliance to small roundings 2022-10-20 19:57:56 +02:00
Matthias
107845afa8 Keep version number in docker versioning 2022-10-20 19:55:42 +02:00
Wagner Costa Santos
6606a0113f refactoring - remove unnecessary config file 2022-10-20 14:53:25 -03:00
Matthias
60cb11a44d Add price jump warning 2022-10-20 19:36:28 +02:00
Wagner Costa Santos
589944055e fix typos - live predictions candles 2022-10-20 12:15:41 -03:00
Wagner Costa Santos
52b60c5cbb Merge branch 'develop' into backtest_live_models 2022-10-20 11:59:37 -03:00
rcaulk
a9db668082 avoid redundant indicator population for corr_pair list 2022-10-20 16:30:32 +02:00
Mark Regan
073ce1659e remove un-used f-string 2022-10-20 14:26:10 +01:00
Mark Regan
295ba21389 Make extra_returns_per_train values available during backtest 2022-10-20 12:05:37 +01:00
Matthias
7192ed7be6 Fix bug with dataframe not being 0 indexed 2022-10-19 11:57:18 +02:00
Matthias
6e95b6667d Modify test ensuring we always have a 0 index 2022-10-19 11:57:05 +02:00
Matteo Manzi
51b410ac1a Update utils.md 2022-10-18 19:28:29 +02:00
Matteo Manzi
8c39b37223 Update bug_report.md 2022-10-18 19:26:09 +02:00
Matteo Manzi
35cc6aa966 Update data-analysis.md 2022-10-18 19:25:37 +02:00
Matteo Manzi
67850d92af Update question.md 2022-10-18 19:24:46 +02:00
Matteo Manzi
fe3d99b568 Update feature_request.md 2022-10-18 19:22:49 +02:00
Matteo Manzi
11d6d0be9e Update sql_cheatsheet.md 2022-10-18 19:22:07 +02:00
Matteo Manzi
abcbe7a421 Update updating.md 2022-10-18 19:15:59 +02:00
Matteo Manzi
d427226900 Update docker_quickstart.md 2022-10-18 19:15:20 +02:00
th0rntwig
033c5bd441 Make check constant pred labels agnostic 2022-10-18 12:55:47 +02:00
Matthias
c3d4fb9f1b Simplify backtest calling interface 2022-10-18 06:39:55 +02:00
Matthias
c7fff1213c Rate-limit EMC startup to avoid overwelming the queue 2022-10-17 20:46:15 +02:00
Matthias
880ddccaa8 Merge pull request #7590 from freqtrade/list-models
List models
2022-10-17 20:40:41 +02:00
Matthias
441032be25 Fix sys.stdout bug for CatboostRegressorMultiTarget 2022-10-17 19:48:27 +02:00
Matthias
b166c04cba Bring back asyncio.sleep to avoid overwelming the a consumer queue 2022-10-17 19:29:30 +02:00
Matthias
c8e103e4a4 Adjust typehints to match return value 2022-10-17 10:02:55 +00:00
Matthias
c2914feb12 Don't fail contract size repopulation if pair is no longer available 2022-10-17 09:55:18 +00:00
Matthias
08e684a3e8 Merge pull request #7598 from freqtrade/dependabot/pip/develop/types-python-dateutil-2.8.19.1
Bump types-python-dateutil from 2.8.19 to 2.8.19.1
2022-10-17 08:36:08 +02:00
Matthias
caf907e202 Update date-util precommit types 2022-10-17 08:03:52 +02:00
Matthias
2a6b8dd88b Merge pull request #7601 from freqtrade/dependabot/pip/develop/mkdocs-1.4.1
Bump mkdocs from 1.4.0 to 1.4.1
2022-10-17 08:03:10 +02:00
Matthias
ef87976b7c Merge pull request #7600 from freqtrade/dependabot/pip/develop/ccxt-2.0.25
Bump ccxt from 1.95.30 to 2.0.25
2022-10-17 08:02:27 +02:00
Matthias
943f5f21ff Improve get_pair_dataframe doc wording 2022-10-17 07:23:44 +02:00
Matthias
abe4d32ead Update wording in get_analyzed_dataframe docs 2022-10-17 07:19:24 +02:00
Matthias
6cb14148aa Fix random test failure due to catboost bug
https://github.com/catboost/catboost/issues/2195
2022-10-17 07:00:44 +02:00
Matthias
6252ae466e Convert position_stacking to attribute of backtest 2022-10-17 06:57:26 +02:00
Matthias
8534dfb0d4 Extract backtest 1 candle from main function 2022-10-17 06:57:26 +02:00
Matthias
0e8cf366f5 Keep trade state in LocalTrade 2022-10-17 06:57:26 +02:00
dependabot[bot]
5aeea5b14c Bump ccxt from 1.95.30 to 2.0.25
Bumps [ccxt](https://github.com/ccxt/ccxt) from 1.95.30 to 2.0.25.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/1.95.30...2.0.25)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-17 04:35:36 +00:00
Matthias
49426a924d Merge pull request #7603 from freqtrade/dependabot/pip/develop/lightgbm-3.3.3
Bump lightgbm from 3.3.2 to 3.3.3
2022-10-17 06:34:41 +02:00
Matthias
c4caaf559b Merge pull request #7602 from freqtrade/dependabot/pip/develop/sqlalchemy-1.4.42
Bump sqlalchemy from 1.4.41 to 1.4.42
2022-10-17 06:33:01 +02:00
Matthias
db3def962b Merge pull request #7599 from freqtrade/dependabot/pip/develop/numpy-1.23.4
Bump numpy from 1.23.3 to 1.23.4
2022-10-17 06:32:40 +02:00
Matthias
ef2a14425b Merge pull request #7604 from freqtrade/dependabot/pip/develop/fastapi-0.85.1
Bump fastapi from 0.85.0 to 0.85.1
2022-10-17 06:31:39 +02:00
dependabot[bot]
7ec1e3b94f Bump fastapi from 0.85.0 to 0.85.1
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.85.0 to 0.85.1.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.85.0...0.85.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-17 03:01:55 +00:00
dependabot[bot]
600b886241 Bump lightgbm from 3.3.2 to 3.3.3
Bumps [lightgbm](https://github.com/microsoft/LightGBM) from 3.3.2 to 3.3.3.
- [Release notes](https://github.com/microsoft/LightGBM/releases)
- [Commits](https://github.com/microsoft/LightGBM/compare/v3.3.2...v3.3.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-17 03:01:51 +00:00
dependabot[bot]
a9bb7db06c Bump sqlalchemy from 1.4.41 to 1.4.42
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 1.4.41 to 1.4.42.
- [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>
2022-10-17 03:01:46 +00:00
dependabot[bot]
2ddfc7bbba Bump mkdocs from 1.4.0 to 1.4.1
Bumps [mkdocs](https://github.com/mkdocs/mkdocs) from 1.4.0 to 1.4.1.
- [Release notes](https://github.com/mkdocs/mkdocs/releases)
- [Commits](https://github.com/mkdocs/mkdocs/compare/1.4.0...1.4.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-17 03:01:37 +00:00
dependabot[bot]
8550eb513e Bump numpy from 1.23.3 to 1.23.4
Bumps [numpy](https://github.com/numpy/numpy) from 1.23.3 to 1.23.4.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v1.23.3...v1.23.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-17 03:01:22 +00:00
dependabot[bot]
dd3f62ac13 Bump types-python-dateutil from 2.8.19 to 2.8.19.1
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19 to 2.8.19.1.
- [Release notes](https://github.com/python/typeshed/releases)
- [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>
2022-10-17 03:01:10 +00:00
Matthias
23a5a516f9 Merge pull request #7557 from freqtrade/add-metric-tracker
Add metric tracker to FreqAI
2022-10-16 18:20:07 +02:00
Matthias
e82baf5f60 Use helper-method to modify trades_open 2022-10-16 16:45:16 +02:00
Matthias
2b70106019 Merge pull request #7596 from iprogger/fix/backtest-counting-available-slots
Fix counting available trade slots in backtesting.
2022-10-16 16:45:09 +02:00
Evgeniy Vladimirov
82d75d8914 Fix tests that failed due to new strategy. 2022-10-16 14:59:55 +03:00
Matthias
f4059ccabe Merge pull request #7595 from matteoettam09/develop
Update stoploss.md
2022-10-16 13:29:45 +02:00
Matteo Manzi
b7dce8d24a Update stoploss.md 2022-10-16 12:02:27 +02:00
Evgeniy Vladimirov
de9f5660f3 Fix counting available trade slots in backtesting. 2022-10-16 12:56:59 +03:00
Matthias
dc50186d5b Merge branch 'develop' into list-models 2022-10-16 09:23:10 +02:00
Matthias
b6c096d3bc Simplify backtest condition 2022-10-16 09:22:56 +02:00
th0rntwig
20fc521771 Fix constant PCA 2022-10-15 23:30:12 +02:00
Robert Caulk
62ca822597 Merge pull request #7569 from Silur/develop
Add XGBoost random forest predictors to freqai
2022-10-15 16:09:26 +02:00
Robert Caulk
46ba3bb357 Merge pull request #7585 from aemr3/add-eval-set-catboost
Add eval set to CatboostClassifier
2022-10-15 16:08:13 +02:00
robcaulk
9135e631c0 :Merge branch 'develop' into add-metric-tracker 2022-10-15 15:54:41 +02:00
robcaulk
3b4402aaab Merge branch 'move-disk-writing-to-ram' into add-metric-tracker 2022-10-15 13:52:14 +02:00
robcaulk
99dbba6cad avoid reading from disk to instantiate large objects 2022-10-15 13:50:55 +02:00
robcaulk
d81eef0b70 add timestamps to each metric, use rapidjson 2022-10-15 13:23:01 +02:00
Matthias
05ca725e4d Remove no longer needed local state 2022-10-15 12:07:22 +02:00
Matthias
c8e6dad9cd use exit_reason to determine left open trades 2022-10-15 12:00:20 +02:00
Matthias
498289728d Fix catboost tests polluting CWD 2022-10-15 08:48:41 +02:00
Matthias
93ad3810fd Add test for list-freqaimodels 2022-10-15 08:20:06 +02:00
Matthias
4bfe58706b Generalize "path" variables for resolvers 2022-10-14 19:49:06 +02:00
robcaulk
b236e362ba Merge remote-tracking branch 'origin/develop' into add-metric-tracker 2022-10-14 19:00:49 +02:00
Matthias
2ef315e8c2 Add documentation for list-freqaimodels 2022-10-14 18:24:15 +02:00
Matthias
fda3a2827b add list-freqAI models command 2022-10-14 16:20:49 +00:00
Matthias
4a8cb3359b Fix broken tests 2022-10-14 16:07:49 +00:00
Matthias
9d4ba767c4 Update usages of search_all_objects 2022-10-14 14:50:52 +00:00
Matthias
1d8d360a12 update _search_all_objects functioning 2022-10-14 14:32:30 +00:00
Emre
7f05b44376 Add eval set to CatboostClassifier 2022-10-13 23:01:09 +03:00
Wagner Costa Santos
02fc59d473 Merge branch 'develop' into backtest_live_models 2022-10-13 15:52:19 -03:00
Wagner Costa Santos
4e1bf79239 backtest live models - documentation 2022-10-13 15:47:31 -03:00
Wagner Costa Santos
6919f3aa75 Backtest live models - fix utc date convert issue 2022-10-13 15:03:27 -03:00
Matthias
c6d2eed4fc Merge pull request #7582 from th0rntwig/improve-freqai-docs
Add model info
2022-10-13 19:57:56 +02:00
Matthias
f019471051 Don't round prices if no custom prices have been used
closes #7573
2022-10-13 19:51:42 +02:00
Matthias
7672586de9 Fix unreliable hyperopt test 2022-10-13 19:43:37 +02:00
Matthias
c71c0e8da0 Fix some typos 2022-10-13 18:16:39 +02:00
Wagner Costa Santos
93fe2b6446 Merge branch 'develop' into backtest_live_models 2022-10-13 11:22:58 -03:00
Matthias
c4d60184cd Merge pull request #7581 from TheJoeSchr/develop
Docs: add `ignore_buying_expired_candle_after` and `order pricing` to summary
2022-10-13 14:23:18 +02:00
Matthias
28be784c2e Fix kucoin live test failure 2022-10-13 12:17:53 +00:00
Matthias
2045780810 Reinstate default of 1000% for roi
closes #7583
2022-10-13 11:58:32 +00:00
th0rntwig
f8331e0326 Add model libs info 2022-10-13 10:53:25 +02:00
Matthias
e3ca740704 Merge pull request #7558 from wizrds/feat/queue-per-client-ws
Refactor broadcasting in Message Websocket
2022-10-13 09:52:29 +02:00
Matthias
75f1a123eb Move "tickers_needed" check to pairlistmanager to cover all pairlists 2022-10-13 06:58:17 +00:00
Matthias
39c27cfc37 Don't fail if fetchTickers is not availlable 2022-10-13 06:58:02 +00:00
Joe Schr
96e6c1b190 Docs: add ignore_buying_expired_candle_after and order pricing to summary 2022-10-12 20:11:17 +02:00
Matthias
a6f6a17393 Type fetch_ticker 2022-10-11 21:42:48 +02:00
Matthias
52e9528361 Improve ticker type 2022-10-11 19:33:07 +00:00
Matthias
35f3f988d4 Improve price handling in priceFilter 2022-10-11 19:33:05 +00:00
Matthias
afaca2167c use Type Alias for Ticker result to improve keyerror resiliancy 2022-10-11 19:33:02 +00:00
Robert Caulk
8ab600f7b2 Merge pull request #7576 from freqtrade/bugfix-tensorboard
catboost tensorboard bugfix
2022-10-11 21:27:42 +02:00
robcaulk
1e31be562e remove whitespace 2022-10-11 21:05:42 +02:00
robcaulk
dba1b573bc remove tensorboard dir from other pred models 2022-10-11 19:49:24 +02:00
robcaulk
88b8f18639 add test for metric tracker 2022-10-11 19:24:47 +02:00
robcaulk
5b5bb8aab5 catboost tensorboard bugfix 2022-10-11 19:05:46 +02:00
silur
30a45bb597 add XGBoostRF models to freqai test interface 2022-10-11 13:17:21 +02:00
Matthias
8f2a887a58 Merge pull request #7572 from wizrds/fix/ws-client-timestamp
Test WebSocket client fix
2022-10-11 08:49:47 +02:00
Timothy Pogue
16c0fef72e update timestamp calculation to correct int, remove internal ping interval 2022-10-11 00:10:57 -06:00
Timothy Pogue
eb8c89fe31 move send delay to relay 2022-10-10 23:32:10 -06:00
Timothy Pogue
5ada5eb540 fix error message, update exception import 2022-10-10 23:30:43 -06:00
Matthias
28f0a35e73 Merge pull request #7549 from froggleston/discord_sendmsg
Add support for dp.send_msg() to webhooks
2022-10-11 06:35:29 +02:00
Robert Caulk
2e34aa9f04 Merge pull request #7544 from th0rntwig/prediction-shape
Remove constant labels from prediction
2022-10-10 21:24:25 +02:00
Robert Caulk
7bcb7d9a1a Merge pull request #7554 from initrv/add-catboost-tensorboard
Add tensorboard for catboost
2022-10-10 21:03:45 +02:00
robcaulk
c9eee2eba4 revert syntax 2022-10-10 20:50:54 +02:00
robcaulk
724be0afef add tensorboard asset to fai doc 2022-10-10 20:39:31 +02:00
Wagner Costa Santos
01e3507e4c fix freqai backtest live models 2022-10-10 15:15:43 -03:00
Wagner Costa Santos
88418d524a Merge branch 'develop' into backtest_live_models 2022-10-10 15:14:59 -03:00
Matthias
341cfc0cb6 Merge pull request #7571 from freqtrade/feat/freqaimodels
document user_data/freqaimodels
2022-10-10 19:57:23 +02:00
Wagner Costa Santos
3081e73f8a Merge branch 'develop' into backtest_live_models 2022-10-10 14:53:45 -03:00
Matthias
5ffa3cb9ba Update docs to mention freqaimodels directory
closes #7570
2022-10-10 18:11:32 +02:00
Matthias
ee0d90d1aa Automatically create freqai models directory 2022-10-10 18:04:54 +02:00
Matthias
002a46c5a0 Fix typo in docstring 2022-10-10 14:16:37 +00:00
silur
2ad086dd7a add XGBoost random forest predictors to freqai 2022-10-10 14:38:43 +02:00
Matthias
eaae9c9e03 Update docstring format 2022-10-10 12:19:29 +00:00
Matthias
60de192d47 Update Classifier docstrings 2022-10-10 12:13:41 +00:00
Matthias
d3b2b2972e Update pairlist docstring to be less missleading 2022-10-10 12:01:39 +00:00
Matthias
6be9b81f4c Fix workflow syntax error 2022-10-10 12:12:30 +02:00
Matthias
53e685f97b Merge pull request #7568 from freqtrade/dependabot/pip/develop/types-requests-2.28.11.2
Bump types-requests from 2.28.11 to 2.28.11.2
2022-10-10 10:12:20 +02:00
Matthias
d0b163764e Run coveralls only when needed 2022-10-10 07:42:27 +00:00
Matthias
81ed80c594 Merge pull request #7566 from freqtrade/dependabot/pip/develop/pytest-mock-3.10.0
Bump pytest-mock from 3.9.0 to 3.10.0
2022-10-10 09:26:58 +02:00
Matthias
f120c66987 types-requests - update pre-commit 2022-10-10 08:52:38 +02:00
dependabot[bot]
5218fb1df5 Bump types-requests from 2.28.11 to 2.28.11.2
Bumps [types-requests](https://github.com/python/typeshed) from 2.28.11 to 2.28.11.2.
- [Release notes](https://github.com/python/typeshed/releases)
- [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>
2022-10-10 06:49:11 +00:00
Matthias
2b1c1afc46 Merge pull request #7567 from freqtrade/dependabot/pip/develop/types-tabulate-0.9.0.0
Bump types-tabulate from 0.8.11 to 0.9.0.0
2022-10-10 08:48:02 +02:00
Matthias
9412d76934 Merge pull request #7564 from freqtrade/dependabot/pip/develop/scipy-1.9.2
Bump scipy from 1.9.1 to 1.9.2
2022-10-10 08:31:51 +02:00
Matthias
d9ff072dd6 Merge pull request #7563 from freqtrade/dependabot/pip/develop/mypy-0.982
Bump mypy from 0.981 to 0.982
2022-10-10 08:31:01 +02:00
Matthias
13529fabb1 types-tabulate in pre-commit 2022-10-10 08:16:26 +02:00
Matthias
884410a761 Merge pull request #7565 from freqtrade/dependabot/pip/develop/ccxt-1.95.30
Bump ccxt from 1.95.2 to 1.95.30
2022-10-10 08:12:24 +02:00
Matthias
3fcba2fb8d Remove hard-pin on python version in ci 2022-10-10 08:03:40 +02:00
Matthias
c55bea2a5e Merge pull request #7562 from freqtrade/dependabot/pip/develop/tabulate-0.9.0
Bump tabulate from 0.8.10 to 0.9.0
2022-10-10 07:09:52 +02:00
dependabot[bot]
c1dfa837bd Bump mypy from 0.981 to 0.982
Bumps [mypy](https://github.com/python/mypy) from 0.981 to 0.982.
- [Release notes](https://github.com/python/mypy/releases)
- [Commits](https://github.com/python/mypy/compare/v0.981...v0.982)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-10 04:56:43 +00:00
Matthias
9776067028 Merge pull request #7561 from freqtrade/dependabot/pip/develop/nbconvert-7.2.1
Bump nbconvert from 7.0.0 to 7.2.1
2022-10-10 06:55:50 +02:00
dependabot[bot]
935adc99ae Bump types-tabulate from 0.8.11 to 0.9.0.0
Bumps [types-tabulate](https://github.com/python/typeshed) from 0.8.11 to 0.9.0.0.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-10 03:03:06 +00:00
dependabot[bot]
9d2f281ca6 Bump pytest-mock from 3.9.0 to 3.10.0
Bumps [pytest-mock](https://github.com/pytest-dev/pytest-mock) from 3.9.0 to 3.10.0.
- [Release notes](https://github.com/pytest-dev/pytest-mock/releases)
- [Changelog](https://github.com/pytest-dev/pytest-mock/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-mock/compare/v3.9.0...v3.10.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-10 03:02:57 +00:00
dependabot[bot]
8bb7b94f8d Bump ccxt from 1.95.2 to 1.95.30
Bumps [ccxt](https://github.com/ccxt/ccxt) from 1.95.2 to 1.95.30.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/1.95.2...1.95.30)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-10 03:02:53 +00:00
dependabot[bot]
dab2759c21 Bump scipy from 1.9.1 to 1.9.2
Bumps [scipy](https://github.com/scipy/scipy) from 1.9.1 to 1.9.2.
- [Release notes](https://github.com/scipy/scipy/releases)
- [Commits](https://github.com/scipy/scipy/compare/v1.9.1...v1.9.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-10 03:02:43 +00:00
dependabot[bot]
40afa079b1 Bump tabulate from 0.8.10 to 0.9.0
Bumps [tabulate](https://github.com/astanin/python-tabulate) from 0.8.10 to 0.9.0.
- [Release notes](https://github.com/astanin/python-tabulate/releases)
- [Changelog](https://github.com/astanin/python-tabulate/blob/master/CHANGELOG)
- [Commits](https://github.com/astanin/python-tabulate/compare/v0.8.10...v0.9.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-10 03:02:31 +00:00
dependabot[bot]
337ea04ba0 Bump nbconvert from 7.0.0 to 7.2.1
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.0.0 to 7.2.1.
- [Release notes](https://github.com/jupyter/nbconvert/releases)
- [Changelog](https://github.com/jupyter/nbconvert/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jupyter/nbconvert/compare/7.0.0...v7.2.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-10 03:02:27 +00:00
Timothy Pogue
db8cf6c957 disable ping interval in client 2022-10-09 18:51:52 -06:00
Timothy Pogue
71bbffd10a update ws channel send to add data to queue 2022-10-09 18:49:04 -06:00
Timothy Pogue
2c76dd9e39 change wait timeout to 30 seconds to better support reverse proxies 2022-10-09 15:23:56 -06:00
Timothy Pogue
2f64a08623 set channel queue maxsize to 32 2022-10-09 15:11:58 -06:00
Timothy Pogue
3e8d8fd1b0 refactor broadcasting to a queue per client 2022-10-09 15:04:52 -06:00
robcaulk
a4aa1b972c isolate and standardize location of tensorboard files, add doc, ensure backtesting functionality 2022-10-09 21:11:37 +02:00
robcaulk
76b33359a9 add an optional metric tracker to collect train timings, inference timings, and cpu load data 2022-10-09 20:22:42 +02:00
Matthias
a10b2d003f Add freqai timeframe validation (incl. test)
closes #7543
2022-10-09 14:40:25 +02:00
Matthias
4623c3ec1d Improve test resiliance 2022-10-09 10:55:38 +02:00
Matthias
4f967fed97 Improve ccxt tests 2022-10-09 10:52:01 +02:00
Matthias
db1132bebd ensure required_candle_call_count is always set
closes #7552
2022-10-09 09:29:37 +02:00
Matthias
8e3a4eca41 Remove unused type:ignore 2022-10-09 09:15:11 +02:00
th0rntwig
4daf0000c7 Move check and add log warning 2022-10-08 16:15:48 +02:00
robcaulk
8d7adfabe9 clean RL tests to avoid dir pollution and increase speed 2022-10-08 12:10:38 +02:00
Matthias
9454fb8f7b Fix discord message sending 2022-10-07 20:59:49 +02:00
Matthias
df5ae66252 Refactor webhook method 2022-10-07 20:52:52 +02:00
Matthias
1aedf08ba5 Update tests 2022-10-07 20:48:37 +02:00
Matthias
ed12cddf3f Update docs with new wording for webhook settings 2022-10-07 20:45:15 +02:00
Matthias
fb2f2d9a39 Allow webhook message setting directly 2022-10-07 20:44:47 +02:00
Emre
e337d4b78a Reset dataframe index after slice 2022-10-07 20:00:05 +02:00
Matthias
bc09c812a8 Merge pull request #7551 from wizrds/fix/test-ws-client
Test WS Client typo fix
2022-10-07 19:24:41 +02:00
Timothy Pogue
0460f362fb typo in handle func name 2022-10-07 10:41:06 -06:00
froggleston
8fcb80df69 Add support for dp.send_msg() to webhooks 2022-10-07 16:06:30 +01:00
initrv
ec7af83c87 add tensorboard to freqai reqs 2022-10-07 17:13:19 +03:00
Matthias
d42fb15608 Improve generic exception handler 2022-10-07 16:05:41 +02:00
Matthias
a5bf34587a Improve fiat-convert behavior in case of coingecko outage 2022-10-07 15:46:31 +02:00
Matthias
fab6b2f105 Align datetime import in fiat_convert 2022-10-07 15:23:32 +02:00
Matthias
1cabfe8d0a Merge pull request #7545 from wizrds/feat/test-ws-client
Message WebSocket Testing client
2022-10-07 15:23:22 +02:00
Matthias
3e258e000e Don't set use_db without resetting it 2022-10-07 07:05:56 +02:00
Timothy Pogue
1595e5fd8a small fix in protocol 2022-10-06 21:00:28 -06:00
Timothy Pogue
b92b98af29 fix formatting 2022-10-06 14:33:04 -06:00
Timothy Pogue
3e08c6e540 testing/debugging ws client script 2022-10-06 14:12:44 -06:00
Matthias
6e179c7699 Only store tick refresh time if we cache 2022-10-06 19:35:38 +02:00
th0rntwig
a9d5e04a43 Remove constant labels from prediction 2022-10-06 19:26:33 +02:00
initrv
86c781798a Add сatboost train_dir for tensorboard 2022-10-06 19:59:35 +03:00
Matthias
7c702dd106 Add cache eviction 2022-10-06 14:51:52 +00:00
Matthias
92a1d58df8 Evict cache if we didn't get new candles for X hours 2022-10-06 14:51:52 +00:00
Matthias
f475c6c305 Add Specific, time-sensitive test-case for new behavior 2022-10-06 14:51:52 +00:00
Matthias
638515bce5 Test advanced caching 2022-10-06 14:51:52 +00:00
Matthias
678272e2ef Improve test formatting 2022-10-06 14:51:52 +00:00
Matthias
cea017e79f Age out old candles 2022-10-06 14:51:52 +00:00
Matthias
b7f26e4f96 Update some formatting issues 2022-10-06 14:51:52 +00:00
Matthias
02e238a944 Combine ohlcv data in exchange class for live mode 2022-10-06 14:51:52 +00:00
Matthias
b9f1872d51 Install RL dependencies as dev dependency 2022-10-06 08:28:15 +02:00
Matthias
edb942f662 Add typing import to sampleStrategy 2022-10-06 06:30:38 +02:00
robcaulk
e5204101d9 add tensorboard back to reqs to keep default integration working (and for docker) 2022-10-05 21:34:10 +02:00
robcaulk
488739424d fix reward inconsistency in template 2022-10-05 20:55:50 +02:00
Matthias
9b1fb02df8 Refactor generic data generation to conftest 2022-10-05 18:09:26 +02:00
robcaulk
017e476f49 add extras to setup.py for RL 2022-10-05 17:20:40 +02:00
robcaulk
cf10a76a2a bring back Trades.use_db = True 2022-10-05 17:06:18 +02:00
robcaulk
17fb7f7a3b gym needs 0.21 to match stable_baselines3 2022-10-05 16:46:02 +02:00
robcaulk
ab4705efd2 provide background and goals for RL in doc 2022-10-05 16:39:38 +02:00
robcaulk
b5dd92f85a remove RL reqs from general FAI reqs 2022-10-05 16:25:24 +02:00
robcaulk
9cb4832c87 merge feat/freqai into dev-merge-rl 2022-10-05 16:16:07 +02:00
robcaulk
5cfadc689b Merge remote-tracking branch 'origin/develop' into fix-freqai-rl-remote 2022-10-05 16:05:37 +02:00
robcaulk
936ca24482 separate RL install from general FAI install, update docs 2022-10-05 15:58:54 +02:00
robcaulk
9c73411ac2 Merge remote-tracking branch 'origin/develop' into dev-merge-rl 2022-10-05 15:21:45 +02:00
Matthias
b0eff4160f Merge pull request #7538 from freqtrade/improve-freqai-tests
improve freqai tests
2022-10-05 15:15:20 +02:00
Matthias
7dbb78da95 Losely pin pydantic to avoid dependency problems
closes #7537
2022-10-05 13:14:36 +00:00
robcaulk
0d67afe15b allow less precision, ensure regex is catching the right chars 2022-10-05 14:38:50 +02:00
robcaulk
4edb30bfa8 isort 2022-10-05 14:11:19 +02:00
robcaulk
0e0bda8f13 improve freqai tests 2022-10-05 14:08:03 +02:00
Robert Caulk
8c7f478724 Update requirements-freqai.txt 2022-10-05 10:59:33 +02:00
Robert Caulk
52b774b5eb Merge branch 'develop' into feat/freqai-rl-dev 2022-10-05 09:37:17 +02:00
Matthias
22043deffa Merge pull request #7535 from mciepluc/develop
Fixes #7534 - add leverage in check_order_replace/replace_order
2022-10-05 08:54:19 +02:00
Matthias
ca913fb29d Add leveraged test-case for order-adjustment 2022-10-05 07:28:34 +02:00
Marek Cieplucha
4df533feb0 Add missing comma 2022-10-04 21:16:30 +02:00
Robert Caulk
a1a598dcab Merge pull request #7519 from freqtrade/dependabot/pip/develop/catboost-1.1
Bump catboost from 1.0.6 to 1.1
2022-10-04 21:08:11 +02:00
Marek Cieplucha
5019300d5c Fix for #7534 in bot 2022-10-04 20:28:47 +02:00
Marek Cieplucha
3264d7b890 Fix for #7534 in backtesting 2022-10-04 20:27:13 +02:00
Matthias
c1d8ade2fa Improve supported exchange check by supporting exchange aliases 2022-10-04 19:28:57 +02:00
Matthias
68db0bc647 move check_exchange to exchange package 2022-10-04 18:25:23 +02:00
Matthias
a6296be2f5 Update market_change datatype 2022-10-04 10:27:04 +00:00
Matthias
eb8eebe492 Reset open_order_id after trade cancel
Part of #7526
2022-10-04 10:08:58 +00:00
Matthias
016e438468 Calculate market-change in hyperopt
closes #7532
2022-10-04 08:37:07 +00:00
Matthias
bc6729f724 Improve readability of "now_is_time_to_refresh" 2022-10-04 06:56:10 +02:00
Matthias
7f308c5186 Remove last occurance of timerange index 2022-10-04 06:56:10 +02:00
Matthias
7f475e37d7 refactor refresh_latest_ohlcv 2022-10-04 06:56:06 +02:00
Matthias
dc5c3a0ed2 Merge pull request #7523 from freqtrade/dependabot/pip/develop/ccxt-1.95.2
Bump ccxt from 1.93.98 to 1.95.2
2022-10-03 20:54:11 +02:00
Matthias
4c83552f3b Merge pull request #7506 from freqtrade/cancel_partial_sell
Support cancellation partially filled exit orders
2022-10-03 19:36:51 +02:00
Matthias
f0c04212f2 Merge pull request #7512 from freqtrade/add-data-hist-preds
add close price and date to `historic_predictions.pkl`
2022-10-03 19:27:45 +02:00
robcaulk
292d72d593 automatically handle model_save_type for user 2022-10-03 18:42:20 +02:00
Matthias
ca22d857b7 Improve handling of trades that fail to cancel as they are closed 2022-10-03 18:09:53 +02:00
Robert Caulk
3585742b43 remove trailing whitespace 2022-10-03 17:28:45 +02:00
Robert Caulk
74277c7eff Merge pull request #7511 from th0rntwig/improve-freqai-docs
Fix typos and correct/improve descriptions
2022-10-03 14:48:03 +02:00
Robert Caulk
265795824b make default type for close_price and date_pred np.nan 2022-10-03 11:58:22 +02:00
th0rntwig
c2d0eca9d8 Remove backticks around FreqAI 2022-10-03 11:01:58 +02:00
Robert Caulk
6ecd92de4a Allow updating without changing identifier 2022-10-03 09:55:57 +02:00
Matthias
3921615023 Merge pull request #7524 from freqtrade/dependabot/pip/develop/mypy-0.981
Bump mypy from 0.971 to 0.981
2022-10-03 09:00:27 +02:00
Matthias
ac7df58447 Merge pull request #7516 from freqtrade/dependabot/pip/develop/time-machine-2.8.2
Bump time-machine from 2.8.1 to 2.8.2
2022-10-03 08:59:13 +02:00
dependabot[bot]
a78d6a05a6 Bump mypy from 0.971 to 0.981
Bumps [mypy](https://github.com/python/mypy) from 0.971 to 0.981.
- [Release notes](https://github.com/python/mypy/releases)
- [Commits](https://github.com/python/mypy/compare/v0.971...v0.981)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-03 06:10:30 +00:00
Matthias
616d69e0bd Merge pull request #7517 from freqtrade/dependabot/pip/develop/pymdown-extensions-9.6
Bump pymdown-extensions from 9.5 to 9.6
2022-10-03 08:10:01 +02:00
Matthias
ae0a39521b Merge pull request #7518 from freqtrade/dependabot/pip/develop/pytest-cov-4.0.0
Bump pytest-cov from 3.0.0 to 4.0.0
2022-10-03 08:09:01 +02:00
dependabot[bot]
3c789bca63 Bump pymdown-extensions from 9.5 to 9.6
Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 9.5 to 9.6.
- [Release notes](https://github.com/facelessuser/pymdown-extensions/releases)
- [Commits](https://github.com/facelessuser/pymdown-extensions/compare/9.5...9.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-03 05:07:25 +00:00
Matthias
0af124701b Merge pull request #7522 from freqtrade/dependabot/pip/develop/mkdocs-material-8.5.6
Bump mkdocs-material from 8.5.3 to 8.5.6
2022-10-03 07:06:19 +02:00
Matthias
4cf4642a6c Parametrize EMC test 2022-10-03 06:40:21 +02:00
dependabot[bot]
f3d4c56b3b Bump pytest-cov from 3.0.0 to 4.0.0
Bumps [pytest-cov](https://github.com/pytest-dev/pytest-cov) from 3.0.0 to 4.0.0.
- [Release notes](https://github.com/pytest-dev/pytest-cov/releases)
- [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-cov/compare/v3.0.0...v4.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-03 04:35:34 +00:00
dependabot[bot]
6defa62297 Bump mkdocs-material from 8.5.3 to 8.5.6
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 8.5.3 to 8.5.6.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/8.5.3...8.5.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-03 04:35:31 +00:00
Matthias
9691524ade Merge pull request #7520 from freqtrade/dependabot/pip/develop/mkdocs-1.4.0
Bump mkdocs from 1.3.1 to 1.4.0
2022-10-03 06:34:36 +02:00
Matthias
a6bc00501f Merge pull request #7521 from freqtrade/dependabot/pip/develop/pytest-mock-3.9.0
Bump pytest-mock from 3.8.2 to 3.9.0
2022-10-03 06:34:00 +02:00
dependabot[bot]
373132e135 Bump ccxt from 1.93.98 to 1.95.2
Bumps [ccxt](https://github.com/ccxt/ccxt) from 1.93.98 to 1.95.2.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/1.93.98...1.95.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-03 03:01:50 +00:00
dependabot[bot]
70d6c27e3e Bump pytest-mock from 3.8.2 to 3.9.0
Bumps [pytest-mock](https://github.com/pytest-dev/pytest-mock) from 3.8.2 to 3.9.0.
- [Release notes](https://github.com/pytest-dev/pytest-mock/releases)
- [Changelog](https://github.com/pytest-dev/pytest-mock/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-mock/compare/v3.8.2...v3.9.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-03 03:01:38 +00:00
dependabot[bot]
0a7e4d6da5 Bump mkdocs from 1.3.1 to 1.4.0
Bumps [mkdocs](https://github.com/mkdocs/mkdocs) from 1.3.1 to 1.4.0.
- [Release notes](https://github.com/mkdocs/mkdocs/releases)
- [Commits](https://github.com/mkdocs/mkdocs/compare/1.3.1...1.4.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-03 03:01:36 +00:00
dependabot[bot]
f722104f7e Bump catboost from 1.0.6 to 1.1
Bumps [catboost](https://github.com/catboost/catboost) from 1.0.6 to 1.1.
- [Release notes](https://github.com/catboost/catboost/releases)
- [Changelog](https://github.com/catboost/catboost/blob/master/RELEASE.md)
- [Commits](https://github.com/catboost/catboost/compare/v1.0.6...v1.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-03 03:01:30 +00:00
dependabot[bot]
6f7b75d4b0 Bump time-machine from 2.8.1 to 2.8.2
Bumps [time-machine](https://github.com/adamchainz/time-machine) from 2.8.1 to 2.8.2.
- [Release notes](https://github.com/adamchainz/time-machine/releases)
- [Changelog](https://github.com/adamchainz/time-machine/blob/main/HISTORY.rst)
- [Commits](https://github.com/adamchainz/time-machine/compare/2.8.1...2.8.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-03 03:01:13 +00:00
robcaulk
b70f18f4c3 add close price and date to historic_predictions 2022-10-02 18:33:39 +02:00
Matthias
1727f99b58 Fix missing mock 2022-10-02 18:14:00 +02:00
th0rntwig
21440eaec2 Fix typos and correct/improve descriptions 2022-10-02 12:47:58 +02:00
Matthias
d0b8c8b1a0 improve invalid canceled order response handling 2022-10-02 08:45:41 +02:00
Matthias
a5bc75b48c Merge branch 'develop' into cancel_partial_sell 2022-10-02 08:38:18 +02:00
Matthias
e686faf1bc Remove faulty test cleanup 2022-10-02 08:37:37 +02:00
Matthias
9bb061073d Improve tests 2022-10-02 08:36:34 +02:00
Matthias
308fa43007 Don't use magicmock as trade object 2022-10-02 08:30:19 +02:00
Matthias
564318415e Improve test resiliance 2022-10-02 08:12:03 +02:00
Matthias
2c94ed2e59 Decrease message throughput
fixes memory leak by queue raising indefinitely
2022-10-01 21:23:33 +02:00
robcaulk
cf882fa84e fix tests 2022-10-01 20:26:41 +02:00
robcaulk
ab9d781b06 add reinforcement learning page to docs 2022-10-01 17:50:05 +02:00
robcaulk
048cb95bd6 Merge remote-tracking branch 'origin/develop' into dev-merge-rl 2022-10-01 17:48:47 +02:00
Robert Caulk
3e34f10e3d Merge pull request #7508 from aemr3/fix-pca-errors
Fix feature list match for PCA
2022-10-01 16:50:29 +02:00
Robert Caulk
84b822dbf1 Merge pull request #7495 from th0rntwig/train-test-shuffle
Set train-test-split parameters shuffle=False as default and remove stratification
2022-10-01 14:52:14 +02:00
robcaulk
f4c6b99d63 remove commented lines 2022-10-01 14:23:15 +02:00
robcaulk
cd514cf15d fix inlier metric in backtesting 2022-10-01 14:18:46 +02:00
robcaulk
f2b875483f ensure raw features match when PCA is employed 2022-10-01 13:14:59 +02:00
robcaulk
51556e08c3 Merge branch 'develop' into pr/th0rntwig/7495 2022-10-01 12:45:08 +02:00
Matthias
6702a1b219 Update test to verify webhook won't log-spam on new messagetypes 2022-10-01 09:45:58 +02:00
Matthias
8f8b5cc28e Disable log spam from analyze_df in webhook/discord 2022-10-01 09:35:21 +02:00
Matthias
201bbbcee6 Okx formatting 2022-10-01 09:32:16 +02:00
Matthias
a96aa568bf Add binance futures mode checks
closes #7505
2022-10-01 09:23:41 +02:00
Matthias
545d652352 Update okx exception wording 2022-10-01 09:02:05 +02:00
Matthias
fad9026939 Update updating docs
closes #7507
2022-10-01 08:35:51 +02:00
Emre
cdc01a0781 Fix feature list match for pca 2022-09-30 15:22:05 -07:00
Matthias
47ef99f588 Simplify interface to notify_exit_cancel 2022-09-30 17:18:27 +02:00
Matthias
819488c906 Improve exit message wording 2022-09-30 17:04:34 +02:00
Matthias
c946d30596 Add partial cancel message 2022-09-30 16:24:16 +02:00
Matthias
649879192b Implement partial sell 2022-09-30 16:24:16 +02:00
Matthias
d462f40299 Simple test improvements 2022-09-30 16:24:07 +02:00
Matthias
bd664580fb Don't unnecessarily reset order_id 2022-09-30 15:43:23 +02:00
Matthias
cc06c60fd8 Fix pandas deprecation warnings from freqAI 2022-09-30 15:43:23 +02:00
Matthias
0d8dfc1a92 Force joblib update via setup.py 2022-09-30 13:47:26 +02:00
Matthias
f6a0d677d2 Remove pointless notification assignment 2022-09-30 09:34:00 +02:00
Matthias
7dd984e25e Simplify cancel_entry 2022-09-30 09:34:00 +02:00
Matthias
561600e98b Remove false test statements
a trade is ONLY closed on `.close()` - which will only happen once the last order has been filled.
2022-09-30 09:34:00 +02:00
Matthias
2d2ff2fff6 remove unnecessary assignments and comments 2022-09-30 09:34:00 +02:00
Matthias
2ce265bed3 Merge pull request #7473 from freqtrade/feat/producerpairlist
Producerpairlist
2022-09-30 06:54:15 +02:00
Matthias
34951f59d2 Update failing tests 2022-09-30 06:44:19 +02:00
robcaulk
be48131185 make shuffle false in constants 2022-09-30 00:33:08 +02:00
robcaulk
38aca8e908 fix failing svm test 2022-09-30 00:22:31 +02:00
Robert Caulk
09e834fa21 Merge pull request #7492 from wizrds/freqai-rl-dev
Shutdown Subproc Env on signal
2022-09-30 00:19:44 +02:00
Matthias
578da343dc Merge pull request #7491 from freqtrade/partial_close_leverage
Partial close leverage
2022-09-29 19:42:16 +02:00
Matthias
b4fb28e4ef Update tests for new dataload strategy 2022-09-29 19:18:52 +02:00
Matthias
00965d8c06 Default to assume stored data only contains complete candles
closes #7468
2022-09-29 19:18:52 +02:00
Robert Caulk
6e74d46660 Ensure 1 thread available 2022-09-29 14:02:00 +02:00
Robert Caulk
7ef56e3029 Ensure at least 1 thread is available 2022-09-29 14:01:22 +02:00
Robert Caulk
555cc42630 Ensure 1 thread is available (for testing purposes) 2022-09-29 14:00:09 +02:00
Matthias
80d0e66b48 Update log level in test 2022-09-29 07:19:16 +02:00
Matthias
388a572cb3 Version bump develop version 2022-09-29 07:17:38 +02:00
Matthias
ac229b7a42 Reduce message consumer verbosity 2022-09-29 07:10:00 +02:00
Wagner Costa Santos
6845a5c6ea backtest_live_models - refactoring after PR review 2022-09-29 01:48:38 -03:00
Matthias
4e920e9c53 Reduce verbosity of sending-message 2022-09-29 06:41:16 +02:00
Robert Caulk
dcf6ebe273 Update BaseReinforcementLearningModel.py 2022-09-29 00:37:03 +02:00
robcaulk
83343dc2f1 control number of threads, update doc 2022-09-29 00:10:18 +02:00
th0rntwig
772abfc6f0 Add default value for shuffle in docs 2022-09-28 19:29:02 +02:00
th0rntwig
683b084323 Set train-test-split shuffle=False as default and remove stratification 2022-09-28 18:23:56 +02:00
Wagner Costa Santos
df0927cdee Merge branch 'develop' into backtest_live_models 2022-09-28 08:49:15 -03:00
Wagner Costa Santos
55ebbeec18 backtest_live models tests refactoring 2022-09-28 08:48:32 -03:00
Matthias
fb3d408338 Respect max_open_trades when forceentering
closes #7489
2022-09-28 09:32:07 +00:00
Matthias
e9abe3cb68 Ease end of line rules 2022-09-28 07:24:43 +00:00
Matthias
7e124618d4 Move "success" notification to last pipeline step 2022-09-28 06:27:15 +00:00
Matthias
7c84edbc23 Avoid online call when asking for /status. 2022-09-28 07:21:52 +02:00
Matthias
a06372c7b2 Improve jupyter container install
closes #7484
2022-09-28 07:21:20 +02:00
Timothy Pogue
099137adac remove hasattr calls 2022-09-27 22:35:15 -06:00
Timothy Pogue
9e36b0d2ea fix formatting 2022-09-27 22:02:33 -06:00
Timothy Pogue
caa47a2f47 close subproc env on shutdown 2022-09-28 03:06:05 +00:00
Matthias
42cecb83f2 Disable base64 loading via API
closes severe RCE vulnerability reported privately.
2022-09-27 20:37:16 +02:00
Matthias
e668bf7138 Test case to disable base64 strategies via API 2022-09-27 20:36:27 +02:00
Matthias
255c748ca2 Update docs for new trade_position behavior 2022-09-27 19:55:17 +02:00
Matthias
30a5bb08dd partial exits should account for leverage 2022-09-27 19:53:55 +02:00
Matthias
8eda3a45a3 Test backest detail with leverage 2022-09-27 19:52:34 +02:00
Matthias
6c491ee02e Update missed changes to plot_feature_importance 2022-09-27 18:17:49 +02:00
Wagner Costa Santos
3c002ff752 Merge branch 'develop' into backtest_live_models 2022-09-27 10:27:47 -03:00
Wagner Costa Santos
0be115de9c backtest_live_models - added new tests and refactoring 2022-09-27 10:26:57 -03:00
Matthias
895b15abbc Fix rpi CI 2022-09-27 11:06:13 +00:00
Matthias
24c1d84982 Fix lineending 2022-09-27 09:26:52 +00:00
Matthias
9d462af047 Temporary workaround for PI image 2022-09-27 08:54:18 +00:00
Matthias
8c2e473ee5 Fix test warning 2022-09-27 08:53:29 +00:00
Matthias
43e847ff2f Update to pandas 1.5.0 syntax, avoiding warnings 2022-09-27 08:02:51 +00:00
Matthias
bc007ce038 Update binance leverage tiers
closes #7485
2022-09-27 07:14:55 +02:00
Wagner Costa Santos
72aa47fc51 backtest_live_models - fix issue with timerange BT and 2 trainings within same candle (no data) 2022-09-27 00:14:12 -03:00
Wagner Costa Santos
14b96aaa38 backtesting live models - fix ci issues 2022-09-26 19:52:59 -03:00
Wagner Costa Santos
290afd9699 backtest_live_models - fix typo 2022-09-26 19:21:53 -03:00
Wagner Costa Santos
0318ca9f12 backtest_live_models - fix typo 2022-09-26 19:08:25 -03:00
Wagner Costa Santos
22bef71d5d backtest_live_models - add function comments and tests 2022-09-26 19:01:24 -03:00
Wagner Costa Santos
182d9e5426 Merge branch 'develop' into backtest_live_models 2022-09-26 17:23:44 -03:00
Matthias
ba8c714698 Require kwargs on ohlcv_load 2022-09-26 20:33:49 +02:00
Matthias
853a4d1014 Merge pull request #7395 from freqtrade/improve-freqai-docs
Reorganize and improve FreqAI docs
2022-09-26 20:12:25 +02:00
Matthias
eb36105de4 Fix some random typos 2022-09-26 19:47:56 +02:00
Matthias
cf5267a4d3 Merge pull request #7481 from chusri/develop
✏️ fixed typo from StaticPairlist to StaticPairList
2022-09-26 18:11:56 +02:00
Matthias
9f32e02bba Update missing testcase 2022-09-26 17:10:23 +02:00
Thaweesak Chusri
4faa6a0bd7 🐛 updated test case from StaticPairlist to StaticPairList 2022-09-26 21:51:59 +08:00
Matthias
3d72168c01 Merge pull request #7479 from freqtrade/dependabot/pip/develop/types-requests-2.28.11
Bump types-requests from 2.28.10 to 2.28.11
2022-09-26 14:15:48 +02:00
Matthias
d493b2b7e7 Merge pull request #7406 from freqtrade/dependabot/pip/develop/ta-lib-0.4.25
Bump ta-lib from 0.4.24 to 0.4.25
2022-09-26 14:13:15 +02:00
Matthias
5477966cb6 Merge pull request #7478 from freqtrade/dependabot/pip/develop/pandas-1.5.0
Bump pandas from 1.4.4 to 1.5.0
2022-09-26 13:23:15 +02:00
dependabot[bot]
32930a269e Bump pandas from 1.4.4 to 1.5.0
Bumps [pandas](https://github.com/pandas-dev/pandas) from 1.4.4 to 1.5.0.
- [Release notes](https://github.com/pandas-dev/pandas/releases)
- [Changelog](https://github.com/pandas-dev/pandas/blob/main/RELEASE.md)
- [Commits](https://github.com/pandas-dev/pandas/compare/v1.4.4...v1.5.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-26 09:36:05 +00:00
Matthias
8e0811d9de Call cleanup explicitly 2022-09-26 09:35:21 +00:00
Matthias
cde1d1c2b3 Merge pull request #7474 from wizrds/bugfix-emc
Fix bug in API Server WebSocket
2022-09-26 10:45:44 +02:00
Matthias
ed2c960a93 Update types-requests for pre-commit 2022-09-26 10:25:49 +02:00
Matthias
a1a62681bf add fixes for random test failures 2022-09-26 08:11:00 +00:00
Matthias
041258a549 Fix arm test failure 2022-09-26 07:02:40 +00:00
Matthias
ecb41ff9aa Merge pull request #7476 from freqtrade/dependabot/pip/develop/ccxt-1.93.98
Bump ccxt from 1.93.66 to 1.93.98
2022-09-26 09:01:19 +02:00
Matthias
965f8ff39b Merge pull request #7477 from freqtrade/dependabot/pip/develop/mkdocs-material-8.5.3
Bump mkdocs-material from 8.5.2 to 8.5.3
2022-09-26 08:07:32 +02:00
dependabot[bot]
8ef3a41a0e Bump ccxt from 1.93.66 to 1.93.98
Bumps [ccxt](https://github.com/ccxt/ccxt) from 1.93.66 to 1.93.98.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/1.93.66...1.93.98)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-26 05:18:23 +00:00
Matthias
b90513d676 Merge pull request #7480 from freqtrade/dependabot/pip/develop/aiohttp-3.8.3
Bump aiohttp from 3.8.1 to 3.8.3
2022-09-26 07:17:13 +02:00
Thaweesak Chusri
c4784c6695 ✏️ fixed typo from StaticPairlist to StaticPairList 2022-09-26 11:05:27 +08:00
dependabot[bot]
5faaa25faf Bump aiohttp from 3.8.1 to 3.8.3
Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.8.1 to 3.8.3.
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.8.1...v3.8.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-26 03:02:00 +00:00
dependabot[bot]
95a2d43e1a Bump types-requests from 2.28.10 to 2.28.11
Bumps [types-requests](https://github.com/python/typeshed) from 2.28.10 to 2.28.11.
- [Release notes](https://github.com/python/typeshed/releases)
- [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>
2022-09-26 03:01:52 +00:00
dependabot[bot]
a38f47e1a5 Bump mkdocs-material from 8.5.2 to 8.5.3
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 8.5.2 to 8.5.3.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/8.5.2...8.5.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-26 03:01:37 +00:00
Wagner Costa Santos
ec947ad65c remove commented code - backtest_live_models 2022-09-25 23:47:27 -03:00
Wagner Costa Santos
5880f7a638 backtest_live_models - params validation and get timerange from live models in BT 2022-09-25 23:14:00 -03:00
Wagner Costa Santos
f3f3917da3 Merge branch 'develop' into backtest_live_models 2022-09-25 20:05:26 -03:00
Timothy Pogue
e54ed5b10e fix runtime error: dict changed size during iteration 2022-09-25 15:05:56 -06:00
robcaulk
f5535e780c change wording, switch FreqAI word format 2022-09-25 21:18:51 +02:00
robcaulk
117e510e61 Merge branch 'develop' into improve-freqai-docs 2022-09-25 20:53:36 +02:00
Robert Caulk
8051235171 Merge pull request #7465 from freqtrade/aggregate-fixes-fai
Aggregate recent feature requests
2022-09-25 20:43:23 +02:00
robcaulk
48e89e68b9 fix typos 2022-09-25 20:22:19 +02:00
Matthias
e53f0ce897 Update wheels to build with crypto fix 2022-09-25 19:33:12 +02:00
Matthias
af59572cb9 prior pairlists should go first 2022-09-25 19:32:39 +02:00
Matthias
adb5b98a3d Fix pre-commit lineending 2022-09-25 19:29:20 +02:00
Robert Caulk
0e7ec182a3 Merge pull request #7466 from th0rntwig/improve-freqai-docs
Revise FreqAI multipage docs structure
2022-09-25 17:51:58 +02:00
Wagner Costa Santos
0ed7b2bfc3 change start_backtesting to handle backtest_live_models 2022-09-25 10:35:55 -03:00
robcaulk
677c5719bf improve inlier-metric figure 2022-09-25 15:22:08 +02:00
th0rntwig
02dba5304b Revise FreqAI multipage docs structure 2022-09-25 12:12:35 +02:00
robcaulk
873d2a5069 no model save backtest, plot features backtest, ensure inlier plays nice, doc 2022-09-25 11:18:10 +02:00
Matthias
bd106b4b8e Add tests for Producerpairlist 2022-09-25 10:13:00 +02:00
Matthias
1bb45a2650 Fix crash due to insufficient check 2022-09-25 09:47:57 +02:00
Matthias
30d51b6939 Move "pairlist" logging to manager 2022-09-25 09:43:39 +02:00
Matthias
1c089dcd51 Add docs for Producer/consumer pairlist 2022-09-25 09:40:44 +02:00
Matthias
527fd36134 num_assets should be optional 2022-09-25 09:38:20 +02:00
Matthias
4940fa7be3 Add Producer Pairlist 2022-09-25 09:29:22 +02:00
Matthias
0c810868de Add Dataprovider to pairlist 2022-09-25 09:22:21 +02:00
Matthias
f4fac53a13 Merge pull request #7458 from xmatthias/dataformat/feather
new Dataformats feather and Parquet
2022-09-25 09:00:22 +02:00
Matthias
96336cb552 Merge pull request #7462 from freqtrade/pre-commit-ci
Use pre-commit in Ci to check for all things
2022-09-25 08:50:40 +02:00
Wagner Costa Santos
7f116db95e added generic function to get timerange from existent models 2022-09-24 13:01:53 -03:00
Wagner Costa Santos
d9c16d4888 Merge branch 'develop' into backtest_live_models 2022-09-24 12:30:55 -03:00
Wagner Costa Santos
3ee7eb63f7 starting backtest live models 2022-09-24 12:28:52 -03:00
Matthias
873eb5f2ca Improve EMC config validations 2022-09-24 16:43:58 +02:00
Matthias
1bd742f7e9 Properly setup pre-commit job 2022-09-24 16:31:29 +02:00
Matthias
585342f193 Merge pull request #7454 from freqtrade/fix_backtesting_dfsize_freqai
Ensure the DF has the same size in backtesting FreqAI
2022-09-24 16:17:39 +02:00
Matthias
e63f9e1c14 Use pre-commit in Ci to check for all things 2022-09-24 16:16:47 +02:00
Matthias
8d77ba118c Fix line endings 2022-09-24 16:15:15 +02:00
Matthias
50dfde7048 Remove unnecessary typing import 2022-09-24 16:11:15 +02:00
Matthias
53c8e0923f Improve typing in message_consumer 2022-09-24 16:10:42 +02:00
Matthias
166ae8e3a1 Remove missleading comment 2022-09-24 15:51:20 +02:00
Matthias
98ba57ffaa Better test for contract calculation change
closes #7449
2022-09-24 15:25:04 +02:00
Matthias
4efe2e9bc4 use FtPrecise to convert to contracts and back 2022-09-24 14:55:58 +02:00
Matthias
00b192b4df Add test to verify #7449 2022-09-24 14:51:58 +02:00
paranoidandy
2cc00a1a2c Allow use of --strategy-list with freqai, with warning (#7455)
* Allow use of --strategy-list with freqai, with warning

* ensure populate_any_indicators is identical for resused identifiers

* use pair instead of metadata["pair"]

Co-authored-by: robcaulk <rob.caulk@gmail.com>
2022-09-24 13:21:01 +02:00
Matthias
e429aa16f3 Add note about enter_tag handling
closes #7336
2022-09-24 11:21:50 +02:00
Matthias
6643d90e64 simplify freqAI start_backtesting 2022-09-24 10:34:14 +02:00
Matthias
5d27d5689f Merge pull request #7457 from aemr3/add-training-time
Add elapsed time to Freqai training logs
2022-09-24 10:27:08 +02:00
Matthias
d9c8e7157b Merge pull request #7460 from wizrds/bugfix-emc
Bug fix in External Message Consumer
2022-09-24 06:49:18 +02:00
Timothy Pogue
af974443cd add test 2022-09-23 13:37:46 -06:00
Timothy Pogue
6b5d71049e add sleep 2022-09-23 13:10:45 -06:00
Timothy Pogue
4c7cef570f typo in exception 2022-09-23 12:58:26 -06:00
Timothy Pogue
b8e1d29a1b catch connectionclosederror 2022-09-23 12:36:05 -06:00
Matthias
cf05f374cf Merge pull request #7459 from wizrds/fix-producer-docs
Fix typo in Configuration docs for Producer
2022-09-23 20:28:55 +02:00
Timothy Pogue
255ff000af typo in configuration.md 2022-09-23 12:12:47 -06:00
Matthias
2fffe7c5dd Fix missing comma 2022-09-23 20:03:33 +02:00
Matthias
7c093388e7 Add pyarrow dependency 2022-09-23 19:36:23 +02:00
robcaulk
647200e8a7 isort 2022-09-23 19:30:56 +02:00
robcaulk
77c360b264 improve typing, improve docstrings, ensure global tests pass 2022-09-23 19:17:27 +02:00
Matthias
4576d291a9 Update data command outputs 2022-09-23 18:25:26 +02:00
Matthias
7e1e388b9c Add feather/parquet docs 2022-09-23 18:24:30 +02:00
robcaulk
9c361f4422 increase test coverage for RL and FreqAI 2022-09-23 18:04:43 +02:00
Matthias
48352b8a37 Update hdf5 handler to reset index on load 2022-09-23 14:49:17 +00:00
Matthias
0bbb6faeba Add generic datahandler test 2022-09-23 13:23:17 +00:00
Robert Caulk
95121550ef Remove unnecessary models, add model arg 2022-09-23 10:37:34 +02:00
Robert Caulk
f7dd3045f7 Parameterize backtesting test 2022-09-23 10:30:52 +02:00
Robert Caulk
f5cd8f62c6 Remove unused code from BaseEnv 2022-09-23 10:24:39 +02:00
Emre
a4eaff4da6 Add training elapsed time 2022-09-23 01:18:34 -07:00
robcaulk
1c56fa034f add test_models folder 2022-09-23 09:19:16 +02:00
Matthias
5fb56b09f2 Test Feather/parquet datahandler init 2022-09-23 07:20:09 +02:00
Matthias
983a16d937 Rudimentary "not implemented" test 2022-09-23 07:18:18 +02:00
Matthias
044891f543 Add conditional formats depending on mode 2022-09-23 07:18:18 +02:00
Matthias
dc2b93228b Add ParquetDataHandler 2022-09-23 07:18:18 +02:00
Matthias
3c0d2c446d Add Feather datahandler (no trade mode yet) 2022-09-23 07:18:18 +02:00
Matthias
7b4af85425 Remove double-init in test 2022-09-23 07:18:08 +02:00
Matthias
f62f2bb1ca Improve datahandler tests 2022-09-23 07:17:33 +02:00
Matthias
2a5bc58df8 Split datahandler and history tests 2022-09-23 07:09:34 +02:00
Matthias
1db8421b9d Merge pull request #7303 from wizrds/feat/externalsignals
Producer/consumer mode
2022-09-23 06:29:58 +02:00
robcaulk
7295ba0fb2 add test for Base4ActionEnv 2022-09-22 23:42:33 +02:00
robcaulk
b7c60e810a improve class diagram 2022-09-22 21:32:12 +02:00
robcaulk
f6e9753c99 show advanced users how they can customize agent indepth` 2022-09-22 21:18:09 +02:00
robcaulk
eeebb78a5c skip darwin in RL tests, remove example scripts, improve doc 2022-09-22 21:16:21 +02:00
Matthias
06a5cfa401 Update "branding" to producer/follower mode 2022-09-22 21:08:06 +02:00
Matthias
1626eb7f97 Update dataprovider function name to get_producer_df 2022-09-22 20:46:40 +02:00
Matthias
e6c5c22ea0 Update websocket/follower docs 2022-09-22 20:31:42 +02:00
robcaulk
ea8e34e192 Merge branch 'develop' into dev-merge-rl 2022-09-22 19:46:50 +02:00
th0rntwig
71e6c54ea4 Normalise distances before Weibull fit (#7432)
* Normalise distances before Weibull

* Track inlier-metric params
2022-09-22 18:11:50 +02:00
Wagner Costa Santos
b1dbc3a65f remove function remove_training_from_backtesting and ensure BT period is correct with startup_candle_count 2022-09-22 12:13:51 -03:00
Robert Caulk
3e1e530aca Merge branch 'develop' into improve-freqai-docs 2022-09-22 15:58:27 +02:00
Timothy Pogue
6a6ae809f4 fix jwt auth 2022-09-21 18:23:00 -06:00
Timothy Pogue
77ed713232 add catch for invalid message error 2022-09-21 16:04:25 -06:00
Timothy Pogue
128b117af6 support list of tokens in ws_token 2022-09-21 16:02:21 -06:00
Timothy Pogue
0811bca8b4 revise docs, update dp method docstring 2022-09-21 15:50:11 -06:00
Matthias
91dc5e7aa6 Be sure to provide an amount in entry notifications 2022-09-21 21:12:08 +02:00
Matthias
08e183fb55 Add note about okx trading mode 2022-09-21 20:59:12 +02:00
paranoidandy
366c6c24d8 Add docs for External Signals API 2022-09-21 12:52:23 -06:00
Matthias
923182680e Explicitly define notification defaults 2022-09-21 12:46:58 +00:00
Matthias
f7b8c5a767 Reorder telegram noise sample 2022-09-21 12:46:58 +00:00
Matthias
02f2096fc3 Reverse and fix rangestability conditions
closes #7447
2022-09-21 06:53:07 +02:00
Matthias
8f41f943b4 Fix 0.0 amount message wording 2022-09-21 06:42:55 +02:00
Matthias
ff36431680 Adjust tests for new messageType handling 2022-09-20 20:34:56 +02:00
Matthias
3b0874eb37 Update exit message handling to gracefully handle kucoins "empty" responses
closes #7444
2022-09-20 20:00:08 +02:00
Matthias
0c01b23cba Capture exceptions in send_msg calls 2022-09-20 18:09:14 +02:00
Matthias
0bd6ad55a1 Always show freqtrade version 2022-09-20 14:14:54 +00:00
Matthias
8a91c8e220 Sort and dedup pairs before data conversion 2022-09-20 13:36:28 +00:00
Matthias
6c18fa0847 Update proxy docs 2022-09-20 09:30:48 +00:00
Matthias
914eccecec Merge branch 'develop' into pr/wizrds/7303 2022-09-20 06:56:15 +02:00
Matthias
3274bb0751 Remove msgpack for now 2022-09-20 06:55:22 +02:00
robcaulk
b5fd11f91b protect against unforeseen issues in scanning thread 2022-09-19 21:18:31 +02:00
Matthias
32d46e8a6b Improve fixture naming 2022-09-19 20:59:53 +02:00
Matthias
703bcc099a Fix list-pair regex to also support 1INCH/USDT 2022-09-19 20:32:54 +02:00
Matthias
eb9ac9cbda add --exchange to convert-trade-data 2022-09-19 20:29:28 +02:00
Matthias
a023ac26f3 Merge pull request #7441 from freqtrade/train-queue
Ensure train ordering after restart
2022-09-19 19:33:16 +02:00
robcaulk
42c75b4a7b combine log messages 2022-09-19 19:16:32 +02:00
Robert Caulk
9b66297cc0 Fix append 2022-09-19 12:47:20 +02:00
Robert Caulk
995396c775 Add useful log info 2022-09-19 11:42:56 +02:00
Robert Caulk
ad652817ef Ensure train ordering after restart
Ensure lowest timestamps get trained first after restart
2022-09-19 11:11:23 +02:00
Robert Caulk
f9460c80c2 Merge pull request #7434 from freqtrade/improve-train-queue
improve train queue system in FreqAI
2022-09-19 10:55:53 +02:00
Matthias
ea58c29ded Add plot_feature_importance to schema definition 2022-09-19 08:13:54 +00:00
Matthias
225f7cd5f8 Merge pull request #7431 from initrv/add-plot-feature-importance
Add plot feature importance
2022-09-19 08:41:10 +02:00
Matthias
2c4137e5ca Merge pull request #7440 from freqtrade/dependabot/pip/develop/fastapi-0.85.0
Bump fastapi from 0.83.0 to 0.85.0
2022-09-19 08:01:12 +02:00
Matthias
ec7642febf Merge pull request #7437 from freqtrade/dependabot/pip/develop/ccxt-1.93.66
Bump ccxt from 1.93.35 to 1.93.66
2022-09-19 08:00:57 +02:00
Matthias
4a0a0c307c Use json_load to load leverage tiers 2022-09-19 07:23:26 +02:00
Matthias
d930931000 Bring back sleep - it'll ensure we give up control over the thread. 2022-09-19 07:14:33 +02:00
Matthias
1d0e686cd4 Merge pull request #7436 from freqtrade/dependabot/pip/develop/joblib-1.2.0
Bump joblib from 1.1.0 to 1.2.0
2022-09-19 06:59:10 +02:00
Matthias
cc89b4127a Merge pull request #7439 from freqtrade/dependabot/pip/develop/mkdocs-material-8.5.2
Bump mkdocs-material from 8.4.3 to 8.5.2
2022-09-19 06:57:47 +02:00
dependabot[bot]
b5f51b5ec2 Bump fastapi from 0.83.0 to 0.85.0
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.83.0 to 0.85.0.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.83.0...0.85.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-19 04:34:24 +00:00
Matthias
613ad8cb31 Merge pull request #7438 from freqtrade/dependabot/pip/develop/pyjwt-2.5.0
Bump pyjwt from 2.4.0 to 2.5.0
2022-09-19 06:33:29 +02:00
dependabot[bot]
15c9b6bf41 Bump mkdocs-material from 8.4.3 to 8.5.2
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 8.4.3 to 8.5.2.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/8.4.3...8.5.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-19 03:02:33 +00:00
dependabot[bot]
cbdb0ce3e7 Bump pyjwt from 2.4.0 to 2.5.0
Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.4.0 to 2.5.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.4.0...2.5.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-19 03:02:23 +00:00
dependabot[bot]
f512717943 Bump ccxt from 1.93.35 to 1.93.66
Bumps [ccxt](https://github.com/ccxt/ccxt) from 1.93.35 to 1.93.66.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/1.93.35...1.93.66)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-19 03:02:16 +00:00
dependabot[bot]
4cdc89706e Bump joblib from 1.1.0 to 1.2.0
Bumps [joblib](https://github.com/joblib/joblib) from 1.1.0 to 1.2.0.
- [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.1.0...1.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-19 03:02:04 +00:00
Matthias
8116ca847b move trades_get_pairs to parent class 2022-09-18 19:40:03 +02:00
Matthias
a06eee300a move ohlcv_get_pairs to parent class 2022-09-18 19:36:23 +02:00
Matthias
584b2381d1 Fix Imports 2022-09-18 19:36:11 +02:00
Matthias
9e01ff5a72 Merge pull request #7435 from th0rntwig/improve-freqai-docs
Add Common pitfalls
2022-09-18 19:24:10 +02:00
robcaulk
470d5d8405 ensure full new pairlist is in the queue 2022-09-18 17:08:07 +02:00
robcaulk
eaa43337d2 improve train queue system, ensure crash resilience in train queue. 2022-09-18 17:00:55 +02:00
th0rntwig
edbe9137da Add Common pitfalls 2022-09-18 14:51:11 +02:00
robcaulk
95457d23ca escape freqai-specific characters from file naming 2022-09-18 13:59:30 +02:00
Matthias
994c1c5ea0 use Config typing in more places 2022-09-18 13:31:52 +02:00
Matthias
667853c504 Use Alias to type config objects 2022-09-18 13:20:55 +02:00
robcaulk
188f75d8ec set model in models dict 2022-09-18 12:50:44 +02:00
Matthias
27c46300a7 Merge pull request #7430 from th0rntwig/improve-freqai-docs
Reorganise multipage doc
2022-09-18 10:22:45 +02:00
Matthias
9f23588154 strategy template - remove pointless noqa's 2022-09-18 08:58:33 +02:00
Matthias
7a73adb955 Improve default strategy template 2022-09-18 08:57:26 +02:00
Matthias
faf84295a5 Separate strategy subtemplates for better overview 2022-09-18 08:52:53 +02:00
Matthias
ab78fb373a Improve freqAI strategy formatting and readability 2022-09-18 08:45:24 +02:00
Matthias
4634936265 additional support for --data-dir 2022-09-18 08:39:03 +02:00
Matthias
fa3d4b58ab Revert unnecessary formatting 2022-09-18 08:30:59 +02:00
Robert Caulk
bdeb2f9c6a Merge branch 'develop' into add-plot-feature-importance 2022-09-18 00:02:46 +02:00
robcaulk
1ef875901a maintian user privacy by keeping plotly offline 2022-09-18 00:01:42 +02:00
robcaulk
68f7a31504 ensure continued operation despite not being able to plot 2022-09-18 00:00:14 +02:00
robcaulk
2c23effbf2 allow plot to plot multitargets, add test 2022-09-17 19:17:44 +02:00
initrv
1c92734f39 simplify plot_feature_importance call 2022-09-17 18:53:43 +03:00
robcaulk
7b1d409c98 fix mypy/flake8 2022-09-17 17:51:06 +02:00
robcaulk
d056d766ed make tests pass 2022-09-17 17:46:47 +02:00
th0rntwig
c210d6614c Reorganise multipage doc 2022-09-17 17:43:39 +02:00
Matthias
92a32ab31b Add documentation for stop-market on binance futures
part of #7426
2022-09-17 17:14:45 +02:00
Matthias
063511826c Update stoploss on exchange logic
closes #7424
2022-09-17 17:11:00 +02:00
Matthias
9f266cbcb2 Allow safe_price for market stop orders 2022-09-17 17:11:00 +02:00
Matthias
ca6dec3d4c Binance spot also allows market orders
closes #7426
2022-09-17 17:11:00 +02:00
Matthias
8639c1f23d Reduce complexity in binance stoploss handling 2022-09-17 17:11:00 +02:00
Matthias
93237efc15 Merge pull request #7428 from freqtrade/informative_freqai
Informative freqai
2022-09-17 16:44:28 +02:00
Matthias
38b28fc4da Update duplicated test 2022-09-17 14:19:20 +02:00
Matthias
4182a7891a Allow leverage tier cache to be 4 weeks old.
we've seen from binance that it's not changing this often.
2022-09-17 10:41:48 +02:00
Matthias
6682ae35b3 Update cached binance_leverage_tiers 2022-09-17 10:37:47 +02:00
Matthias
10ec681b30 Clean up no longer needed informative sample code 2022-09-17 10:19:46 +02:00
Matthias
d62cef01be Add test for __informative_pairs_freqai 2022-09-17 10:18:08 +02:00
Matthias
0aada271ca Move informative_pairs for freqAI to backend 2022-09-17 10:17:22 +02:00
Timothy Pogue
4422ac7f45 constrain port in config, catch value error 2022-09-16 19:22:24 -06:00
initrv
86aa875bc9 plot features as html instead of png 2022-09-16 21:47:12 +03:00
initrv
b707a6da35 Add ability to plot feature importance 2022-09-16 19:17:41 +03:00
Matthias
e5368f5a14 backtesting confirm_trade_entry should pass correct amount, not stake-amount
closes #7423
2022-09-16 13:24:20 +00:00
Timothy Pogue
b0b575ead9 change json serialize to split orient 2022-09-16 00:02:27 -06:00
Timothy Pogue
1ad25095c1 change test server from localhost to 127.0.0.1 2022-09-15 19:40:45 -06:00
Timothy Pogue
efaef68ad7 Merge branch 'develop' into feat/externalsignals 2022-09-15 18:09:25 -06:00
Timothy Pogue
7d1645ac20 fix tests and warning message 2022-09-15 17:54:31 -06:00
Timothy Pogue
8e75852ff3 fix constants, update config example, add emc config validation 2022-09-15 11:12:05 -06:00
robcaulk
025b98decd bring back doc sentence 2022-09-15 01:01:33 +02:00
robcaulk
3b97b3d5c8 fix mypy error for strategy 2022-09-15 00:56:51 +02:00
robcaulk
8aac644009 add tests. add guardrails. 2022-09-15 00:46:35 +02:00
Timothy Pogue
6126925dbe message size limit in mb, default to 8mb 2022-09-14 16:42:14 -06:00
robcaulk
48140bff91 fix bug in 4ActRLEnv 2022-09-14 22:53:53 +02:00
robcaulk
81417cb795 Merge branch 'develop' into dev-merge-rl 2022-09-14 22:49:11 +02:00
Matthias
711849abd6 Use Wheels for win builds 2022-09-14 07:16:57 +02:00
Matthias
8a236c3c4f Merge pull request #7412 from initrv/fix-purge-old-models
Fixed a bug that prevents clearing old models
2022-09-14 07:10:57 +02:00
Matthias
91bc3d1161 Update docs aroudn use_exit_signal
close #7413
2022-09-14 07:04:14 +02:00
Matthias
49800e4cc3 pin ci python to 3.10.6 for now 2022-09-14 06:55:05 +02:00
Timothy Pogue
aed19ff6ce fix The future belongs to a different loop error 2022-09-13 19:17:12 -06:00
initrv
37dd22c89e Fixed a bug that prevents clearing old models
Corrects the error of clearing old models when the model directory contains directories with names that do not match a regular expression
2022-09-14 03:40:13 +03:00
Timothy Pogue
06350a13cb support specifying message size in emc config 2022-09-13 16:39:53 -06:00
Timothy Pogue
d75d5a7dad debug ping error message 2022-09-13 16:06:25 -06:00
Matthias
7a98775f01 Version bump apiVersion 2022-09-13 22:07:59 +02:00
Timothy Pogue
46a425d1b6 fix OOM on emc test 2022-09-13 13:36:21 -06:00
Matthias
7b6e465d57 Remove gate live test skip 2022-09-13 21:28:11 +02:00
Matthias
877d24bcdd Fix external dependency of test 2022-09-13 20:52:07 +02:00
Matthias
d2abc9417f Simplify ws imports 2022-09-13 20:51:13 +02:00
Matthias
79c70bd52d use WebSocketState from fastapi
available since 0.82.0
2022-09-13 20:50:12 +02:00
Timothy Pogue
aeaca78940 change port in send_msg test 2022-09-13 12:39:12 -06:00
Timothy Pogue
07aa206f71 real fix for reconnecting 2022-09-13 12:36:40 -06:00
Timothy Pogue
6d0dfd4dc8 continue trying connect on ping error 2022-09-13 12:27:41 -06:00
Timothy Pogue
75ce9067dc fix dp test 2022-09-12 16:39:16 -06:00
Robert Caulk
26441820a9 Merge pull request #7390 from aemr3/add-xgboostclassifier
Add XGBoostClassifier
2022-09-12 23:38:04 +02:00
Timothy Pogue
bf2e5dee75 add running false on shutdown, fix dp typing 2022-09-12 14:21:39 -06:00
Timothy Pogue
12a3e90f78 fix tests 2022-09-12 14:12:39 -06:00
Timothy Pogue
0697041f14 remove copy statement where not needed 2022-09-12 14:09:12 -06:00
Timothy Pogue
c19a5fbe06 copy data being transferred, remove debug messages in emc 2022-09-12 13:57:29 -06:00
Matthias
b6434040de Remove plain json serializer implementation 2022-09-12 20:24:28 +02:00
Matthias
867d59b930 Improve type specifitivity 2022-09-12 20:00:01 +02:00
Matthias
0052e58917 emc: Fix potential startup timing issue 2022-09-12 19:50:22 +02:00
Timothy Pogue
a477b3c244 remove log line, fix tests to not connect to actual ip 2022-09-12 10:45:59 -06:00
Timothy Pogue
10852555e5 change verbosity of testing log 2022-09-12 09:53:47 -06:00
Matthias
fac8f19554 Merge pull request #7396 from freqtrade/hyperopt_per_epoch
Hyperopt per epoch
2022-09-12 15:56:03 +02:00
Timothy Pogue
457075b823 one more line 2022-09-12 07:47:30 -06:00
Timothy Pogue
d6205e6cfb test logging lines 2022-09-12 07:36:11 -06:00
Timothy Pogue
85b43a7c34 Merge branch 'develop' into feat/externalsignals 2022-09-12 07:28:08 -06:00
Matthias
a93e355175 Merge pull request #7403 from freqtrade/dependabot/pip/develop/types-requests-2.28.10
Bump types-requests from 2.28.9 to 2.28.10
2022-09-12 10:37:42 +02:00
Matthias
f45824acf5 Bump precommit types/requests 2022-09-12 09:23:02 +02:00
Matthias
2599e57fe6 Merge pull request #7401 from freqtrade/dependabot/pip/develop/aiofiles-22.1.0
Bump aiofiles from 0.8.0 to 22.1.0
2022-09-12 09:21:58 +02:00
Matthias
e20ebc99c4 Merge pull request #7398 from freqtrade/dependabot/pip/develop/cryptography-38.0.1
Bump cryptography from 37.0.4 to 38.0.1
2022-09-12 08:41:01 +02:00
Matthias
21ed992b78 Merge pull request #7400 from freqtrade/dependabot/pip/develop/numpy-1.23.3
Bump numpy from 1.23.2 to 1.23.3
2022-09-12 08:40:16 +02:00
dependabot[bot]
7ee92db7a2 Bump aiofiles from 0.8.0 to 22.1.0
Bumps [aiofiles](https://github.com/Tinche/aiofiles) from 0.8.0 to 22.1.0.
- [Release notes](https://github.com/Tinche/aiofiles/releases)
- [Commits](https://github.com/Tinche/aiofiles/compare/v0.8.0...v22.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-12 06:07:40 +00:00
Matthias
91b7e152c2 Merge pull request #7404 from freqtrade/dependabot/pip/develop/fastapi-0.83.0
Bump fastapi from 0.82.0 to 0.83.0
2022-09-12 08:06:43 +02:00
dependabot[bot]
00db473f10 Bump cryptography from 37.0.4 to 38.0.1
Bumps [cryptography](https://github.com/pyca/cryptography) from 37.0.4 to 38.0.1.
- [Release notes](https://github.com/pyca/cryptography/releases)
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/37.0.4...38.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-12 06:05:22 +00:00
dependabot[bot]
4ac804f795 Bump numpy from 1.23.2 to 1.23.3
Bumps [numpy](https://github.com/numpy/numpy) from 1.23.2 to 1.23.3.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v1.23.2...v1.23.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-12 06:05:04 +00:00
Matthias
d3f4d742bb Merge pull request #7399 from freqtrade/dependabot/pip/develop/ccxt-1.93.35
Bump ccxt from 1.93.3 to 1.93.35
2022-09-12 08:04:16 +02:00
dependabot[bot]
09cdce864e Bump ta-lib from 0.4.24 to 0.4.25
Bumps [ta-lib](https://github.com/mrjbq7/ta-lib) from 0.4.24 to 0.4.25.
- [Release notes](https://github.com/mrjbq7/ta-lib/releases)
- [Changelog](https://github.com/mrjbq7/ta-lib/blob/master/CHANGELOG)
- [Commits](https://github.com/mrjbq7/ta-lib/compare/TA_Lib-0.4.24...TA_Lib-0.4.25)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-12 06:02:21 +00:00
Matthias
1f11d6091c Merge pull request #7405 from freqtrade/dependabot/pip/develop/jsonschema-4.16.0
Bump jsonschema from 4.15.0 to 4.16.0
2022-09-12 08:01:36 +02:00
Matthias
dae2ee446c Merge pull request #7402 from freqtrade/dependabot/pip/develop/mkdocs-material-8.4.3
Bump mkdocs-material from 8.4.2 to 8.4.3
2022-09-12 08:01:04 +02:00
Matthias
715a71465d Fix auth bug when no token is set 2022-09-12 07:28:31 +02:00
dependabot[bot]
c149c47afb Bump ccxt from 1.93.3 to 1.93.35
Bumps [ccxt](https://github.com/ccxt/ccxt) from 1.93.3 to 1.93.35.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/1.93.3...1.93.35)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-12 05:05:30 +00:00
Matthias
3c2e0b5ad6 Merge pull request #7397 from freqtrade/dependabot/pip/develop/sqlalchemy-1.4.41
Bump sqlalchemy from 1.4.40 to 1.4.41
2022-09-12 07:04:36 +02:00
dependabot[bot]
6968fc333b Bump jsonschema from 4.15.0 to 4.16.0
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.15.0 to 4.16.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.15.0...v4.16.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-12 03:02:10 +00:00
dependabot[bot]
a4b7e0a714 Bump fastapi from 0.82.0 to 0.83.0
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.82.0 to 0.83.0.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.82.0...0.83.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-12 03:02:06 +00:00
dependabot[bot]
1ef334411e Bump types-requests from 2.28.9 to 2.28.10
Bumps [types-requests](https://github.com/python/typeshed) from 2.28.9 to 2.28.10.
- [Release notes](https://github.com/python/typeshed/releases)
- [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>
2022-09-12 03:02:01 +00:00
dependabot[bot]
6bfe996061 Bump mkdocs-material from 8.4.2 to 8.4.3
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 8.4.2 to 8.4.3.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/8.4.2...8.4.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-12 03:01:56 +00:00
dependabot[bot]
6777d43aea Bump sqlalchemy from 1.4.40 to 1.4.41
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 1.4.40 to 1.4.41.
- [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>
2022-09-12 03:01:27 +00:00
Timothy Pogue
5483cf21f6 remove default secret_ws_token, set timeout min to 0 2022-09-11 11:42:13 -06:00
Matthias
982c0315fa Rename variable 2022-09-11 19:31:11 +02:00
Matthias
816c1f7603 add test for per epoch hyperopt 2022-09-11 17:51:30 +02:00
Matthias
72d197a99d Run first epoch in non-parallel mode
this allows dataprovider to load it's cache.

closes #7384
2022-09-11 17:51:07 +02:00
robcaulk
ede282392f add a developers guide 2022-09-11 17:50:50 +02:00
Timothy Pogue
818f7bfc40 Merge branch 'develop' into feat/externalsignals 2022-09-11 09:48:16 -06:00
robcaulk
68a900a9b7 reorganize freqai docs for easier reading, add detailed file structure description 2022-09-11 17:29:14 +02:00
Matthias
78cd46ecd5 hyperopt Remove unnecessary arguments 2022-09-11 14:59:39 +02:00
Matthias
32e13d65c3 Refactor hyperopt to extract evaluate_result 2022-09-11 14:59:39 +02:00
Matthias
a48923c0e4 Extract widget colorization to separate function 2022-09-11 14:59:39 +02:00
Matthias
9c8c7a03a1 Improve typehint 2022-09-11 14:59:39 +02:00
Matthias
ccc70a21f2 Update pairs_file cli argument description 2022-09-11 14:59:39 +02:00
Matthias
4476b5a7f4 add user_data arg to test-pairlist 2022-09-11 14:59:39 +02:00
Matthias
24b35bfb44 Merge pull request #7394 from freqtrade/add-search-share
add search share button to website
2022-09-11 14:57:11 +02:00
robcaulk
d598f4334e add search share button to website 2022-09-11 13:28:14 +02:00
Timothy Pogue
0a8b7686d6 reworked emc tests 2022-09-11 00:50:18 -06:00
Timothy Pogue
ed4ba8801f more emc tests 2022-09-10 23:57:17 -06:00
Timothy Pogue
9a1a4dfb5b more ws endpoint tests 2022-09-10 16:08:05 -06:00
Timothy Pogue
0f8eaf98e7 Merge branch 'develop' into feat/externalsignals 2022-09-10 15:14:10 -06:00
Timothy Pogue
0bc18ea33c call websocket close in channel close 2022-09-10 15:12:18 -06:00
Emre
330d7068ab Merge branch 'develop' into add-xgboostclassifier 2022-09-10 23:59:11 +03:00
Robert Caulk
075748b21a Merge pull request #7392 from freqtrade/improve_ai_tests
Improve freqai tests by utilizing parametrization
2022-09-10 22:37:21 +02:00
Timothy Pogue
2afd5c202c update message parsing, tests 2022-09-10 14:29:15 -06:00
robcaulk
5a0cfee27e allow user to multithread jobs (advanced users only) 2022-09-10 22:16:49 +02:00
Robert Caulk
73e122ad10 Merge pull request #7391 from wagnercosta/fixBTfreqaiV2
Fix FreaqAI backtesting - startup_candle_count bug
2022-09-10 21:53:00 +02:00
Timothy Pogue
c5d031733b remove old param in test fixture 2022-09-10 13:50:36 -06:00
Timothy Pogue
a7baccdb7d update log messages in emc, more tests 2022-09-10 13:44:27 -06:00
Timothy Pogue
866a564958 update emc start/shutdown, initial emc tests 2022-09-10 12:51:29 -06:00
Matthias
b3fc1cfde9 Parametrize classifier tests 2022-09-10 20:18:00 +02:00
Matthias
88892ba663 Parametrize regressor tests 2022-09-10 20:18:00 +02:00
Matthias
f97f1dc5c3 Test CatboostRegressorMultiTarget, simplify test setup via parametrization 2022-09-10 20:18:00 +02:00
Matthias
e4caccc353 Merge pull request #7367 from freqtrade/add-continual-learning
add continual learning to catboost and friends
2022-09-10 20:17:28 +02:00
Timothy Pogue
d8cdd92140 wrap background cleanup in finally, add tests 2022-09-10 11:47:21 -06:00
Wagner Costa Santos
311ae8bf1f freqai backtesting - add startup_candle_count at function description 2022-09-10 14:45:42 -03:00
Emre
60eb02bb62 Add XGBoostClassifier 2022-09-10 20:13:16 +03:00
Robert Caulk
2077f84f9b Merge pull request #7363 from wagnercosta/fixHyperoptFreqai
Fix hyperopt - freqai
2022-09-10 17:02:01 +02:00
Robert Caulk
4a47c63f71 Merge pull request #7374 from th0rntwig/filter-constant-features 2022-09-10 16:58:58 +02:00
robcaulk
10b6aebc5f enable continual learning and evaluation sets on multioutput models. 2022-09-10 16:54:13 +02:00
Matthias
daf352e6a5 Test online candle fetching in futures, too
disable gateio checking on spot markets
2022-09-10 16:01:06 +02:00
Wagner Costa Santos
a1f88cca80 merge develop 2022-09-10 10:35:16 -03:00
Wagner Costa Santos
79985fda01 fix backtesting freqai startup candles bug 2022-09-10 10:27:17 -03:00
Matthias
4250174de9 Fix ws exception when no token is provided 2022-09-10 14:29:58 +02:00
Matthias
b344f78d00 Improve logic for token validation 2022-09-10 14:20:49 +02:00
Matthias
170bec0438 Fix failing XGBoost tests 2022-09-10 08:24:23 +02:00
Matthias
5705b8759b Merge branch 'develop' into add-continual-learning 2022-09-10 08:24:04 +02:00
Timothy Pogue
2f6a61521f add more tests 2022-09-09 17:14:40 -06:00
robcaulk
05581db4e3 ensure columns are only dropped in training 2022-09-09 20:37:21 +02:00
Matthias
939fb7acb3 Fix enum imports 2022-09-09 20:31:30 +02:00
Matthias
97be3318f4 Use Datetime_format from constants 2022-09-09 20:31:02 +02:00
Matthias
37fcbeba58 Update backtesting output wording to Entries 2022-09-09 19:58:55 +02:00
Timothy Pogue
826eb85254 update confige example 2022-09-09 11:58:30 -06:00
robcaulk
c13bec26d1 add freqaimodel to hyperopt command 2022-09-09 19:41:28 +02:00
Timothy Pogue
6cbc03a96a support jwt token in place of ws token 2022-09-09 11:38:42 -06:00
robcaulk
a826c0eb83 ensure signatures match, reduce verbosity 2022-09-09 19:30:53 +02:00
Emre
acb410a0de Remove verbosity params 2022-09-09 19:30:53 +02:00
Emre
df6e43d2c5 Add XGBoostRegressorMultiTarget class 2022-09-09 19:30:53 +02:00
Emre
1b6410d7d1 Add XGBoostRegressor for freqAI, fix mypy errors 2022-09-09 19:30:53 +02:00
Timothy Pogue
09679cc798 fix dependency 2022-09-09 11:27:20 -06:00
Wagner Costa Santos
d38cc06139 Fix freqai backtesting time range issue 2022-09-09 19:27:05 +02:00
Timothy Pogue
ad96597693 wording 2022-09-09 10:59:38 -06:00
Timothy Pogue
445ab1beee update docs 2022-09-09 10:56:54 -06:00
Timothy Pogue
426f8f37e9 change var names 2022-09-09 10:45:49 -06:00
Matthias
e256ebd727 Add ws_token to auto-generated config 2022-09-09 07:13:05 +02:00
Matthias
afc17c5ec9 Merge pull request #7383 from freqtrade/dependabot/docker/python-3.10.7-slim-bullseye
Bump python from 3.10.6-slim-bullseye to 3.10.7-slim-bullseye
2022-09-09 06:30:19 +02:00
dependabot[bot]
92d71ebdb7 Bump python from 3.10.6-slim-bullseye to 3.10.7-slim-bullseye
Bumps python from 3.10.6-slim-bullseye to 3.10.7-slim-bullseye.

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-09 03:03:30 +00:00
Timothy Pogue
46cd0ce994 fix sentence in docs 2022-09-08 16:30:31 -06:00
Timothy Pogue
1466d2d26f initial message ws docs 2022-09-08 16:27:09 -06:00
Timothy Pogue
75cf8dbfe4 missed await 2022-09-08 15:11:36 -06:00
robcaulk
c5d9180758 isort 2022-09-08 22:35:52 +02:00
robcaulk
bc7295579f improve docs, make example strat hyperoptable 2022-09-08 22:22:50 +02:00
Timothy Pogue
c9d4f666c5 minor apiserver test change 2022-09-08 14:00:22 -06:00
Timothy Pogue
2b9c8550b0 moved ws_schemas, first ws tests 2022-09-08 13:58:28 -06:00
Timothy Pogue
b9e7af1ce2 fix ws token auth 2022-09-08 11:25:30 -06:00
Timothy Pogue
fac6626459 update default timeouts 2022-09-08 10:54:31 -06:00
Timothy Pogue
b3b0c918d9 cleanup old code 2022-09-08 10:44:03 -06:00
Timothy Pogue
379b1cbc90 remove unnecessary returns 2022-09-08 10:37:41 -06:00
Timothy Pogue
df3c126146 fix mypy error 2022-09-08 10:34:37 -06:00
Timothy Pogue
9b752475db re-add fix to freqtradebot test 2022-09-08 10:20:03 -06:00
Timothy Pogue
4104d0f68a Merge branch 'develop' into feat/externalsignals 2022-09-08 10:19:23 -06:00
Timothy Pogue
4fac125443 fix apiserver cleanup issues in tests 2022-09-08 10:14:30 -06:00
Timothy Pogue
83770d20fa fix existing freqtradebot tests 2022-09-08 10:10:32 -06:00
Matthias
883abe5b4f Merge pull request #7379 from freqtrade/fix/keyerror_fundingfee
Fix keyerror fundingfee update
2022-09-08 12:06:52 +02:00
Matthias
08726a264b Update FAQ to point out multiple parallel positions per trade 2022-09-08 07:48:36 +00:00
Matthias
5e42defafc Update telegram docs to disable partial exit notifications 2022-09-08 07:36:37 +00:00
Matthias
9ef0ffe277 Update tests for funding-Fee exceptions 2022-09-08 07:19:17 +00:00
Matthias
791f61c089 Add test case for funding fee update failure 2022-09-08 07:13:15 +00:00
Matthias
b91ad609f2 Merge pull request #7370 from wizrds/feat/suffix-merge-informative
Add optional `suffix` parameter to `merge_informative_pair`
2022-09-08 08:08:55 +02:00
Matthias
39b6cadd14 Test keyerror case for funding_Fee calculation 2022-09-08 07:24:57 +02:00
Matthias
4e15611b05 Don't crash in case of funding fee fetch error 2022-09-08 07:18:38 +02:00
Matthias
045c3f0f3a Reduce diff by avoiding unnecessary changes 2022-09-08 07:01:37 +02:00
Matthias
f3417a8690 Revert condition sequence to simplify conditions 2022-09-08 06:59:14 +02:00
Matthias
20bf44a856 Merge pull request #7375 from freqtrade/combine-metrics
ensure inlier metric can be combined with other cleaning methods
2022-09-08 06:43:02 +02:00
Timothy Pogue
a50923f796 add producers attribute to dataprovider 2022-09-07 17:14:26 -06:00
Wagner Costa Santos
f4f2884a66 Fix freqai backtesting time range issue 2022-09-07 18:52:58 -03:00
Timothy Pogue
1ef1fc269e docstring and tests 2022-09-07 15:26:38 -06:00
Timothy Pogue
5934495dda add websocket request/message schemas 2022-09-07 15:08:01 -06:00
Wagner Costa Santos
bf3ee51167 validate freqai hyperopt with freqai enabled param 2022-09-07 14:42:05 -03:00
Matthias
f8e7ed5d7d Reduce shutdown verbosity of exchange 2022-09-07 19:28:42 +02:00
Matthias
a9fd12b816 Allow more dynamic timeframes by disabling "choice"
part of #7366
2022-09-07 19:28:42 +02:00
robcaulk
e51d352777 ensure pca is handling same DF as inlier 2022-09-07 19:11:54 +02:00
robcaulk
4c9ac6b7c0 add kwargs, reduce duplicated code 2022-09-07 18:58:55 +02:00
Timothy Pogue
5d338e697c change window to timeperiod in hybrid 2022-09-07 18:49:47 +02:00
Timothy Pogue
48cadbf933 remove duplicate line, change window to timeperiod 2022-09-07 18:49:47 +02:00
robcaulk
ea7bdac9ed ensure inlier metric can be combined with other cleaning methods 2022-09-07 18:45:16 +02:00
Matthias
322f00e3e8 Fix empty entry message if order doesn't fill immediately
closes #7368
2022-09-07 18:19:43 +02:00
th0rntwig
cdc72bf8ca Correct indexing 2022-09-07 18:14:13 +02:00
th0rntwig
047ded1baa Check for constant columns 2022-09-07 17:47:27 +02:00
Timothy Pogue
2c9b765953 add suffix parameter 2022-09-07 09:35:37 -06:00
Wagner Costa Santos
972b699105 hyperopt - freqai - change validation to config_validation 2022-09-07 11:11:31 -03:00
wagnercosta
6b7644029c Merge branch 'freqtrade:develop' into fixHyperoptFreqai 2022-09-07 11:07:51 -03:00
Matthias
c08c82bc40 Merge pull request #7322 from freqtrade/add-inlier-metric
Add inlier metric
2022-09-07 07:05:57 +02:00
Matthias
3454a52b95 Explicitly test amount_to_contract_precision 2022-09-07 06:55:22 +02:00
Matthias
4d69df08dd trunc to amount precision before checking valid partial exits
closes #7368
2022-09-07 06:43:08 +02:00
Matthias
83d9f3aeba Add test showing #7365 2022-09-07 06:37:53 +02:00
Matthias
95a33ab2e6 Add amount_to_contract helper in the exchange 2022-09-07 06:34:03 +02:00
Wagner Costa Santos
5aba5de20f fix link - hyperopt spaces 2022-09-06 16:17:10 -03:00
Timothy Pogue
8bfaf0a998 Merge branch 'develop' into feat/externalsignals 2022-09-06 13:02:36 -06:00
Wagner Costa Santos
e0490b3efc Merge branch 'fixHyperoptFreqai' of https://github.com/wagnercosta/freqtrade into fixHyperoptFreqai 2022-09-06 15:43:08 -03:00
Wagner Costa Santos
8d16dd804d hyperopt - freqai - docs and refactoring 2022-09-06 15:42:47 -03:00
Timothy Pogue
b1c0267449 mypy fixes 2022-09-06 12:40:58 -06:00
Robert Caulk
d7585161b2 Merge branch 'develop' into add-inlier-metric 2022-09-06 20:40:21 +02:00
wagnercosta
55195260e4 Merge branch 'freqtrade:develop' into fixHyperoptFreqai 2022-09-06 15:32:28 -03:00
robcaulk
97077ba18a add continual learning to catboost and friends 2022-09-06 20:30:46 +02:00
Matthias
dc4a4bdf09 Wrap cleanup in try/finally handler
If a database has errors, the database cleanups would fail, causing
cleanup to be incomplete.

closes #7364
2022-09-06 20:26:42 +02:00
Timothy Pogue
3535aa7724 add last_analyzed to emitted dataframe 2022-09-06 12:12:05 -06:00
robcaulk
d44296783e isort datakitchen 2022-09-06 20:10:12 +02:00
th0rntwig
90ec336c70 Update+correct descriptions and figure (#7323) 2022-09-06 19:58:25 +02:00
robcaulk
e83c9b276d fix whitespace 2022-09-06 19:56:52 +02:00
Matthias
f2f811a2fe Fix telegram bug with open partial exit orders 2022-09-06 19:55:18 +02:00
robcaulk
4b28d0495f fix timestamping, move imports, add words to doc 2022-09-06 19:46:58 +02:00
Matthias
98ec84fca6 Merge pull request #7339 from freqtrade/fix/fundingfee_handling
Fix/fundingfee handling
2022-09-06 19:21:40 +02:00
Matthias
8597b52e34 Slightly update docs to link to full sample 2022-09-06 16:29:24 +02:00
wagnercosta
1820bc6832 Merge branch 'freqtrade:develop' into fixHyperoptFreqai 2022-09-06 10:02:17 -03:00
Matthias
3f3099cbfc Merge pull request #7361 from italodamato/develop
fix hyperopt df preprocessing
2022-09-06 07:26:14 +02:00
Timothy Pogue
38f14349e9 move bytes decoding to serializer 2022-09-05 23:25:25 -06:00
Matthias
d526dfb171 Revert some more changes in rpc_manager 2022-09-06 07:03:31 +02:00
Matthias
4dec19de9f Add comment to explain why we use the non-trimmed DF 2022-09-06 06:52:50 +02:00
Matthias
4e5153609e Merge pull request #7362 from freqtrade/improve-docs
improve clarity on data download requirements
2022-09-06 06:38:04 +02:00
Matthias
3b5c3a366e Merge pull request #7353 from freqtrade/dependabot/pip/develop/jsonschema-4.15.0
Bump jsonschema from 4.14.0 to 4.15.0
2022-09-06 06:21:10 +02:00
Timothy Pogue
a0d774fdc4 change default initial candle limit to 1500 2022-09-05 20:23:00 -06:00
Timothy Pogue
b949ea301c fix failed apiserver tests 2022-09-05 19:29:07 -06:00
Timothy Pogue
cd8455ccb7 Merge branch 'develop' into feat/externalsignals 2022-09-05 15:10:25 -06:00
Wagner Costa Santos
2c8e5b191b fix hyperopt - freqai 2022-09-05 17:43:55 -03:00
Wagner Costa Santos
5b826150df fix hyperopt - freqai 2022-09-05 17:43:28 -03:00
robcaulk
1ea703d527 remove download-data command 2022-09-05 22:20:38 +02:00
Timothy Pogue
8f261d8edf change from bytes to text in websocket, remove old logs 2022-09-05 13:47:17 -06:00
Matthias
9fb3517adc Fix non-resolvable freqai test
this test could never succeed in UI's as the name was constantly changing.
2022-09-05 21:08:01 +02:00
robcaulk
689b193240 improve clarity on data download requirements 2022-09-05 20:57:42 +02:00
Matthias
36e5c18fa6 Don't raise exception when a message is not implemented in telegram 2022-09-05 20:54:03 +02:00
dependabot[bot]
4628bfa580 Bump jsonschema from 4.14.0 to 4.15.0
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.14.0 to 4.15.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.14.0...v4.15.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-05 17:30:55 +00:00
Matthias
545cfdf913 Merge pull request #7358 from freqtrade/dependabot/pip/develop/pycoingecko-3.0.0
Bump pycoingecko from 2.2.0 to 3.0.0
2022-09-05 19:30:06 +02:00
Matthias
fda0e547f2 Merge pull request #7356 from freqtrade/dependabot/pip/develop/python-telegram-bot-13.14
Bump python-telegram-bot from 13.13 to 13.14
2022-09-05 19:18:50 +02:00
dependabot[bot]
949f618d42 Bump python-telegram-bot from 13.13 to 13.14
Bumps [python-telegram-bot](https://github.com/python-telegram-bot/python-telegram-bot) from 13.13 to 13.14.
- [Release notes](https://github.com/python-telegram-bot/python-telegram-bot/releases)
- [Changelog](https://github.com/python-telegram-bot/python-telegram-bot/blob/v13.14/CHANGES.rst)
- [Commits](https://github.com/python-telegram-bot/python-telegram-bot/compare/v13.13...v13.14)

---
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>
2022-09-05 16:30:43 +00:00
Italo
9f5642fd97 fix hyperopt df preprocessing 2022-09-05 18:12:19 +02:00
Matthias
da183364f2 Merge pull request #7357 from freqtrade/dependabot/pip/develop/pandas-1.4.4
Bump pandas from 1.4.3 to 1.4.4
2022-09-05 16:53:36 +02:00
Matthias
205ebfc801 Merge pull request #7352 from freqtrade/dependabot/pip/develop/ccxt-1.93.3
Bump ccxt from 1.92.84 to 1.93.3
2022-09-05 16:41:41 +02:00
Matthias
8d61ee7dd7 Merge pull request #7355 from freqtrade/dependabot/pip/develop/fastapi-0.82.0
Bump fastapi from 0.81.0 to 0.82.0
2022-09-05 16:35:09 +02:00
Matthias
7d48d5cfc6 Merge pull request #7354 from freqtrade/dependabot/pip/develop/prompt-toolkit-3.0.31
Bump prompt-toolkit from 3.0.30 to 3.0.31
2022-09-05 16:16:49 +02:00
Matthias
523f9ebe84 Merge pull request #7351 from freqtrade/dependabot/pip/develop/pytest-7.1.3
Bump pytest from 7.1.2 to 7.1.3
2022-09-05 16:15:16 +02:00
Matthias
d829dbb177 Merge pull request #7350 from freqtrade/dependabot/pip/develop/psutil-5.9.2
Bump psutil from 5.9.1 to 5.9.2
2022-09-05 16:13:16 +02:00
Matthias
15383a03e6 Merge pull request #7349 from freqtrade/dependabot/pip/develop/arrow-1.2.3
Bump arrow from 1.2.2 to 1.2.3
2022-09-05 16:12:53 +02:00
dependabot[bot]
48dc1f2d88 Bump pycoingecko from 2.2.0 to 3.0.0
Bumps [pycoingecko](https://github.com/man-c/pycoingecko) from 2.2.0 to 3.0.0.
- [Release notes](https://github.com/man-c/pycoingecko/releases)
- [Changelog](https://github.com/man-c/pycoingecko/blob/master/CHANGELOG.md)
- [Commits](https://github.com/man-c/pycoingecko/compare/2.2.0...3.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-05 13:11:29 +00:00
dependabot[bot]
f5500350f9 Bump pandas from 1.4.3 to 1.4.4
Bumps [pandas](https://github.com/pandas-dev/pandas) from 1.4.3 to 1.4.4.
- [Release notes](https://github.com/pandas-dev/pandas/releases)
- [Changelog](https://github.com/pandas-dev/pandas/blob/main/RELEASE.md)
- [Commits](https://github.com/pandas-dev/pandas/compare/v1.4.3...v1.4.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-05 13:11:24 +00:00
dependabot[bot]
6f6afca027 Bump fastapi from 0.81.0 to 0.82.0
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.81.0 to 0.82.0.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.81.0...0.82.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-05 13:10:53 +00:00
dependabot[bot]
90fbb79471 Bump prompt-toolkit from 3.0.30 to 3.0.31
Bumps [prompt-toolkit](https://github.com/prompt-toolkit/python-prompt-toolkit) from 3.0.30 to 3.0.31.
- [Release notes](https://github.com/prompt-toolkit/python-prompt-toolkit/releases)
- [Changelog](https://github.com/prompt-toolkit/python-prompt-toolkit/blob/master/CHANGELOG)
- [Commits](https://github.com/prompt-toolkit/python-prompt-toolkit/compare/3.0.30...3.0.31)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-05 13:10:44 +00:00
dependabot[bot]
3d03856845 Bump ccxt from 1.92.84 to 1.93.3
Bumps [ccxt](https://github.com/ccxt/ccxt) from 1.92.84 to 1.93.3.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/1.92.84...1.93.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-05 13:10:31 +00:00
dependabot[bot]
af7e4d7bf0 Bump pytest from 7.1.2 to 7.1.3
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.1.2 to 7.1.3.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.1.2...7.1.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-05 13:10:11 +00:00
dependabot[bot]
7cc8ac0a34 Bump psutil from 5.9.1 to 5.9.2
Bumps [psutil](https://github.com/giampaolo/psutil) from 5.9.1 to 5.9.2.
- [Release notes](https://github.com/giampaolo/psutil/releases)
- [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst)
- [Commits](https://github.com/giampaolo/psutil/compare/release-5.9.1...release-5.9.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-05 13:10:02 +00:00
dependabot[bot]
a035a69a61 Bump arrow from 1.2.2 to 1.2.3
Bumps [arrow](https://github.com/arrow-py/arrow) from 1.2.2 to 1.2.3.
- [Release notes](https://github.com/arrow-py/arrow/releases)
- [Changelog](https://github.com/arrow-py/arrow/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/arrow-py/arrow/compare/1.2.2...1.2.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-05 13:09:53 +00:00
Matthias
52b20fd4b7 Merge pull request #7346 from freqtrade/update-freqai-tests
fix broken CI
2022-09-05 06:18:21 +02:00
robcaulk
c8a9ac900c fix broken CI 2022-09-05 00:52:26 +02:00
robcaulk
78d01810ed reduce code redundancy, ensure live always gets the latest data 2022-09-05 00:12:00 +02:00
Wagner Costa Santos
d43ed186fc fix issue with freqai backtesting at slice dataframe 2022-09-05 00:12:00 +02:00
Timothy Pogue
8a08f8ff8d revert rpc manager 2022-09-04 10:27:34 -06:00
Timothy Pogue
07f806a314 minor improvements, fixes, old config+constant removal 2022-09-04 10:22:10 -06:00
Timothy Pogue
1601868854 dataprovider fix, updated config example 2022-09-04 09:42:43 -06:00
Robert Caulk
956ea43e55 Merge pull request #7340 from wizrds/sigint-freqai
Support SIGINT in FreqAI
2022-09-04 16:43:36 +02:00
robcaulk
ec76214d02 backup historical predictions pickle and load the backup in case of corruption 2022-09-04 15:56:07 +02:00
robcaulk
69b3fcfd32 Merge branch 'develop' into dev-merge-rl 2022-09-04 11:23:25 +02:00
robcaulk
27dce20b29 fix bug in Base4ActionRLEnv, improve example strats 2022-09-04 11:21:54 +02:00
Timothy Pogue
3b5e5fc57b fix method name in dummy class 2022-09-03 14:10:23 -06:00
Robert Caulk
8545d74378 Merge pull request #7331 from th0rntwig/pca
Normalise PCA space
2022-09-03 21:49:54 +02:00
Timothy Pogue
dae3b3d86a support shutting down freqai 2022-09-03 13:24:14 -06:00
Matthias
16573b19e3 Fix migration syntax error 2022-09-03 19:51:44 +02:00
robcaulk
5cfb4154eb revert all changes in normalize_data() 2022-09-03 19:48:30 +02:00
Robert Caulk
63514b0443 Merge pull request #7325 from wagnercosta/develop
Improve Freqai backtesting performance
2022-09-03 19:28:04 +02:00
robcaulk
c21808ff98 remove metadata redundancy, fix pca bug 2022-09-03 16:54:30 +02:00
robcaulk
fa8d5b9834 add documentation for noise_standard_deviation` 2022-09-03 16:05:18 +02:00
robcaulk
c9be66b5b6 increase test coverage for dk, improve function naming, extra cleaning 2022-09-03 15:52:29 +02:00
Matthias
ed4cc18cdd Migration to check order funding fee 2022-09-03 15:19:40 +02:00
Matthias
b95b3d8391 Update test to actually test funding fee appliance 2022-09-03 15:09:50 +02:00
Matthias
0f483ee31f Use "since last order" approach for live as well. 2022-09-03 15:01:42 +02:00
Matthias
0c6a02687a Don't calculate funding fees if we're not going to use them. 2022-09-03 15:01:42 +02:00
Matthias
df50b1928d Fix funding fee calculation for backtesting 2022-09-03 15:01:42 +02:00
Matthias
80b5f035ab Remove typo in log message 2022-09-03 15:01:28 +02:00
robcaulk
599c1c79fb reorganized backtest utilities, test new functionality, improve/update doc 2022-09-03 14:00:01 +02:00
Matthias
be192fae91 Test should use proper Order objects 2022-09-03 10:54:58 +02:00
Matthias
966de19611 Improve test resiliance by properly setting Order object 2022-09-03 08:16:33 +02:00
Wagner Costa Santos
af5460cebf Add option to keep models only in memory for backtest 2022-09-02 22:01:53 -03:00
Timothy Pogue
05cbcf834c minor logging changes 2022-09-02 16:01:33 -06:00
Timothy Pogue
cf917ad2f5 initial candle request limit, better error reporting, split up _handle_producer_connection 2022-09-02 15:05:16 -06:00
Matthias
b26126cb57 Don't use ticker['symbol'] but use "pair" instead
closes #7262
2022-09-02 20:09:30 +02:00
Matthias
6a5774b476 Merge pull request #7329 from epigramx/epigramx-fee-docs-patch
Make the recommendation for Binance/Kucoin blacklisting more accurate.
2022-09-02 19:58:38 +02:00
Matthias
a948e51389 Update futures docs to define pair namings
#7334, #7136, ...
2022-09-02 19:56:12 +02:00
Timothy Pogue
5b0b802f31 hybrid json ws serializer 2022-09-02 00:05:36 -06:00
Timothy Pogue
eb4cd6ba82 split initial data into separate requests 2022-09-01 23:52:13 -06:00
Timothy Pogue
dccde88c83 fix dataframe serializing 2022-09-01 23:15:03 -06:00
Matthias
b53791fef2 Futures volumepairlist to account for contract size 2022-09-02 07:11:32 +02:00
Timothy Pogue
00f35f4870 remove old constant, add initial_data requesting, minor changes 2022-09-01 20:06:36 -06:00
th0rntwig
11b2bc269e Added missing s 2022-09-01 22:37:32 +02:00
th0rntwig
3f8400df10 Normalise PCA space 2022-09-01 21:51:33 +02:00
Matthias
11fbfd3402 Remove unnecessary assignment 2022-09-01 19:39:20 +02:00
epigramx
61d5fc0e08 Make the recommendation for Binance/Kucoin blacklisting more accurate.
Now that a recent bug regarding selling BNB is fixed, it should be safe to trade it, but with a warning that the user may have to manually maintain extra BNB. 
Also the old text implied those features are always unabled so this texts makes it clear those fee-related features can be also disabled.
I'm not sure if it's still true that an "eaten by fees" position becomes unsellable but I left that as it is.
2022-09-01 17:22:34 +03:00
Wagner Costa Santos
d6e115178a refactoring freqai backtesting - remove duplicate code 2022-09-01 07:09:23 -03:00
Matthias
f3c73189d5 Remove pointless default on wallet_balance argument 2022-09-01 06:49:51 +02:00
Matthias
ba2eb7cf0f Fix BNB fee bug when selling
thanks @epigramx, for reporting and for the detailed data.
2022-09-01 06:42:51 +02:00
Timothy Pogue
57e9078727 update example config 2022-08-31 14:44:52 -06:00
Wagner Costa Santos
44d3a9140d Merge branch 'develop' of https://github.com/wagnercosta/freqtrade into develop 2022-08-31 15:37:06 -03:00
Wagner Costa Santos
7bed0450d2 pr review - refactoring backtesting freqai 2022-08-31 15:36:29 -03:00
Timothy Pogue
c72a2c26c7 remove external pairlist 2022-08-31 12:06:24 -06:00
Timothy Pogue
6e8abf8674 add producer name to required fields in config 2022-08-31 11:58:58 -06:00
wagnercosta
3d4497467c Merge branch 'freqtrade:develop' into develop 2022-08-31 14:47:06 -03:00
Matthias
3d4ad1de4c Merge pull request #7244 from freqtrade/move_datadownload
extract download-data from freqai to prepare for future async changes
2022-08-31 19:46:14 +02:00
Timothy Pogue
865b34cd6f add producer names 2022-08-31 11:43:02 -06:00
Timothy Pogue
510cf4f305 remove data waiting, remove explicit analyzing of external df 2022-08-31 10:40:26 -06:00
robcaulk
240b529533 fix tensorboard path so that users can track all historical models 2022-08-31 16:50:39 +02:00
Richard Jozsa
2493e0c8a5 Unnecessary lines in Base4, and changes for box space, to fit better for our needs (#7324) 2022-08-31 16:37:02 +02:00
Wagner Costa Santos
df51da22ee refactoring freqai backtesting 2022-08-31 11:23:48 -03:00
Matthias
57ff6f8ac5 Init timerange object properly 2022-08-31 10:28:31 +00:00
Matthias
13ccd940d5 Remove startup_candle_count from freqai sample config to avoid confusion 2022-08-31 10:27:08 +00:00
Matthias
7ba4fda5d7 Implement PR feedback 2022-08-31 10:26:47 +00:00
Matthias
a88ffd2c9d Merge branch 'develop' into move_datadownload 2022-08-31 10:23:45 +00:00
Matthias
4aec2db14d Remove isClose from tests in favor of pytest.approx 2022-08-31 08:25:56 +00:00
Timothy Pogue
115a901773 minor fix for conditional in handle func 2022-08-30 19:34:43 -06:00
Timothy Pogue
ddc45ce2eb message handling fix, data waiting fix 2022-08-30 19:30:14 -06:00
Timothy Pogue
346e73dd75 client implementation, minor fixes 2022-08-30 19:21:34 -06:00
Matthias
10e0d53860 Simplify 2 more tests 2022-08-30 20:49:53 +02:00
Matthias
c9aa09ec89 Simplify base fee handling 2022-08-30 20:46:06 +02:00
robcaulk
7e8e29e42d use continuous value for inlier_metric 2022-08-30 20:41:37 +02:00
robcaulk
0b8482360f add documentation for inlier metric 2022-08-30 20:32:49 +02:00
Timothy Pogue
418bd26a80 minor fixes, rework consumer request, update requirements.txt 2022-08-30 11:04:16 -06:00
robcaulk
7f52908e87 ensure the lost points are prepended for FreqUI 2022-08-30 18:55:58 +02:00
robcaulk
a58dd0bbf9 add noise feature, improve docstrings 2022-08-30 18:26:24 +02:00
robcaulk
b11742a4c5 integrate inlier metric function 2022-08-30 18:26:24 +02:00
th0rntwig
d3cb211283 Add inlier metric computation 2022-08-30 18:26:24 +02:00
th0rntwig
50e2808667 Fix bug in DI (#7321) 2022-08-30 12:54:39 +02:00
Timothy Pogue
47f7c384fb consumer subscriptions, fix serializer bug 2022-08-29 15:48:29 -06:00
Matthias
71846ecbf2 Partially revert prior commit, use correct exchange class 2022-08-29 21:51:10 +02:00
Timothy Pogue
7952e0df25 initial rework separating server and client impl 2022-08-29 13:41:15 -06:00
Matthias
eee2071e32 Fix non-testing liquidation test 2022-08-29 21:04:09 +02:00
Matthias
efc3b39fb8 Improve config overwriting wording
#7181
2022-08-29 20:01:03 +02:00
Matthias
93cbfc5f29 Merge pull request #7315 from freqtrade/reverse-train-test-order
allow users to properly reverse train-test data ordering
2022-08-29 15:27:28 +02:00
Richard Jozsa
1a8e1362a1 There was an error in the docs around continual learning and thread count (#7314)
* Error in the docs
2022-08-29 11:15:06 +02:00
robcaulk
62c0a174c8 allow users to properly reverse train-test data ordering 2022-08-29 11:04:58 +02:00
Matthias
c54484dad5 Merge pull request #7305 from freqtrade/dependabot/pip/develop/mkdocs-material-8.4.2
Bump mkdocs-material from 8.4.1 to 8.4.2
2022-08-29 08:08:33 +02:00
Matthias
db3d972d47 Merge pull request #7306 from freqtrade/dependabot/pip/develop/fastapi-0.81.0
Bump fastapi from 0.79.1 to 0.81.0
2022-08-29 08:08:14 +02:00
Matthias
25a7f44856 Merge pull request #7312 from freqtrade/dependabot/pip/develop/ccxt-1.92.84
Bump ccxt from 1.92.52 to 1.92.84
2022-08-29 08:07:53 +02:00
Matthias
b7b87c398b Merge pull request #7308 from freqtrade/dependabot/pip/develop/nbconvert-7.0.0
Bump nbconvert from 6.5.3 to 7.0.0
2022-08-29 07:58:46 +02:00
Matthias
27a9f98d5f Simplify liquidation price structure, improve test cov 2022-08-29 07:04:48 +02:00
Matthias
226fa5d93c Simplify liquidation price calling structure 2022-08-29 07:04:48 +02:00
dependabot[bot]
56cd80926a Bump fastapi from 0.79.1 to 0.81.0
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.79.1 to 0.81.0.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.79.1...0.81.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-29 04:52:12 +00:00
Matthias
f664ebd262 Merge pull request #7309 from freqtrade/dependabot/pip/develop/scipy-1.9.1
Bump scipy from 1.9.0 to 1.9.1
2022-08-29 06:51:37 +02:00
Matthias
9b5f85b970 Merge pull request #7310 from freqtrade/dependabot/pip/develop/uvicorn-0.18.3
Bump uvicorn from 0.18.2 to 0.18.3
2022-08-29 06:51:19 +02:00
Matthias
ebbb2cc552 Merge pull request #7311 from freqtrade/dependabot/pip/develop/orjson-3.8.0
Bump orjson from 3.7.12 to 3.8.0
2022-08-29 06:50:44 +02:00
Matthias
a0db6652a7 Merge pull request #7307 from freqtrade/dependabot/pip/develop/urllib3-1.26.12
Bump urllib3 from 1.26.11 to 1.26.12
2022-08-29 06:50:30 +02:00
Matthias
4def3678b7 Merge pull request #7298 from freqtrade/tif_align
align TimeInForce to ccxt usage
2022-08-29 06:36:51 +02:00
Matthias
8be8a12cc4 Merge pull request #7260 from JohanVlugt/develop
Example FreqAI hybrid strategy
2022-08-29 06:34:45 +02:00
Matthias
40c00d2d8f Version bump dev version to 2022.9 2022-08-29 06:34:20 +02:00
Matthias
a01402fa46 Merge branch 'stable' into develop 2022-08-29 06:28:21 +02:00
dependabot[bot]
d7189847a7 Bump ccxt from 1.92.52 to 1.92.84
Bumps [ccxt](https://github.com/ccxt/ccxt) from 1.92.52 to 1.92.84.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/1.92.52...1.92.84)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-29 03:01:59 +00:00
dependabot[bot]
d734f7612f Bump orjson from 3.7.12 to 3.8.0
Bumps [orjson](https://github.com/ijl/orjson) from 3.7.12 to 3.8.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.7.12...3.8.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-29 03:01:50 +00:00
dependabot[bot]
3a7441a27d Bump uvicorn from 0.18.2 to 0.18.3
Bumps [uvicorn](https://github.com/encode/uvicorn) from 0.18.2 to 0.18.3.
- [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.18.2...0.18.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-29 03:01:41 +00:00
dependabot[bot]
49dd1c1d49 Bump scipy from 1.9.0 to 1.9.1
Bumps [scipy](https://github.com/scipy/scipy) from 1.9.0 to 1.9.1.
- [Release notes](https://github.com/scipy/scipy/releases)
- [Commits](https://github.com/scipy/scipy/compare/v1.9.0...v1.9.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-29 03:01:36 +00:00
dependabot[bot]
e9f46f4768 Bump nbconvert from 6.5.3 to 7.0.0
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 6.5.3 to 7.0.0.
- [Release notes](https://github.com/jupyter/nbconvert/releases)
- [Commits](https://github.com/jupyter/nbconvert/compare/6.5.3...7.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-29 03:01:30 +00:00
dependabot[bot]
0af4bd2944 Bump urllib3 from 1.26.11 to 1.26.12
Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.11 to 1.26.12.
- [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/1.26.11...1.26.12)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-29 03:01:25 +00:00
dependabot[bot]
e9e872ca20 Bump mkdocs-material from 8.4.1 to 8.4.2
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 8.4.1 to 8.4.2.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/8.4.1...8.4.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-29 03:01:18 +00:00
th0rntwig
8b0cfe1236 Reduce image sizes in freqai doc (#7304) 2022-08-28 23:27:12 +02:00
Timothy Pogue
8c4e68b8eb updated example configs 2022-08-28 13:00:52 -06:00
robcaulk
67cddae756 fix tensorboard image 2022-08-28 21:00:26 +02:00
robcaulk
af8f308584 start the reinforcement learning doc 2022-08-28 20:52:03 +02:00
robcaulk
7766350c15 refactor environment inheritence tree to accommodate flexible action types/counts. fix bug in train profit handling 2022-08-28 19:21:57 +02:00
Robert Caulk
39a739eadb Merge pull request #7296 from th0rntwig/dbscan
Improve MinPts calculation in DBSCAN, add outlier protection, and add data_kitchen tests
2022-08-28 14:37:47 +02:00
robcaulk
a44a235b56 isort imports in tests/freqai 2022-08-28 13:47:01 +02:00
robcaulk
6634229cc1 appease the flake8 gods 2022-08-28 13:21:29 +02:00
robcaulk
fcb5d1cb5a remove debugging flag 2022-08-28 13:01:39 +02:00
robcaulk
dd628eb525 add tests for outlier detection and removal functions 2022-08-28 12:56:39 +02:00
robcaulk
1e41c773a0 fix outlier protection 2022-08-28 12:11:29 +02:00
robcaulk
22b42e91f3 add new parameter to freqai doc 2022-08-28 11:53:24 +02:00
smarmau
ff3a4995c1 remove unnecessary code 2022-08-28 11:45:20 +02:00
Matthias
b9f35cadb3 add /stopentry alias for /stopbuy 2022-08-28 11:37:22 +02:00
smarmau
005594c29c simplify hybrid template 2022-08-28 11:29:48 +02:00
Matthias
59a723aec8 Add /health to rest client
discovered in #7299
2022-08-27 15:12:04 +02:00
th0rntwig
71f7d68783 Fixed mypy error 2022-08-27 12:44:55 +02:00
Matthias
c61b986c3d FTX - support time_in_force (and PO ordertype)
closes #7175
2022-08-27 10:30:38 +02:00
Matthias
104a73025d Uppercase TimeInForce (align with ccxt) 2022-08-27 10:30:06 +02:00
Matthias
6686489c06 Merge pull request #7258 from freqtrade/feat/hyp_optinal_indicator
Add flag to move hyperopt populate_indicators to epoch
2022-08-27 09:21:16 +02:00
Matthias
c3e74e6e8d Improve doc wording 2022-08-27 08:55:29 +02:00
Matthias
2b70c3d0c0 support price callback for partial exits in bt
This will align results to how live works.
closes #7292
2022-08-27 08:50:09 +02:00
Timothy Pogue
05ca673883 Catch status code errors 2022-08-27 00:06:03 -06:00
Timothy Pogue
fcceb744c5 Add janus to requirements.txt 2022-08-26 23:43:05 -06:00
Timothy Pogue
2b5f067877 Refactoring, minor improvements, data provider improvements 2022-08-26 23:40:13 -06:00
Matthias
9204f01312 Don't lock pairs on partial exit 2022-08-27 07:23:02 +02:00
elintornquist
86c5ac44e4 Add outlier percentage check 2022-08-26 23:05:07 +02:00
Timothy Pogue
a998d6d773 fix tests 2022-08-26 14:52:15 -06:00
Matthias
2ef4534fee Fix ccxt / longrun tests 2022-08-26 20:44:36 +02:00
Matthias
efe4fd3e24 Add libgomp1 to dockerfile 2022-08-26 20:21:19 +02:00
Matthias
01126c43f7 Fix liquidation price tier calculation
closes #7294
2022-08-26 20:14:24 +02:00
Matthias
753d1b2aad Update leverage tier terminology to be clear and aligned with ccxt 2022-08-26 19:34:51 +02:00
elintornquist
b2d664c63c Change MinPts calculation 2022-08-26 18:57:27 +02:00
robcaulk
bb3523f383 download data homogeneously across timeframes 2022-08-26 18:51:42 +02:00
robcaulk
e7261cf515 add freqai utils.py file 2022-08-26 15:30:28 +02:00
robcaulk
65b552e310 make docs reflect reality, move download_all_data to new utils.py file, automatic startup_candle detection 2022-08-26 15:30:01 +02:00
robcaulk
4b7e640f31 reduce code duplication, optimize auto data download per tf 2022-08-26 13:56:44 +02:00
robcaulk
8c313b431d remove whitespace from Dockerfile 2022-08-26 11:14:01 +02:00
robcaulk
baa4f8e3d0 remove Base3ActionEnv in favor of Base4Action 2022-08-26 11:04:25 +02:00
richardjozsa
cdc550da9a Revert the docker changes to be inline with the original freqtrade image
Reverted the changes, and added a new way of doing, Dockerfile.freqai with that file the users can make their own dockerimage.
2022-08-26 11:04:25 +02:00
richardjozsa
d31926efdf Added Base4Action 2022-08-26 11:04:25 +02:00
Matthias
53d46a0385 align max_entry_position_adjustment behavior of backtesting to live
closes #7293
2022-08-25 20:36:17 +02:00
robcaulk
3199eb453b reduce code for base use-case, ensure multiproc inherits custom env, add ability to limit ram use. 2022-08-25 19:05:51 +02:00
Matthias
1fd223c815 Update --prepend help string
closes #7290
2022-08-25 17:03:41 +02:00
robcaulk
05ccebf9a1 automate eval freq in multiproc 2022-08-25 12:29:48 +02:00
robcaulk
94cfc8e63f fix multiproc callback, add continual learning to multiproc, fix totalprofit bug in env, set eval_freq automatically, improve default reward 2022-08-25 11:46:18 +02:00
Matthias
f2a356a80c Fix some imports 2022-08-25 07:08:58 +02:00
Matthias
6636f17e0f Simplify usage of amount_to_contract precision 2022-08-25 07:08:22 +02:00
Matthias
9e48e6a40b Update docs about precision limits in backtesting 2022-08-25 06:50:10 +02:00
Matthias
205ab26e92 Remove TODO in test 2022-08-25 06:50:10 +02:00
Matthias
70df037690 Improve test precision 2022-08-25 06:50:10 +02:00
Timothy Pogue
3e786a9b8b added example configs 2022-08-24 22:44:22 -06:00
Timothy Pogue
d474111a65 Renamed to external signals, controller class refactored 2022-08-24 22:42:29 -06:00
Timothy Pogue
592373f096 Remove pairlist waiting, add .db files to .gitignore 2022-08-24 18:30:30 -06:00
Matthias
32faad9333 Fix backtest calculation problem with DCA
closes #7287
2022-08-24 20:36:08 +02:00
robcaulk
d1bee29b1e improve default reward, fix bugs in environment 2022-08-24 18:32:40 +02:00
robcaulk
a61821e1c6 remove monitor log 2022-08-24 16:33:13 +02:00
robcaulk
bd870e2331 fix monitor bug, set default values in case user doesnt set params 2022-08-24 16:32:14 +02:00
robcaulk
c0cee5df07 add continual retraining feature, handly mypy typing reqs, improve docstrings 2022-08-24 13:00:55 +02:00
robcaulk
b708134c1a switch multiproc thread count to rl_config definition 2022-08-24 13:00:55 +02:00
robcaulk
b26ed7dea4 fix generic reward, add time duration to reward 2022-08-24 13:00:55 +02:00
robcaulk
280a1dc3f8 add live rate, add trade duration 2022-08-24 13:00:55 +02:00
robcaulk
f9a49744e6 add strategy to the freqai object 2022-08-24 13:00:55 +02:00
richardjozsa
a2a4bc05db Fix the state profit calculation logic 2022-08-24 13:00:55 +02:00
robcaulk
29f0e01c4a expose environment reward parameters to the user config 2022-08-24 13:00:55 +02:00
robcaulk
d88a0dbf82 add sb3_contrib models to the available agents. include sb3_contrib in requirements. 2022-08-24 13:00:55 +02:00
robcaulk
8b3a8234ac fix env bug, allow example strat to short 2022-08-24 13:00:55 +02:00
mrzdev
8cd4daad0a Feat/freqai rl dev (#7)
* access trades through get_trades_proxy method to allow backtesting
2022-08-24 13:00:55 +02:00
robcaulk
3eb897c2f8 reuse callback, allow user to acces all stable_baselines3 agents via config 2022-08-24 13:00:55 +02:00
robcaulk
4b9499e321 improve nomenclature and fix short exit bug 2022-08-24 13:00:55 +02:00
sonnhfit
4baa36bdcf fix persist a single training environment for PPO 2022-08-24 13:00:55 +02:00
robcaulk
f95602f6bd persist a single training environment. 2022-08-24 13:00:55 +02:00
robcaulk
5d4e5e69fe reinforce training with state info, reinforce prediction with state info, restructure config to accommodate all parameters from any user imported model type. Set 5Act to default env on TDQN. Clean example config. 2022-08-24 13:00:55 +02:00
sonnhfit
7962a1439b remove keep low profit 2022-08-24 13:00:55 +02:00
sonnhfit
81b5aa66e8 make env keep current position when low profit 2022-08-24 13:00:55 +02:00
sonnhfit
45218faeb0 fix coding convention 2022-08-24 13:00:55 +02:00
richardjozsa
d55092ff17 Docker building update, and TDQN repair with the newer release of SB+ 2022-08-24 13:00:55 +02:00
robcaulk
74e4fd0633 ensure config example can work with backtesting RL 2022-08-24 13:00:55 +02:00
robcaulk
b90da46b1b improve price df handling to enable backtesting 2022-08-24 13:00:55 +02:00
MukavaValkku
2080ff86ed 5ac base fixes in logic 2022-08-24 13:00:55 +02:00
robcaulk
16cec7dfbd fix save/reload functionality for stablebaselines 2022-08-24 13:00:55 +02:00
sonnhfit
0475b7cb18 remove unuse code and fix coding conventions 2022-08-24 13:00:55 +02:00
MukavaValkku
d60a166fbf multiproc TDQN with xtra callbacks 2022-08-24 13:00:55 +02:00
robcaulk
dd382dd370 add monitor to eval env so that multiproc can save best_model 2022-08-24 13:00:55 +02:00
robcaulk
69d542d3e2 match config and strats to upstream freqai 2022-08-24 13:00:55 +02:00
robcaulk
e5df39e891 ensuring best_model is placed in ram and saved to disk and loaded from disk 2022-08-24 13:00:55 +02:00
robcaulk
bf7ceba958 set cpu threads in config 2022-08-24 13:00:55 +02:00
MukavaValkku
57c488a6f1 learning_rate + multicpu changes 2022-08-24 13:00:55 +02:00
MukavaValkku
48bb51b458 example config added 2022-08-24 13:00:55 +02:00
MukavaValkku
b1fc5a06ca example config added 2022-08-24 13:00:55 +02:00
sonnhfit
6d8e838a8f update tensorboard dependency 2022-08-24 13:00:55 +02:00
robcaulk
acf3484e88 add multiprocessing variant of ReinforcementLearningPPO 2022-08-24 13:00:55 +02:00
MukavaValkku
cf0731095f type fix 2022-08-24 13:00:55 +02:00
MukavaValkku
1c81ec6016 3ac and 5ac example strategies 2022-08-24 13:00:55 +02:00
MukavaValkku
13cd18dc9a PPO policy change + verbose=1 2022-08-24 13:00:55 +02:00
robcaulk
926023935f make base 3ac and base 5ac environments. TDQN defaults to 3AC. 2022-08-24 13:00:55 +02:00
MukavaValkku
096533bcb9 3ac to 5ac 2022-08-24 13:00:55 +02:00
MukavaValkku
718c9d0440 action fix 2022-08-24 13:00:55 +02:00
robcaulk
9c78e6c26f base PPO model only customizes reward for 3AC 2022-08-24 13:00:55 +02:00
robcaulk
6048f60f13 get TDQN working with 5 action environment 2022-08-24 13:00:55 +02:00
robcaulk
d4db5c3281 ensure TDQN class is properly named 2022-08-24 13:00:55 +02:00
robcaulk
91683e1dca restructure RL so that user can customize environment 2022-08-24 13:00:55 +02:00
sonnhfit
ecd1f55abc add rl module 2022-08-24 13:00:55 +02:00
sonnhfit
70b25461f0 add rl dependency 2022-08-24 13:00:55 +02:00
MukavaValkku
9b895500b3 initial commit - new dev branch 2022-08-24 13:00:55 +02:00
MukavaValkku
cd3fe44424 callback function and TDQN model added 2022-08-24 13:00:55 +02:00
MukavaValkku
01232e9a1f callback function and TDQN model added 2022-08-24 13:00:55 +02:00
MukavaValkku
8eeaab2746 add reward function 2022-08-24 13:00:55 +02:00
MukavaValkku
ec813434f5 ReinforcementLearningModel 2022-08-24 13:00:55 +02:00
MukavaValkku
2f4d73eb06 Revert "ReinforcementLearningModel"
This reverts commit 4d8dfe1ff1daa47276eda77118ddf39c13512a85.
2022-08-24 13:00:55 +02:00
MukavaValkku
c1e7db3130 ReinforcementLearningModel 2022-08-24 13:00:55 +02:00
robcaulk
05ed1b544f Working base for reinforcement learning model 2022-08-24 13:00:40 +02:00
Matthias
a6d78a8615 initialize Since parameter properly
closes #7285
2022-08-23 06:43:04 +02:00
Matthias
fe7108ae75 Convert amount to contracts before comparing for close
closes #7279
2022-08-23 06:37:38 +02:00
Matthias
78b161e14c add contract_size to database 2022-08-23 06:37:38 +02:00
Matthias
6036018f35 Extract contracts_to_amount and amount_to_contracts to standalone functions 2022-08-23 06:37:38 +02:00
Matthias
1b0f37a93c Fix documentation typo 2022-08-23 06:37:38 +02:00
Matthias
5f38a574ce Add okx broker id 2022-08-23 06:37:38 +02:00
th0rntwig
5ce1c69803 Improve DBSCAN epsilon identification (#7269)
* Improve DBSCAN epsilon identification
2022-08-22 19:57:20 +02:00
Matthias
60ba921f56 Merge pull request #7282 from freqtrade/mem-leak-fix
Plug mem leak, add training timer
2022-08-22 19:36:52 +02:00
robcaulk
ac42c0153d deprecate indicator_max_period_candles, automatically compute startup candles for FreqAI backtesting. 2022-08-22 18:19:07 +02:00
robcaulk
96d8882f1e Plug mem leak, add training timer 2022-08-22 13:30:30 +02:00
Matthias
f55d5ffd8c Don't fail when --strategy-path is not a valid directory.
closes #7264
2022-08-22 09:20:14 +00:00
Matthias
914b6247e4 Merge pull request #7278 from freqtrade/dependabot/pip/develop/ccxt-1.92.52
Bump ccxt from 1.92.20 to 1.92.52
2022-08-22 08:41:52 +02:00
Matthias
da87e9cbb3 Merge pull request #7275 from freqtrade/dependabot/pip/develop/types-requests-2.28.9
Bump types-requests from 2.28.8 to 2.28.9
2022-08-22 08:41:34 +02:00
Matthias
484b147a89 Merge pull request #7277 from freqtrade/dependabot/pip/develop/time-machine-2.8.1
Bump time-machine from 2.7.1 to 2.8.1
2022-08-22 07:13:05 +02:00
Timothy Pogue
4fa01548f6 Remove old var from strategy interface 2022-08-21 22:49:42 -06:00
Timothy Pogue
6f5478cc02 DataFrame transmission, strategy follower logic 2022-08-21 22:45:36 -06:00
Matthias
015be770c3 ccxt now defaults to base volume for all markets 2022-08-22 06:42:14 +02:00
Matthias
93d2f7fc85 types-requests bump pre-commit 2022-08-22 06:37:26 +02:00
Matthias
7844157a90 Merge pull request #7276 from freqtrade/dependabot/pip/develop/jsonschema-4.14.0
Bump jsonschema from 4.9.1 to 4.14.0
2022-08-22 06:31:29 +02:00
Matthias
6e046884af Merge pull request #7273 from freqtrade/dependabot/pip/develop/fastapi-0.79.1
Bump fastapi from 0.79.0 to 0.79.1
2022-08-22 06:25:35 +02:00
Matthias
a784f63e9a Merge pull request #7274 from freqtrade/dependabot/pip/develop/mkdocs-material-8.4.1
Bump mkdocs-material from 8.4.0 to 8.4.1
2022-08-22 06:24:22 +02:00
dependabot[bot]
ff9ed1abad Bump ccxt from 1.92.20 to 1.92.52
Bumps [ccxt](https://github.com/ccxt/ccxt) from 1.92.20 to 1.92.52.
- [Release notes](https://github.com/ccxt/ccxt/releases)
- [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg)
- [Commits](https://github.com/ccxt/ccxt/compare/1.92.20...1.92.52)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-22 03:02:25 +00:00
dependabot[bot]
354d3c0cda Bump time-machine from 2.7.1 to 2.8.1
Bumps [time-machine](https://github.com/adamchainz/time-machine) from 2.7.1 to 2.8.1.
- [Release notes](https://github.com/adamchainz/time-machine/releases)
- [Changelog](https://github.com/adamchainz/time-machine/blob/main/HISTORY.rst)
- [Commits](https://github.com/adamchainz/time-machine/compare/2.7.1...2.8.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-22 03:02:10 +00:00
dependabot[bot]
eeb177110e Bump jsonschema from 4.9.1 to 4.14.0
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.9.1 to 4.14.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.9.1...v4.14.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-22 03:02:03 +00:00
dependabot[bot]
70848a258d Bump types-requests from 2.28.8 to 2.28.9
Bumps [types-requests](https://github.com/python/typeshed) from 2.28.8 to 2.28.9.
- [Release notes](https://github.com/python/typeshed/releases)
- [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>
2022-08-22 03:01:59 +00:00
dependabot[bot]
3958e53aaa Bump mkdocs-material from 8.4.0 to 8.4.1
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 8.4.0 to 8.4.1.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/8.4.0...8.4.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>
2022-08-22 03:01:55 +00:00
dependabot[bot]
dfa7d1fc27 Bump fastapi from 0.79.0 to 0.79.1
Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.79.0 to 0.79.1.
- [Release notes](https://github.com/tiangolo/fastapi/releases)
- [Commits](https://github.com/tiangolo/fastapi/compare/0.79.0...0.79.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-22 03:01:51 +00:00
Matthias
2dc34779d5 Fix line length 2022-08-21 18:07:41 +02:00
Matthias
f6d832c6d9 Add get_option to expose ft_has via method 2022-08-21 17:51:46 +02:00
Matthias
87a3115073 Add get_open_trade_count() to simplify getting open trade count. 2022-08-21 17:08:27 +02:00
Matthias
085f81ec9e Fix header indent on stake-size-management 2022-08-21 08:24:14 +02:00
Matthias
0ec38e0cfd Fix typo in docs 2022-08-21 08:23:07 +02:00
Matthias
6189aa817c Fix HybridExample formatting 2022-08-20 19:50:18 +02:00
robcaulk
64b0834437 add credit in docstring 2022-08-20 17:04:38 +02:00
robcaulk
90c03178b1 provide user directions, clean up strategy, remove unnecessary code. 2022-08-20 17:02:18 +02:00
Matthias
cdd4745693 Merge pull request #7263 from freqtrade/okx_cache_tiers
Okx cache tiers
2022-08-20 15:18:13 +02:00
Matthias
1fb2e9558f Disable caching of leverage tiers in ccxt compat methods 2022-08-20 14:39:11 +02:00
Matthias
5b3f031590 Use hyperopt safe amount precision method 2022-08-20 14:13:15 +02:00
Matthias
4511634f3a improve test coverage 2022-08-20 14:03:47 +02:00
Matthias
738e95b875 Add tests for leverage tiers caching 2022-08-20 13:54:54 +02:00
Matthias
b6e8b9df35 Use cached leverage tiers 2022-08-20 13:01:58 +02:00
Matthias
52ec0d1046 Update binance Leverage tiers 2022-08-20 11:53:15 +02:00
Matthias
7563050f17 Realign tests to precision backtesting 2022-08-20 11:47:15 +02:00
Matthias
0da0600836 Have backtesting respect tradable size
closes #7161
2022-08-20 11:41:11 +02:00
Matthias
54ddc1a4c2 Add --tradingmode alias 2022-08-20 11:24:20 +02:00
Matthias
aa3da092a0 Dont' use classProperty - that's not supported on 3.8 2022-08-20 10:55:52 +02:00
Matthias
63efb3ff3e Merge pull request #7245 from th0rntwig/improve-doc
Restructure and improve doc, add fig
2022-08-20 09:48:50 +02:00
Matthias
665cf4431d Add explicit test cov. for .range behavior 2022-08-20 08:41:31 +02:00
Matthias
01d45ed12e Merge pull request #7257 from freqtrade/feat/list-pair-time
Get min/max data in list-data command
2022-08-20 08:16:52 +02:00
Matthias
7b8b73e651 Merge pull request #7243 from lolongcovas/newbranch_test
Improve PCA and pairwise distance calcs
2022-08-20 08:13:40 +02:00
Timothy Pogue
739b68f8fd ExternalPairList plugin 2022-08-19 22:40:01 -06:00
elintornquist
692c6bf1fd Added and updated figs and fig descriptions 2022-08-19 22:23:26 +02:00
robcaulk
88d6a7fbff additional edits 2022-08-19 22:23:26 +02:00
elintornquist
9c6b745f06 Restructure and improve doc, add fiq 2022-08-19 22:23:26 +02:00
Johan van der Vlugt
b44bd0171c Example Classifier strat 2022-08-19 19:10:37 +02:00
Matthias
b9d48c3278 use numbers in HyperoptState properly ... 2022-08-19 15:40:06 +02:00
Matthias
1389c8f5b6 Update documentation with show-timerange option 2022-08-19 15:34:10 +02:00
Matthias
733f716819 Update documentation 2022-08-19 15:22:43 +02:00
Matthias
bc359675a2 Add --analyze-per-epoch - moving populate_analysis to the epoch process 2022-08-19 15:19:43 +02:00
Matthias
09f8904545 Extract analysis to separate method 2022-08-19 15:12:55 +02:00
Matthias
08ef5ad2d8 Add HyperoptState enum and container class 2022-08-19 15:11:43 +02:00
Matthias
1c6f966579 Hyperopt: simplify parameter "can_optimize" handling 2022-08-19 15:03:03 +02:00
Matthias
b7553d20d4 Get min/max data in list-data command 2022-08-19 13:45:55 +02:00
longyu
521381ebf0 undo example strategy newline 2022-08-19 12:40:03 +02:00
longyu
790534e0f8 Merge branch 'newbranch_test' of github.com:lolongcovas/freqtrade into newbranch_test 2022-08-19 12:39:19 +02:00
longyu
cfa5b3f12c add new line 2022-08-19 12:39:08 +02:00
longyu
277245c69d remove line 2022-08-19 12:39:00 +02:00
Timothy Pogue
6834db11f3 minor improvements and pairlist data transmission 2022-08-19 00:06:19 -06:00
Timothy Pogue
9f6bba40af initial concept for replicate, basic leader and follower logic 2022-08-18 20:10:58 +02:00
longyu
1fada53ddd remove newline 2022-08-18 19:40:00 +02:00
longyu
f70b0bab80 remove line 2022-08-17 23:49:20 +02:00
robcaulk
88dd9920ea sort imports for isort 2022-08-17 16:38:09 +02:00
robcaulk
5155afb4e7 clean up code remnants 2022-08-17 15:22:48 +02:00
robcaulk
0c34104e45 extract download-data from freqai to prepare for future async changes 2022-08-17 15:18:44 +02:00
longyu
9c38c27eed ignore sample itself distance for avg_mean_dist computation 2022-08-17 15:09:57 +02:00
longyu
72c34291e3 newline 2022-08-17 15:09:10 +02:00
Matthias
987bbb8e12 Merge pull request #7176 from Jetsukda/patch-1
Edit Typo Custom-stake-amount
2022-08-05 06:23:00 +02:00
OGSK
c3d06257be Edit index of custom_stake_amount 2022-08-05 09:36:26 +07:00
OGSK
8bf056ca39 Edit Typo Custom-stake-amount
Edit Custom-stake-amount to `custom_stake_amount`
2022-08-05 00:28:28 +07:00
Matthias
046ae18411 Merge pull request #7144 from freqtrade/new_release
New release 2022.7
2022-07-30 16:06:37 +02:00
Matthias
28b4773083 Version bump 2022.7 2022-07-30 09:21:29 +02:00
Matthias
d4e8ab1cac Merge branch 'stable' into new_release 2022-07-30 09:21:05 +02:00
Matthias
2db5cc177d Merge pull request #7029 from freqtrade/new_release
New release 2022.6
2022-07-03 19:42:24 +02:00
Matthias
c1d4078518 Version bump to 2022.6 2022-07-03 15:04:38 +02:00
Matthias
d25ec6d0b8 Merge branch 'stable' into new_release 2022-07-03 15:04:16 +02:00
Matthias
c57db0a330 Version bump 2022.5.1 2022-06-01 06:34:28 +02:00
Matthias
f5087a82dc Merge branch 'stable' into new_release 2022-06-01 06:33:42 +02:00
Matthias
eed0d67005 Merge pull request #6893 from freqtrade/new_release
New release 2022.5
2022-05-28 13:46:24 +02:00
Matthias
a1d54f5ae0 Version bump 2022.5 2022-05-28 09:49:58 +02:00
Matthias
a4a7c6536d Merge branch 'stable' into new_release 2022-05-28 09:49:46 +02:00
Matthias
340a97d1df Merge pull request #6811 from DJCrashdummy/patch-1
corrected minor "typo" in formatting
2022-05-10 19:16:40 +02:00
DJCrashdummy
fab197edf2 corrected minor "typo" in formatting 2022-05-10 10:33:04 +00:00
Matthias
851c5dad30 Version bump 2022.4.2 2022-05-03 20:37:29 +02:00
Matthias
5b76ae452f Fix fee handling for futures trades 2022-05-03 20:35:30 +02:00
Matthias
2c750fdb09 Reduce no stake amount verbosity
closes #6768
2022-05-03 20:35:22 +02:00
Matthias
e7f5252074 Version bump 2022.4.1 2022-05-01 16:49:11 +02:00
Matthias
dfbd1c34c4 Merge pull request #6755 from freqtrade/new_release
New release 2022.4
2022-05-01 14:51:39 +02:00
Matthias
7615c4e904 Version bump 2022.4 2022-05-01 11:19:32 +02:00
Matthias
e9b78bf3ae Merge branch 'stable' into new_release 2022-05-01 11:19:17 +02:00
Matthias
2e397a88e1 Merge pull request #6592 from freqtrade/new_release
New release 2022.3
2022-03-27 15:51:58 +02:00
Matthias
fe6c62e144 Version bump 2022.3 2022-03-27 15:27:16 +02:00
Matthias
f0db721f05 Merge branch 'stable' into new_release 2022-03-27 15:09:06 +02:00
Matthias
4d8d30ea39 Version bump to 2022.2.2 2022-03-21 06:34:33 +01:00
Matthias
e90e3cead0 Map usdt fiat to correct coingecko fiat 2022-03-21 06:34:20 +01:00
Matthias
a568548192 Merge pull request #6464 from freqtrade/new_release
New release 2022.2.1
2022-02-26 08:57:42 +01:00
Matthias
f9d10a7fad Version bump 2022.2.1 2022-02-26 08:35:50 +01:00
Matthias
cbc2b00ee6 Merge branch 'stable' into new_release 2022-02-26 08:35:31 +01:00
Matthias
8f7b857ae9 Merge pull request #6459 from freqtrade/new_release
New release 2022.2
2022-02-25 15:14:27 +01:00
Matthias
e88b022cd4 Version bump 2022.2 2022-02-25 12:07:09 +01:00
Matthias
bfb738f69f Merge branch 'stable' into new_release 2022-02-25 12:06:11 +01:00
Matthias
00dd8e76ee Merge pull request #6416 from froggleston/patch-2
Update windows_installation.md
2022-02-25 11:44:40 +01:00
318 changed files with 19610 additions and 7388 deletions

View File

@@ -11,12 +11,14 @@
"mounts": [
"source=freqtrade-bashhistory,target=/home/ftuser/commandhistory,type=volume"
],
"workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/freqtrade,type=bind,consistency=cached",
// Uncomment to connect as a non-root user if you've added one. See https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "ftuser",
"onCreateCommand": "pip install --user -e .",
"postCreateCommand": "freqtrade create-userdir --userdir user_data/",
"workspaceFolder": "/freqtrade/",
"workspaceFolder": "/workspaces/freqtrade",
"settings": {
"terminal.integrated.shell.linux": "/bin/bash",

View File

@@ -20,7 +20,7 @@ Please do not use bug reports to request new features.
* Operating system: ____
* Python Version: _____ (`python -V`)
* CCXT version: _____ (`pip freeze | grep ccxt`)
* Freqtrade Version: ____ (`freqtrade -V` or `docker-compose run --rm freqtrade -V` for Freqtrade running in docker)
* Freqtrade Version: ____ (`freqtrade -V` or `docker compose run --rm freqtrade -V` for Freqtrade running in docker)
Note: All issues other than enhancement requests will be closed without further comment if the above template is deleted or not filled out.

View File

@@ -18,7 +18,7 @@ Have you search for this feature before requesting it? It's highly likely that a
* Operating system: ____
* Python Version: _____ (`python -V`)
* CCXT version: _____ (`pip freeze | grep ccxt`)
* Freqtrade Version: ____ (`freqtrade -V` or `docker-compose run --rm freqtrade -V` for Freqtrade running in docker)
* Freqtrade Version: ____ (`freqtrade -V` or `docker compose run --rm freqtrade -V` for Freqtrade running in docker)
## Describe the enhancement

View File

@@ -18,7 +18,7 @@ Please do not use the question template to report bugs or to request new feature
* Operating system: ____
* Python Version: _____ (`python -V`)
* CCXT version: _____ (`pip freeze | grep ccxt`)
* Freqtrade Version: ____ (`freqtrade -V` or `docker-compose run --rm freqtrade -V` for Freqtrade running in docker)
* Freqtrade Version: ____ (`freqtrade -V` or `docker compose run --rm freqtrade -V` for Freqtrade running in docker)
## Your question

View File

@@ -66,15 +66,9 @@ jobs:
- name: Tests
run: |
pytest --random-order --cov=freqtrade --cov-config=.coveragerc
if: matrix.python-version != '3.9' || matrix.os != 'ubuntu-22.04'
- name: Tests incl. ccxt compatibility tests
run: |
pytest --random-order --cov=freqtrade --cov-config=.coveragerc --longrun
if: matrix.python-version == '3.9' && matrix.os == 'ubuntu-22.04'
- name: Coveralls
if: (runner.os == 'Linux' && matrix.python-version == '3.9')
if: (runner.os == 'Linux' && matrix.python-version == '3.10' && matrix.os == 'ubuntu-22.04')
env:
# Coveralls token. Not used as secret due to github not providing secrets to forked repositories
COVERALLS_REPO_TOKEN: 6D1m0xupS3FgutfuGao8keFf9Hc0FpIXu
@@ -94,7 +88,7 @@ jobs:
run: |
cp config_examples/config_bittrex.example.json config.json
freqtrade create-userdir --userdir user_data
freqtrade hyperopt --datadir tests/testdata -e 5 --strategy SampleStrategy --hyperopt-loss SharpeHyperOptLossDaily --print-all
freqtrade hyperopt --datadir tests/testdata -e 6 --strategy SampleStrategy --hyperopt-loss SharpeHyperOptLossDaily --print-all
- name: Flake8
run: |
@@ -258,7 +252,7 @@ jobs:
webhookUrl: ${{ secrets.DISCORD_WEBHOOK }}
mypy_version_check:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
@@ -272,8 +266,18 @@ jobs:
pip install pyaml
python build_helpers/pre_commit_update.py
pre-commit:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: "3.10"
- uses: pre-commit/action@v3.0.0
docs_check:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
@@ -300,10 +304,65 @@ jobs:
details: Freqtrade doc test failed!
webhookUrl: ${{ secrets.DISCORD_WEBHOOK }}
build_linux_online:
# Run pytest with "live" checks
runs-on: ubuntu-22.04
# permissions:
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.9"
- name: Cache_dependencies
uses: actions/cache@v3
id: cache
with:
path: ~/dependencies/
key: ${{ runner.os }}-dependencies
- name: pip cache (linux)
uses: actions/cache@v3
if: runner.os == 'Linux'
with:
path: ~/.cache/pip
key: test-${{ matrix.os }}-${{ matrix.python-version }}-pip
- name: TA binary *nix
if: steps.cache.outputs.cache-hit != 'true'
run: |
cd build_helpers && ./install_ta-lib.sh ${HOME}/dependencies/; cd ..
- name: Installation - *nix
if: runner.os == 'Linux'
run: |
python -m pip install --upgrade pip wheel
export LD_LIBRARY_PATH=${HOME}/dependencies/lib:$LD_LIBRARY_PATH
export TA_LIBRARY_PATH=${HOME}/dependencies/lib
export TA_INCLUDE_PATH=${HOME}/dependencies/include
pip install -r requirements-dev.txt
pip install -e .
- name: Tests incl. ccxt compatibility tests
run: |
pytest --random-order --cov=freqtrade --cov-config=.coveragerc --longrun
# Notify only once - when CI completes (and after deploy) in case it's successfull
notify-complete:
needs: [ build_linux, build_macos, build_windows, docs_check, mypy_version_check ]
runs-on: ubuntu-20.04
needs: [
build_linux,
build_macos,
build_windows,
docs_check,
mypy_version_check,
pre-commit,
build_linux_online
]
runs-on: ubuntu-22.04
# Discord notification can't handle schedule events
if: (github.event_name != 'schedule')
permissions:
@@ -327,8 +386,8 @@ jobs:
webhookUrl: ${{ secrets.DISCORD_WEBHOOK }}
deploy:
needs: [ build_linux, build_macos, build_windows, docs_check, mypy_version_check ]
runs-on: ubuntu-20.04
needs: [ build_linux, build_macos, build_windows, docs_check, mypy_version_check, pre-commit ]
runs-on: ubuntu-22.04
if: (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'release') && github.repository == 'freqtrade/freqtrade'
@@ -351,7 +410,7 @@ jobs:
python setup.py sdist bdist_wheel
- name: Publish to PyPI (Test)
uses: pypa/gh-action-pypi-publish@v1.5.1
uses: pypa/gh-action-pypi-publish@v1.6.4
if: (github.event_name == 'release')
with:
user: __token__
@@ -359,7 +418,7 @@ jobs:
repository_url: https://test.pypi.org/legacy/
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@v1.5.1
uses: pypa/gh-action-pypi-publish@v1.6.4
if: (github.event_name == 'release')
with:
user: __token__
@@ -397,15 +456,6 @@ jobs:
run: |
build_helpers/publish_docker_multi.sh
- name: Discord notification
uses: rjstone/discord-webhook-notify@v1
if: always() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) && (github.event_name != 'schedule')
with:
severity: info
details: Deploy Succeeded!
webhookUrl: ${{ secrets.DISCORD_WEBHOOK }}
deploy_arm:
needs: [ deploy ]
# Only run on 64bit machines
@@ -433,3 +483,11 @@ jobs:
BRANCH_NAME: ${{ steps.extract_branch.outputs.branch }}
run: |
build_helpers/publish_docker_arm64.sh
- name: Discord notification
uses: rjstone/discord-webhook-notify@v1
if: always() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) && (github.event_name != 'schedule')
with:
severity: info
details: Deploy Succeeded!
webhookUrl: ${{ secrets.DISCORD_WEBHOOK }}

1
.gitignore vendored
View File

@@ -109,7 +109,6 @@ target/
!*.gitkeep
!config_examples/config_binance.example.json
!config_examples/config_bittrex.example.json
!config_examples/config_ftx.example.json
!config_examples/config_full.example.json
!config_examples/config_kraken.example.json
!config_examples/config_freqai.example.json

View File

@@ -15,9 +15,9 @@ repos:
additional_dependencies:
- types-cachetools==5.2.1
- types-filelock==3.2.7
- types-requests==2.28.8
- types-tabulate==0.8.11
- types-python-dateutil==2.8.19
- types-requests==2.28.11.5
- types-tabulate==0.9.0.0
- types-python-dateutil==2.8.19.4
# stages: [push]
- repo: https://github.com/pycqa/isort
@@ -34,7 +34,9 @@ repos:
exclude: |
(?x)^(
tests/.*|
.*\.svg
.*\.svg|
.*\.yml|
.*\.json
)$
- id: mixed-line-ending
- id: debug-statements

View File

@@ -1,4 +1,4 @@
FROM python:3.10.6-slim-bullseye as base
FROM python:3.10.7-slim-bullseye as base
# Setup env
ENV LANG C.UTF-8
@@ -11,7 +11,7 @@ ENV FT_APP_ENV="docker"
# Prepare environment
RUN mkdir /freqtrade \
&& apt-get update \
&& apt-get -y install sudo libatlas3-base curl sqlite3 libhdf5-serial-dev \
&& apt-get -y install sudo libatlas3-base curl sqlite3 libhdf5-serial-dev libgomp1 \
&& apt-get clean \
&& useradd -u 1000 -G sudo -U -m -s /bin/bash ftuser \
&& chown ftuser:ftuser /freqtrade \

View File

@@ -28,7 +28,6 @@ Please read the [exchange specific notes](docs/exchanges.md) to learn about even
- [X] [Binance](https://www.binance.com/)
- [X] [Bittrex](https://bittrex.com/)
- [X] [FTX](https://ftx.com/#a=2258149)
- [X] [Gate.io](https://www.gate.io/ref/6266643)
- [X] [Huobi](http://huobi.com/)
- [X] [Kraken](https://kraken.com/)
@@ -39,7 +38,7 @@ Please read the [exchange specific notes](docs/exchanges.md) to learn about even
- [X] [Binance](https://www.binance.com/)
- [X] [Gate.io](https://www.gate.io/ref/6266643)
- [X] [OKX](https://okx.com/).
- [X] [OKX](https://okx.com/)
Please make sure to read the [exchange specific notes](docs/exchanges.md), as well as the [trading with leverage](docs/leverage.md) documentation before diving in.
@@ -130,7 +129,7 @@ Telegram is not mandatory. However, this is a great way to control your bot. Mor
- `/start`: Starts the trader.
- `/stop`: Stops the trader.
- `/stopbuy`: Stop entering new trades.
- `/stopentry`: Stop entering new trades.
- `/status <trade_id>|[table]`: Lists all or specific open trades.
- `/profit [<n>]`: Lists cumulative profit from all finished trades, over the last n days.
- `/forceexit <trade_id>|all`: Instantly exits the given trade (Ignoring `minimum_roi`).

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -6,13 +6,13 @@ 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.24-cp38-cp38-win_amd64.whl
pip install build_helpers\TA_Lib-0.4.25-cp38-cp38-win_amd64.whl
}
if ($pyv -eq '3.9') {
pip install build_helpers\TA_Lib-0.4.24-cp39-cp39-win_amd64.whl
pip install build_helpers\TA_Lib-0.4.25-cp39-cp39-win_amd64.whl
}
if ($pyv -eq '3.10') {
pip install build_helpers\TA_Lib-0.4.24-cp310-cp310-win_amd64.whl
pip install build_helpers\TA_Lib-0.4.25-cp310-cp310-win_amd64.whl
}
pip install -r requirements-dev.txt
pip install -e .

View File

@@ -7,11 +7,13 @@ export DOCKER_BUILDKIT=1
TAG=$(echo "${BRANCH_NAME}" | sed -e "s/\//_/g")
TAG_PLOT=${TAG}_plot
TAG_FREQAI=${TAG}_freqai
TAG_FREQAI_RL=${TAG_FREQAI}rl
TAG_PI="${TAG}_pi"
TAG_ARM=${TAG}_arm
TAG_PLOT_ARM=${TAG_PLOT}_arm
TAG_FREQAI_ARM=${TAG_FREQAI}_arm
TAG_FREQAI_RL_ARM=${TAG_FREQAI_RL}_arm
CACHE_IMAGE=freqtradeorg/freqtrade_cache
echo "Running for ${TAG}"
@@ -41,9 +43,11 @@ docker tag freqtrade:$TAG_ARM ${CACHE_IMAGE}:$TAG_ARM
docker build --cache-from freqtrade:${TAG_ARM} --build-arg sourceimage=${CACHE_IMAGE} --build-arg sourcetag=${TAG_ARM} -t freqtrade:${TAG_PLOT_ARM} -f docker/Dockerfile.plot .
docker build --cache-from freqtrade:${TAG_ARM} --build-arg sourceimage=${CACHE_IMAGE} --build-arg sourcetag=${TAG_ARM} -t freqtrade:${TAG_FREQAI_ARM} -f docker/Dockerfile.freqai .
docker build --cache-from freqtrade:${TAG_ARM} --build-arg sourceimage=${CACHE_IMAGE} --build-arg sourcetag=${TAG_ARM} -t freqtrade:${TAG_FREQAI_RL_ARM} -f docker/Dockerfile.freqai_rl .
docker tag freqtrade:$TAG_PLOT_ARM ${CACHE_IMAGE}:$TAG_PLOT_ARM
docker tag freqtrade:$TAG_FREQAI_ARM ${CACHE_IMAGE}:$TAG_FREQAI_ARM
docker tag freqtrade:$TAG_FREQAI_RL_ARM ${CACHE_IMAGE}:$TAG_FREQAI_RL_ARM
# Run backtest
docker run --rm -v $(pwd)/config_examples/config_bittrex.example.json:/freqtrade/config.json:ro -v $(pwd)/tests:/tests freqtrade:${TAG_ARM} backtesting --datadir /tests/testdata --strategy-path /tests/strategy/strats/ --strategy StrategyTestV3
@@ -58,6 +62,7 @@ docker images
# docker push ${IMAGE_NAME}
docker push ${CACHE_IMAGE}:$TAG_PLOT_ARM
docker push ${CACHE_IMAGE}:$TAG_FREQAI_ARM
docker push ${CACHE_IMAGE}:$TAG_FREQAI_RL_ARM
docker push ${CACHE_IMAGE}:$TAG_ARM
# Create multi-arch image
@@ -74,6 +79,9 @@ docker manifest push -p ${IMAGE_NAME}:${TAG_PLOT}
docker manifest create ${IMAGE_NAME}:${TAG_FREQAI} ${CACHE_IMAGE}:${TAG_FREQAI_ARM} ${CACHE_IMAGE}:${TAG_FREQAI}
docker manifest push -p ${IMAGE_NAME}:${TAG_FREQAI}
docker manifest create ${IMAGE_NAME}:${TAG_FREQAI_RL} ${CACHE_IMAGE}:${TAG_FREQAI_RL_ARM} ${CACHE_IMAGE}:${TAG_FREQAI_RL}
docker manifest push -p ${IMAGE_NAME}:${TAG_FREQAI_RL}
# Tag as latest for develop builds
if [ "${TAG}" = "develop" ]; then
docker manifest create ${IMAGE_NAME}:latest ${CACHE_IMAGE}:${TAG_ARM} ${IMAGE_NAME}:${TAG_PI} ${CACHE_IMAGE}:${TAG}

View File

@@ -6,6 +6,7 @@
TAG=$(echo "${BRANCH_NAME}" | sed -e "s/\//_/g")
TAG_PLOT=${TAG}_plot
TAG_FREQAI=${TAG}_freqai
TAG_FREQAI_RL=${TAG_FREQAI}rl
TAG_PI="${TAG}_pi"
PI_PLATFORM="linux/arm/v7"
@@ -51,9 +52,11 @@ docker tag freqtrade:$TAG ${CACHE_IMAGE}:$TAG
docker build --cache-from freqtrade:${TAG} --build-arg sourceimage=${CACHE_IMAGE} --build-arg sourcetag=${TAG} -t freqtrade:${TAG_PLOT} -f docker/Dockerfile.plot .
docker build --cache-from freqtrade:${TAG} --build-arg sourceimage=${CACHE_IMAGE} --build-arg sourcetag=${TAG} -t freqtrade:${TAG_FREQAI} -f docker/Dockerfile.freqai .
docker build --cache-from freqtrade:${TAG_FREQAI} --build-arg sourceimage=${CACHE_IMAGE} --build-arg sourcetag=${TAG_FREQAI} -t freqtrade:${TAG_FREQAI_RL} -f docker/Dockerfile.freqai_rl .
docker tag freqtrade:$TAG_PLOT ${CACHE_IMAGE}:$TAG_PLOT
docker tag freqtrade:$TAG_FREQAI ${CACHE_IMAGE}:$TAG_FREQAI
docker tag freqtrade:$TAG_FREQAI_RL ${CACHE_IMAGE}:$TAG_FREQAI_RL
# Run backtest
docker run --rm -v $(pwd)/config_examples/config_bittrex.example.json:/freqtrade/config.json:ro -v $(pwd)/tests:/tests freqtrade:${TAG} backtesting --datadir /tests/testdata --strategy-path /tests/strategy/strats/ --strategy StrategyTestV3
@@ -68,6 +71,7 @@ docker images
docker push ${CACHE_IMAGE}
docker push ${CACHE_IMAGE}:$TAG_PLOT
docker push ${CACHE_IMAGE}:$TAG_FREQAI
docker push ${CACHE_IMAGE}:$TAG_FREQAI_RL
docker push ${CACHE_IMAGE}:$TAG

View File

@@ -53,7 +53,7 @@
"XTZ/BTC"
],
"pair_blacklist": [
"BNB/BTC"
"BNB/.*"
]
},
"pairlists": [

View File

@@ -18,13 +18,8 @@
"name": "binance",
"key": "",
"secret": "",
"ccxt_config": {
"enableRateLimit": true
},
"ccxt_async_config": {
"enableRateLimit": true,
"rateLimit": 200
},
"ccxt_config": {},
"ccxt_async_config": {},
"pair_whitelist": [
"1INCH/USDT",
"ALGO/USDT"
@@ -53,7 +48,6 @@
],
"freqai": {
"enabled": true,
"startup_candles": 10000,
"purge_old_models": true,
"train_period_days": 15,
"backtest_period_days": 7,
@@ -75,17 +69,17 @@
"weight_factor": 0.9,
"principal_component_analysis": false,
"use_SVM_to_remove_outliers": true,
"stratify_training_data": 0,
"indicator_max_period_candles": 20,
"indicator_periods_candles": [10, 20]
"indicator_periods_candles": [
10,
20
],
"plot_feature_importances": 0
},
"data_split_parameters": {
"test_size": 0.33,
"random_state": 1
},
"model_training_parameters": {
"n_estimators": 1000
}
"model_training_parameters": {}
},
"bot_name": "",
"force_entry_enable": true,

View File

@@ -1,96 +0,0 @@
{
"max_open_trades": 3,
"stake_currency": "USD",
"stake_amount": 50,
"tradable_balance_ratio": 0.99,
"fiat_display_currency": "USD",
"timeframe": "5m",
"dry_run": true,
"cancel_open_orders_on_exit": false,
"unfilledtimeout": {
"entry": 10,
"exit": 10,
"exit_timeout_count": 0,
"unit": "minutes"
},
"entry_pricing": {
"price_side": "same",
"use_order_book": true,
"order_book_top": 1,
"price_last_balance": 0.0,
"check_depth_of_market": {
"enabled": false,
"bids_to_ask_delta": 1
}
},
"exit_pricing": {
"price_side": "same",
"use_order_book": true,
"order_book_top": 1
},
"exchange": {
"name": "ftx",
"key": "your_exchange_key",
"secret": "your_exchange_secret",
"ccxt_config": {},
"ccxt_async_config": {},
"pair_whitelist": [
"BTC/USD",
"ETH/USD",
"BNB/USD",
"USDT/USD",
"LTC/USD",
"SRM/USD",
"SXP/USD",
"XRP/USD",
"DOGE/USD",
"1INCH/USD",
"CHZ/USD",
"MATIC/USD",
"LINK/USD",
"OXY/USD",
"SUSHI/USD"
],
"pair_blacklist": [
"FTT/USD"
]
},
"pairlists": [
{"method": "StaticPairList"}
],
"edge": {
"enabled": false,
"process_throttle_secs": 3600,
"calculate_since_number_of_days": 7,
"allowed_risk": 0.01,
"stoploss_range_min": -0.01,
"stoploss_range_max": -0.1,
"stoploss_range_step": -0.01,
"minimum_winrate": 0.60,
"minimum_expectancy": 0.20,
"min_trade_number": 10,
"max_trade_duration_minute": 1440,
"remove_pumps": false
},
"telegram": {
"enabled": false,
"token": "your_telegram_token",
"chat_id": "your_telegram_chat_id"
},
"api_server": {
"enabled": false,
"listen_ip_address": "127.0.0.1",
"listen_port": 8080,
"verbosity": "error",
"jwt_secret_key": "somethingrandom",
"CORS_origins": [],
"username": "freqtrader",
"password": "SuperSecurePassword"
},
"bot_name": "freqtrade",
"initial_state": "running",
"force_entry_enable": false,
"internals": {
"process_throttle_secs": 5
}
}

View File

@@ -64,8 +64,8 @@
"stoploss_on_exchange_limit_ratio": 0.99
},
"order_time_in_force": {
"entry": "gtc",
"exit": "gtc"
"entry": "GTC",
"exit": "GTC"
},
"pairlists": [
{"method": "StaticPairList"},
@@ -172,7 +172,24 @@
"jwt_secret_key": "somethingrandom",
"CORS_origins": [],
"username": "freqtrader",
"password": "SuperSecurePassword"
"password": "SuperSecurePassword",
"ws_token": "secret_ws_t0ken."
},
"external_message_consumer": {
"enabled": false,
"producers": [
{
"name": "default",
"host": "127.0.0.2",
"port": 8080,
"ws_token": "secret_ws_t0ken."
}
],
"wait_timeout": 300,
"ping_timeout": 10,
"sleep_time": 10,
"remove_entry_exit_signals": false,
"message_size_limit": 8
},
"bot_name": "freqtrade",
"db_url": "sqlite:///tradesv3.sqlite",
@@ -187,6 +204,7 @@
"strategy_path": "user_data/strategies/",
"recursive_strategy_search": false,
"add_config_files": [],
"reduce_df_footprint": false,
"dataformat_ohlcv": "json",
"dataformat_trades": "jsongz"
}

View File

@@ -11,7 +11,7 @@ ENV FT_APP_ENV="docker"
# Prepare environment
RUN mkdir /freqtrade \
&& apt-get update \
&& apt-get -y install sudo libatlas3-base curl sqlite3 libhdf5-dev \
&& apt-get -y install sudo libatlas3-base curl sqlite3 libhdf5-dev libutf8proc-dev libsnappy-dev \
&& apt-get clean \
&& useradd -u 1000 -G sudo -U -m ftuser \
&& chown ftuser:ftuser /freqtrade \
@@ -37,6 +37,7 @@ ENV LD_LIBRARY_PATH /usr/local/lib
COPY --chown=ftuser:ftuser requirements.txt /freqtrade/
USER ftuser
RUN pip install --user --no-cache-dir numpy \
&& pip install --user /tmp/pyarrow-*.whl \
&& pip install --user --no-cache-dir -r requirements.txt
# Copy dependencies to runtime-image

View File

@@ -6,4 +6,3 @@ FROM ${sourceimage}:${sourcetag}
COPY requirements-freqai.txt /freqtrade/
RUN pip install -r requirements-freqai.txt --user --no-cache-dir

View File

@@ -0,0 +1,8 @@
ARG sourceimage=freqtradeorg/freqtrade
ARG sourcetag=develop_freqai
FROM ${sourceimage}:${sourcetag}
# Install dependencies
COPY requirements-freqai.txt requirements-freqai-rl.txt /freqtrade/
RUN pip install -r requirements-freqai-rl.txt --user --no-cache-dir

View File

@@ -1,7 +1,8 @@
FROM freqtradeorg/freqtrade:develop_plot
RUN pip install jupyterlab --user --no-cache-dir
# Pin jupyter-client to avoid tornado version conflict
RUN pip install jupyterlab jupyter-client==7.3.4 --user --no-cache-dir
# Empty the ENTRYPOINT to allow all commands
ENTRYPOINT []

View File

@@ -10,7 +10,7 @@ services:
ports:
- "127.0.0.1:8888:8888"
volumes:
- "./user_data:/freqtrade/user_data"
- "../user_data:/freqtrade/user_data"
# Default command used when running `docker compose up`
command: >
jupyter lab --port=8888 --ip 0.0.0.0 --allow-root

View File

@@ -100,3 +100,17 @@ freqtrade backtesting-analysis -c <config.json> --analysis-groups 0 2 --enter-re
The indicators have to be present in your strategy's main DataFrame (either for your main
timeframe or for informative timeframes) otherwise they will simply be ignored in the script
output.
### 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:
```
--timerange : Timerange to filter output trades, start date inclusive, end date exclusive. e.g. 20220101-20221231
```
For example, if your backtest timerange was `20220101-20221231` but you only want to output trades in January:
```bash
freqtrade backtesting-analysis -c <config.json> --timerange 20220101-20220201
```

View File

@@ -17,6 +17,7 @@ from typing import Any, Dict
from pandas import DataFrame
from freqtrade.constants import Config
from freqtrade.optimize.hyperopt import IHyperOptLoss
TARGET_TRADES = 600
@@ -31,7 +32,7 @@ class SuperDuperHyperOptLoss(IHyperOptLoss):
@staticmethod
def hyperopt_loss_function(results: DataFrame, trade_count: int,
min_date: datetime, max_date: datetime,
config: Dict, processed: Dict[str, DataFrame],
config: Config, processed: Dict[str, DataFrame],
backtest_stats: Dict[str, Any],
*args, **kwargs) -> float:
"""
@@ -77,6 +78,8 @@ This function needs to return a floating point number (`float`). Smaller numbers
To override a pre-defined space (`roi_space`, `generate_roi_table`, `stoploss_space`, `trailing_space`), define a nested class called Hyperopt and define the required spaces as follows:
```python
from freqtrade.optimize.space import Categorical, Dimension, Integer, SKDecimal
class MyAwesomeStrategy(IStrategy):
class HyperOpt:
# Define a custom stoploss space.
@@ -93,6 +96,33 @@ class MyAwesomeStrategy(IStrategy):
SKDecimal(0.01, 0.07, decimals=3, name='roi_p2'),
SKDecimal(0.01, 0.20, decimals=3, name='roi_p3'),
]
def generate_roi_table(params: Dict) -> Dict[int, float]:
roi_table = {}
roi_table[0] = params['roi_p1'] + params['roi_p2'] + params['roi_p3']
roi_table[params['roi_t3']] = params['roi_p1'] + params['roi_p2']
roi_table[params['roi_t3'] + params['roi_t2']] = params['roi_p1']
roi_table[params['roi_t3'] + params['roi_t2'] + params['roi_t1']] = 0
return roi_table
def trailing_space() -> List[Dimension]:
# All parameters here are mandatory, you can only modify their type or the range.
return [
# Fixed to true, if optimizing trailing_stop we assume to use trailing stop at all times.
Categorical([True], name='trailing_stop'),
SKDecimal(0.01, 0.35, decimals=3, name='trailing_stop_positive'),
# 'trailing_stop_positive_offset' should be greater than 'trailing_stop_positive',
# so this intermediate parameter is used as the value of the difference between
# them. The value of the 'trailing_stop_positive_offset' is constructed in the
# generate_trailing_params() method.
# This is similar to the hyperspace dimensions used for constructing the ROI tables.
SKDecimal(0.001, 0.1, decimals=3, name='trailing_stop_positive_offset_p1'),
Categorical([True, False], name='trailing_only_offset_is_reached'),
]
```
!!! Note

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
docs/assets/freqai_DI.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

BIN
docs/assets/freqai_algo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 995 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

BIN
docs/assets/tensorboard.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

View File

@@ -107,7 +107,7 @@ Strategy arguments:
## Test your strategy with Backtesting
Now you have good Buy and Sell strategies and some historic data, you want to test it against
Now you have good Entry and exit strategies and some historic data, you want to test it against
real data. This is what we call [backtesting](https://en.wikipedia.org/wiki/Backtesting).
Backtesting will use the crypto-currencies (pairs) from your config file and load historical candle (OHLCV) data from `user_data/data/<exchange>` by default.
@@ -215,7 +215,7 @@ Sometimes your account has certain fee rebates (fee reductions starting with a c
To account for this in backtesting, you can use the `--fee` command line option to supply this value to backtesting.
This fee must be a ratio, and will be applied twice (once for trade entry, and once for trade exit).
For example, if the buying and selling commission fee is 0.1% (i.e., 0.001 written as ratio), then you would run backtesting as the following:
For example, if the commission fee per order is 0.1% (i.e., 0.001 written as ratio), then you would run backtesting as the following:
```bash
freqtrade backtesting --fee 0.001
@@ -252,41 +252,41 @@ The most important in the backtesting is to understand the result.
A backtesting result will look like that:
```
========================================================= BACKTESTING REPORT ==========================================================
| Pair | Buys | Avg Profit % | Cum Profit % | Tot Profit BTC | Tot Profit % | Avg Duration | Wins Draws Loss Win% |
|:---------|-------:|---------------:|---------------:|-----------------:|---------------:|:-------------|-------------------------:|
| ADA/BTC | 35 | -0.11 | -3.88 | -0.00019428 | -1.94 | 4:35:00 | 14 0 21 40.0 |
| ARK/BTC | 11 | -0.41 | -4.52 | -0.00022647 | -2.26 | 2:03:00 | 3 0 8 27.3 |
| BTS/BTC | 32 | 0.31 | 9.78 | 0.00048938 | 4.89 | 5:05:00 | 18 0 14 56.2 |
| DASH/BTC | 13 | -0.08 | -1.07 | -0.00005343 | -0.53 | 4:39:00 | 6 0 7 46.2 |
| ENG/BTC | 18 | 1.36 | 24.54 | 0.00122807 | 12.27 | 2:50:00 | 8 0 10 44.4 |
| EOS/BTC | 36 | 0.08 | 3.06 | 0.00015304 | 1.53 | 3:34:00 | 16 0 20 44.4 |
| ETC/BTC | 26 | 0.37 | 9.51 | 0.00047576 | 4.75 | 6:14:00 | 11 0 15 42.3 |
| ETH/BTC | 33 | 0.30 | 9.96 | 0.00049856 | 4.98 | 7:31:00 | 16 0 17 48.5 |
| IOTA/BTC | 32 | 0.03 | 1.09 | 0.00005444 | 0.54 | 3:12:00 | 14 0 18 43.8 |
| LSK/BTC | 15 | 1.75 | 26.26 | 0.00131413 | 13.13 | 2:58:00 | 6 0 9 40.0 |
| LTC/BTC | 32 | -0.04 | -1.38 | -0.00006886 | -0.69 | 4:49:00 | 11 0 21 34.4 |
| NANO/BTC | 17 | 1.26 | 21.39 | 0.00107058 | 10.70 | 1:55:00 | 10 0 7 58.5 |
| NEO/BTC | 23 | 0.82 | 18.97 | 0.00094936 | 9.48 | 2:59:00 | 10 0 13 43.5 |
| REQ/BTC | 9 | 1.17 | 10.54 | 0.00052734 | 5.27 | 3:47:00 | 4 0 5 44.4 |
| XLM/BTC | 16 | 1.22 | 19.54 | 0.00097800 | 9.77 | 3:15:00 | 7 0 9 43.8 |
| XMR/BTC | 23 | -0.18 | -4.13 | -0.00020696 | -2.07 | 5:30:00 | 12 0 11 52.2 |
| XRP/BTC | 35 | 0.66 | 22.96 | 0.00114897 | 11.48 | 3:49:00 | 12 0 23 34.3 |
| ZEC/BTC | 22 | -0.46 | -10.18 | -0.00050971 | -5.09 | 2:22:00 | 7 0 15 31.8 |
| TOTAL | 429 | 0.36 | 152.41 | 0.00762792 | 76.20 | 4:12:00 | 186 0 243 43.4 |
========================================================= BACKTESTING REPORT =========================================================
| Pair | Entries | Avg Profit % | Cum Profit % | Tot Profit BTC | Tot Profit % | Avg Duration | Wins Draws Loss Win% |
|:---------|--------:|---------------:|---------------:|-----------------:|---------------:|:-------------|-------------------------:|
| ADA/BTC | 35 | -0.11 | -3.88 | -0.00019428 | -1.94 | 4:35:00 | 14 0 21 40.0 |
| ARK/BTC | 11 | -0.41 | -4.52 | -0.00022647 | -2.26 | 2:03:00 | 3 0 8 27.3 |
| BTS/BTC | 32 | 0.31 | 9.78 | 0.00048938 | 4.89 | 5:05:00 | 18 0 14 56.2 |
| DASH/BTC | 13 | -0.08 | -1.07 | -0.00005343 | -0.53 | 4:39:00 | 6 0 7 46.2 |
| ENG/BTC | 18 | 1.36 | 24.54 | 0.00122807 | 12.27 | 2:50:00 | 8 0 10 44.4 |
| EOS/BTC | 36 | 0.08 | 3.06 | 0.00015304 | 1.53 | 3:34:00 | 16 0 20 44.4 |
| ETC/BTC | 26 | 0.37 | 9.51 | 0.00047576 | 4.75 | 6:14:00 | 11 0 15 42.3 |
| ETH/BTC | 33 | 0.30 | 9.96 | 0.00049856 | 4.98 | 7:31:00 | 16 0 17 48.5 |
| IOTA/BTC | 32 | 0.03 | 1.09 | 0.00005444 | 0.54 | 3:12:00 | 14 0 18 43.8 |
| LSK/BTC | 15 | 1.75 | 26.26 | 0.00131413 | 13.13 | 2:58:00 | 6 0 9 40.0 |
| LTC/BTC | 32 | -0.04 | -1.38 | -0.00006886 | -0.69 | 4:49:00 | 11 0 21 34.4 |
| NANO/BTC | 17 | 1.26 | 21.39 | 0.00107058 | 10.70 | 1:55:00 | 10 0 7 58.5 |
| NEO/BTC | 23 | 0.82 | 18.97 | 0.00094936 | 9.48 | 2:59:00 | 10 0 13 43.5 |
| REQ/BTC | 9 | 1.17 | 10.54 | 0.00052734 | 5.27 | 3:47:00 | 4 0 5 44.4 |
| XLM/BTC | 16 | 1.22 | 19.54 | 0.00097800 | 9.77 | 3:15:00 | 7 0 9 43.8 |
| XMR/BTC | 23 | -0.18 | -4.13 | -0.00020696 | -2.07 | 5:30:00 | 12 0 11 52.2 |
| XRP/BTC | 35 | 0.66 | 22.96 | 0.00114897 | 11.48 | 3:49:00 | 12 0 23 34.3 |
| ZEC/BTC | 22 | -0.46 | -10.18 | -0.00050971 | -5.09 | 2:22:00 | 7 0 15 31.8 |
| TOTAL | 429 | 0.36 | 152.41 | 0.00762792 | 76.20 | 4:12:00 | 186 0 243 43.4 |
========================================================= EXIT REASON STATS ==========================================================
| Exit Reason | Sells | Wins | Draws | Losses |
| Exit Reason | Exits | Wins | Draws | Losses |
|:-------------------|--------:|------:|-------:|--------:|
| trailing_stop_loss | 205 | 150 | 0 | 55 |
| stop_loss | 166 | 0 | 0 | 166 |
| exit_signal | 56 | 36 | 0 | 20 |
| force_exit | 2 | 0 | 0 | 2 |
====================================================== LEFT OPEN TRADES REPORT ======================================================
| Pair | Buys | Avg Profit % | Cum Profit % | Tot Profit BTC | Tot Profit % | Avg Duration | Win Draw Loss Win% |
|:---------|-------:|---------------:|---------------:|-----------------:|---------------:|:---------------|--------------------:|
| ADA/BTC | 1 | 0.89 | 0.89 | 0.00004434 | 0.44 | 6:00:00 | 1 0 0 100 |
| LTC/BTC | 1 | 0.68 | 0.68 | 0.00003421 | 0.34 | 2:00:00 | 1 0 0 100 |
| TOTAL | 2 | 0.78 | 1.57 | 0.00007855 | 0.78 | 4:00:00 | 2 0 0 100 |
| Pair | Entries | Avg Profit % | Cum Profit % | Tot Profit BTC | Tot Profit % | Avg Duration | Win Draw Loss Win% |
|:---------|---------:|---------------:|---------------:|-----------------:|---------------:|:---------------|--------------------:|
| ADA/BTC | 1 | 0.89 | 0.89 | 0.00004434 | 0.44 | 6:00:00 | 1 0 0 100 |
| LTC/BTC | 1 | 0.68 | 0.68 | 0.00003421 | 0.34 | 2:00:00 | 1 0 0 100 |
| TOTAL | 2 | 0.78 | 1.57 | 0.00007855 | 0.78 | 4:00:00 | 2 0 0 100 |
================== SUMMARY METRICS ==================
| Metric | Value |
|-----------------------------+---------------------|
@@ -356,7 +356,7 @@ The column `Avg Profit %` shows the average profit for all trades made while the
The column `Tot Profit %` shows instead the total profit % in relation to the starting balance.
In the above results, we have a starting balance of 0.01 BTC and an absolute profit of 0.00762792 BTC - so the `Tot Profit %` will be `(0.00762792 / 0.01) * 100 ~= 76.2%`.
Your strategy performance is influenced by your buy strategy, your exit strategy, and also by the `minimal_roi` and `stop_loss` you have set.
Your strategy performance is influenced by your entry strategy, your exit strategy, and also by the `minimal_roi` and `stop_loss` you have set.
For example, if your `minimal_roi` is only `"0": 0.01` you cannot expect the bot to make more profit than 1% (because it will exit every time a trade reaches 1%).
@@ -515,20 +515,20 @@ You can then load the trades to perform further analysis as shown in the [data a
Since backtesting lacks some detailed information about what happens within a candle, it needs to take a few assumptions:
- Exchange [trading limits](#trading-limits-in-backtesting) are respected
- Buys happen at open-price
- Entries happen at open-price
- All orders are filled at the requested price (no slippage, no unfilled orders)
- Exit-signal exits happen at open-price of the consecutive candle
- Exit-signal is favored over Stoploss, because exit-signals are assumed to trigger on candle's open
- 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
- Forceexits 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)
- 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
- Low happens before high for stoploss, protecting capital first
- Trailing stoploss
- Trailing Stoploss is only adjusted if it's below the candle's low (otherwise it would be triggered)
- On trade entry candles that trigger trailing stoploss, the "minimum offset" (`stop_positive_offset`) is assumed (instead of high) - and the stop is calculated from this point
- On trade entry candles that trigger trailing stoploss, the "minimum offset" (`stop_positive_offset`) is assumed (instead of high) - and the stop is calculated from this point. This rule is NOT applicable to custom-stoploss scenarios, since there's no information about the stoploss logic available.
- High happens first - adjusting stoploss
- Low uses the adjusted stoploss (so exits with large high-low difference are backtested correctly)
- ROI applies before trailing-stop, ensuring profits are "top-capped" at ROI if both ROI and trailing stop applies
@@ -546,8 +546,8 @@ In addition to the above assumptions, strategy authors should carefully read the
### Trading limits in backtesting
Exchanges have certain trading limits, like minimum base currency, or minimum stake (quote) currency.
These limits are usually listed in the exchange documentation as "trading rules" or similar.
Exchanges have certain trading limits, like minimum (and maximum) base currency, or minimum/maximum stake (quote) currency.
These limits are usually listed in the exchange documentation as "trading rules" or similar and can be quite different between different pairs.
Backtesting (as well as live and dry-run) does honor these limits, and will ensure that a stoploss can be placed below this value - so the value will be slightly higher than what the exchange specifies.
Freqtrade has however no information about historic limits.
@@ -561,6 +561,14 @@ BTC trades at 22.000\$ today (0.001 BTC is related to this) - but the backtestin
Today's minimum would be `0.001 * 22_000` - or 22\$.
However the limit could also be 50$ - based on `0.001 * 50_000` in some historic setting.
#### Trading precision limits
Most exchanges pose precision limits on both price and amounts, so you cannot buy 1.0020401 of a pair, or at a price of 1.24567123123.
Instead, these prices and amounts will be rounded or truncated (based on the exchange definition) to the defined trading precision.
The above values may for example be rounded to an amount of 1.002, and a price of 1.24567.
These precision values are based on current exchange limits (as described in the [above section](#trading-limits-in-backtesting)), as historic precision limits are not available.
## Improved backtest accuracy
One big limitation of backtesting is it's inability to know how prices moved intra-candle (was high before close, or viceversa?).
@@ -575,7 +583,8 @@ To utilize this, you can append `--timeframe-detail 5m` to your regular backtest
freqtrade backtesting --strategy AwesomeStrategy --timeframe 1h --timeframe-detail 5m
```
This will load 1h data as well as 5m data for the timeframe. The strategy will be analyzed with the 1h timeframe - and for every "open trade candle" (candles where a trade is open) the 5m data will be used to simulate intra-candle movements.
This will load 1h data as well as 5m data for the timeframe. The strategy will be analyzed with the 1h timeframe, and Entry orders will only be placed at the main timeframe, however Order fills and exit signals will be evaluated at the 5m candle, simulating intra-candle movements.
All callback functions (`custom_exit()`, `custom_stoploss()`, ... ) will be running for each 5m candle once the trade is opened (so 12 times in the above example of 1h timeframe, and 5m detailed timeframe).
`--timeframe-detail` must be smaller than the original timeframe, otherwise backtesting will fail to start.
@@ -604,11 +613,11 @@ There will be an additional table comparing win/losses of the different strategi
Detailed output for all strategies one after the other will be available, so make sure to scroll up to see the details per strategy.
```
=========================================================== STRATEGY SUMMARY =========================================================================
| Strategy | Buys | Avg Profit % | Cum Profit % | Tot Profit BTC | Tot Profit % | Avg Duration | Wins | Draws | Losses | Drawdown % |
|:------------|-------:|---------------:|---------------:|-----------------:|---------------:|:---------------|------:|-------:|-------:|-----------:|
| Strategy1 | 429 | 0.36 | 152.41 | 0.00762792 | 76.20 | 4:12:00 | 186 | 0 | 243 | 45.2 |
| Strategy2 | 1487 | -0.13 | -197.58 | -0.00988917 | -98.79 | 4:43:00 | 662 | 0 | 825 | 241.68 |
=========================================================== STRATEGY SUMMARY ===========================================================================
| Strategy | Entries | Avg Profit % | Cum Profit % | Tot Profit BTC | Tot Profit % | Avg Duration | Wins | Draws | Losses | Drawdown % |
|:------------|---------:|---------------:|---------------:|-----------------:|---------------:|:---------------|------:|-------:|-------:|-----------:|
| Strategy1 | 429 | 0.36 | 152.41 | 0.00762792 | 76.20 | 4:12:00 | 186 | 0 | 243 | 45.2 |
| Strategy2 | 1487 | -0.13 | -197.58 | -0.00988917 | -98.79 | 4:43:00 | 662 | 0 | 825 | 241.68 |
```
## Next step

View File

@@ -70,7 +70,7 @@ This loop will be repeated again and again until the bot is stopped.
* Determine stake size by calling the `custom_stake_amount()` callback.
* Check position adjustments for open trades if enabled and call `adjust_trade_position()` to determine if an additional order is requested.
* Call `custom_stoploss()` and `custom_exit()` to find custom exit points.
* For exits based on exit-signal and custom-exit: Call `custom_exit_price()` to determine exit price (Prices are moved to be within the closing candle).
* For exits based on exit-signal, custom-exit and partial exits: Call `custom_exit_price()` to determine exit price (Prices are moved to be within the closing candle).
* Generate backtest report output
!!! Note

View File

@@ -58,9 +58,20 @@ This is similar to using multiple `--config` parameters, but simpler in usage as
!!! Tip "Use multiple configuration files to keep secrets secret"
You can use a 2nd configuration file containing your secrets. That way you can share your "primary" configuration file, while still keeping your API keys for yourself.
The 2nd file should only specify what you intend to override.
If a key is in more than one of the configurations, then the "last specified configuration" wins (in the above example, `config-private.json`).
For one-off commands, you can also use the below syntax by specifying multiple "--config" parameters.
``` bash
freqtrade trade --config user_data/config1.json --config user_data/config-private.json <...>
```
The below is equivalent to the example above - but having 2 configuration files in the configuration, for easier reuse.
``` json title="user_data/config.json"
"add_config_files": [
"config1.json",
"config-private.json"
]
```
@@ -69,17 +80,6 @@ This is similar to using multiple `--config` parameters, but simpler in usage as
freqtrade trade --config user_data/config.json <...>
```
The 2nd file should only specify what you intend to override.
If a key is in more than one of the configurations, then the "last specified configuration" wins (in the above example, `config-private.json`).
For one-off commands, you can also use the below syntax by specifying multiple "--config" parameters.
``` bash
freqtrade trade --config user_data/config.json --config user_data/config-private.json <...>
```
This is equivalent to the example above - but `config-private.json` is specified as cli argument.
??? Note "config collision handling"
If the same configuration setting takes place in both `config.json` and `config-import.json`, then the parent configuration wins.
In the below case, `max_open_trades` would be 3 after the merging - as the reusable "import" configuration has this key overwritten.
@@ -111,6 +111,8 @@ This is similar to using multiple `--config` parameters, but simpler in usage as
}
```
If multiple files are in the `add_config_files` section, then they will be assumed to be at identical levels, having the last occurrence override the earlier config (unless a parent already defined such a key).
## Configuration parameters
The table below will list all configuration parameters available.
@@ -213,24 +215,28 @@ Mandatory parameters are marked as **Required**, which means that they are requi
| `telegram.balance_dust_level` | Dust-level (in stake currency) - currencies with a balance below this will not be shown by `/balance`. <br> **Datatype:** float
| `telegram.reload` | Allow "reload" buttons on telegram messages. <br>*Defaults to `True`.<br> **Datatype:** boolean
| `telegram.notification_settings.*` | Detailed notification settings. Refer to the [telegram documentation](telegram-usage.md) for details.<br> **Datatype:** dictionary
| `telegram.allow_custom_messages` | Enable the sending of Telegram messages from strategies via the dataprovider.send_msg() function. <br> **Datatype:** Boolean
| | **Webhook**
| `webhook.enabled` | Enable usage of Webhook notifications <br> **Datatype:** Boolean
| `webhook.url` | URL for the webhook. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| `webhook.webhookentry` | Payload to send on entry. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| `webhook.webhookentrycancel` | Payload to send on entry order cancel. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| `webhook.webhookentryfill` | Payload to send on entry order filled. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| `webhook.webhookexit` | Payload to send on exit. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| `webhook.webhookexitcancel` | Payload to send on exit order cancel. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| `webhook.webhookexitfill` | Payload to send on exit order filled. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| `webhook.webhookstatus` | Payload to send on status calls. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| | **Rest API / FreqUI**
| `webhook.entry` | Payload to send on entry. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| `webhook.entry_cancel` | Payload to send on entry order cancel. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| `webhook.entry_fill` | Payload to send on entry order filled. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| `webhook.exit` | Payload to send on exit. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| `webhook.exit_cancel` | Payload to send on exit order cancel. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| `webhook.exit_fill` | Payload to send on exit order filled. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| `webhook.status` | Payload to send on status calls. Only required if `webhook.enabled` is `true`. See the [webhook documentation](webhook-config.md) for more details. <br> **Datatype:** String
| `webhook.allow_custom_messages` | Enable the sending of Webhook messages from strategies via the dataprovider.send_msg() function. <br> **Datatype:** Boolean
| | **Rest API / FreqUI / Producer-Consumer**
| `api_server.enabled` | Enable usage of API Server. See the [API Server documentation](rest-api.md) for more details. <br> **Datatype:** Boolean
| `api_server.listen_ip_address` | Bind IP address. See the [API Server documentation](rest-api.md) for more details. <br> **Datatype:** IPv4
| `api_server.listen_port` | Bind Port. See the [API Server documentation](rest-api.md) for more details. <br>**Datatype:** Integer between 1024 and 65535
| `api_server.verbosity` | Logging verbosity. `info` will print all RPC Calls, while "error" will only display errors. <br>**Datatype:** Enum, either `info` or `error`. Defaults to `info`.
| `api_server.username` | Username for API server. See the [API Server documentation](rest-api.md) for more details. <br>**Keep it in secret, do not disclose publicly.**<br> **Datatype:** String
| `api_server.password` | Password for API server. See the [API Server documentation](rest-api.md) for more details. <br>**Keep it in secret, do not disclose publicly.**<br> **Datatype:** String
| `api_server.ws_token` | API token for the Message WebSocket. See the [API Server documentation](rest-api.md) for more details. <br>**Keep it in secret, do not disclose publicly.** <br> **Datatype:** String
| `bot_name` | Name of the bot. Passed via API to a client - can be shown to distinguish / name bots.<br> *Defaults to `freqtrade`*<br> **Datatype:** String
| `external_message_consumer` | Enable [Producer/Consumer mode](producer-consumer.md) for more details. <br> **Datatype:** Dict
| | **Other**
| `initial_state` | Defines the initial application state. If set to stopped, then the bot has to be explicitly started via `/start` RPC command. <br>*Defaults to `stopped`.* <br> **Datatype:** Enum, either `stopped` or `running`
| `force_entry_enable` | Enables the RPC Commands to force a Trade entry. More information below. <br> **Datatype:** Boolean
@@ -247,6 +253,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi
| `add_config_files` | Additional config files. These files will be loaded and merged with the current config file. The files are resolved relative to the initial file.<br> *Defaults to `[]`*. <br> **Datatype:** List of strings
| `dataformat_ohlcv` | Data format to use to store historical candle (OHLCV) data. <br> *Defaults to `json`*. <br> **Datatype:** String
| `dataformat_trades` | Data format to use to store historical trades data. <br> *Defaults to `jsongz`*. <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
@@ -525,21 +532,28 @@ It means if the order is not executed immediately AND fully then it is cancelled
It is the same as FOK (above) except it can be partially fulfilled. The remaining part
is automatically cancelled by the exchange.
The `order_time_in_force` parameter contains a dict with buy and sell time in force policy values.
**PO (Post only):**
Post only order. The order is either placed as a maker order, or it is canceled.
This means the order must be placed on orderbook for at at least time in an unfilled state.
#### time_in_force config
The `order_time_in_force` parameter contains a dict with entry and exit time in force policy values.
This can be set in the configuration file or in the strategy.
Values set in the configuration file overwrites values set in the strategy.
The possible values are: `gtc` (default), `fok` or `ioc`.
The possible values are: `GTC` (default), `FOK` or `IOC`.
``` python
"order_time_in_force": {
"entry": "gtc",
"exit": "gtc"
"entry": "GTC",
"exit": "GTC"
},
```
!!! Warning
This is ongoing work. For now, it is supported only for binance and kucoin.
This is ongoing work. For now, it is supported only for binance, gate and kucoin.
Please don't change the default value unless you know what you are doing and have researched the impact of using different values for your particular exchange.
### What values can be used for fiat_display_currency?
@@ -650,17 +664,8 @@ You should also make sure to read the [Exchanges](exchanges.md) section of the d
### Using proxy with Freqtrade
To use a proxy with freqtrade, add the kwarg `"aiohttp_trust_env"=true` to the `"ccxt_async_kwargs"` dict in the exchange section of the configuration.
An example for this can be found in `config_examples/config_full.example.json`
``` json
"ccxt_async_config": {
"aiohttp_trust_env": true
}
```
Then, export your proxy settings using the variables `"HTTP_PROXY"` and `"HTTPS_PROXY"` set to the appropriate values
To use a proxy with freqtrade, export your proxy settings using the variables `"HTTP_PROXY"` and `"HTTPS_PROXY"` set to the appropriate values.
This will have the proxy settings applied to everything (telegram, coingecko, ...) except exchange requests.
``` bash
export HTTP_PROXY="http://addr:port"
@@ -668,6 +673,23 @@ export HTTPS_PROXY="http://addr:port"
freqtrade
```
#### Proxy exchange requests
To use a proxy for exchange connections - you will have to define the proxies as part of the ccxt configuration.
``` json
{
"exchange": {
"ccxt_config": {
"aiohttp_proxy": "http://addr:port",
"proxies": {
"http": "http://addr:port",
"https": "http://addr:port"
},
}
}
```
## Next step
Now you have configured your config.json, the next step is to [start your bot](bot-usage.md).

View File

@@ -5,7 +5,7 @@ You can analyze the results of backtests and trading history easily using Jupyte
## Quick start with docker
Freqtrade provides a docker-compose file which starts up a jupyter lab server.
You can run this server using the following command: `docker-compose -f docker/docker-compose-jupyter.yml up`
You can run this server using the following command: `docker compose -f docker/docker-compose-jupyter.yml up`
This will create a dockercontainer running jupyter lab, which will be accessible using `https://127.0.0.1:8888/lab`.
Please use the link that's printed in the console after startup for simplified login.
@@ -83,7 +83,7 @@ from pathlib import Path
project_root = "somedir/freqtrade"
i=0
try:
os.chdirdir(project_root)
os.chdir(project_root)
assert Path('LICENSE').is_file()
except:
while i<4 and (not Path('LICENSE').is_file()):

View File

@@ -25,9 +25,8 @@ usage: freqtrade download-data [-h] [-v] [--logfile FILE] [-V] [-c PATH]
[--include-inactive-pairs]
[--timerange TIMERANGE] [--dl-trades]
[--exchange EXCHANGE]
[-t {1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} [{1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} ...]]
[--erase]
[--data-format-ohlcv {json,jsongz,hdf5}]
[-t TIMEFRAMES [TIMEFRAMES ...]] [--erase]
[--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}]
[--data-format-trades {json,jsongz,hdf5}]
[--trading-mode {spot,margin,futures}]
[--prepend]
@@ -37,7 +36,8 @@ optional arguments:
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space-
separated.
--pairs-file FILE File containing a list of pairs to download.
--pairs-file FILE File containing a list of pairs. Takes precedence over
--pairs or pairs configured in the configuration.
--days INT Download data for given number of days.
--new-pairs-days INT Download data of new pairs for given number of days.
Default: `None`.
@@ -50,20 +50,20 @@ optional arguments:
as --timeframes/-t.
--exchange EXCHANGE Exchange name (default: `bittrex`). Only valid if no
config is provided.
-t {1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} [{1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} ...], --timeframes {1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} [{1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} ...]
-t TIMEFRAMES [TIMEFRAMES ...], --timeframes TIMEFRAMES [TIMEFRAMES ...]
Specify which tickers to download. Space-separated
list. Default: `1m 5m`.
--erase Clean all existing data for the selected
exchange/pairs/timeframes.
--data-format-ohlcv {json,jsongz,hdf5}
--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}
Storage format for downloaded candle (OHLCV) data.
(default: `json`).
--data-format-trades {json,jsongz,hdf5}
Storage format for downloaded trades data. (default:
`jsongz`).
--trading-mode {spot,margin,futures}
--trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures}
Select Trading mode
--prepend Allow data prepending.
--prepend Allow data prepending. (Data-appending is disabled)
Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
@@ -76,7 +76,7 @@ Common arguments:
`userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin.
-d PATH, --datadir PATH
-d PATH, --datadir PATH, --data-dir PATH
Path to directory with historical backtesting data.
--userdir PATH, --user-data-dir PATH
Path to userdata directory.
@@ -177,16 +177,18 @@ freqtrade download-data --exchange binance --pairs ETH/USDT XRP/USDT BTC/USDT --
### Data format
Freqtrade currently supports 3 data-formats for both OHLCV and trades data:
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)
* `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)
* `parquet` - columnar datastore (OHLCV only)
By default, OHLCV data is stored as `json` data, while trades data is stored as `jsongz` data.
This can be changed via the `--data-format-ohlcv` and `--data-format-trades` command line arguments respectively.
To persist this change, you can should also add the following snippet to your configuration, so you don't have to insert the above arguments each time:
To persist this change, you should also add the following snippet to your configuration, so you don't have to insert the above arguments each time:
``` jsonc
// ...
@@ -200,38 +202,74 @@ If the default data-format has been changed during download, then the keys `data
!!! Note
You can convert between data-formats using the [convert-data](#sub-command-convert-data) and [convert-trade-data](#sub-command-convert-trade-data) methods.
#### Dataformat comparison
The following comparisons have been made with the following data, and by using the linux `time` command.
```
Found 6 pair / timeframe combinations.
+----------+-------------+--------+---------------------+---------------------+
| Pair | Timeframe | Type | From | To |
|----------+-------------+--------+---------------------+---------------------|
| BTC/USDT | 5m | spot | 2017-08-17 04:00:00 | 2022-09-13 19:25:00 |
| ETH/USDT | 1m | spot | 2017-08-17 04:00:00 | 2022-09-13 19:26:00 |
| BTC/USDT | 1m | spot | 2017-08-17 04:00:00 | 2022-09-13 19:30:00 |
| XRP/USDT | 5m | spot | 2018-05-04 08:10:00 | 2022-09-13 19:15:00 |
| XRP/USDT | 1m | spot | 2018-05-04 08:11:00 | 2022-09-13 19:22:00 |
| ETH/USDT | 5m | spot | 2017-08-17 04:00:00 | 2022-09-13 19:20:00 |
+----------+-------------+--------+---------------------+---------------------+
```
Timings have been taken in a not very scientific way with the following command, which forces reading the data into memory.
``` bash
time freqtrade list-data --show-timerange --data-format-ohlcv <dataformat>
```
| Format | Size | timing |
|------------|-------------|-------------|
| `json` | 149Mb | 25.6s |
| `jsongz` | 39Mb | 27s |
| `hdf5` | 145Mb | 3.9s |
| `feather` | 72Mb | 3.5s |
| `parquet` | 83Mb | 3.8s |
Size has been taken from the BTC/USDT 1m spot combination for the timerange specified above.
To have a best performance/size mix, we recommend the use of either feather or parquet.
#### Sub-command convert data
```
usage: freqtrade convert-data [-h] [-v] [--logfile FILE] [-V] [-c PATH]
[-d PATH] [--userdir PATH]
[-p PAIRS [PAIRS ...]] --format-from
{json,jsongz,hdf5} --format-to
{json,jsongz,hdf5} [--erase]
[-t {1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} [{1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} ...]]
{json,jsongz,hdf5,feather,parquet} --format-to
{json,jsongz,hdf5,feather,parquet} [--erase]
[--exchange EXCHANGE]
[-t TIMEFRAMES [TIMEFRAMES ...]]
[--trading-mode {spot,margin,futures}]
[--candle-types {spot,,futures,mark,index,premiumIndex,funding_rate} [{spot,,futures,mark,index,premiumIndex,funding_rate} ...]]
[--candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...]]
optional arguments:
-h, --help show this help message and exit
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space-
separated.
--format-from {json,jsongz,hdf5}
--format-from {json,jsongz,hdf5,feather,parquet}
Source format for data conversion.
--format-to {json,jsongz,hdf5}
--format-to {json,jsongz,hdf5,feather,parquet}
Destination format for data conversion.
--erase Clean all existing data for the selected
exchange/pairs/timeframes.
-t {1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} [{1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} ...], --timeframes {1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} [{1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} ...]
Specify which tickers to download. Space-separated
list. Default: `1m 5m`.
--exchange EXCHANGE Exchange name (default: `bittrex`). Only valid if no
config is provided.
--trading-mode {spot,margin,futures}
-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} ...]
--candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...]
Select candle type to use
Common arguments:
@@ -245,7 +283,7 @@ Common arguments:
`userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin.
-d PATH, --datadir PATH
-d PATH, --datadir PATH, --data-dir PATH
Path to directory with historical backtesting data.
--userdir PATH, --user-data-dir PATH
Path to userdata directory.
@@ -267,20 +305,24 @@ freqtrade convert-data --format-from json --format-to jsongz --datadir ~/.freqtr
usage: freqtrade convert-trade-data [-h] [-v] [--logfile FILE] [-V] [-c PATH]
[-d PATH] [--userdir PATH]
[-p PAIRS [PAIRS ...]] --format-from
{json,jsongz,hdf5} --format-to
{json,jsongz,hdf5} [--erase]
{json,jsongz,hdf5,feather,parquet}
--format-to
{json,jsongz,hdf5,feather,parquet}
[--erase] [--exchange EXCHANGE]
optional arguments:
-h, --help show this help message and exit
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Show profits for only these pairs. Pairs are space-
Limit command to these pairs. Pairs are space-
separated.
--format-from {json,jsongz,hdf5}
--format-from {json,jsongz,hdf5,feather,parquet}
Source format for data conversion.
--format-to {json,jsongz,hdf5}
--format-to {json,jsongz,hdf5,feather,parquet}
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.
Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
@@ -293,7 +335,7 @@ Common arguments:
`userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin.
-d PATH, --datadir PATH
-d PATH, --datadir PATH, --data-dir PATH
Path to directory with historical backtesting data.
--userdir PATH, --user-data-dir PATH
Path to userdata directory.
@@ -318,9 +360,9 @@ This command will allow you to repeat this last step for additional timeframes w
usage: freqtrade trades-to-ohlcv [-h] [-v] [--logfile FILE] [-V] [-c PATH]
[-d PATH] [--userdir PATH]
[-p PAIRS [PAIRS ...]]
[-t {1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} [{1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} ...]]
[-t TIMEFRAMES [TIMEFRAMES ...]]
[--exchange EXCHANGE]
[--data-format-ohlcv {json,jsongz,hdf5}]
[--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}]
[--data-format-trades {json,jsongz,hdf5}]
optional arguments:
@@ -328,12 +370,12 @@ optional arguments:
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space-
separated.
-t {1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} [{1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} ...], --timeframes {1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} [{1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} ...]
-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.
--data-format-ohlcv {json,jsongz,hdf5}
--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}
Storage format for downloaded candle (OHLCV) data.
(default: `json`).
--data-format-trades {json,jsongz,hdf5}
@@ -351,7 +393,7 @@ Common arguments:
`userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin.
-d PATH, --datadir PATH
-d PATH, --datadir PATH, --data-dir PATH
Path to directory with historical backtesting data.
--userdir PATH, --user-data-dir PATH
Path to userdata directory.
@@ -371,22 +413,25 @@ You can get a list of downloaded data using the `list-data` sub-command.
```
usage: freqtrade list-data [-h] [-v] [--logfile FILE] [-V] [-c PATH] [-d PATH]
[--userdir PATH] [--exchange EXCHANGE]
[--data-format-ohlcv {json,jsongz,hdf5}]
[--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}]
[-p PAIRS [PAIRS ...]]
[--trading-mode {spot,margin,futures}]
[--show-timerange]
optional arguments:
-h, --help show this help message and exit
--exchange EXCHANGE Exchange name (default: `bittrex`). Only valid if no
config is provided.
--data-format-ohlcv {json,jsongz,hdf5}
--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}
Storage format for downloaded candle (OHLCV) data.
(default: `json`).
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
Limit command to these pairs. Pairs are space-
separated.
--trading-mode {spot,margin,futures}
--trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures}
Select Trading mode
--show-timerange Show timerange available for available data. (May take
a while to calculate).
Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
@@ -399,7 +444,7 @@ Common arguments:
`userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin.
-d PATH, --datadir PATH
-d PATH, --datadir PATH, --data-dir PATH
Path to directory with historical backtesting data.
--userdir PATH, --user-data-dir PATH
Path to userdata directory.

View File

@@ -66,11 +66,11 @@ We will keep a compatibility layer for 1-2 versions (so both `buy_tag` and `ente
#### Naming changes
Webhook terminology changed from "sell" to "exit", and from "buy" to "entry".
Webhook terminology changed from "sell" to "exit", and from "buy" to "entry", removing "webhook" in the process.
* `webhookbuy` -> `webhookentry`
* `webhookbuyfill` -> `webhookentryfill`
* `webhookbuycancel` -> `webhookentrycancel`
* `webhooksell` -> `webhookexit`
* `webhooksellfill` -> `webhookexitfill`
* `webhooksellcancel` -> `webhookexitcancel`
* `webhookbuy`, `webhookentry` -> `entry`
* `webhookbuyfill`, `webhookentryfill` -> `entry_fill`
* `webhookbuycancel`, `webhookentrycancel` -> `entry_cancel`
* `webhooksell`, `webhookexit` -> `exit`
* `webhooksellfill`, `webhookexitfill` -> `exit_fill`
* `webhooksellcancel`, `webhookexitcancel` -> `exit_cancel`

View File

@@ -49,6 +49,13 @@ For more information about the [Remote container extension](https://code.visuals
New code should be covered by basic unittests. Depending on the complexity of the feature, Reviewers may request more in-depth unittests.
If necessary, the Freqtrade team can assist and give guidance with writing good tests (however please don't expect anyone to write the tests for you).
#### How to run tests
Use `pytest` in root folder to run all available testcases and confirm your local environment is setup correctly
!!! Note "feature branches"
Tests are expected to pass on the `develop` and `stable` branches. Other branches may be work in progress with tests not working yet.
#### Checking log content in tests
Freqtrade uses 2 main methods to check log content in tests, `log_has()` and `log_has_re()` (to check using regex, in case of dynamic log-messages).
@@ -409,8 +416,9 @@ Determine if crucial bugfixes have been made between this commit and the current
* Merge the release branch (stable) into this branch.
* Edit `freqtrade/__init__.py` and add the version matching the current date (for example `2019.7` for July 2019). Minor versions can be `2019.7.1` should we need to do a second release that month. Version numbers must follow allowed versions from PEP0440 to avoid failures pushing to pypi.
* Commit this part
* push that branch to the remote and create a PR against the stable branch
* Commit this part.
* push that branch to the remote and create a PR against the stable branch.
* Update develop version to next version following the pattern `2019.8-dev`.
### Create changelog from git commits
@@ -433,6 +441,11 @@ To keep the release-log short, best wrap the full git changelog into a collapsib
</details>
```
### FreqUI release
If FreqUI has been updated substantially, make sure to create a release before merging the release branch.
Make sure that freqUI CI on the release is finished and passed before merging the release.
### Create github release / tag
Once the PR against stable is merged (best right after merging):

View File

@@ -4,20 +4,22 @@ This page explains how to run the bot with Docker. It is not meant to work out o
## Install Docker
Start by downloading and installing Docker CE for your platform:
Start by downloading and installing Docker / Docker Desktop for your platform:
* [Mac](https://docs.docker.com/docker-for-mac/install/)
* [Windows](https://docs.docker.com/docker-for-windows/install/)
* [Linux](https://docs.docker.com/install/)
To simplify running freqtrade, [`docker-compose`](https://docs.docker.com/compose/install/) should be installed and available to follow the below [docker quick start guide](#docker-quick-start).
!!! Info "Docker compose install"
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`).
## Freqtrade with docker-compose
## 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.
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.
!!! Note
- The following section assumes that `docker` and `docker-compose` are installed and available to the logged in user.
- The following section assumes that `docker` is installed and available to the logged in user.
- All below commands use relative directories and will have to be executed from the directory containing the `docker-compose.yml` file.
### Docker quick start
@@ -31,13 +33,13 @@ cd ft_userdata/
curl https://raw.githubusercontent.com/freqtrade/freqtrade/stable/docker-compose.yml -o docker-compose.yml
# Pull the freqtrade image
docker-compose pull
docker compose pull
# Create user directory structure
docker-compose run --rm freqtrade create-userdir --userdir user_data
docker compose run --rm freqtrade create-userdir --userdir user_data
# Create configuration - Requires answering interactive questions
docker-compose run --rm freqtrade new-config --config user_data/config.json
docker compose run --rm freqtrade new-config --config user_data/config.json
```
The above snippet creates a new directory called `ft_userdata`, downloads the latest compose file and pulls the freqtrade image.
@@ -64,7 +66,7 @@ The `SampleStrategy` is run by default.
Once this is done, you're ready to launch the bot in trading mode (Dry-run or Live-trading, depending on your answer to the corresponding question you made above).
``` bash
docker-compose up -d
docker compose up -d
```
!!! Warning "Default configuration"
@@ -84,27 +86,27 @@ You can now access the UI by typing localhost:8080 in your browser.
#### Monitoring the bot
You can check for running instances with `docker-compose ps`.
You can check for running instances with `docker compose ps`.
This should list the service `freqtrade` as `running`. If that's not the case, best check the logs (see next point).
#### Docker-compose logs
#### Docker compose logs
Logs will be written to: `user_data/logs/freqtrade.log`.
You can also check the latest log with the command `docker-compose logs -f`.
You can also check the latest log with the command `docker compose logs -f`.
#### Database
The database will be located at: `user_data/tradesv3.sqlite`
#### Updating freqtrade with docker-compose
#### Updating freqtrade with docker
Updating freqtrade when using `docker-compose` is as simple as running the following 2 commands:
Updating freqtrade when using `docker` is as simple as running the following 2 commands:
``` bash
# Download the latest image
docker-compose pull
docker compose pull
# Restart the image
docker-compose up -d
docker compose up -d
```
This will first pull the latest image, and will then restart the container with the just pulled version.
@@ -116,43 +118,43 @@ This will first pull the latest image, and will then restart the container with
Advanced users may edit the docker-compose file further to include all possible options or arguments.
All freqtrade arguments will be available by running `docker-compose run --rm freqtrade <command> <optional arguments>`.
All freqtrade arguments will be available by running `docker compose run --rm freqtrade <command> <optional arguments>`.
!!! Warning "`docker-compose` for trade commands"
Trade commands (`freqtrade trade <...>`) should not be ran via `docker-compose run` - but should use `docker-compose up -d` instead.
!!! Warning "`docker compose` for trade commands"
Trade commands (`freqtrade trade <...>`) should not be ran via `docker compose run` - but should use `docker compose up -d` instead.
This makes sure that the container is properly started (including port forwardings) and will make sure that the container will restart after a system reboot.
If you intend to use freqUI, please also ensure to adjust the [configuration accordingly](rest-api.md#configuration-with-docker), otherwise the UI will not be available.
!!! Note "`docker-compose run --rm`"
!!! 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-compose"
"`docker-compose run --rm`" will require a compose file to be provided.
??? Note "Using docker without docker"
"`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`.
This can be useful for fetching exchange information to add to your `config.json` without affecting your running containers.
#### Example: Download data with docker-compose
#### Example: Download data with docker
Download backtesting data for 5 days for the pair ETH/BTC and 1h timeframe from Binance. The data will be stored in the directory `user_data/data/` on the host.
``` bash
docker-compose run --rm freqtrade download-data --pairs ETH/BTC --exchange binance --days 5 -t 1h
docker compose run --rm freqtrade download-data --pairs ETH/BTC --exchange binance --days 5 -t 1h
```
Head over to the [Data Downloading Documentation](data-download.md) for more details on downloading data.
#### Example: Backtest with docker-compose
#### Example: Backtest with docker
Run backtesting in docker-containers for SampleStrategy and specified timerange of historical data, on 5m timeframe:
``` bash
docker-compose run --rm freqtrade backtesting --config user_data/config.json --strategy SampleStrategy --timerange 20190801-20191001 -i 5m
docker compose run --rm freqtrade backtesting --config user_data/config.json --strategy SampleStrategy --timerange 20190801-20191001 -i 5m
```
Head over to the [Backtesting Documentation](backtesting.md) to learn more.
### Additional dependencies with docker-compose
### Additional dependencies with docker
If your strategy requires dependencies not included in the default image - it will be necessary to build the image on your host.
For this, please create a Dockerfile containing installation steps for the additional dependencies (have a look at [docker/Dockerfile.custom](https://github.com/freqtrade/freqtrade/blob/develop/docker/Dockerfile.custom) for an example).
@@ -166,15 +168,15 @@ You'll then also need to modify the `docker-compose.yml` file and uncomment the
dockerfile: "./Dockerfile.<yourextension>"
```
You can then run `docker-compose build --pull` to build the docker image, and run it using the commands described above.
You can then run `docker compose build --pull` to build the docker image, and run it using the commands described above.
### Plotting with docker-compose
### 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.
You can then use these commands as follows:
``` bash
docker-compose run --rm freqtrade plot-dataframe --strategy AwesomeStrategy -p BTC/ETH --timerange=20180801-20180805
docker compose run --rm freqtrade plot-dataframe --strategy AwesomeStrategy -p BTC/ETH --timerange=20180801-20180805
```
The output will be stored in the `user_data/plot` directory, and can be opened with any modern browser.
@@ -185,7 +187,7 @@ Freqtrade provides a docker-compose file which starts up a jupyter lab server.
You can run this server using the following command:
``` bash
docker-compose -f docker/docker-compose-jupyter.yml up
docker compose -f docker/docker-compose-jupyter.yml up
```
This will create a docker-container running jupyter lab, which will be accessible using `https://127.0.0.1:8888/lab`.
@@ -194,7 +196,7 @@ Please use the link that's printed in the console after startup for simplified l
Since part of this image is built on your machine, it is recommended to rebuild the image from time to time to keep freqtrade (and dependencies) up-to-date.
``` bash
docker-compose -f docker/docker-compose-jupyter.yml build --no-cache
docker compose -f docker/docker-compose-jupyter.yml build --no-cache
```
## Troubleshooting

View File

@@ -54,15 +54,26 @@ This configuration enables kraken, as well as rate-limiting to avoid bans from t
## Binance
!!! Warning "Server location and geo-ip restrictions"
Please be aware that binance restrict api access regarding the server country. The currents and non exhaustive countries blocked are United States, Malaysia (Singapour), Ontario (Canada). Please go to [binance terms > b. Eligibility](https://www.binance.com/en/terms) to find up to date list.
Binance supports [time_in_force](configuration.md#understand-order_time_in_force).
!!! Tip "Stoploss on Exchange"
Binance 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..
Binance 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, Binance 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.
### Binance Blacklist
### Binance Blacklist recommendation
For Binance, please add `"BNB/<STAKE>"` to your blacklist to avoid issues.
Accounts having BNB accounts use this to pay for fees - if your first trade happens to be on `BNB`, further trades will consume this position and make the initial BNB trade unsellable as the expected amount is not there anymore.
For Binance, it is suggested to add `"BNB/<STAKE>"` to your blacklist to avoid issues, unless you are willing to maintain enough extra `BNB` on the account or unless you're willing to disable using `BNB` for fees.
Binance accounts may use `BNB` for fees, and if a trade happens to be on `BNB`, further trades may consume this position and make the initial BNB trade unsellable as the expected amount is not there anymore.
### Binance sites
Binance has been split into 2, and users must use the correct ccxt exchange ID for their exchange, otherwise API keys are not recognized.
* [binance.com](https://www.binance.com/) - International users. Use exchange id: `binance`.
* [binance.us](https://www.binance.us/) - US based users. Use exchange id: `binanceus`.
### Binance Futures
@@ -86,12 +97,14 @@ When trading on Binance Futures market, orderbook must be used because there is
},
```
### Binance sites
#### Binance futures settings
Binance has been split into 2, and users must use the correct ccxt exchange ID for their exchange, otherwise API keys are not recognized.
Users will also have to have the futures-setting "Position Mode" set to "One-way Mode", and "Asset Mode" set to "Single-Asset Mode".
These settings will be checked on startup, and freqtrade will show an error if this setting is wrong.
* [binance.com](https://www.binance.com/) - International users. Use exchange id: `binance`.
* [binance.us](https://www.binance.us/) - US based users. Use exchange id: `binanceus`.
![Binance futures settings](assets/binance_futures_settings.png)
Freqtrade will not attempt to change these settings.
## Kraken
@@ -163,26 +176,6 @@ res = [p for p, x in lm.items() if 'US' in x['info']['prohibitedIn']]
print(res)
```
## FTX
!!! Tip "Stoploss on Exchange"
FTX supports `stoploss_on_exchange` and can use both stop-loss-market and stop-loss-limit orders. It provides great advantages, so we recommend to benefit from it.
You can use either `"limit"` or `"market"` in the `order_types.stoploss` configuration setting to decide which type of stoploss shall be used.
### Using subaccounts
To use subaccounts with FTX, you need to edit the configuration and add the following:
``` json
"exchange": {
"ccxt_config": {
"headers": {
"FTX-SUBACCOUNT": "name"
}
},
}
```
## Kucoin
Kucoin requires a passphrase for each api key, you will therefore need to add this key into the configuration so your exchange section looks as follows:
@@ -205,8 +198,8 @@ Kucoin supports [time_in_force](configuration.md#understand-order_time_in_force)
### Kucoin Blacklists
For Kucoin, please add `"KCS/<STAKE>"` to your blacklist to avoid issues.
Accounts having KCS accounts use this to pay for fees - if your first trade happens to be on `KCS`, further trades will consume this position and make the initial KCS trade unsellable as the expected amount is not there anymore.
For Kucoin, it is suggested to add `"KCS/<STAKE>"` to your blacklist to avoid issues, unless you are willing to maintain enough extra `KCS` on the account or unless you're willing to disable using `KCS` for fees.
Kucoin accounts may use `KCS` for fees, and if a trade happens to be on `KCS`, further trades may consume this position and make the initial `KCS` trade unsellable as the expected amount is not there anymore.
## Huobi
@@ -232,7 +225,7 @@ OKX requires a passphrase for each api key, you will therefore need to add this
!!! Warning "Futures"
OKX Futures has the concept of "position mode" - which can be Net or long/short (hedge mode).
Freqtrade supports both modes - but changing the mode mid-trading is not supported and will lead to exceptions and failures to place trades.
Freqtrade supports both modes (we recommend to use net mode) - but changing the mode mid-trading is not supported and will lead to exceptions and failures to place trades.
OKX also only provides MARK candles for the past ~3 months. Backtesting futures prior to that date will therefore lead to slight deviations, as funding-fees cannot be calculated correctly without this data.
## Gate.io
@@ -278,7 +271,7 @@ For example, to test the order type `FOK` with Kraken, and modify candle limit t
"exchange": {
"name": "kraken",
"_ft_has_params": {
"order_time_in_force": ["gtc", "fok"],
"order_time_in_force": ["GTC", "FOK"],
"ohlcv_candle_limit": 200
}
//...

View File

@@ -4,7 +4,7 @@
Freqtrade supports spot trading only.
### Can I open short positions?
### Can my bot open short positions?
Freqtrade can open short positions in futures markets.
This requires the strategy to be made for this - and `"trading_mode": "futures"` in the configuration.
@@ -12,9 +12,9 @@ Please make sure to read the [relevant documentation page](leverage.md) first.
In spot markets, you can in some cases use leveraged spot tokens, which reflect an inverted pair (eg. BTCUP/USD, BTCDOWN/USD, ETHBULL/USD, ETHBEAR/USD,...) which can be traded with Freqtrade.
### Can I trade options or futures?
### Can my bot trade options or futures?
Futures trading is supported for selected exchanges.
Futures trading is supported for selected exchanges. Please refer to the [documentation start page](index.md#supported-futures-exchanges-experimental) for an uptodate list of supported exchanges.
## Beginner Tips & Tricks
@@ -22,6 +22,13 @@ Futures trading is supported for selected exchanges.
## Freqtrade common issues
### Can freqtrade open multiple positions on the same pair in parallel?
No. Freqtrade will only open one position per pair at a time.
You can however use the [`adjust_trade_position()` callback](strategy-callbacks.md#adjust-trade-position) to adjust an open position.
Backtesting provides an option for this in `--eps` - however this is only there to highlight "hidden" signals, and will not work in live.
### The bot does not start
Running the bot with `freqtrade trade --config config.json` shows the output `freqtrade: command not found`.
@@ -30,7 +37,7 @@ This could be caused by the following reasons:
* The virtual environment is not active.
* Run `source .env/bin/activate` to activate the virtual environment.
* The installation did not work correctly.
* The installation did not complete successfully.
* Please check the [Installation documentation](installation.md).
### I have waited 5 minutes, why hasn't the bot made any trades yet?
@@ -67,7 +74,7 @@ This is not a bot-problem, but will also happen while manual trading.
While freqtrade can handle this (it'll sell 99 COIN), fees are often below the minimum tradable lot-size (you can only trade full COIN, not 0.9 COIN).
Leaving the dust (0.9 COIN) on the exchange makes usually sense, as the next time freqtrade buys COIN, it'll eat into the remaining small balance, this time selling everything it bought, and therefore slowly declining the dust balance (although it most likely will never reach exactly 0).
Where possible (e.g. on binance), the use of the exchange's dedicated fee currency will fix this.
Where possible (e.g. on binance), the use of the exchange's dedicated fee currency will fix this.
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.
@@ -77,9 +84,9 @@ Freqtrade will not provide incomplete candles to strategies. Using incomplete ca
You can use "current" market data by using the [dataprovider](strategy-customization.md#orderbookpair-maximum)'s orderbook or ticker methods - which however cannot be used during backtesting.
### Is there a setting to only SELL the coins being held and not perform anymore BUYS?
### Is there a setting to only Exit the trades being held and not perform any new Entries?
You can use the `/stopbuy` command in Telegram to prevent future buys, followed by `/forceexit all` (sell all open trades).
You can use the `/stopentry` command in Telegram to prevent future trade entry, followed by `/forceexit all` (sell all open trades).
### I want to run multiple bots on the same machine
@@ -95,6 +102,12 @@ If this happens for all pairs in the pairlist, this might indicate a recent exch
Irrespectively of the reason, Freqtrade will fill up these candles with "empty" candles, where open, high, low and close are set to the previous candle close - and volume is empty. In a chart, this will look like a `_` - and is aligned with how exchanges usually represent 0 volume candles.
### I'm getting "Price jump between 2 candles detected"
This message is a warning that the candles had a price jump of > 30%.
This might be a sign that the pair stopped trading, and some token exchange took place (e.g. COCOS in 2021 - where price jumped from 0.0000154 to 0.01621).
This message is often accompanied by ["Missing data fillup"](#im-getting-missing-data-fillup-messages-in-the-log) - as trading on such pairs is often stopped for some time.
### I'm getting "Outdated history for pair xxx" in the log
The bot is trying to tell you that it got an outdated last candle (not the last complete candle).
@@ -109,7 +122,7 @@ This warning can point to one of the below problems:
### I'm getting the "RESTRICTED_MARKET" message in the log
Currently known to happen for US Bittrex users.
Currently known to happen for US Bittrex users.
Read [the Bittrex section about restricted markets](exchanges.md#restricted-markets) for more information.
@@ -177,8 +190,8 @@ The GPU improvements would only apply to pandas-native calculations - or ones wr
For hyperopt, freqtrade is using scikit-optimize, which is built on top of scikit-learn.
Their statement about GPU support is [pretty clear](https://scikit-learn.org/stable/faq.html#will-you-add-gpu-support).
GPU's also are only good at crunching numbers (floating point operations).
For hyperopt, we need both number-crunching (find next parameters) and running python code (running backtesting).
GPU's also are only good at crunching numbers (floating point operations).
For hyperopt, we need both number-crunching (find next parameters) and running python code (running backtesting).
As such, GPU's are not too well suited for most parts of hyperopt.
The benefit of using GPU would therefore be pretty slim - and will not justify the complexity introduced by trying to add GPU support.
@@ -219,9 +232,9 @@ already 8\*10^9\*10 evaluations. A roughly total of 80 billion evaluations.
Did you run 100 000 evaluations? Congrats, you've done roughly 1 / 100 000 th
of the search space, assuming that the bot never tests the same parameters more than once.
* The time it takes to run 1000 hyperopt epochs depends on things like: The available cpu, hard-disk, ram, timeframe, timerange, indicator settings, indicator count, amount of coins that hyperopt test strategies on and the resulting trade count - which can be 650 trades in a year or 100000 trades depending if the strategy aims for big profits by trading rarely or for many low profit trades.
* The time it takes to run 1000 hyperopt epochs depends on things like: The available cpu, hard-disk, ram, timeframe, timerange, indicator settings, indicator count, amount of coins that hyperopt test strategies on and the resulting trade count - which can be 650 trades in a year or 100000 trades depending if the strategy aims for big profits by trading rarely or for many low profit trades.
Example: 4% profit 650 times vs 0,3% profit a trade 10000 times in a year. If we assume you set the --timerange to 365 days.
Example: 4% profit 650 times vs 0,3% profit a trade 10000 times in a year. If we assume you set the --timerange to 365 days.
Example:
`freqtrade --config config.json --strategy SampleStrategy --hyperopt SampleHyperopt -e 1000 --timerange 20190601-20200601`

View File

@@ -0,0 +1,258 @@
# Configuration
FreqAI is configured through the typical [Freqtrade config file](configuration.md) and the standard [Freqtrade strategy](strategy-customization.md). Examples of FreqAI config and strategy files can be found in `config_examples/config_freqai.example.json` and `freqtrade/templates/FreqaiExampleStrategy.py`, respectively.
## Setting up the configuration file
Although there are plenty of additional parameters to choose from, as highlighted in the [parameter table](freqai-parameter-table.md#parameter-table), a FreqAI config must at minimum include the following parameters (the parameter values are only examples):
```json
"freqai": {
"enabled": true,
"purge_old_models": true,
"train_period_days": 30,
"backtest_period_days": 7,
"identifier" : "unique-id",
"feature_parameters" : {
"include_timeframes": ["5m","15m","4h"],
"include_corr_pairlist": [
"ETH/USD",
"LINK/USD",
"BNB/USD"
],
"label_period_candles": 24,
"include_shifted_candles": 2,
"indicator_periods_candles": [10, 20]
},
"data_split_parameters" : {
"test_size": 0.25
}
}
```
A full example config is available in `config_examples/config_freqai.example.json`.
## Building a FreqAI strategy
The FreqAI strategy requires including the following lines of code in the standard [Freqtrade strategy](strategy-customization.md):
```python
# user should define the maximum startup candle count (the largest number of candles
# passed to any single indicator)
startup_candle_count: int = 20
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# the model will return all labels created by user in `populate_any_indicators`
# (& 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
# `populate_any_indicators()` for each training period.
dataframe = self.freqai.start(dataframe, metadata, self)
return dataframe
def populate_any_indicators(
self, pair, df, tf, informative=None, set_generalized_indicators=False
):
"""
Function designed to automatically generate, name and merge features
from user indicated timeframes in the configuration file. User controls the indicators
passed to the training/prediction by prepending indicators with `'%-' + pair `
(see convention below). I.e. user should not prepend any supporting metrics
(e.g. bb_lowerband below) with % unless they explicitly want to pass that metric to the
model.
:param pair: pair to be used as informative
:param df: strategy dataframe which will receive merges from informatives
:param tf: timeframe of the dataframe which will modify the feature names
:param informative: the dataframe associated with the informative pair
"""
if informative is None:
informative = self.dp.get_pair_dataframe(pair, tf)
# first loop is automatically duplicating indicators for time periods
for t in self.freqai_info["feature_parameters"]["indicator_periods_candles"]:
t = int(t)
informative[f"%-{pair}rsi-period_{t}"] = ta.RSI(informative, timeperiod=t)
informative[f"%-{pair}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t)
informative[f"%-{pair}adx-period_{t}"] = ta.ADX(informative, window=t)
indicators = [col for col in informative if col.startswith("%")]
# This loop duplicates and shifts all indicators to add a sense of recency to data
for n in range(self.freqai_info["feature_parameters"]["include_shifted_candles"] + 1):
if n == 0:
continue
informative_shift = informative[indicators].shift(n)
informative_shift = informative_shift.add_suffix("_shift-" + str(n))
informative = pd.concat((informative, informative_shift), axis=1)
df = merge_informative_pair(df, informative, self.config["timeframe"], tf, ffill=True)
skip_columns = [
(s + "_" + tf) for s in ["date", "open", "high", "low", "close", "volume"]
]
df = df.drop(columns=skip_columns)
# Add generalized indicators here (because in live, it will call this
# function to populate indicators during training). Notice how we ensure not to
# add them multiple times
if set_generalized_indicators:
# user adds targets here by prepending them with &- (see convention below)
# If user wishes to use multiple targets, a multioutput prediction model
# needs to be used such as templates/CatboostPredictionMultiModel.py
df["&-s_close"] = (
df["close"]
.shift(-self.freqai_info["feature_parameters"]["label_period_candles"])
.rolling(self.freqai_info["feature_parameters"]["label_period_candles"])
.mean()
/ df["close"]
- 1
)
return df
```
Notice how the `populate_any_indicators()` is where [features](freqai-feature-engineering.md#feature-engineering) and labels/targets are added. A full example strategy is available in `templates/FreqaiExampleStrategy.py`.
Notice also the location of the labels under `if set_generalized_indicators:` at the bottom of the example. This is where single features and labels/targets should be added to the feature set to avoid duplication of them from various configuration parameters that multiply the feature set, such as `include_timeframes`.
!!! Note
The `self.freqai.start()` function cannot be called outside the `populate_indicators()`.
!!! Note
Features **must** be defined in `populate_any_indicators()`. Defining FreqAI features in `populate_indicators()`
will cause the algorithm to fail in live/dry mode. In order to add generalized features that are not associated with a specific pair or timeframe, the following structure inside `populate_any_indicators()` should be used
(as exemplified in `freqtrade/templates/FreqaiExampleStrategy.py`):
```python
def populate_any_indicators(self, pair, df, tf, informative=None, set_generalized_indicators=False):
...
# Add generalized indicators here (because in live, it will call only this function to populate
# indicators for retraining). Notice how we ensure not to add them multiple times by associating
# these generalized indicators to the basepair/timeframe
if set_generalized_indicators:
df['%-day_of_week'] = (df["date"].dt.dayofweek + 1) / 7
df['%-hour_of_day'] = (df['date'].dt.hour + 1) / 25
# user adds targets here by prepending them with &- (see convention below)
# If user wishes to use multiple targets, a multioutput prediction model
# needs to be used such as templates/CatboostPredictionMultiModel.py
df["&-s_close"] = (
df["close"]
.shift(-self.freqai_info["feature_parameters"]["label_period_candles"])
.rolling(self.freqai_info["feature_parameters"]["label_period_candles"])
.mean()
/ df["close"]
- 1
)
```
Please see the example script located in `freqtrade/templates/FreqaiExampleStrategy.py` for a full example of `populate_any_indicators()`.
## Important dataframe key patterns
Below are the values you can expect to include/use inside a typical strategy dataframe (`df[]`):
| DataFrame Key | Description |
|------------|-------------|
| `df['&*']` | Any dataframe column prepended with `&` in `populate_any_indicators()` 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['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 `populate_any_indicators()` 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.
## Setting the `startup_candle_count`
The `startup_candle_count` in the FreqAI strategy needs to be set up in the same way as in the standard Freqtrade strategy (see details [here](strategy-customization.md#strategy-startup-period)). This value is used by Freqtrade to ensure that a sufficient amount of data is provided when calling the `dataprovider`, to avoid any NaNs at the beginning of the first training. You can easily set this value by identifying the longest period (in candle units) which is passed to the indicator creation functions (e.g., Ta-Lib functions). In the presented example, `startup_candle_count` is 20 since this is the maximum value in `indicators_periods_candles`.
!!! Note
There are instances where the Ta-Lib functions actually require more data than just the passed `period` or else the feature dataset gets populated with NaNs. Anecdotally, multiplying the `startup_candle_count` by 2 always leads to a fully NaN free training dataset. Hence, it is typically safest to multiply the expected `startup_candle_count` by 2. Look out for this log message to confirm that the data is clean:
```
2022-08-31 15:14:04 - freqtrade.freqai.data_kitchen - INFO - dropped 0 training points due to NaNs in populated dataset 4319.
```
## Creating a dynamic target threshold
Deciding when to enter or exit a trade can be done in a dynamic way to reflect current market conditions. FreqAI allows you to return additional information from the training of a model (more info [here](freqai-feature-engineering.md#returning-additional-info-from-training)). For example, the `&*_std/mean` return values describe the statistical distribution of the target/label *during the most recent training*. Comparing a given prediction to these values allows you to know the rarity of the prediction. In `templates/FreqaiExampleStrategy.py`, the `target_roi` and `sell_roi` are defined to be 1.25 z-scores away from the mean which causes predictions that are closer to the mean to be filtered out.
```python
dataframe["target_roi"] = dataframe["&-s_close_mean"] + dataframe["&-s_close_std"] * 1.25
dataframe["sell_roi"] = dataframe["&-s_close_mean"] - dataframe["&-s_close_std"] * 1.25
```
To consider the population of *historical predictions* for creating the dynamic target instead of information from the training as discussed above, you would set `fit_live_predictions_candles` in the config to the number of historical prediction candles you wish to use to generate target statistics.
```json
"freqai": {
"fit_live_predictions_candles": 300,
}
```
If this value is set, FreqAI will initially use the predictions from the training data and subsequently begin introducing real prediction data as it is generated. FreqAI will save this historical data to be reloaded if you stop and restart a model with the same `identifier`.
## Using different prediction models
FreqAI has multiple example prediction model libraries that are ready to be used as is via the flag `--freqaimodel`. These libraries include `CatBoost`, `LightGBM`, and `XGBoost` regression, classification, and multi-target models, and can be found in `freqai/prediction_models/`.
Regression and classification models differ in what targets they predict - a regression model will predict a target of continuous values, for example what price BTC will be at tomorrow, whilst a classifier will predict a target of discrete values, for example if the price of BTC will go up tomorrow or not. This means that you have to specify your targets differently depending on which model type you are using (see details [below](#setting-model-targets)).
All of the aforementioned model libraries implement gradient boosted decision tree algorithms. They all work on the principle of ensemble learning, where predictions from multiple simple learners are combined to get a final prediction that is more stable and generalized. The simple learners in this case are decision trees. Gradient boosting refers to the method of learning, where each simple learner is built in sequence - the subsequent learner is used to improve on the error from the previous learner. If you want to learn more about the different model libraries you can find the information in their respective docs:
* CatBoost: https://catboost.ai/en/docs/
* LightGBM: https://lightgbm.readthedocs.io/en/v3.3.2/#
* XGBoost: https://xgboost.readthedocs.io/en/stable/#
There are also numerous online articles describing and comparing the algorithms. Some relatively light-weight examples would be [CatBoost vs. LightGBM vs. XGBoost — Which is the best algorithm?](https://towardsdatascience.com/catboost-vs-lightgbm-vs-xgboost-c80f40662924#:~:text=In%20CatBoost%2C%20symmetric%20trees%2C%20or,the%20same%20depth%20can%20differ.) and [XGBoost, LightGBM or CatBoost — which boosting algorithm should I use?](https://medium.com/riskified-technology/xgboost-lightgbm-or-catboost-which-boosting-algorithm-should-i-use-e7fda7bb36bc). Keep in mind that the performance of each model is highly dependent on the application and so any reported metrics might not be true for your particular use of the model.
Apart from the models already available in FreqAI, it is also possible to customize and create your own prediction models using the `IFreqaiModel` class. You are encouraged to inherit `fit()`, `train()`, and `predict()` to customize various aspects of the training procedures. You can place custom FreqAI models in `user_data/freqaimodels` - and freqtrade will pick them up from there based on the provided `--freqaimodel` name - which has to correspond to the class name of your custom model.
Make sure to use unique names to avoid overriding built-in models.
### Setting model targets
#### Regressors
If you are using a regressor, you need to specify a target that has continuous values. FreqAI includes a variety of regressors, such as the `CatboostRegressor`via the flag `--freqaimodel CatboostRegressor`. An example of how you could set a regression target for predicting the price 100 candles into the future would be
```python
df['&s-close_price'] = df['close'].shift(-100)
```
If you want to predict multiple targets, you need to define multiple labels using the same syntax as shown above.
#### Classifiers
If you are using a classifier, you need to specify a target that has discrete values. FreqAI includes a variety of classifiers, such as the `CatboostClassifier` via the flag `--freqaimodel CatboostClassifier`. If you elects to use a classifier, the classes need to be set using strings. For example, if you want to predict if the price 100 candles into the future goes up or down you would set
```python
df['&s-up_or_down'] = np.where( df["close"].shift(-100) > df["close"], 'up', 'down')
```
If you want to predict multiple targets you must specify all labels in the same label column. You could, for example, add the label `same` to define where the price was unchanged by setting
```python
df['&s-up_or_down'] = np.where( df["close"].shift(-100) > df["close"], 'up', 'down')
df['&s-up_or_down'] = np.where( df["close"].shift(-100) == df["close"], 'same', df['&s-up_or_down'])
```
### Convolutional Neural Network model
The `CNNPredictionModel` is a non-linear regression based on `Tensorflow` which follows very similar configuration to the other regressors. Feature engineering and label creation remains the same as highlighted [here](#building-a-freqai-strategy) and [here](#setting-model-targets). Control of the model is focused in the `model_training_parameters` configuration dictionary, which accepts any hyperparameter available to the CNN `fit()` function of Tensorflow [more here](https://www.tensorflow.org/api_docs/python/tf/keras/Model#fit). For example, this is where the `epochs` and `batch_size` are controlled:
```json
"model_training_parameters" : {
"batch_size": 64,
"epochs": 10,
"verbose": "auto",
"shuffle": false,
"workers": 1,
"use_multiprocessing": false
}
```
Running the `CNNPredictionModel` is the same as other regressors: `--freqaimodel CNNPredictionModel`.

78
docs/freqai-developers.md Normal file
View File

@@ -0,0 +1,78 @@
# Development
## Project architecture
The architecture and functions of FreqAI are generalized to encourages development of unique features, functions, models, etc.
The class structure and a detailed algorithmic overview is depicted in the following diagram:
![image](assets/freqai_algorithm-diagram.jpg)
As shown, there are three distinct objects comprising FreqAI:
* **IFreqaiModel** - A singular persistent object containing all the necessary logic to collect, store, and process data, engineer features, run training, and inference models.
* **FreqaiDataKitchen** - A non-persistent object which is created uniquely for each unique asset/model. Beyond metadata, it also contains a variety of data processing tools.
* **FreqaiDataDrawer** - A singular persistent object containing all the historical predictions, models, and save/load methods.
There are a variety of built-in [prediction models](freqai-configuration.md#using-different-prediction-models) which inherit directly from `IFreqaiModel`. Each of these models have full access to all methods in `IFreqaiModel` and can therefore override any of those functions at will. However, advanced users will likely stick to overriding `fit()`, `train()`, `predict()`, and `data_cleaning_train/predict()`.
## Data handling
FreqAI aims to organize model files, prediction data, and meta data in a way that simplifies post-processing and enhances crash resilience by automatic data reloading. The data is saved in a file structure,`user_data_dir/models/`, which contains all the data associated with the trainings and backtests. The `FreqaiDataKitchen()` relies heavily on the file structure for proper training and inferencing and should therefore not be manually modified.
### File structure
The file structure is automatically generated based on the model `identifier` set in the [config](freqai-configuration.md#setting-up-the-configuration-file). The following structure shows where the data is stored for post processing:
| Structure | Description |
|-----------|-------------|
| `config_*.json` | A copy of the model specific configuration file. |
| `historic_predictions.pkl` | A file containing all historic predictions generated during the lifetime of the `identifier` model during live deployment. `historic_predictions.pkl` is used to reload the model after a crash or a config change. A backup file is always held in case of corruption on the main file. FreqAI **automatically** detects corruption and replaces the corrupted file with the backup. |
| `pair_dictionary.json` | A file containing the training queue as well as the on disk location of the most recently trained model. |
| `sub-train-*_TIMESTAMP` | A folder containing all the files associated with a single model, such as: <br>
|| `*_metadata.json` - Metadata for the model, such as normalization max/min, expected training feature list, etc. <br>
|| `*_model.*` - The model file saved to disk for reloading from a crash. Can be `joblib` (typical boosting libs), `zip` (stable_baselines), `hd5` (keras type), etc. <br>
|| `*_pca_object.pkl` - The [Principal component analysis (PCA)](freqai-feature-engineering.md#data-dimensionality-reduction-with-principal-component-analysis) transform (if `principal_component_analysis: True` is set in the config) which will be used to transform unseen prediction features. <br>
|| `*_svm_model.pkl` - The [Support Vector Machine (SVM)](freqai-feature-engineering.md#identifying-outliers-using-a-support-vector-machine-svm) model (if `use_SVM_to_remove_outliers: True` is set in the config) which is used to detect outliers in unseen prediction features. <br>
|| `*_trained_df.pkl` - The dataframe containing all the training features used to train the `identifier` model. This is used for computing the [Dissimilarity Index (DI)](freqai-feature-engineering.md#identifying-outliers-with-the-dissimilarity-index-di) and can also be used for post-processing. <br>
|| `*_trained_dates.df.pkl` - The dates associated with the `trained_df.pkl`, which is useful for post-processing. |
The example file structure would look like this:
```
├── models
│   └── unique-id
│   ├── config_freqai.example.json
│   ├── historic_predictions.backup.pkl
│   ├── historic_predictions.pkl
│   ├── pair_dictionary.json
│   ├── sub-train-1INCH_1662821319
│   │   ├── cb_1inch_1662821319_metadata.json
│   │   ├── cb_1inch_1662821319_model.joblib
│   │   ├── cb_1inch_1662821319_pca_object.pkl
│   │   ├── cb_1inch_1662821319_svm_model.joblib
│   │   ├── cb_1inch_1662821319_trained_dates_df.pkl
│   │   └── cb_1inch_1662821319_trained_df.pkl
│   ├── sub-train-1INCH_1662821371
│   │   ├── cb_1inch_1662821371_metadata.json
│   │   ├── cb_1inch_1662821371_model.joblib
│   │   ├── cb_1inch_1662821371_pca_object.pkl
│   │   ├── cb_1inch_1662821371_svm_model.joblib
│   │   ├── cb_1inch_1662821371_trained_dates_df.pkl
│   │   └── cb_1inch_1662821371_trained_df.pkl
│   ├── sub-train-ADA_1662821344
│   │   ├── cb_ada_1662821344_metadata.json
│   │   ├── cb_ada_1662821344_model.joblib
│   │   ├── cb_ada_1662821344_pca_object.pkl
│   │   ├── cb_ada_1662821344_svm_model.joblib
│   │   ├── cb_ada_1662821344_trained_dates_df.pkl
│   │   └── cb_ada_1662821344_trained_df.pkl
│   └── sub-train-ADA_1662821399
│   ├── cb_ada_1662821399_metadata.json
│   ├── cb_ada_1662821399_model.joblib
│   ├── cb_ada_1662821399_pca_object.pkl
│   ├── cb_ada_1662821399_svm_model.joblib
│   ├── cb_ada_1662821399_trained_dates_df.pkl
│   └── cb_ada_1662821399_trained_df.pkl
```

View File

@@ -0,0 +1,268 @@
# Feature engineering
## Defining the features
Low level feature engineering is performed in the user strategy within a function called `populate_any_indicators()`. That function sets the `base features` such as, `RSI`, `MFI`, `EMA`, `SMA`, time of day, volume, etc. The `base features` can be custom indicators or they can be imported from any technical-analysis library that you can find. One important syntax rule is that all `base features` string names are prepended with `%-{pair}`, while labels/targets are prepended with `&`.
!!! Note
Adding the full pair string, e.g. XYZ/USD, in the feature name enables improved performance for dataframe caching on the backend. If you decide *not* to add the full pair string in the feature string, FreqAI will operate in a reduced performance mode.
Meanwhile, high level feature engineering is handled within `"feature_parameters":{}` in the FreqAI config. Within this file, it is possible to decide large scale feature expansions on top of the `base_features` such as "including correlated pairs" or "including informative timeframes" or even "including recent candles."
It is advisable to start from the template `populate_any_indicators()` in the source provided example strategy (found in `templates/FreqaiExampleStrategy.py`) to ensure that the feature definitions are following the correct conventions. Here is an example of how to set the indicators and labels in the strategy:
```python
def populate_any_indicators(
self, pair, df, tf, informative=None, set_generalized_indicators=False
):
"""
Function designed to automatically generate, name, and merge features
from user-indicated timeframes in the configuration file. The user controls the indicators
passed to the training/prediction by prepending indicators with `'%-' + pair `
(see convention below). I.e., the user should not prepend any supporting metrics
(e.g., bb_lowerband below) with % unless they explicitly want to pass that metric to the
model.
:param pair: pair to be used as informative
:param df: strategy dataframe which will receive merges from informatives
:param tf: timeframe of the dataframe which will modify the feature names
:param informative: the dataframe associated with the informative pair
"""
if informative is None:
informative = self.dp.get_pair_dataframe(pair, tf)
# first loop is automatically duplicating indicators for time periods
for t in self.freqai_info["feature_parameters"]["indicator_periods_candles"]:
t = int(t)
informative[f"%-{pair}rsi-period_{t}"] = ta.RSI(informative, timeperiod=t)
informative[f"%-{pair}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t)
informative[f"%-{pair}adx-period_{t}"] = ta.ADX(informative, window=t)
bollinger = qtpylib.bollinger_bands(
qtpylib.typical_price(informative), window=t, stds=2.2
)
informative[f"{pair}bb_lowerband-period_{t}"] = bollinger["lower"]
informative[f"{pair}bb_middleband-period_{t}"] = bollinger["mid"]
informative[f"{pair}bb_upperband-period_{t}"] = bollinger["upper"]
informative[f"%-{pair}bb_width-period_{t}"] = (
informative[f"{pair}bb_upperband-period_{t}"]
- informative[f"{pair}bb_lowerband-period_{t}"]
) / informative[f"{pair}bb_middleband-period_{t}"]
informative[f"%-{pair}close-bb_lower-period_{t}"] = (
informative["close"] / informative[f"{pair}bb_lowerband-period_{t}"]
)
informative[f"%-{pair}relative_volume-period_{t}"] = (
informative["volume"] / informative["volume"].rolling(t).mean()
)
indicators = [col for col in informative if col.startswith("%")]
# This loop duplicates and shifts all indicators to add a sense of recency to data
for n in range(self.freqai_info["feature_parameters"]["include_shifted_candles"] + 1):
if n == 0:
continue
informative_shift = informative[indicators].shift(n)
informative_shift = informative_shift.add_suffix("_shift-" + str(n))
informative = pd.concat((informative, informative_shift), axis=1)
df = merge_informative_pair(df, informative, self.config["timeframe"], tf, ffill=True)
skip_columns = [
(s + "_" + tf) for s in ["date", "open", "high", "low", "close", "volume"]
]
df = df.drop(columns=skip_columns)
# Add generalized indicators here (because in live, it will call this
# function to populate indicators during training). Notice how we ensure not to
# add them multiple times
if set_generalized_indicators:
df["%-day_of_week"] = (df["date"].dt.dayofweek + 1) / 7
df["%-hour_of_day"] = (df["date"].dt.hour + 1) / 25
# user adds targets here by prepending them with &- (see convention below)
# If user wishes to use multiple targets, a multioutput prediction model
# needs to be used such as templates/CatboostPredictionMultiModel.py
df["&-s_close"] = (
df["close"]
.shift(-self.freqai_info["feature_parameters"]["label_period_candles"])
.rolling(self.freqai_info["feature_parameters"]["label_period_candles"])
.mean()
/ df["close"]
- 1
)
return df
```
In the presented example, the user does not wish to pass the `bb_lowerband` as a feature to the model,
and has therefore not prepended it with `%`. The user does, however, wish to pass `bb_width` to the
model for training/prediction and has therefore prepended it with `%`.
After having defined the `base features`, the next step is to expand upon them using the powerful `feature_parameters` in the configuration file:
```json
"freqai": {
//...
"feature_parameters" : {
"include_timeframes": ["5m","15m","4h"],
"include_corr_pairlist": [
"ETH/USD",
"LINK/USD",
"BNB/USD"
],
"label_period_candles": 24,
"include_shifted_candles": 2,
"indicator_periods_candles": [10, 20]
},
//...
}
```
The `include_timeframes` in the config above are the timeframes (`tf`) of each call to `populate_any_indicators()` in the strategy. In the presented case, the user is asking for the `5m`, `15m`, and `4h` timeframes of the `rsi`, `mfi`, `roc`, and `bb_width` to be included in the feature set.
You can ask for each of the defined features to be included also for informative pairs using the `include_corr_pairlist`. This means that the feature set will include all the features from `populate_any_indicators` on all the `include_timeframes` for each of the correlated pairs defined in the config (`ETH/USD`, `LINK/USD`, and `BNB/USD` in the presented example).
`include_shifted_candles` indicates the number of previous candles to include in the feature set. For example, `include_shifted_candles: 2` tells FreqAI to include the past 2 candles for each of the features in the feature set.
In total, the number of features the user of the presented example strat has created is: length of `include_timeframes` * no. features in `populate_any_indicators()` * length of `include_corr_pairlist` * no. `include_shifted_candles` * length of `indicator_periods_candles`
$= 3 * 3 * 3 * 2 * 2 = 108$.
### Returning additional info from training
Important metrics can be returned to the strategy at the end of each model training by assigning them to `dk.data['extra_returns_per_train']['my_new_value'] = XYZ` inside the custom prediction model class.
FreqAI takes the `my_new_value` assigned in this dictionary and expands it to fit the dataframe that is returned to the strategy. You can then use the returned metrics in your strategy through `dataframe['my_new_value']`. An example of how return values can be used in FreqAI are the `&*_mean` and `&*_std` values that are used to [created a dynamic target threshold](freqai-configuration.md#creating-a-dynamic-target-threshold).
Another example, where the user wants to use live metrics from the trade database, is shown below:
```json
"freqai": {
"extra_returns_per_train": {"total_profit": 4}
}
```
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 a the features of a data point are to the most recent historic 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
FreqAI allows you to set a `weight_factor` to weight recent data more strongly than past data via an exponential function:
$$ W_i = \exp(\frac{-i}{\alpha*n}) $$
where $W_i$ is the weight of data point $i$ in a total set of $n$ data points. Below is a figure showing the effect of different weight factors on the data points in a feature set.
![weight-factor](assets/freqai_weight-factor.jpg)
## 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.
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:
```json
"freqai": {
"feature_parameters" : {
"DI_threshold": 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} $$
where $d_{ab}$ is the distance between the normalized points $a$ and $b$, and $p$ is the number of features, i.e., the length of the vector $X$. The characteristic distance, $\overline{d}$, for a set of training data points is simply the mean of the average distances:
$$ \overline{d} = \sum_{a=1}^n(\sum_{b=1}^n(d_{ab}/n)/n) $$
$\overline{d}$ quantifies the spread of the training data, which is compared to the distance between a new prediction feature vectors, $X_k$ and all the training data:
$$ d_k = \arg \min d_{k,i} $$
This enables the estimation of the Dissimilarity Index as:
$$ DI_k = d_k/\overline{d} $$
You can tweak the DI through the `DI_threshold` to increase or decrease the extrapolation of the trained model. A higher `DI_threshold` means that the DI is more lenient and allows predictions further away from the training data to be used whilst a lower `DI_threshold` has the opposite effect and hence discards more predictions.
Below is a figure that describes the DI for a 3D data set.
![DI](assets/freqai_DI.jpg)
### Identifying outliers using a Support Vector Machine (SVM)
You can tell FreqAI to remove outlier data points from the training/test data sets using a Support Vector Machine (SVM) by including the following statement in the config:
```json
"freqai": {
"feature_parameters" : {
"use_SVM_to_remove_outliers": true
}
}
```
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`.
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.
The parameter `nu`, *very* broadly, is the amount of data points that should be considered outliers and should be between 0 and 1.
### Identifying outliers with DBSCAN
You can configure FreqAI to use DBSCAN to cluster and remove outliers from the training/test data set or incoming outliers from predictions, by activating `use_DBSCAN_to_remove_outliers` in the config:
```json
"freqai": {
"feature_parameters" : {
"use_DBSCAN_to_remove_outliers": true
}
}
```
DBSCAN 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$.
![dbscan](assets/freqai_dbscan.jpg)
FreqAI uses `sklearn.cluster.DBSCAN` (details are available on scikit-learn's webpage [here](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html) (external website)) with `min_samples` ($N$) taken as 1/4 of the no. of time points (candles) in the feature set. `eps` ($\varepsilon$) is computed automatically as the elbow point in the *k-distance graph* computed from the nearest neighbors in the pairwise distances of all data points in the feature set.

View File

@@ -0,0 +1,94 @@
# Parameter table
The table below will list all configuration parameters available for FreqAI. Some of the parameters are exemplified in `config_examples/config_freqai.example.json`.
Mandatory parameters are marked as **Required** and have to be set in one of the suggested ways.
### General configuration parameters
| Parameter | Description |
|------------|-------------|
| | **General configuration parameters within the `config.freqai` tree**
| `freqai` | **Required.** <br> The parent dictionary containing all the parameters for controlling FreqAI. <br> **Datatype:** Dictionary.
| `train_period_days` | **Required.** <br> Number of days to use for the training data (width of the sliding window). <br> **Datatype:** Positive integer.
| `backtest_period_days` | **Required.** <br> Number of days to inference from the trained model before sliding the `train_period_days` window defined above, and retraining the model during backtesting (more info [here](freqai-running.md#backtesting)). This can be fractional days, but beware that the provided `timerange` will be divided by this number to yield the number of trainings necessary to complete the backtest. <br> **Datatype:** Float.
| `identifier` | **Required.** <br> A unique ID for the current model. If models are saved to disk, the `identifier` allows for reloading specific pre-trained models/data. <br> **Datatype:** String.
| `live_retrain_hours` | Frequency of retraining during dry/live runs. <br> **Datatype:** Float > 0. <br> Default: `0` (models retrain as often as possible).
| `expiration_hours` | Avoid making predictions if a model is more than `expiration_hours` old. <br> **Datatype:** Positive integer. <br> Default: `0` (models never expire).
| `purge_old_models` | Delete obsolete models. <br> **Datatype:** Boolean. <br> Default: `False` (all historic models remain on disk).
| `save_backtest_models` | Save models to disk when running backtesting. Backtesting operates most efficiently by saving the prediction data and reusing them directly for subsequent runs (when you wish to tune entry/exit parameters). Saving backtesting models to disk also allows to use the same model files for starting a dry/live instance with the same model `identifier`. <br> **Datatype:** Boolean. <br> Default: `False` (no models are saved).
| `fit_live_predictions_candles` | Number of historical candles to use for computing target (label) statistics from prediction data, instead of from the training dataset (more information can be found [here](freqai-configuration.md#creating-a-dynamic-target-threshold)). <br> **Datatype:** Positive integer.
| `follow_mode` | Use a `follower` that will look for models associated with a specific `identifier` and load those for inferencing. A `follower` will **not** train new models. <br> **Datatype:** Boolean. <br> Default: `False`.
| `continual_learning` | Use the final state of the most recently trained model as starting point for the new model, allowing for incremental learning (more information can be found [here](freqai-running.md#continual-learning)). <br> **Datatype:** Boolean. <br> Default: `False`.
| `write_metrics_to_disk` | Collect train timings, inference timings and cpu usage in json file. <br> **Datatype:** Boolean. <br> Default: `False`
| `data_kitchen_thread_count` | <br> Designate the number of threads you want to use for data processing (outlier methods, normalization, etc.). This has no impact on the number of threads used for training. If user does not set it (default), FreqAI will use max number of threads - 2 (leaving 1 physical core available for Freqtrade bot and FreqUI) <br> **Datatype:** Positive integer.
### Feature parameters
| Parameter | Description |
|------------|-------------|
| | **Feature parameters within the `freqai.feature_parameters` sub dictionary**
| `feature_parameters` | A dictionary containing the parameters used to engineer the feature set. Details and examples are shown [here](freqai-feature-engineering.md). <br> **Datatype:** Dictionary.
| `include_timeframes` | A list of timeframes that all indicators in `populate_any_indicators` will be created for. The list is added as features to the base indicators dataset. <br> **Datatype:** List of timeframes (strings).
| `include_corr_pairlist` | A list of correlated coins that FreqAI will add as additional features to all `pair_whitelist` coins. All indicators set in `populate_any_indicators` during feature engineering (see details [here](freqai-feature-engineering.md)) will be created for each correlated coin. The correlated coins features are added to the base indicators dataset. <br> **Datatype:** List of assets (strings).
| `label_period_candles` | Number of candles into the future that the labels are created for. This is used in `populate_any_indicators` (see `templates/FreqaiExampleStrategy.py` for detailed usage). You can create custom labels and choose whether to make use of this parameter or not. <br> **Datatype:** Positive integer.
| `include_shifted_candles` | Add features from previous candles to subsequent candles with the intent of adding historical information. If used, FreqAI will duplicate and shift all features from the `include_shifted_candles` previous candles so that the information is available for the subsequent candle. <br> **Datatype:** Positive integer.
| `weight_factor` | Weight training data points according to their recency (see details [here](freqai-feature-engineering.md#weighting-features-for-temporal-importance)). <br> **Datatype:** Positive float (typically < 1).
| `indicator_max_period_candles` | **No longer used (#7325)**. Replaced by `startup_candle_count` which is set in the [strategy](freqai-configuration.md#building-a-freqai-strategy). `startup_candle_count` is timeframe independent and defines the maximum *period* used in `populate_any_indicators()` for indicator creation. FreqAI uses this parameter together with the maximum timeframe in `include_time_frames` to calculate how many data points to download such that the first data point does not include a NaN. <br> **Datatype:** Positive integer.
| `indicator_periods_candles` | Time periods to calculate indicators for. The indicators are added to the base indicator dataset. <br> **Datatype:** List of positive integers.
| `principal_component_analysis` | Automatically reduce the dimensionality of the data set using Principal Component Analysis. See details about how it works [here](#reducing-data-dimensionality-with-principal-component-analysis) <br> **Datatype:** Boolean. <br> Default: `False`.
| `plot_feature_importances` | Create a feature importance plot for each model for the top/bottom `plot_feature_importances` number of features. Plot is stored in `user_data/models/<identifier>/sub-train-<COIN>_<timestamp>.html`. <br> **Datatype:** Integer. <br> Default: `0`.
| `DI_threshold` | Activates the use of the Dissimilarity Index for outlier detection when set to > 0. See details about how it works [here](freqai-feature-engineering.md#identifying-outliers-with-the-dissimilarity-index-di). <br> **Datatype:** Positive float (typically < 1).
| `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).
### Data split parameters
| Parameter | Description |
|------------|-------------|
| | **Data split parameters within the `freqai.data_split_parameters` sub dictionary**
| `data_split_parameters` | Include any additional parameters available from Scikit-learn `test_train_split()`, which are shown [here](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) (external website). <br> **Datatype:** Dictionary.
| `test_size` | The fraction of data that should be used for testing instead of training. <br> **Datatype:** Positive float < 1.
| `shuffle` | Shuffle the training data points during training. Typically, to not remove the chronological order of data in time-series forecasting, this is set to `False`. <br> **Datatype:** Boolean. <br> Defaut: `False`.
### Model training parameters
| Parameter | Description |
|------------|-------------|
| | **Model training parameters within the `freqai.model_training_parameters` sub dictionary**
| `model_training_parameters` | A flexible dictionary that includes all parameters available by the selected model library. For example, if you use `LightGBMRegressor`, this dictionary can contain any parameter available by the `LightGBMRegressor` [here](https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMRegressor.html) (external website). If you select a different model, this dictionary can contain any parameter from that model. A list of the currently available models can be found [here](freqai-configuration.md#using-different-prediction-models). <br> **Datatype:** Dictionary.
| `n_estimators` | The number of boosted trees to fit in the training of the model. <br> **Datatype:** Integer.
| `learning_rate` | Boosting learning rate during training of the model. <br> **Datatype:** Float.
| `n_jobs`, `thread_count`, `task_type` | Set the number of threads for parallel processing and the `task_type` (`gpu` or `cpu`). Different model libraries use different parameter names. <br> **Datatype:** Float.
### Reinforcement Learning parameters
| Parameter | Description |
|------------|-------------|
| | **Reinforcement Learning Parameters within the `freqai.rl_config` sub dictionary**
| `rl_config` | A dictionary containing the control parameters for a Reinforcement Learning model. <br> **Datatype:** Dictionary.
| `train_cycles` | Training time steps will be set based on the `train_cycles * number of training data points. <br> **Datatype:** Integer.
| `cpu_count` | Number of processors to dedicate to the Reinforcement Learning training process. <br> **Datatype:** int.
| `max_trade_duration_candles`| Guides the agent training to keep trades below desired length. Example usage shown in `prediction_models/ReinforcementLearner.py` within the customizable `calculate_reward()` function. <br> **Datatype:** int.
| `model_type` | Model string from stable_baselines3 or SBcontrib. Available strings include: `'TRPO', 'ARS', 'RecurrentPPO', 'MaskablePPO', 'PPO', 'A2C', 'DQN'`. User should ensure that `model_training_parameters` match those available to the corresponding stable_baselines3 model by visiting their documentaiton. [PPO doc](https://stable-baselines3.readthedocs.io/en/master/modules/ppo.html) (external website) <br> **Datatype:** string.
| `policy_type` | One of the available policy types from stable_baselines3 <br> **Datatype:** string.
| `max_training_drawdown_pct` | The maximum drawdown that the agent is allowed to experience during training. <br> **Datatype:** float. <br> Default: 0.8
| `cpu_count` | Number of threads/cpus to dedicate to the Reinforcement Learning training process (depending on if `ReinforcementLearning_multiproc` is selected or not). Recommended to leave this untouched, by default, this value is set to the total number of physical cores minus 1. <br> **Datatype:** int.
| `model_reward_parameters` | Parameters used inside the customizable `calculate_reward()` function in `ReinforcementLearner.py` <br> **Datatype:** int.
| `add_state_info` | Tell FreqAI to include state information in the feature set for training and inferencing. The current state variables include trade duration, current profit, trade position. This is only available in dry/live runs, and is automatically switched to false for backtesting. <br> **Datatype:** bool. <br> Default: `False`.
| `net_arch` | Network architecture which is well described in [`stable_baselines3` doc](https://stable-baselines3.readthedocs.io/en/master/guide/custom_policy.html#examples). In summary: `[<shared layers>, dict(vf=[<non-shared value network layers>], pi=[<non-shared policy network layers>])]`. By default this is set to `[128, 128]`, which defines 2 shared hidden layers with 128 units each.
| `randomize_starting_position` | Randomize the starting point of each episode to avoid overfitting. <br> **Datatype:** bool. <br> Default: `False`.
### Additional parameters
| Parameter | Description |
|------------|-------------|
| | **Extraneous parameters**
| `freqai.keras` | If the selected model makes use of Keras (typical for Tensorflow-based prediction models), this flag should be activated so that the model save/loading follows Keras standards. If the the provided `CNNPredictionModel` is used, then this is handled automatically. <br> **Datatype:** Boolean. <br> Default: `False`.
| `freqai.conv_width` | The width of a convolutional neural network input tensor. This replaces the need for shifting candles (`include_shifted_candles`) by feeding in historical data points as the second dimension of the tensor. Technically, this parameter can also be used for regressors, but it only adds computational overhead and does not change the model training/prediction. <br> **Datatype:** Integer. <br> Default: `2`.
| `freqai.reduce_df_footprint` | Recast all numeric columns to float32/int32, with the objective of reducing ram/disk usage and decreasing train/inference timing. This parameter is set in the main level of the Freqtrade configuration file (not inside FreqAI). <br> **Datatype:** Boolean. <br> Default: `False`.

View File

@@ -0,0 +1,286 @@
# Reinforcement Learning
!!! Note "Installation size"
Reinforcement learning dependencies include large packages such as `torch`, which should be explicitly requested during `./setup.sh -i` by answering "y" to the question "Do you also want dependencies for freqai-rl (~700mb additional space required) [y/N]?".
Users who prefer docker should ensure they use the docker image appended with `_freqairl`.
## Background and terminology
### What is RL and why does FreqAI need it?
Reinforcement learning involves two important components, the *agent* and the training *environment*. During agent training, the agent moves through historical data candle by candle, always making 1 of a set of actions: Long entry, long exit, short entry, short exit, neutral). During this training process, the environment tracks the performance of these actions and rewards the agent according to a custom user made `calculate_reward()` (here we offer a default reward for users to build on if they wish [details here](#creating-a-custom-reward-function)). The reward is used to train weights in a neural network.
A second important component of the FreqAI RL implementation is the use of *state* information. State information is fed into the network at each step, including current profit, current position, and current trade duration. These are used to train the agent in the training environment, and to reinforce the agent in dry/live (this functionality is not available in backtesting). *FreqAI + Freqtrade is a perfect match for this reinforcing mechanism since this information is readily available in live deployments.*
Reinforcement learning is a natural progression for FreqAI, since it adds a new layer of adaptivity and market reactivity that Classifiers and Regressors cannot match. However, Classifiers and Regressors have strengths that RL does not have such as robust predictions. Improperly trained RL agents may find "cheats" and "tricks" to maximize reward without actually winning any trades. For this reason, RL is more complex and demands a higher level of understanding than typical Classifiers and Regressors.
### The RL interface
With the current framework, we aim to expose the training environment via the common "prediction model" file, which is a user inherited `BaseReinforcementLearner` object (e.g. `freqai/prediction_models/ReinforcementLearner`). Inside this user class, the RL environment is available and customized via `MyRLEnv` as [shown below](#creating-a-custom-reward-function).
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.
### Important considerations
As explained above, the agent is "trained" in an artificial trading "environment". In our case, that environment may seem quite similar to a real Freqtrade backtesting environment, but it is *NOT*. In fact, the RL training environment is much more simplified. It does not incorporate any of the complicated strategy logic, such as callbacks like `custom_exit`, `custom_stoploss`, leverage controls, etc. The RL environment is instead a very "raw" representation of the true market, where the agent has free-will to learn the policy (read: stoploss, take profit, etc.) which is enforced by the `calculate_reward()`. Thus, it is important to consider that the agent training environment is not identical to the real world.
## Running Reinforcement Learning
Setting up and running a Reinforcement Learning model is the same as running a Regressor or Classifier. The same two flags, `--freqaimodel` and `--strategy`, must be defined on the command line:
```bash
freqtrade trade --freqaimodel ReinforcementLearner --strategy MyRLStrategy --config config.json
```
where `ReinforcementLearner` will use the templated `ReinforcementLearner` from `freqai/prediction_models/ReinforcementLearner` (or a custom user defined one located in `user_data/freqaimodels`). The strategy, on the other hand, follows the same base [feature engineering](freqai-feature-engineering.md) with `populate_any_indicators` as a typical Regressor:
```python
def populate_any_indicators(
self, pair, df, tf, informative=None, set_generalized_indicators=False
):
if informative is None:
informative = self.dp.get_pair_dataframe(pair, tf)
# first loop is automatically duplicating indicators for time periods
for t in self.freqai_info["feature_parameters"]["indicator_periods_candles"]:
t = int(t)
informative[f"%-{pair}rsi-period_{t}"] = ta.RSI(informative, timeperiod=t)
informative[f"%-{pair}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t)
informative[f"%-{pair}adx-period_{t}"] = ta.ADX(informative, window=t)
# The following raw price values are necessary for RL models
informative[f"%-{pair}raw_close"] = informative["close"]
informative[f"%-{pair}raw_open"] = informative["open"]
informative[f"%-{pair}raw_high"] = informative["high"]
informative[f"%-{pair}raw_low"] = informative["low"]
indicators = [col for col in informative if col.startswith("%")]
# This loop duplicates and shifts all indicators to add a sense of recency to data
for n in range(self.freqai_info["feature_parameters"]["include_shifted_candles"] + 1):
if n == 0:
continue
informative_shift = informative[indicators].shift(n)
informative_shift = informative_shift.add_suffix("_shift-" + str(n))
informative = pd.concat((informative, informative_shift), axis=1)
df = merge_informative_pair(df, informative, self.config["timeframe"], tf, ffill=True)
skip_columns = [
(s + "_" + tf) for s in ["date", "open", "high", "low", "close", "volume"]
]
df = df.drop(columns=skip_columns)
# Add generalized indicators here (because in live, it will call this
# function to populate indicators during training). Notice how we ensure not to
# add them multiple times
if set_generalized_indicators:
# For RL, there are no direct targets to set. This is filler (neutral)
# until the agent sends an action.
df["&-action"] = 0
return df
```
Most of the function remains the same as for typical Regressors, however, the function above shows how the strategy must pass the raw price data to the agent so that it has access to raw OHLCV in the training environment:
```python
# The following features are necessary for RL models
informative[f"%-{pair}raw_close"] = informative["close"]
informative[f"%-{pair}raw_open"] = informative["open"]
informative[f"%-{pair}raw_high"] = informative["high"]
informative[f"%-{pair}raw_low"] = informative["low"]
```
Finally, there is no explicit "label" to make - instead it is necessary to assign the `&-action` column which will contain the agent's actions when accessed in `populate_entry/exit_trends()`. In the present example, the neutral action to 0. This value should align with the environment used. FreqAI provides two environments, both use 0 as the neutral action.
After users realize there are no labels to set, they will soon understand that the agent is making its "own" entry and exit decisions. This makes strategy construction rather simple. The entry and exit signals come from the agent in the form of an integer - which are used directly to decide entries and exits in the strategy:
```python
def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
enter_long_conditions = [df["do_predict"] == 1, df["&-action"] == 1]
if enter_long_conditions:
df.loc[
reduce(lambda x, y: x & y, enter_long_conditions), ["enter_long", "enter_tag"]
] = (1, "long")
enter_short_conditions = [df["do_predict"] == 1, df["&-action"] == 3]
if enter_short_conditions:
df.loc[
reduce(lambda x, y: x & y, enter_short_conditions), ["enter_short", "enter_tag"]
] = (1, "short")
return df
def populate_exit_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
exit_long_conditions = [df["do_predict"] == 1, df["&-action"] == 2]
if exit_long_conditions:
df.loc[reduce(lambda x, y: x & y, exit_long_conditions), "exit_long"] = 1
exit_short_conditions = [df["do_predict"] == 1, df["&-action"] == 4]
if exit_short_conditions:
df.loc[reduce(lambda x, y: x & y, exit_short_conditions), "exit_short"] = 1
return df
```
It is important to consider that `&-action` depends on which environment they choose to use. The example above shows 5 actions, where 0 is neutral, 1 is enter long, 2 is exit long, 3 is enter short and 4 is exit short.
## Configuring the Reinforcement Learner
In order to configure the `Reinforcement Learner` the following dictionary must exist in the `freqai` config:
```json
"rl_config": {
"train_cycles": 25,
"add_state_info": true,
"max_trade_duration_candles": 300,
"max_training_drawdown_pct": 0.02,
"cpu_count": 8,
"model_type": "PPO",
"policy_type": "MlpPolicy",
"model_reward_parameters": {
"rr": 1,
"profit_aim": 0.025
}
}
```
Parameter details can be found [here](freqai-parameter-table.md), but in general the `train_cycles` decides how many times the agent should cycle through the candle data in its artificial environment to train weights in the model. `model_type` is a string which selects one of the available models in [stable_baselines](https://stable-baselines3.readthedocs.io/en/master/)(external link).
!!! Note
If you would like to experiment with `continual_learning`, then you should set that value to `true` in the main `freqai` configuration dictionary. This will tell the Reinforcement Learning library to continue training new models from the final state of previous models, instead of retraining new models from scratch each time a retrain is initiated.
!!! Note
Remember that the general `model_training_parameters` dictionary should contain all the model hyperparameter customizations for the particular `model_type`. For example, `PPO` parameters can be found [here](https://stable-baselines3.readthedocs.io/en/master/modules/ppo.html).
## Creating a custom reward function
As you begin to modify the strategy and the prediction model, you will quickly realize some important differences between the Reinforcement Learner and the Regressors/Classifiers. Firstly, the strategy does not set a target value (no labels!). Instead, you set the `calculate_reward()` function inside the `MyRLEnv` class (see below). A default `calculate_reward()` is provided inside `prediction_models/ReinforcementLearner.py` to demonstrate the necessary building blocks for creating rewards, but users are encouraged to create their own custom reinforcement learning model class (see below) and save it to `user_data/freqaimodels`. It is inside the `calculate_reward()` where creative theories about the market can be expressed. For example, you can reward your agent when it makes a winning trade, and penalize the agent when it makes a losing trade. Or perhaps, you wish to reward the agent for entering trades, and penalize the agent for sitting in trades too long. Below we show examples of how these rewards are all calculated:
```python
from freqtrade.freqai.prediction_models.ReinforcementLearner import ReinforcementLearner
from freqtrade.freqai.RL.Base5ActionRLEnv import Actions, Base5ActionRLEnv, Positions
class MyCoolRLModel(ReinforcementLearner):
"""
User created RL prediction model.
Save this file to `freqtrade/user_data/freqaimodels`
then use it with:
freqtrade trade --freqaimodel MyCoolRLModel --config config.json --strategy SomeCoolStrat
Here the users can override any of the functions
available in the `IFreqaiModel` inheritance tree. Most importantly for RL, this
is where the user overrides `MyRLEnv` (see below), to define custom
`calculate_reward()` function, or to override any other parts of the environment.
This class also allows users to override any other part of the IFreqaiModel tree.
For example, the user can override `def fit()` or `def train()` or `def predict()`
to take fine-tuned control over these processes.
Another common override may be `def data_cleaning_predict()` where the user can
take fine-tuned control over the data handling pipeline.
"""
class MyRLEnv(Base5ActionRLEnv):
"""
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.
"""
def calculate_reward(self, action: int) -> float:
# first, penalize if the action is not valid
if not self._is_valid(action):
return -2
pnl = self.get_unrealized_profit()
factor = 100
# reward agent for entering trades
if action in (Actions.Long_enter.value, Actions.Short_enter.value) \
and self._position == Positions.Neutral:
return 25
# discourage agent from not entering trades
if action == Actions.Neutral.value and self._position == Positions.Neutral:
return -1
max_trade_duration = self.rl_config.get('max_trade_duration_candles', 300)
trade_duration = self._current_tick - self._last_trade_tick
if trade_duration <= max_trade_duration:
factor *= 1.5
elif trade_duration > max_trade_duration:
factor *= 0.5
# discourage sitting in position
if self._position in (Positions.Short, Positions.Long) and \
action == Actions.Neutral.value:
return -1 * trade_duration / max_trade_duration
# close long
if action == Actions.Long_exit.value and self._position == Positions.Long:
if pnl > self.profit_aim * self.rr:
factor *= self.rl_config['model_reward_parameters'].get('win_reward_factor', 2)
return float(pnl * factor)
# close short
if action == Actions.Short_exit.value and self._position == Positions.Short:
if pnl > self.profit_aim * self.rr:
factor *= self.rl_config['model_reward_parameters'].get('win_reward_factor', 2)
return float(pnl * factor)
return 0.
```
### Using Tensorboard
Reinforcement Learning models benefit from tracking training metrics. FreqAI has integrated Tensorboard to allow users to track training and evaluation performance across all coins and across all retrainings. Tensorboard is activated via the following command:
```bash
cd freqtrade
tensorboard --logdir user_data/models/unique-id
```
where `unique-id` is the `identifier` set in the `freqai` configuration file. This command must be run in a separate shell to view the output in their browser at 127.0.0.1:6006 (6006 is the default port used by Tensorboard).
![tensorboard](assets/tensorboard.jpg)
### Custom logging
FreqAI also provides a built in episodic summary logger called `self.tensorboard_log` for adding custom information to the Tensorboard log. By default, this function is already called once per step inside the environment to record the agent actions. All values accumulated for all steps in a single episode are reported at the conclusion of each episode, followed by a full reset of all metrics to 0 in preparation for the subsequent episode.
`self.tensorboard_log` can also be used anywhere inside the environment, for example, it can be added to the `calculate_reward` function to collect more detailed information about how often various parts of the reward were called:
```py
class MyRLEnv(Base5ActionRLEnv):
"""
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.
"""
def calculate_reward(self, action: int) -> float:
if not self._is_valid(action):
self.tensorboard_log("is_valid")
return -2
```
!!! Note
The `self.tensorboard_log()` function is designed for tracking incremented objects only i.e. events, actions inside the training environment. If the event of interest is a float, the float can be passed as the second argument e.g. `self.tensorboard_log("float_metric1", 0.23)` would add 0.23 to `float_metric`. In this case you can also disable incrementing using `inc=False` parameter.
### Choosing a base environment
FreqAI provides two base environments, `Base4ActionEnvironment` and `Base5ActionEnvironment`. As the names imply, the environments are customized for agents that can select from 4 or 5 actions. In the `Base4ActionEnvironment`, the agent can enter long, enter short, hold neutral, or exit position. Meanwhile, in the `Base5ActionEnvironment`, the agent has the same actions as Base4, but instead of a single exit action, it separates exit long and exit short. The main changes stemming from the environment selection include:
* the actions available in the `calculate_reward`
* the actions consumed by the user strategy
Both of the FreqAI provided environments inherit from an action/position agnostic environment object called the `BaseEnvironment`, which contains all shared logic. The architecture is designed to be easily customized. The simplest customization is the `calculate_reward()` (see details [here](#creating-a-custom-reward-function)). However, the customizations can be further extended into any of the functions inside the environment. You can do this by simply overriding those functions inside your `MyRLEnv` in the prediction model file. Or for more advanced customizations, it is encouraged to create an entirely new environment inherited from `BaseEnvironment`.
!!! Note
FreqAI does not provide by default, a long-only training environment. However, creating one should be as simple as copy-pasting one of the built in environments and removing the `short` actions (and all associated references to those).

180
docs/freqai-running.md Normal file
View File

@@ -0,0 +1,180 @@
# Running FreqAI
There are two ways to train and deploy an adaptive machine learning model - live deployment and historical backtesting. In both cases, FreqAI runs/simulates periodic retraining of models as shown in the following figure:
![freqai-window](assets/freqai_moving-window.jpg)
## Live deployments
FreqAI can be run dry/live using the following command:
```bash
freqtrade trade --strategy FreqaiExampleStrategy --config config_freqai.example.json --freqaimodel LightGBMRegressor
```
When launched, FreqAI will start training a new model, with a new `identifier`, based on the config settings. Following training, the model will be used to make predictions on incoming candles until a new model is available. New models are typically generated as often as possible, with FreqAI managing an internal queue of the coin pairs to try to keep all models equally up to date. FreqAI will always use the most recently trained model to make predictions on incoming live data. If you do not want FreqAI to retrain new models as often as possible, you can set `live_retrain_hours` to tell FreqAI to wait at least that number of hours before training a new model. Additionally, you can set `expired_hours` to tell FreqAI to avoid making predictions on models that are older than that number of hours.
Trained models are by default saved to disk to allow for reuse during backtesting or after a crash. You can opt to [purge old models](#purging-old-model-data) to save disk space by setting `"purge_old_models": true` in the config.
To start a dry/live run from a saved backtest model (or from a previously crashed dry/live session), you only need to specify the `identifier` of the specific model:
```json
"freqai": {
"identifier": "example",
"live_retrain_hours": 0.5
}
```
In this case, although FreqAI will initiate with a pre-trained model, it will still check to see how much time has elapsed since the model was trained. If a full `live_retrain_hours` has elapsed since the end of the loaded model, FreqAI will start training a new model.
### Automatic data download
FreqAI automatically downloads the proper amount of data needed to ensure training of a model through the defined `train_period_days` and `startup_candle_count` (see the [parameter table](freqai-parameter-table.md) for detailed descriptions of these parameters).
### Saving prediction data
All predictions made during the lifetime of a specific `identifier` model are stored in `historic_predictions.pkl` to allow for reloading after a crash or changes made to the config.
### Purging old model data
FreqAI stores new model files after each successful training. These files become obsolete as new models are generated to adapt to new market conditions. If you are planning to leave FreqAI running for extended periods of time with high frequency retraining, you should enable `purge_old_models` in the config:
```json
"freqai": {
"purge_old_models": true,
}
```
This will automatically purge all models older than the two most recently trained ones to save disk space.
## Backtesting
The FreqAI backtesting module can be executed with the following command:
```bash
freqtrade backtesting --strategy FreqaiExampleStrategy --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --freqaimodel LightGBMRegressor --timerange 20210501-20210701
```
If this command has never been executed with the existing config file, FreqAI will train a new model
for each pair, for each backtesting window within the expanded `--timerange`.
Backtesting mode requires [downloading the necessary data](#downloading-data-to-cover-the-full-backtest-period) before deployment (unlike in dry/live mode where FreqAI handles the data downloading automatically). You should be careful to consider that the time range of the downloaded data is more than the backtesting time range. This is because FreqAI needs data prior to the desired backtesting time range in order to train a model to be ready to make predictions on the first candle of the set backtesting time range. More details on how to calculate the data to download can be found [here](#deciding-the-size-of-the-sliding-training-window-and-backtesting-duration).
!!! Note "Model reuse"
Once the training is completed, you can execute the backtesting again with the same config file and
FreqAI will find the trained models and load them instead of spending time training. This is useful
if you want to tweak (or even hyperopt) buy and sell criteria inside the strategy. If you
*want* to retrain a new model with the same config file, you should simply change the `identifier`.
This way, you can return to using any model you wish by simply specifying the `identifier`.
---
### Saving prediction data
To allow for tweaking your strategy (**not** the features!), FreqAI will automatically save the predictions during backtesting so that they can be reused for future backtests and live runs using the same `identifier` model. This provides a performance enhancement geared towards enabling **high-level hyperopting** of entry/exit criteria.
An additional directory called `backtesting_predictions`, which contains all the predictions stored in `hdf` format, will be created in the `unique-id` folder.
To change your **features**, you **must** set a new `identifier` in the config to signal to FreqAI to train new models.
To save the models generated during a particular backtest so that you can start a live deployment from one of them instead of training a new model, you must set `save_backtest_models` to `True` in the config.
### Backtest live collected predictions
FreqAI allow you to reuse live historic predictions through the backtest parameter `--freqai-backtest-live-models`. This can be useful when you want to reuse predictions generated in dry/run for comparison or other study.
The `--timerange` parameter must not be informed, as it will be automatically calculated through the data in the historic predictions file.
### Downloading data to cover the full backtest period
For live/dry deployments, FreqAI will download the necessary data automatically. However, to use backtesting functionality, you need to download the necessary data using `download-data` (details [here](data-download.md#data-downloading)). You need to pay careful attention to understanding how much *additional* data needs to be downloaded to ensure that there is a sufficient amount of training data *before* the start of the backtesting time range. The amount of additional data can be roughly estimated by moving the start date of the time range backwards by `train_period_days` and the `startup_candle_count` (see the [parameter table](freqai-parameter-table.md) for detailed descriptions of these parameters) from the beginning of the desired backtesting time range.
As an example, to backtest the `--timerange 20210501-20210701` using the [example config](freqai-configuration.md#setting-up-the-configuration-file) which sets `train_period_days` to 30, together with `startup_candle_count: 40` on a maximum `include_timeframes` of 1h, the start date for the downloaded data needs to be `20210501` - 30 days - 40 * 1h / 24 hours = 20210330 (31.7 days earlier than the start of the desired training time range).
### Deciding the size of the sliding training window and backtesting duration
The backtesting time range is defined with the typical `--timerange` parameter in the configuration file. The duration of the sliding training window is set by `train_period_days`, whilst `backtest_period_days` is the sliding backtesting window, both in number of days (`backtest_period_days` can be
a float to indicate sub-daily retraining in live/dry mode). In the presented [example config](freqai-configuration.md#setting-up-the-configuration-file) (found in `config_examples/config_freqai.example.json`), the user is asking FreqAI to use a training period of 30 days and backtest on the subsequent 7 days. After the training of the model, FreqAI will backtest the subsequent 7 days. The "sliding window" then moves one week forward (emulating FreqAI retraining once per week in live mode) and the new model uses the previous 30 days (including the 7 days used for backtesting by the previous model) to train. This is repeated until the end of `--timerange`. This means that if you set `--timerange 20210501-20210701`, FreqAI will have trained 8 separate models at the end of `--timerange` (because the full range comprises 8 weeks).
!!! Note
Although fractional `backtest_period_days` is allowed, you should be aware that the `--timerange` is divided by this value to determine the number of models that FreqAI will need to train in order to backtest the full range. For example, by setting a `--timerange` of 10 days, and a `backtest_period_days` of 0.1, FreqAI will need to train 100 models per pair to complete the full backtest. Because of this, a true backtest of FreqAI adaptive training would take a *very* long time. The best way to fully test a model is to run it dry and let it train constantly. In this case, backtesting would take the exact same amount of time as a dry run.
## Defining model expirations
During dry/live mode, FreqAI trains each coin pair sequentially (on separate threads/GPU from the main Freqtrade bot). This means that there is always an age discrepancy between models. If you are training on 50 pairs, and each pair requires 5 minutes to train, the oldest model will be over 4 hours old. This may be undesirable if the characteristic time scale (the trade duration target) for a strategy is less than 4 hours. You can decide to only make trade entries if the model is less than a certain number of hours old by setting the `expiration_hours` in the config file:
```json
"freqai": {
"expiration_hours": 0.5,
}
```
In the presented example config, the user will only allow predictions on models that are less than 1/2 hours old.
## Controlling the model learning process
Model training parameters are unique to the selected machine learning library. FreqAI allows you to set any parameter for any library using the `model_training_parameters` dictionary in the config. The example config (found in `config_examples/config_freqai.example.json`) shows some of the example parameters associated with `Catboost` and `LightGBM`, but you can add any parameters available in those libraries or any other machine learning library you choose to implement.
Data split parameters are defined in `data_split_parameters` which can be any parameters associated with Scikit-learn's `train_test_split()` function. `train_test_split()` has a parameters called `shuffle` which allows to shuffle the data or keep it unshuffled. This is particularly useful to avoid biasing training with temporally auto-correlated data. More details about these parameters can be found the [Scikit-learn website](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) (external website).
The FreqAI specific parameter `label_period_candles` defines the offset (number of candles into the future) used for the `labels`. In the presented [example config](freqai-configuration.md#setting-up-the-configuration-file), the user is asking for `labels` that are 24 candles in the future.
## Continual learning
You can choose to adopt a continual learning scheme by setting `"continual_learning": true` in the config. By enabling `continual_learning`, after training an initial model from scratch, subsequent trainings will start from the final model state of the preceding training. This gives the new model a "memory" of the previous state. By default, this is set to `False` which means that all new models are trained from scratch, without input from previous models.
## Hyperopt
You can hyperopt using the same command as for [typical Freqtrade hyperopt](hyperopt.md):
```bash
freqtrade hyperopt --hyperopt-loss SharpeHyperOptLoss --strategy FreqaiExampleStrategy --freqaimodel LightGBMRegressor --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --timerange 20220428-20220507
```
`hyperopt` requires you to have the data pre-downloaded in the same fashion as if you were doing [backtesting](#backtesting). In addition, you must consider some restrictions when trying to hyperopt FreqAI strategies:
- The `--analyze-per-epoch` hyperopt parameter is not compatible with FreqAI.
- It's not possible to hyperopt indicators in the `populate_any_indicators()` function. This means that you cannot optimize model parameters using hyperopt. Apart from this exception, it is possible to optimize all other [spaces](hyperopt.md#running-hyperopt-with-smaller-search-space).
- The backtesting instructions also apply to hyperopt.
The best method for combining hyperopt and FreqAI is to focus on hyperopting entry/exit thresholds/criteria. You need to focus on hyperopting parameters that are not used in your features. For example, you should not try to hyperopt rolling window lengths in the feature creation, or any part of the FreqAI config which changes predictions. In order to efficiently hyperopt the FreqAI strategy, FreqAI stores predictions as dataframes and reuses them. Hence the requirement to hyperopt entry/exit thresholds/criteria only.
A good example of a hyperoptable parameter in FreqAI is a threshold for the [Dissimilarity Index (DI)](freqai-feature-engineering.md#identifying-outliers-with-the-dissimilarity-index-di) `DI_values` beyond which we consider data points as outliers:
```python
di_max = IntParameter(low=1, high=20, default=10, space='buy', optimize=True, load=True)
dataframe['outlier'] = np.where(dataframe['DI_values'] > self.di_max.value/10, 1, 0)
```
This specific hyperopt would help you understand the appropriate `DI_values` for your particular parameter space.
## Using Tensorboard
CatBoost models benefit from tracking training metrics via Tensorboard. You can take advantage of the FreqAI integration to track training and evaluation performance across all coins and across all retrainings. Tensorboard is activated via the following command:
```bash
cd freqtrade
tensorboard --logdir user_data/models/unique-id
```
where `unique-id` is the `identifier` set in the `freqai` configuration file. This command must be run in a separate shell if you wish to view the output in your browser at 127.0.0.1:6060 (6060 is the default port used by Tensorboard).
![tensorboard](assets/tensorboard.jpg)
## Setting up a follower
You can indicate to the bot that it should not train models, but instead should look for models trained by a leader with a specific `identifier` by defining:
```json
"freqai": {
"enabled": true,
"follow_mode": true,
"identifier": "example",
"feature_parameters": {
// leader bots feature_parameters inserted here
},
}
```
In this example, the user has a leader bot with the `"identifier": "example"`. The leader bot is already running or is launched simultaneously with the follower. The follower will load models created by the leader and inference them to obtain predictions instead of training its own models. The user will also need to duplicate the `feature_parameters` parameters from from the leaders freqai configuration file into the freqai section of the followers config.

View File

@@ -2,768 +2,103 @@
# FreqAI
FreqAI is a module designed to automate a variety of tasks associated with training a predictive model to generate market forecasts given a set of input features.
## Introduction
Among the the features included:
FreqAI is a software designed to automate a variety of tasks associated with training a predictive machine learning model to generate market forecasts given a set of input signals. In general, the FreqAI aims to be a sand-box for easily deploying robust machine-learning libraries on real-time data ([details])(#freqai-position-in-open-source-machine-learning-landscape).
* **Self-adaptive retraining**: retrain models during live deployments to self-adapt to the market in an unsupervised manner.
* **Rapid feature engineering**: create large rich feature sets (10k+ features) based on simple user created strategies.
* **High performance**: adaptive retraining occurs on separate thread (or on GPU if available) from inferencing and bot trade operations. Keep newest models and data in memory for rapid inferencing.
* **Realistic backtesting**: emulate self-adaptive retraining with backtesting module that automates past retraining.
* **Modifiable**: use the generalized and robust architecture for incorporating any machine learning library/method available in Python. Seven examples available.
* **Smart outlier removal**: remove outliers from training and prediction sets using a variety of outlier detection techniques.
* **Crash resilience**: model storage to disk to make reloading from a crash fast and easy (and purge obsolete files for sustained dry/live runs).
* **Automated data normalization**: normalize the data in a smart and statistically safe way.
* **Automatic data download**: compute the data download timerange and update historic data (in live deployments).
* **Clean incoming data** safe NaN handling before training and prediction.
* **Dimensionality reduction**: reduce the size of the training data via Principal Component Analysis.
* **Deploy bot fleets**: set one bot to train models while a fleet of other bots inference into the models and handle trades.
Features include:
* **Self-adaptive retraining** - Retrain models during [live deployments](freqai-running.md#live-deployments) to self-adapt to the market in a supervised manner
* **Rapid feature engineering** - Create large rich [feature sets](freqai-feature-engineering.md#feature-engineering) (10k+ features) based on simple user-created strategies
* **High performance** - Threading allows for adaptive model retraining on a separate thread (or on GPU if available) from model inferencing (prediction) and bot trade operations. Newest models and data are kept in RAM for rapid inferencing
* **Realistic backtesting** - Emulate self-adaptive training on historic data with a [backtesting module](freqai-running.md#backtesting) that automates retraining
* **Extensibility** - The generalized and robust architecture allows for incorporating any [machine learning library/method](freqai-configuration.md#using-different-prediction-models) available in Python. Eight examples are currently available, including classifiers, regressors, and a convolutional neural network
* **Smart outlier removal** - Remove outliers from training and prediction data sets using a variety of [outlier detection techniques](freqai-feature-engineering.md#outlier-detection)
* **Crash resilience** - Store trained models to disk to make reloading from a crash fast and easy, and [purge obsolete files](freqai-running.md#purging-old-model-data) for sustained dry/live runs
* **Automatic data normalization** - [Normalize the data](freqai-feature-engineering.md#feature-normalization) in a smart and statistically safe way
* **Automatic data download** - Compute timeranges for data downloads and update historic data (in live deployments)
* **Cleaning of incoming data** - Handle NaNs safely before training and model inferencing
* **Dimensionality reduction** - Reduce the size of the training data via [Principal Component Analysis](freqai-feature-engineering.md#data-dimensionality-reduction-with-principal-component-analysis)
* **Deploying bot fleets** - Set one bot to train models while a fleet of [follower bots](freqai-running.md#setting-up-a-follower) inference the models and handle trades
## Quick start
The easiest way to quickly test FreqAI is to run it in dry run with the following command
The easiest way to quickly test FreqAI is to run it in dry mode with the following command:
```bash
freqtrade trade --config config_examples/config_freqai.example.json --strategy FreqaiExampleStrategy --freqaimodel LightGBMRegressor --strategy-path freqtrade/templates
```
where the user will see the boot-up process of auto-data downloading, followed by simultaneous training and trading.
You will see the boot-up process of automatic data downloading, followed by simultaneous training and trading.
The example strategy, example prediction model, and example config can all be found in
`freqtrade/templates/FreqaiExampleStrategy.py`, `freqtrade/freqai/prediction_models/LightGBMRegressor.py`,
An example strategy, prediction model, and config to use as a starting points can be found in
`freqtrade/templates/FreqaiExampleStrategy.py`, `freqtrade/freqai/prediction_models/LightGBMRegressor.py`, and
`config_examples/config_freqai.example.json`, respectively.
## General approach
The user provides FreqAI with a set of custom *base* indicators (created inside the strategy the same way
a typical Freqtrade strategy is created) as well as target values which look into the future.
FreqAI trains a model to predict the target value based on the input of custom indicators for each pair in the whitelist. These models are consistently retrained to adapt to market conditions. FreqAI offers the ability to both backtest strategies (emulating reality with periodic retraining) and deploy dry/live. In dry/live conditions, FreqAI can be set to constant retraining in a background thread in an effort to keep models as young as possible.
You provide FreqAI with a set of custom *base indicators* (the same way as in a [typical Freqtrade strategy](strategy-customization.md)) as well as target values (*labels*). For each pair in the whitelist, FreqAI trains a model to predict the target values based on the input of custom indicators. The models are then consistently retrained, with a predetermined frequency, to adapt to market conditions. FreqAI offers the ability to both backtest strategies (emulating reality with periodic retraining on historic data) and deploy dry/live runs. In dry/live conditions, FreqAI can be set to constant retraining in a background thread to keep models as up to date as possible.
An overview of the algorithm is shown here to help users understand the data processing pipeline and the model usage.
An overview of the algorithm, explaining the data processing pipeline and model usage, is shown below.
![freqai-algo](assets/freqai_algo.png)
![freqai-algo](assets/freqai_algo.jpg)
## Background and vocabulary
### Important machine learning vocabulary
**Features** are the quantities with which a model is trained. $X_i$ represents the
vector of all features for a single candle. In FreqAI, the user
builds the features from anything they can construct in the strategy.
**Features** - the parameters, based on historic data, on which a model is trained. All features for a single candle are stored as a vector. In FreqAI, you build a feature data set from anything you can construct in the strategy.
**Labels** are the target values with which the weights inside a model are trained
toward. Each set of features is associated with a single label, which is also
defined within the strategy by the user. These labels intentionally look into the
future, and are not available to the model during dryrun/live/backtesting.
**Labels** - the target values that the model is trained toward. Each feature vector is associated with a single label that is defined by you within the strategy. These labels intentionally look into the future and are what you are training the model to be able to predict.
**Training** refers to the process of feeding individual feature sets into the
model with associated labels with the goal of matching input feature sets to associated labels.
**Training** - the process of "teaching" the model to match the feature sets to the associated labels. Different types of models "learn" in different ways which means that one might be better than another for a specific application. More information about the different models that are already implemented in FreqAI can be found [here](freqai-configuration.md#using-different-prediction-models).
**Train data** is a subset of the historic data which is fed to the model during
training to adjust weights. This data directly influences weight connections in the model.
**Train data** - a subset of the feature data set that is fed to the model during training to "teach" the model how to predict the targets. This data directly influences weight connections in the model.
**Test data** is a subset of the historic data which is used to evaluate the
intermediate performance of the model during training. This data does not
directly influence nodal weights within the model.
**Test data** - a subset of the feature data set that is used to evaluate the performance of the model after training. This data does not influence nodal weights within the model.
**Inferencing** - the process of feeding a trained model new unseen data on which it will make a prediction.
## Install prerequisites
The normal Freqtrade install process will ask the user if they wish to install FreqAI dependencies. The user should reply "yes" to this question if they wish to use FreqAI. If the user did not reply yes, they can manually install these dependencies after the install with:
The normal Freqtrade install process will ask if you wish to install FreqAI dependencies. You should reply "yes" to this question if you wish to use FreqAI. If you did not reply yes, you can manually install these dependencies after the install with:
``` bash
pip install -r requirements-freqai.txt
```
!!! Note
Catboost will not be installed on arm devices (raspberry, Mac M1, ARM based VPS, ...), since Catboost does not provide wheels for this platform.
Catboost will not be installed on arm devices (raspberry, Mac M1, ARM based VPS, ...), since it does not provide wheels for this platform.
### Usage with docker
For docker users, 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.
## Configuring FreqAI
### Parameter table
### FreqAI position in open-source machine learning landscape
The table below will list all configuration parameters available for FreqAI.
Forecasting chaotic time-series based systems, such as equity/cryptocurrency markets, requires a broad set of tools geared toward testing a wide range of hypotheses. Fortunately, a recent maturation of robust machine learning libraries (e.g. `scikit-learn`) has opened up a wide range of research possibilities. Scientists from a diverse range of fields can now easily prototype their studies on an abundance of established machine learning algorithms. Similarly, these user-friendly libraries enable "citzen scientists" to use their basic Python skills for data-exploration. However, leveraging these machine learning libraries on historical and live chaotic data sources can be logistically difficult and expensive. Additionally, robust data-collection, storage, and handling presents a disparate challenge. [`FreqAI`](#freqai) aims to provide a generalized and extensible open-sourced framework geared toward live deployments of adaptive modeling for market forecasting. The `FreqAI` framework is effectively a sandbox for the rich world of open-source machine learning libraries. Inside the `FreqAI` sandbox, users find they can combine a wide variety of third-party libraries to test creative hypotheses on a free live 24/7 chaotic data source - cryptocurrency exchange data.
Mandatory parameters are marked as **Required**, which means that they are required to be set in one of the possible ways.
## Common pitfalls
| Parameter | Description |
|------------|-------------|
| `freqai` | **Required.** The parent dictionary containing all the parameters below for controlling FreqAI. <br> **Datatype:** dictionary.
| `identifier` | **Required.** A unique name for the current model. This can be reused to reload pre-trained models/data. <br> **Datatype:** string.
| `train_period_days` | **Required.** Number of days to use for the training data (width of the sliding window). <br> **Datatype:** positive integer.
| `backtest_period_days` | **Required.** Number of days to inference into the trained model before sliding the window and retraining. This can be fractional days, but beware that the user provided `timerange` will be divided by this number to yield the number of trainings necessary to complete the backtest. <br> **Datatype:** Float.
| `live_retrain_hours` | Frequency of retraining during dry/live runs. Default set to 0, which means it will retrain as often as possible. <br> **Datatype:** Float > 0.
| `follow_mode` | If true, this instance of FreqAI will look for models associated with `identifier` and load those for inferencing. A `follower` will **not** train new models. `False` by default. <br> **Datatype:** boolean.
| `startup_candles` | Number of candles needed for *backtesting only* to ensure all indicators are non NaNs at the start of the first train period. <br> **Datatype:** positive integer.
| `fit_live_predictions_candles` | Computes target (label) statistics from prediction data, instead of from the training data set. Number of candles is the number of historical candles it uses to generate the statistics. <br> **Datatype:** positive integer.
| `purge_old_models` | Tell FreqAI to delete obsolete models. Otherwise, all historic models will remain on disk. Defaults to `False`. <br> **Datatype:** boolean.
| `expiration_hours` | Ask FreqAI to avoid making predictions if a model is more than `expiration_hours` old. Defaults to 0 which means models never expire. <br> **Datatype:** positive integer.
| | **Feature Parameters**
| `feature_parameters` | A dictionary containing the parameters used to engineer the feature set. Details and examples shown [here](#feature-engineering) <br> **Datatype:** dictionary.
| `include_corr_pairlist` | A list of correlated coins that FreqAI will add as additional features to all `pair_whitelist` coins. All indicators set in `populate_any_indicators` will be created for each coin in this list, and that set of features is added to the base asset feature set. <br> **Datatype:** list of assets (strings).
| `include_timeframes` | A list of timeframes that all indicators in `populate_any_indicators` will be created for and added as features to the base asset feature set. <br> **Datatype:** list of timeframes (strings).
| `label_period_candles` | Number of candles into the future that the labels are created for. This is used in `populate_any_indicators`, refer to `templates/FreqaiExampleStrategy.py` for detailed usage. The user can create custom labels, making use of this parameter not. <br> **Datatype:** positive integer.
| `include_shifted_candles` | Parameter used to add a sense of temporal recency to flattened regression type input data. `include_shifted_candles` takes all features, duplicates and shifts them by the number indicated by user. <br> **Datatype:** positive integer.
| `DI_threshold` | Activates the Dissimilarity Index for outlier detection when above 0, explained in detail [here](#removing-outliers-with-the-dissimilarity-index). <br> **Datatype:** positive float (typically below 1).
| `weight_factor` | Used to set weights for training data points according to their recency, see details and a figure of how it works [here](#controlling-the-model-learning-process). <br> **Datatype:** positive float (typically below 1).
| `principal_component_analysis` | Ask FreqAI to automatically reduce the dimensionality of the data set using PCA. <br> **Datatype:** boolean.
| `use_SVM_to_remove_outliers` | Ask FreqAI to train a support vector machine to detect and remove outliers from the training data set as well as from incoming data points. <br> **Datatype:** boolean.
| `svm_params` | All parameters available in Sklearn's `SGDOneClassSVM()`. E.g. `nu` *Very* broadly, is the percentage of data points that should be considered outliers. `shuffle` is by default false to maintain reproducibility. But these and all others can be added/changed in this dictionary. <br> **Datatype:** dictionary.
| `stratify_training_data` | This value is used to indicate the stratification of the data. e.g. 2 would set every 2nd data point into a separate dataset to be pulled from during training/testing. <br> **Datatype:** positive integer.
| `indicator_max_period_candles` | The maximum *period* used in `populate_any_indicators()` for indicator creation. FreqAI uses this information in combination with the maximum timeframe to calculate how many data points it should download so that the first data point does not have a NaN <br> **Datatype:** positive integer.
| `indicator_periods_candles` | A list of integers used to duplicate all indicators according to a set of periods and add them to the feature set. <br> **Datatype:** list of positive integers.
| `use_DBSCAN_to_remove_outliers` | Inactive by default. If true, FreqAI clusters data using DBSCAN to identify and remove outliers from training and prediction data. <br> **Datatype:** float (fraction of 1).
| | **Data split parameters**
| `data_split_parameters` | Include any additional parameters available from Scikit-learn `test_train_split()`, which are shown [here](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) <br> **Datatype:** dictionary.
| `test_size` | Fraction of data that should be used for testing instead of training. <br> **Datatype:** positive float below 1.
| `shuffle` | Shuffle the training data points during training. Typically for time-series forecasting, this is set to False. <br> **Datatype:** boolean.
| | **Model training parameters**
| `model_training_parameters` | A flexible dictionary that includes all parameters available by the user selected library. For example, if the user uses `LightGBMRegressor`, then this dictionary can contain any parameter available by the `LightGBMRegressor` [here](https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMRegressor.html). If the user selects a different model, then this dictionary can contain any parameter from that different model. <br> **Datatype:** dictionary.
| `n_estimators` | A common parameter among regressors which sets the number of boosted trees to fit <br> **Datatype:** integer.
| `learning_rate` | A common parameter among regressors which sets the boosting learning rate. <br> **Datatype:** float.
| `n_jobs`, `thread_count`, `task_type` | Different libraries use different parameter names to control the number of threads used for parallel processing or whether or not it is a `task_type` of `gpu` or `cpu`. <br> **Datatype:** float.
| | **Extraneous parameters**
| `keras` | If your model makes use of keras (typical of Tensorflow based prediction models), activate this flag so that the model save/loading follows keras standards. Default value `false` <br> **Datatype:** boolean.
| `conv_width` | The width of a convolutional neural network input tensor. This replaces the need for `shift` by feeding in historical data points as the second dimension of the tensor. Technically, this parameter can also be used for regressors, but it only adds computational overhead and does not change the model training/prediction. Default value, 2 <br> **Datatype:** integer.
### Important FreqAI dataframe key patterns
Here are the values the user can expect to include/use inside the typical strategy dataframe (`df[]`):
| DataFrame Key | Description |
|------------|-------------|
| `df['&*']` | Any dataframe column prepended with `&` in `populate_any_indicators()` is treated as a training target inside FreqAI (typically following the naming convention `&-s*`). These same dataframe columns names are fed back to the user as the predictions. For example, the user wishes to predict the price change in the next 40 candles (similar to `templates/FreqaiExampleStrategy.py`) by setting `df['&-s_close']`. FreqAI makes the predictions and gives them back to the user 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']` | The standard deviation and mean values of the user defined labels during training (or live tracking with `fit_live_predictions_candles`). Commonly used to understand rarity of prediction (use the z-score as shown in `templates/FreqaiExampleStrategy.py` to evaluate how often a particular prediction was observed during training (or historically with `fit_live_predictions_candles`)<br> **Datatype:** float.
| `df['do_predict']` | An indication of an outlier, this return value is integer between -1 and 2 which lets the user understand if the prediction is trustworthy or not. `do_predict==1` means the prediction is trustworthy. If the [Dissimilarity Index](#removing-outliers-with-the-dissimilarity-index) is above the user defined threshold, it will subtract 1 from `do_predict`. If `use_SVM_to_remove_outliers()` is active, then the Support Vector Machine (SVM) may also detect outliers in training and prediction data. In this case, the SVM will also subtract one from `do_predict`. A particular case is when `do_predict == 2`, it means that the model has expired due to `expired_hours`. <br> **Datatype:** integer between -1 and 2.
| `df['DI_values']` | The raw Dissimilarity Index values to give the user a sense of confidence in the prediction. Lower DI means the data point is closer to the trained parameter space. <br> **Datatype:** float.
| `df['%*']` | Any dataframe column prepended with `%` in `populate_any_indicators()` is treated as a training feature inside FreqAI. For example, the user can include the rsi in the training feature set (similar to `templates/FreqaiExampleStrategy.py`) by setting `df['%-rsi']`. See more details on how this is done [here](#building-the-feature-set). <br>**Note**: since the number of features prepended with `%` can multiply very quickly (10s of thousands of features is easily engineered using the multiplictative functionality described in the `feature_parameters` table.) these features are removed from the dataframe upon return from FreqAI. If the user wishes to keep a particular type of feature for plotting purposes, you can prepend it with `%%`. <br> **Datatype:** depends on the output of the model.
### Example config file
The user interface is isolated to the typical config file. A typical FreqAI config setup could include:
```json
"freqai": {
"startup_candles": 10000,
"purge_old_models": true,
"train_period_days": 30,
"backtest_period_days": 7,
"identifier" : "unique-id",
"feature_parameters" : {
"include_timeframes": ["5m","15m","4h"],
"include_corr_pairlist": [
"ETH/USD",
"LINK/USD",
"BNB/USD"
],
"label_period_candles": 24,
"include_shifted_candles": 2,
"weight_factor": 0,
"indicator_max_period_candles": 20,
"indicator_periods_candles": [10, 20]
},
"data_split_parameters" : {
"test_size": 0.25,
"random_state": 42
},
"model_training_parameters" : {
"n_estimators": 100,
"random_state": 42,
"learning_rate": 0.02,
"task_type": "CPU",
},
}
```
### Feature engineering
Features are added by the user inside the `populate_any_indicators()` method of the strategy
by prepending indicators with `%` and labels are added by prepending `&`.
There are some important components/structures that the user *must* include when building their feature set.
Another structure to consider is the location of the labels at the bottom of the example function (below `if set_generalized_indicators:`).
This is where the user will add single features and labels to their feature set to avoid duplication from
various configuration parameters which multiply the feature set such as `include_timeframes`.
```python
def populate_any_indicators(
self, pair, df, tf, informative=None, set_generalized_indicators=False
):
"""
Function designed to automatically generate, name and merge features
from user indicated timeframes in the configuration file. User controls the indicators
passed to the training/prediction by prepending indicators with `'%-' + coin `
(see convention below). I.e. user should not prepend any supporting metrics
(e.g. bb_lowerband below) with % unless they explicitly want to pass that metric to the
model.
:param pair: pair to be used as informative
:param df: strategy dataframe which will receive merges from informatives
:param tf: timeframe of the dataframe which will modify the feature names
:param informative: the dataframe associated with the informative pair
:param coin: the name of the coin which will modify the feature names.
"""
coint = pair.split('/')[0]
if informative is None:
informative = self.dp.get_pair_dataframe(pair, tf)
# first loop is automatically duplicating indicators for time periods
for t in self.freqai_info["feature_parameters"]["indicator_periods_candles"]:
t = int(t)
informative[f"%-{coin}rsi-period_{t}"] = ta.RSI(informative, timeperiod=t)
informative[f"%-{coin}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t)
informative[f"%-{coin}adx-period_{t}"] = ta.ADX(informative, window=t)
bollinger = qtpylib.bollinger_bands(
qtpylib.typical_price(informative), window=t, stds=2.2
)
informative[f"{coin}bb_lowerband-period_{t}"] = bollinger["lower"]
informative[f"{coin}bb_middleband-period_{t}"] = bollinger["mid"]
informative[f"{coin}bb_upperband-period_{t}"] = bollinger["upper"]
informative[f"%-{coin}bb_width-period_{t}"] = (
informative[f"{coin}bb_upperband-period_{t}"]
- informative[f"{coin}bb_lowerband-period_{t}"]
) / informative[f"{coin}bb_middleband-period_{t}"]
informative[f"%-{coin}close-bb_lower-period_{t}"] = (
informative["close"] / informative[f"{coin}bb_lowerband-period_{t}"]
)
informative[f"%-{coin}relative_volume-period_{t}"] = (
informative["volume"] / informative["volume"].rolling(t).mean()
)
indicators = [col for col in informative if col.startswith("%")]
# This loop duplicates and shifts all indicators to add a sense of recency to data
for n in range(self.freqai_info["feature_parameters"]["include_shifted_candles"] + 1):
if n == 0:
continue
informative_shift = informative[indicators].shift(n)
informative_shift = informative_shift.add_suffix("_shift-" + str(n))
informative = pd.concat((informative, informative_shift), axis=1)
df = merge_informative_pair(df, informative, self.config["timeframe"], tf, ffill=True)
skip_columns = [
(s + "_" + tf) for s in ["date", "open", "high", "low", "close", "volume"]
]
df = df.drop(columns=skip_columns)
# Add generalized indicators here (because in live, it will call this
# function to populate indicators during training). Notice how we ensure not to
# add them multiple times
if set_generalized_indicators:
df["%-day_of_week"] = (df["date"].dt.dayofweek + 1) / 7
df["%-hour_of_day"] = (df["date"].dt.hour + 1) / 25
# user adds targets here by prepending them with &- (see convention below)
# If user wishes to use multiple targets, a multioutput prediction model
# needs to be used such as templates/CatboostPredictionMultiModel.py
df["&-s_close"] = (
df["close"]
.shift(-self.freqai_info["feature_parameters"]["label_period_candles"])
.rolling(self.freqai_info["feature_parameters"]["label_period_candles"])
.mean()
/ df["close"]
- 1
)
return df
```
The user of the present example does not wish to pass the `bb_lowerband` as a feature to the model,
and has therefore not prepended it with `%`. The user does, however, wish to pass `bb_width` to the
model for training/prediction and has therefore prepended it with `%`.
The `include_timeframes` from the example config above are the timeframes (`tf`) of each call to `populate_any_indicators()`
included metric for inclusion in the feature set. In the present case, the user is asking for the
`5m`, `15m`, and `4h` timeframes of the `rsi`, `mfi`, `roc`, and `bb_width` to be included in the feature set.
In addition, the user can ask for each of these features to be included from
informative pairs using the `include_corr_pairlist`. This means that the present feature
set will include all the features from `populate_any_indicators` on all the `include_timeframes` for each of
`ETH/USD`, `LINK/USD`, and `BNB/USD`.
`include_shifted_candles` is another user controlled parameter which indicates the number of previous
candles to include in the present feature set. In other words, `include_shifted_candles: 2`, tells
FreqAI to include the the past 2 candles for each of the features included in the dataset.
In total, the number of features the present user has created is:
length of `include_timeframes` * no. features in `populate_any_indicators()` * length of `include_corr_pairlist` * no. `include_shifted_candles` * length of `indicator_periods_candles`
$3 * 3 * 3 * 2 * 2 = 108$.
!!! Note
Features **must** be defined in `populate_any_indicators()`. Making features in `populate_indicators()`
will fail in live/dry mode. If the user wishes to add generalized features that are not associated with
a specific pair or timeframe, they should use the following structure inside `populate_any_indicators()`
(as exemplified in `freqtrade/templates/FreqaiExampleStrategy.py`:
```python
def populate_any_indicators(self, metadata, pair, df, tf, informative=None, coin="", set_generalized_indicators=False):
...
# Add generalized indicators here (because in live, it will call only this function to populate
# indicators for retraining). Notice how we ensure not to add them multiple times by associating
# these generalized indicators to the basepair/timeframe
if set_generalized_indicators:
df['%-day_of_week'] = (df["date"].dt.dayofweek + 1) / 7
df['%-hour_of_day'] = (df['date'].dt.hour + 1) / 25
# user adds targets here by prepending them with &- (see convention below)
# If user wishes to use multiple targets, a multioutput prediction model
# needs to be used such as templates/CatboostPredictionMultiModel.py
df["&-s_close"] = (
df["close"]
.shift(-self.freqai_info["feature_parameters"]["label_period_candles"])
.rolling(self.freqai_info["feature_parameters"]["label_period_candles"])
.mean()
/ df["close"]
- 1
)
```
(Please see the example script located in `freqtrade/templates/FreqaiExampleStrategy.py` for a full example of `populate_any_indicators()`)
### Deciding the sliding training window and backtesting duration
Users define the backtesting timerange with the typical `--timerange` parameter in the user
configuration file. `train_period_days` is the duration of the sliding training window, while
`backtest_period_days` is the sliding backtesting window, both in number of days (`backtest_period_days` can be
a float to indicate sub daily retraining in live/dry mode). In the present example,
the user is asking FreqAI to use a training period of 30 days and backtest the subsequent 7 days.
This means that if the user sets `--timerange 20210501-20210701`,
FreqAI will train 8 separate models (because the full range comprises 8 weeks),
and then backtest the subsequent week associated with each of the 8 training
data set timerange months. Users can think of this as a "sliding window" which
emulates FreqAI retraining itself once per week in live using the previous
month of data.
In live, the required training data is automatically computed and downloaded. However, in backtesting
the user must manually enter the required number of `startup_candles` in the config. This value
is used to increase the available data to FreqAI and should be sufficient to enable all indicators
to be NaN free at the beginning of the first training timerange. This boils down to identifying the
highest timeframe (`4h` in present example) and the longest indicator period (25 in present example)
and adding this to the `train_period_days`. The units need to be in the base candle time frame:
`startup_candles` = ( 4 hours * 25 max period * 60 minutes/hour + 30 day train_period_days * 1440 minutes per day ) / 5 min (base time frame) = 1488.
!!! Note
In dry/live, this is all precomputed and handled automatically. Thus, `startup_candle` has no influence on dry/live.
!!! Note
Although fractional `backtest_period_days` is allowed, the user should be ware that the `--timerange` is divided by this value to determine the number of models that FreqAI will need to train in order to backtest the full range. For example, if the user wants to set a `--timerange` of 10 days, and asks for a `backtest_period_days` of 0.1, FreqAI will need to train 100 models per pair to complete the full backtest. This is why it is physically impossible to truly backtest FreqAI adaptive training. The best way to fully test a model is to run it dry and let it constantly train. In this case, backtesting would take the exact same amount of time as a dry run.
## Running FreqAI
### Backtesting
The FreqAI backtesting module can be executed with the following command:
```bash
freqtrade backtesting --strategy FreqaiExampleStrategy --config config_freqai.example.json --freqaimodel LightGBMRegressor --timerange 20210501-20210701
```
Backtesting mode requires the user to have the data pre-downloaded (unlike dry/live, where FreqAI automatically downloads the necessary data). The user should be careful to consider that the range of the downloaded data is more than the backtesting range. This is because FreqAI needs data prior to the desired backtesting range in order to train a model to be ready to make predictions on the first candle of the user set backtesting range. More details on how to calculate the data download timerange can be found [here](#deciding-the-sliding-training-window-and-backtesting-duration).
If this command has never been executed with the existing config file, then it will train a new model
for each pair, for each backtesting window within the bigger `--timerange`.
!!! Note "Model reuse"
Once the training is completed, the user can execute this again with the same config file and
FreqAI will find the trained models and load them instead of spending time training. This is useful
if the user wants to tweak (or even hyperopt) buy and sell criteria inside the strategy. IF the user
*wants* to retrain a new model with the same config file, then he/she should simply change the `identifier`.
This way, the user can return to using any model they wish by simply changing the `identifier`.
---
### Building a freqai strategy
The FreqAI strategy requires the user to include the following lines of code in the strategy:
```python
def informative_pairs(self):
whitelist_pairs = self.dp.current_whitelist()
corr_pairs = self.config["freqai"]["feature_parameters"]["include_corr_pairlist"]
informative_pairs = []
for tf in self.config["freqai"]["feature_parameters"]["include_timeframes"]:
for pair in whitelist_pairs:
informative_pairs.append((pair, tf))
for pair in corr_pairs:
if pair in whitelist_pairs:
continue # avoid duplication
informative_pairs.append((pair, tf))
return informative_pairs
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# All indicators must be populated by populate_any_indicators() for live functionality
# to work correctly.
# the model will return all labels created by user in `populate_any_indicators`
# (& 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
# `populate_any_indicators()` for each training period.
dataframe = self.freqai.start(dataframe, metadata, self)
return dataframe
def populate_any_indicators(
self, pair, df, tf, informative=None, set_generalized_indicators=False
):
"""
Function designed to automatically generate, name and merge features
from user indicated timeframes in the configuration file. User controls the indicators
passed to the training/prediction by prepending indicators with `'%-' + coin `
(see convention below). I.e. user should not prepend any supporting metrics
(e.g. bb_lowerband below) with % unless they explicitly want to pass that metric to the
model.
:param pair: pair to be used as informative
:param df: strategy dataframe which will receive merges from informatives
:param tf: timeframe of the dataframe which will modify the feature names
:param informative: the dataframe associated with the informative pair
:param coin: the name of the coin which will modify the feature names.
"""
coin = pair.split('/')[0]
if informative is None:
informative = self.dp.get_pair_dataframe(pair, tf)
# first loop is automatically duplicating indicators for time periods
for t in self.freqai_info["feature_parameters"]["indicator_periods_candles"]:
t = int(t)
informative[f"%-{coin}rsi-period_{t}"] = ta.RSI(informative, timeperiod=t)
informative[f"%-{coin}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t)
informative[f"%-{coin}adx-period_{t}"] = ta.ADX(informative, window=t)
indicators = [col for col in informative if col.startswith("%")]
# This loop duplicates and shifts all indicators to add a sense of recency to data
for n in range(self.freqai_info["feature_parameters"]["include_shifted_candles"] + 1):
if n == 0:
continue
informative_shift = informative[indicators].shift(n)
informative_shift = informative_shift.add_suffix("_shift-" + str(n))
informative = pd.concat((informative, informative_shift), axis=1)
df = merge_informative_pair(df, informative, self.config["timeframe"], tf, ffill=True)
skip_columns = [
(s + "_" + tf) for s in ["date", "open", "high", "low", "close", "volume"]
]
df = df.drop(columns=skip_columns)
# Add generalized indicators here (because in live, it will call this
# function to populate indicators during training). Notice how we ensure not to
# add them multiple times
if set_generalized_indicators:
# user adds targets here by prepending them with &- (see convention below)
# If user wishes to use multiple targets, a multioutput prediction model
# needs to be used such as templates/CatboostPredictionMultiModel.py
df["&-s_close"] = (
df["close"]
.shift(-self.freqai_info["feature_parameters"]["label_period_candles"])
.rolling(self.freqai_info["feature_parameters"]["label_period_candles"])
.mean()
/ df["close"]
- 1
)
return df
```
Notice how the `populate_any_indicators()` is where the user adds their own features and labels ([more information](#feature-engineering)). See a full example at `templates/FreqaiExampleStrategy.py`.
### Setting classifier targets
FreqAI includes a the `CatboostClassifier` via the flag `--freqaimodel CatboostClassifier`. Typically, the user would set the targets using strings:
```python
df['&s-up_or_down'] = np.where( df["close"].shift(-100) > df["close"], 'up', 'down')
```
### Running the model live
FreqAI can be run dry/live using the following command
```bash
freqtrade trade --strategy FreqaiExampleStrategy --config config_freqai.example.json --freqaimodel LightGBMRegressor
```
By default, FreqAI will not find any existing models and will start by training a new one
given the user configuration settings. Following training, it will use that model to make predictions on incoming candles until a new model is available. New models are typically generated as often as possible, with FreqAI managing an internal queue of the pairs to try and keep all models equally "young." FreqAI will always use the newest trained model to make predictions on incoming live data. If users do not want FreqAI to retrain new models as often as possible, they can set `live_retrain_hours` to tell FreqAI to wait at least that number of hours before retraining a new model. Additionally, users can set `expired_hours` to tell FreqAI to avoid making predictions on models aged over this number of hours.
If the user wishes to start dry/live from a backtested saved model, the user only needs to reuse
the same `identifier` parameter
```json
"freqai": {
"identifier": "example",
"live_retrain_hours": 1
}
```
In this case, although FreqAI will initiate with a
pre-trained model, it will still check to see how much time has elapsed since the model was trained,
and if a full `live_retrain_hours` has elapsed since the end of the loaded model, FreqAI will self retrain.
## Data analysis techniques
### Controlling the model learning process
Model training parameters are unique to the ML library used by the user. FreqAI allows users to set any parameter for any library using the `model_training_parameters` dictionary in the user configuration file. The example configuration files show some of the example parameters associated with `Catboost` and `LightGBM`, but users can add any parameters available in those libraries.
Data split parameters are defined in `data_split_parameters` which can be any parameters associated with `Sklearn`'s `train_test_split()` function. FreqAI includes some additional parameters such `weight_factor` which allows the user to weight more recent data more strongly
than past data via an exponential function:
$$ W_i = \exp(\frac{-i}{\alpha*n}) $$
where $W_i$ is the weight of data point $i$ in a total set of $n$ data points.
![weight-factor](assets/weights_factor.png)
`train_test_split()` has a parameters called `shuffle`, which users also have access to in FreqAI, that allows them to keep the data unshuffled. This is particularly useful to avoid biasing training with temporally auto-correlated data.
Finally, `label_period_candles` defines the offset used for the `labels`. In the present example,
the user is asking for `labels` that are 24 candles in the future.
### Removing outliers with the Dissimilarity Index
The Dissimilarity Index (DI) aims to quantify the uncertainty associated with each
prediction by the model. To do so, FreqAI measures the distance between each training
data point and all other training data points:
$$ d_{ab} = \sqrt{\sum_{j=1}^p(X_{a,j}-X_{b,j})^2} $$
where $d_{ab}$ is the distance between the normalized points $a$ and $b$. $p$
is the number of features i.e. the length of the vector $X$.
The characteristic distance, $\overline{d}$ for a set of training data points is simply the mean
of the average distances:
$$ \overline{d} = \sum_{a=1}^n(\sum_{b=1}^n(d_{ab}/n)/n) $$
$\overline{d}$ quantifies the spread of the training data, which is compared to
the distance between the new prediction feature vectors, $X_k$ and all the training
data:
$$ d_k = \arg \min d_{k,i} $$
which enables the estimation of a Dissimilarity Index:
$$ DI_k = d_k/\overline{d} $$
Equity and crypto markets suffer from a high level of non-patterned noise in the
form of outlier data points. The dissimilarity index allows predictions which
are outliers and not existent in the model feature space, to be thrown out due
to low levels of certainty. Activating the Dissimilarity Index can be achieved with:
```json
"freqai": {
"feature_parameters" : {
"DI_threshold": 1
}
}
```
The user can tweak the DI with `DI_threshold` to increase or decrease the extrapolation of the trained model.
### Reducing data dimensionality with Principal Component Analysis
Users can reduce the dimensionality of their features by activating the `principal_component_analysis`:
```json
"freqai": {
"feature_parameters" : {
"principal_component_analysis": true
}
}
```
Which will perform PCA on the features and reduce the dimensionality of the data so that the explained
variance of the data set is >= 0.999.
### Removing outliers using a Support Vector Machine (SVM)
The user can tell FreqAI to remove outlier data points from the training/test data sets by setting:
```json
"freqai": {
"feature_parameters" : {
"use_SVM_to_remove_outliers": true
}
}
```
FreqAI will train an SVM on the training data (or components if the user activated
`principal_component_analysis`) and remove any data point that it deems to be sitting beyond the feature space.
### Clustering the training data and removing outliers with DBSCAN
The user can configure FreqAI to use DBSCAN to cluster training data and remove outliers from the training data set. The user activates `use_DBSCAN_to_remove_outliers` to cluster training data for identification of outliers. Also used to detect incoming outliers for prediction data points.
```json
"freqai": {
"feature_parameters" : {
"use_DBSCAN_to_remove_outliers": true
}
}
```
### Stratifying the data
The user can stratify the training/testing data using:
```json
"freqai": {
"feature_parameters" : {
"stratify_training_data": 3
}
}
```
which will split the data chronologically so that every Xth data points is a testing data point. In the
present example, the user is asking for every third data point in the dataframe to be used for
testing, the other points are used for training.
## Setting up a follower
The user can define:
```json
"freqai": {
"follow_mode": true,
"identifier": "example"
}
```
to indicate to the bot that it should not train models, but instead should look for models trained
by a leader with the same `identifier`. In this example, the user has a leader bot with the
`identifier: "example"` already running or launching simultaneously as the present follower.
The follower will load models created by the leader and inference them to obtain predictions.
## Purging old model data
FreqAI stores new model files each time it retrains. These files become obsolete as new models
are trained and FreqAI adapts to the new market conditions. Users planning to leave FreqAI running
for extended periods of time with high frequency retraining should set `purge_old_models` in their
config:
```json
"freqai": {
"purge_old_models": true,
}
```
which will automatically purge all models older than the two most recently trained ones.
## Defining model expirations
During dry/live, FreqAI trains each pair sequentially (on separate threads/GPU from the main
Freqtrade bot). This means there is always an age discrepancy between models. If a user is training
on 50 pairs, and each pair requires 5 minutes to train, the oldest model will be over 4 hours old.
This may be undesirable if the characteristic time scale (read trade duration target) for a strategy
is much less than 4 hours. The user can decide to only make trade entries if the model is less than
a certain number of hours in age by setting the `expiration_hours` in the config file:
```json
"freqai": {
"expiration_hours": 0.5,
}
```
In the present example, the user will only allow predictions on models that are less than 1/2 hours
old.
## Choosing the calculation of the `target_roi`
As shown in `templates/FreqaiExampleStrategy.py`, the `target_roi` is based on two metrics computed
by FreqAI: `label_mean` and `label_std`. These are the statistics associated with the labels used
*during the most recent training*.
This allows the model to know what magnitude of a target to be expecting since it is directly stemming from the training data.
By default, FreqAI computes this based on training data and it assumes the labels are Gaussian distributed.
These are big assumptions that the user should consider when creating their labels. If the user wants to consider the population
of *historical predictions* for creating the dynamic target instead of the trained labels, the user
can do so by setting `fit_live_prediction_candles` to the number of historical prediction candles
the user wishes to use to generate target statistics.
```json
"freqai": {
"fit_live_prediction_candles": 300,
}
```
If the user sets this value, FreqAI will initially use the predictions from the training data set
and then subsequently begin introducing real prediction data as it is generated. FreqAI will save
this historical data to be reloaded if the user stops and restarts with the same `identifier`.
## Extra returns per train
Users may find that there are some important metrics that they'd like to return to the strategy at the end of each retrain.
Users can include these metrics by assigning them to `dk.data['extra_returns_per_train']['my_new_value'] = XYZ` inside their custom prediction
model class. FreqAI takes the `my_new_value` assigned in this dictionary and expands it to fit the return dataframe to the strategy.
The user can then use the value in the strategy with `dataframe['my_new_value']`. An example of how this is already used in FreqAI is
the `&*_mean` and `&*_std` values, which indicate the mean and standard deviation of that particular label during the most recent training.
Another example is shown below if the user wants to use live metrics from the trade database.
The user needs to set the standard dictionary in the config so FreqAI can return proper dataframe shapes:
```json
"freqai": {
"extra_returns_per_train": {"total_profit": 4}
}
```
These values will likely be overridden by the user prediction model, but in the case where the user model has yet to set them, or needs
a default initial value - this is the value that will be returned.
## Building an IFreqaiModel
FreqAI has multiple example prediction model based libraries such as `Catboost` regression (`freqai/prediction_models/CatboostRegressor.py`) and `LightGBM` regression.
However, users can customize and create their own prediction models using the `IFreqaiModel` class.
Users are encouraged to inherit `train()` and `predict()` to let them customize various aspects of their training procedures.
## Additional information
### Common pitfalls
FreqAI cannot be combined with `VolumePairlists` (or any pairlist filter that adds and removes pairs dynamically).
FreqAI cannot be combined with dynamic `VolumePairlists` (or any pairlist filter that adds and removes pairs dynamically).
This is for performance reasons - FreqAI relies on making quick predictions/retrains. To do this effectively,
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. But this means that if new pairs arrive later in the dry run due
to a volume pairlist, it will not have the data ready. FreqAI does work, however, with the `ShufflePairlist`.
### Feature normalization
The feature set created by the user is automatically normalized to the training data only.
This includes all test data and unseen prediction data (dry/live/backtest).
### File structure
`user_data_dir/models/` contains all the data associated with the trainings and backtests.
This file structure is heavily controlled and read by the `FreqaiDataKitchen()`
and should therefore not be modified.
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).
## Credits
FreqAI was developed by a group of individuals who all contributed specific skillsets to the project.
FreqAI is developed by a group of individuals who all contribute specific skillsets to the project.
Conception and software development:
Robert Caulk @robcaulk
Theoretical brainstorming:
Elin Törnquist @thorntwig
Theoretical brainstorming and data analysis:
Elin Törnquist @th0rntwig
Code review, software architecture brainstorming:
Code review and software architecture brainstorming:
@xmatthias
Software development:
Wagner Costa @wagnercosta
Beta testing and bug reporting:
@bloodhunter4rc, Salah Lamkadem @ikonx, @ken11o2, @longyu, @paranoidandy, @smidelis, @smarm
Juha Nykänen @suikula, Wagner Costa @wagnercosta
Stefan Gehring @bloodhunter4rc, @longyu, Andrew Lawless @paranoidandy, Pascal Schmidt @smidelis, Ryan McMullan @smarmau, Juha Nykänen @suikula, Johan van der Vlugt @jooopiert, Richárd Józsa @richardjosza, Timothy Pogue @wizrds

View File

@@ -40,7 +40,8 @@ pip install -r requirements-hyperopt.txt
```
usage: freqtrade hyperopt [-h] [-v] [--logfile FILE] [-V] [-c PATH] [-d PATH]
[--userdir PATH] [-s NAME] [--strategy-path PATH]
[--recursive-strategy-search] [-i TIMEFRAME]
[--recursive-strategy-search] [--freqaimodel NAME]
[--freqaimodel-path PATH] [-i TIMEFRAME]
[--timerange TIMERANGE]
[--data-format-ohlcv {json,jsongz,hdf5}]
[--max-open-trades INT]
@@ -53,7 +54,7 @@ usage: freqtrade hyperopt [-h] [-v] [--logfile FILE] [-V] [-c PATH] [-d PATH]
[--print-all] [--no-color] [--print-json] [-j JOBS]
[--random-state INT] [--min-trades INT]
[--hyperopt-loss NAME] [--disable-param-export]
[--ignore-missing-spaces]
[--ignore-missing-spaces] [--analyze-per-epoch]
optional arguments:
-h, --help show this help message and exit
@@ -129,6 +130,7 @@ optional arguments:
--ignore-missing-spaces, --ignore-unparameterized-spaces
Suppress errors for any requested Hyperopt spaces that
do not contain any parameters.
--analyze-per-epoch Run populate_indicators once per epoch.
Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
@@ -154,6 +156,10 @@ Strategy arguments:
--recursive-strategy-search
Recursively search for a strategy in the strategies
folder.
--freqaimodel NAME Specify a custom freqaimodels.
--freqaimodel-path PATH
Specify additional lookup path for freqaimodels.
```
### Hyperopt checklist
@@ -185,7 +191,7 @@ Rarely you may also need to create a [nested class](advanced-hyperopt.md#overrid
### Hyperopt execution logic
Hyperopt will first load your data into memory and will then run `populate_indicators()` once per Pair to generate all indicators.
Hyperopt will first load your data into memory and will then run `populate_indicators()` once per Pair to generate all indicators, unless `--analyze-per-epoch` is specified.
Hyperopt will then spawn into different processes (number of processors, or `-j <n>`), and run backtesting over and over again, changing the parameters that are part of the `--spaces` defined.
@@ -426,9 +432,10 @@ 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"
By doing the calculation of all possible indicators in `populate_indicators()`, the calculation of the indicator happens only once for every parameter.
While this may slow down the hyperopt startup speed, the overall performance will increase as the Hyperopt execution itself may pick the same value for multiple epochs (changing other values).
You should however try to use space ranges as small as possible. Every new column will require more memory, and every possibility hyperopt can try will increase the search space.
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.
In either case, you should try to use space ranges as small as possible this will improve CPU/RAM usage in both scenarios.
## Optimizing protections
@@ -879,6 +886,7 @@ To combat these, you have multiple options:
* Avoid using `--timeframe-detail` (this loads a lot of additional data into memory).
* Reduce the number of parallel processes (`-j <n>`).
* Increase the memory of your machine.
* Use `--analyze-per-epoch` if you're using a lot of parameters with `.range` functionality.
## The objective has been evaluated at this point before.

View File

@@ -22,6 +22,7 @@ You may also use something like `.*DOWN/BTC` or `.*UP/BTC` to exclude leveraged
* [`StaticPairList`](#static-pair-list) (default, if not configured differently)
* [`VolumePairList`](#volume-pair-list)
* [`ProducerPairList`](#producerpairlist)
* [`AgeFilter`](#agefilter)
* [`OffsetFilter`](#offsetfilter)
* [`PerformanceFilter`](#performancefilter)
@@ -84,7 +85,7 @@ Filtering instances (not the first position in the list) will not apply any cach
You can define a minimum volume with `min_value` - which will filter out pairs with a volume lower than the specified value in the specified timerange.
### VolumePairList Advanced mode
##### VolumePairList Advanced mode
`VolumePairList` can also operate in an advanced mode to build volume over a given timerange of specified candle size. It utilizes exchange historical candle data, builds a typical price (calculated by (open+high+low)/3) and multiplies the typical price with every candle's volume. The sum is the `quoteVolume` over the given range. This allows different scenarios, for a more smoothened volume, when using longer ranges with larger candle sizes, or the opposite when using a short range with small candles.
@@ -146,6 +147,32 @@ More sophisticated approach can be used, by using `lookback_timeframe` for candl
!!! Note
`VolumePairList` does not support backtesting mode.
#### ProducerPairList
With `ProducerPairList`, you can reuse the pairlist from a [Producer](producer-consumer.md) without explicitly defining the pairlist on each consumer.
[Consumer mode](producer-consumer.md) is required for this pairlist to work.
The pairlist will perform a check on active pairs against the current exchange configuration to avoid attempting to trade on invalid markets.
You can limit the length of the pairlist with the optional parameter `number_assets`. Using `"number_assets"=0` or omitting this key will result in the reuse of all producer pairs valid for the current setup.
```json
"pairlists": [
{
"method": "ProducerPairList",
"number_assets": 5,
"producer_name": "default",
}
],
```
!!! Tip "Combining pairlists"
This pairlist can be combined with all other pairlists and filters for further pairlist reduction, and can also act as an "additional" pairlist, on top of already defined pairs.
`ProducerPairList` can also be used multiple times in sequence, combining the pairs from multiple producers.
Obviously in complex such configurations, the Producer may not provide data for all pairs, so the strategy must be fit for this.
#### AgeFilter
Removes pairs that have been listed on the exchange for less than `min_days_listed` days (defaults to `10`) or more than `max_days_listed` days (defaults `None` mean infinity).
@@ -241,7 +268,7 @@ This option is disabled by default, and will only apply if set to > 0.
The `max_value` setting removes pairs where the minimum value change is above a specified value.
This is useful when an exchange has unbalanced limits. For example, if step-size = 1 (so you can only buy 1, or 2, or 3, but not 1.1 Coins) - and the price is pretty high (like 20\$) as the coin has risen sharply since the last limit adaption.
As a result of the above, you can only buy for 20\$, or 40\$ - but not for 25\$.
On exchanges that deduct fees from the receiving currency (e.g. FTX) - this can result in high value coins / amounts that are unsellable as the amount is slightly below the limit.
On exchanges that deduct fees from the receiving currency (e.g. binance) - this can result in high value coins / amounts that are unsellable as the amount is slightly below the limit.
The `low_price_ratio` setting removes pairs where a raise of 1 price unit (pip) is above the `low_price_ratio` ratio.
This option is disabled by default, and will only apply if set to > 0.
@@ -259,6 +286,18 @@ Min price precision for SHITCOIN/BTC is 8 decimals. If its price is 0.00000011 -
Shuffles (randomizes) pairs in the pairlist. It can be used for preventing the bot from trading some of the pairs more frequently then others when you want all pairs be treated with the same priority.
By default, ShuffleFilter will shuffle pairs once per candle.
To shuffle on every iteration, set `"shuffle_frequency"` to `"iteration"` instead of the default of `"candle"`.
``` json
{
"method": "ShuffleFilter",
"shuffle_frequency": "candle",
"seed": 42
}
```
!!! Tip
You may set the `seed` value for this Pairlist to obtain reproducible results, which can be useful for repeated backtesting sessions. If `seed` is not set, the pairs are shuffled in the non-repeatable random order. ShuffleFilter will automatically detect runmodes and apply the `seed` only for backtesting modes - if a `seed` value is set.

View File

@@ -32,7 +32,7 @@ Freqtrade is a free and open source crypto trading bot written in Python. It is
- Run: Test your strategy with simulated money (Dry-Run mode) or deploy it with real money (Live-Trade mode).
- Run using Edge (optional module): The concept is to find the best historical [trade expectancy](edge.md#expectancy) by markets based on variation of the stop-loss and then allow/reject markets to trade. The sizing of the trade is based on a risk of a percentage of your capital.
- Control/Monitor: Use Telegram or a WebUI (start/stop the bot, show profit/loss, daily summary, current open trades results, etc.).
- Analyse: Further analysis can be performed on either Backtesting data or Freqtrade trading history (SQL database), including automated standard plots, and methods to load the data into [interactive environments](data-analysis.md).
- Analyze: Further analysis can be performed on either Backtesting data or Freqtrade trading history (SQL database), including automated standard plots, and methods to load the data into [interactive environments](data-analysis.md).
## Supported exchange marketplaces
@@ -40,7 +40,6 @@ Please read the [exchange specific notes](exchanges.md) to learn about eventual,
- [X] [Binance](https://www.binance.com/)
- [X] [Bittrex](https://bittrex.com/)
- [X] [FTX](https://ftx.com/#a=2258149)
- [X] [Gate.io](https://www.gate.io/ref/6266643)
- [X] [Huobi](http://huobi.com/)
- [X] [Kraken](https://kraken.com/)
@@ -51,7 +50,7 @@ Please read the [exchange specific notes](exchanges.md) to learn about eventual,
- [X] [Binance](https://www.binance.com/)
- [X] [Gate.io](https://www.gate.io/ref/6266643)
- [X] [OKX](https://okx.com/).
- [X] [OKX](https://okx.com/)
Please make sure to read the [exchange specific notes](exchanges.md), as well as the [trading with leverage](leverage.md) documentation before diving in.

View File

@@ -13,7 +13,7 @@
Please only use advanced trading modes when you know how freqtrade (and your strategy) works.
Also, never risk more than what you can afford to lose.
Please read the [strategy migration guide](strategy_migration.md#strategy-migration-between-v2-and-v3) to migrate your strategy from a freqtrade v2 strategy, to v3 strategy that can short and trade futures.
If you already have an existing strategy, please read the [strategy migration guide](strategy_migration.md#strategy-migration-between-v2-and-v3) to migrate your strategy from a freqtrade v2 strategy, to strategy of version 3 which can short and trade futures.
## Shorting
@@ -62,6 +62,13 @@ You will also have to pick a "margin mode" (explanation below) - with freqtrade
"margin_mode": "isolated"
```
##### Pair namings
Freqtrade follows the [ccxt naming conventions for futures](https://docs.ccxt.com/en/latest/manual.html?#perpetual-swap-perpetual-future).
A futures pair will therefore have the naming of `base/quote:settle` (e.g. `ETH/USDT:USDT`).
Binance is currently still an exception to this naming scheme, where pairs are named `ETH/USDT` also for futures markets, but will be aligned as soon as CCXT is ready.
### Margin mode
On top of `trading_mode` - you will also have to configure your `margin_mode`.

165
docs/producer-consumer.md Normal file
View File

@@ -0,0 +1,165 @@
# Producer / Consumer mode
freqtrade provides a mechanism whereby an instance (also called `consumer`) may listen to messages from an upstream freqtrade instance (also called `producer`) using the message websocket. Mainly, `analyzed_df` and `whitelist` messages. This allows the reuse of computed indicators (and signals) for pairs in multiple bots without needing to compute them multiple times.
See [Message Websocket](rest-api.md#message-websocket) in the Rest API docs for setting up the `api_server` configuration for your message websocket (this will be your producer).
!!! Note
We strongly recommend to set `ws_token` to something random and known only to yourself to avoid unauthorized access to your bot.
## Configuration
Enable subscribing to an instance by adding the `external_message_consumer` section to the consumer's config file.
```json
{
//...
"external_message_consumer": {
"enabled": true,
"producers": [
{
"name": "default", // This can be any name you'd like, default is "default"
"host": "127.0.0.1", // The host from your producer's api_server config
"port": 8080, // The port from your producer's api_server config
"secure": false, // Use a secure websockets connection, default false
"ws_token": "sercet_Ws_t0ken" // The ws_token from your producer's api_server config
}
],
// The following configurations are optional, and usually not required
// "wait_timeout": 300,
// "ping_timeout": 10,
// "sleep_time": 10,
// "remove_entry_exit_signals": false,
// "message_size_limit": 8
}
//...
}
```
| Parameter | Description |
|------------|-------------|
| `enabled` | **Required.** Enable consumer mode. If set to false, all other settings in this section are ignored.<br>*Defaults to `false`.*<br> **Datatype:** boolean .
| `producers` | **Required.** List of producers <br> **Datatype:** Array.
| `producers.name` | **Required.** Name of this producer. This name must be used in calls to `get_producer_pairs()` and `get_producer_df()` if more than one producer is used.<br> **Datatype:** string
| `producers.host` | **Required.** The hostname or IP address from your producer.<br> **Datatype:** string
| `producers.port` | **Required.** The port matching the above host.<br> **Datatype:** string
| `producers.secure` | **Optional.** Use ssl in websockets connection. Default False.<br> **Datatype:** string
| `producers.ws_token` | **Required.** `ws_token` as configured on the producer.<br> **Datatype:** string
| | **Optional settings**
| `wait_timeout` | Timeout until we ping again if no message is received. <br>*Defaults to `300`.*<br> **Datatype:** Integer - in seconds.
| `wait_timeout` | Ping timeout <br>*Defaults to `10`.*<br> **Datatype:** Integer - in seconds.
| `sleep_time` | Sleep time before retrying to connect.<br>*Defaults to `10`.*<br> **Datatype:** Integer - in seconds.
| `remove_entry_exit_signals` | Remove signal columns from the dataframe (set them to 0) on dataframe receipt.<br>*Defaults to `10`.*<br> **Datatype:** Integer - in seconds.
| `message_size_limit` | Size limit per message<br>*Defaults to `8`.*<br> **Datatype:** Integer - Megabytes.
Instead of (or as well as) calculating indicators in `populate_indicators()` the follower instance listens on the connection to a producer instance's messages (or multiple producer instances in advanced configurations) and requests the producer's most recently analyzed dataframes for each pair in the active whitelist.
A consumer instance will then have a full copy of the analyzed dataframes without the need to calculate them itself.
## Examples
### Example - Producer Strategy
A simple strategy with multiple indicators. No special considerations are required in the strategy itself.
```py
class ProducerStrategy(IStrategy):
#...
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
Calculate indicators in the standard freqtrade way which can then be broadcast to other instances
"""
dataframe['rsi'] = ta.RSI(dataframe)
bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2)
dataframe['bb_lowerband'] = bollinger['lower']
dataframe['bb_middleband'] = bollinger['mid']
dataframe['bb_upperband'] = bollinger['upper']
dataframe['tema'] = ta.TEMA(dataframe, timeperiod=9)
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
Populates the entry signal for the given dataframe
"""
dataframe.loc[
(
(qtpylib.crossed_above(dataframe['rsi'], self.buy_rsi.value)) &
(dataframe['tema'] <= dataframe['bb_middleband']) &
(dataframe['tema'] > dataframe['tema'].shift(1)) &
(dataframe['volume'] > 0)
),
'enter_long'] = 1
return dataframe
```
!!! Tip "FreqAI"
You can use this to setup [FreqAI](freqai.md) on a powerful machine, while you run consumers on simple machines like raspberries, which can interpret the signals generated from the producer in different ways.
### Example - Consumer Strategy
A logically equivalent strategy which calculates no indicators itself, but will have the same analyzed dataframes available to make trading decisions based on the indicators calculated in the producer. In this example the consumer has the same entry criteria, however this is not necessary. The consumer may use different logic to enter/exit trades, and only use the indicators as specified.
```py
class ConsumerStrategy(IStrategy):
#...
process_only_new_candles = False # required for consumers
_columns_to_expect = ['rsi_default', 'tema_default', 'bb_middleband_default']
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
Use the websocket api to get pre-populated indicators from another freqtrade instance.
Use `self.dp.get_producer_df(pair)` to get the dataframe
"""
pair = metadata['pair']
timeframe = self.timeframe
producer_pairs = self.dp.get_producer_pairs()
# You can specify which producer to get pairs from via:
# self.dp.get_producer_pairs("my_other_producer")
# This func returns the analyzed dataframe, and when it was analyzed
producer_dataframe, _ = self.dp.get_producer_df(pair)
# You can get other data if the producer makes it available:
# self.dp.get_producer_df(
# pair,
# timeframe="1h",
# candle_type=CandleType.SPOT,
# producer_name="my_other_producer"
# )
if not producer_dataframe.empty:
# If you plan on passing the producer's entry/exit signal directly,
# specify ffill=False or it will have unintended results
merged_dataframe = merge_informative_pair(dataframe, producer_dataframe,
timeframe, timeframe,
append_timeframe=False,
suffix="default")
return merged_dataframe
else:
dataframe[self._columns_to_expect] = 0
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
Populates the entry signal for the given dataframe
"""
# Use the dataframe columns as if we calculated them ourselves
dataframe.loc[
(
(qtpylib.crossed_above(dataframe['rsi_default'], self.buy_rsi.value)) &
(dataframe['tema_default'] <= dataframe['bb_middleband_default']) &
(dataframe['tema_default'] > dataframe['tema_default'].shift(1)) &
(dataframe['volume'] > 0)
),
'enter_long'] = 1
return dataframe
```
!!! Tip "Using upstream signals"
By setting `remove_entry_exit_signals=false`, you can also use the producer's signals directly. They should be available as `enter_long_default` (assuming `suffix="default"` was used) - and can be used as either signal directly, or as additional indicator.

View File

@@ -1,6 +1,6 @@
markdown==3.3.7
mkdocs==1.3.1
mkdocs-material==8.4.0
mkdocs==1.4.2
mkdocs-material==8.5.11
mdx_truly_sane_lists==1.3
pymdown-extensions==9.5
pymdown-extensions==9.9
jinja2==3.1.2

View File

@@ -31,7 +31,8 @@ Sample configuration:
"jwt_secret_key": "somethingrandom",
"CORS_origins": [],
"username": "Freqtrader",
"password": "SuperSecret1!"
"password": "SuperSecret1!",
"ws_token": "sercet_Ws_t0ken"
},
```
@@ -66,7 +67,7 @@ secrets.token_hex()
!!! Danger "Password selection"
Please make sure to select a very strong, unique password to protect your bot from unauthorized access.
Also change `jwt_secret_key` to something random (no need to remember this, but it'll be used to encrypt your session, so it better be something unique!).
Also change `jwt_secret_key` to something random (no need to remember this, but it'll be used to encrypt your session, so it better be something unique!).
### Configuration with docker
@@ -93,7 +94,6 @@ Make sure that the following 2 lines are available in your docker-compose file:
!!! Danger "Security warning"
By using `8080:8080` in the docker port mapping, the API will be available to everyone connecting to the server under the correct port, so others may be able to control your bot.
## Rest API
### Consuming the API
@@ -163,6 +163,8 @@ python3 scripts/rest_client.py --config rest_config.json <command> [optional par
| `strategy <strategy>` | Get specific Strategy content. **Alpha**
| `available_pairs` | List available backtest data. **Alpha**
| `version` | Show version.
| `sysinfo` | Show informations about the system load.
| `health` | Show bot health (last bot loop).
!!! Warning "Alpha status"
Endpoints labeled with *Alpha status* above may change at any time without notice.
@@ -227,6 +229,11 @@ forceexit
Force-exit a trade.
:param tradeid: Id of the trade (can be received via status command)
:param ordertype: Order type to use (must be market or limit)
:param amount: Amount to sell. Full sell if not given
health
Provides a quick health check of the running bot.
locks
Return current locks
@@ -267,7 +274,7 @@ reload_config
Reload configuration.
show_config
Returns part of the configuration, relevant for trading operations.
start
@@ -312,12 +319,118 @@ version
whitelist
Show the current whitelist.
```
### Message WebSocket
The API Server includes a websocket endpoint for subscribing to RPC messages from the freqtrade Bot.
This can be used to consume real-time data from your bot, such as entry/exit fill messages, whitelist changes, populated indicators for pairs, and more.
This is also used to setup [Producer/Consumer mode](producer-consumer.md) in Freqtrade.
Assuming your rest API is set to `127.0.0.1` on port `8080`, the endpoint is available at `http://localhost:8080/api/v1/message/ws`.
To access the websocket endpoint, the `ws_token` is required as a query parameter in the endpoint URL.
To generate a safe `ws_token` you can run the following code:
``` python
>>> import secrets
>>> secrets.token_urlsafe(25)
'hZ-y58LXyX_HZ8O1cJzVyN6ePWrLpNQv4Q'
```
You would then add that token under `ws_token` in your `api_server` config. Like so:
``` json
"api_server": {
"enabled": true,
"listen_ip_address": "127.0.0.1",
"listen_port": 8080,
"verbosity": "error",
"enable_openapi": false,
"jwt_secret_key": "somethingrandom",
"CORS_origins": [],
"username": "Freqtrader",
"password": "SuperSecret1!",
"ws_token": "hZ-y58LXyX_HZ8O1cJzVyN6ePWrLpNQv4Q" // <-----
},
```
You can now connect to the endpoint at `http://localhost:8080/api/v1/message/ws?token=hZ-y58LXyX_HZ8O1cJzVyN6ePWrLpNQv4Q`.
!!! Danger "Reuse of example tokens"
Please do not use the above example token. To make sure you are secure, generate a completely new token.
#### Using the WebSocket
Once connected to the WebSocket, the bot will broadcast RPC messages to anyone who is subscribed to them. To subscribe to a list of messages, you must send a JSON request through the WebSocket like the one below. The `data` key must be a list of message type strings.
``` json
{
"type": "subscribe",
"data": ["whitelist", "analyzed_df"] // A list of string message types
}
```
For a list of message types, please refer to the RPCMessageType enum in `freqtrade/enums/rpcmessagetype.py`
Now anytime those types of RPC messages are sent in the bot, you will receive them through the WebSocket as long as the connection is active. They typically take the same form as the request:
``` json
{
"type": "analyzed_df",
"data": {
"key": ["NEO/BTC", "5m", "spot"],
"df": {}, // The dataframe
"la": "2022-09-08 22:14:41.457786+00:00"
}
}
```
#### Reverse Proxy setup
When using [Nginx](https://nginx.org/en/docs/), the following configuration is required for WebSockets to work (Note this configuration is incomplete, it's missing some information and can not be used as is):
Please make sure to replace `<freqtrade_listen_ip>` (and the subsequent port) with the IP and Port matching your configuration/setup.
```
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
#...
server {
#...
location / {
proxy_http_version 1.1;
proxy_pass http://<freqtrade_listen_ip>:8080;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
}
}
}
```
To properly configure your reverse proxy (securely), please consult it's documentation for proxying websockets.
- **Traefik**: Traefik supports websockets out of the box, see the [documentation](https://doc.traefik.io/traefik/)
- **Caddy**: Caddy v2 supports websockets out of the box, see the [documentation](https://caddyserver.com/docs/v2-upgrade#proxy)
!!! Tip "SSL certificates"
You can use tools like certbot to setup ssl certificates to access your bot's UI through encrypted connection by using any fo the above reverse proxies.
While this will protect your data in transit, we do not recommend to run the freqtrade API outside of your private network (VPN, SSH tunnel).
### OpenAPI interface
To enable the builtin openAPI interface (Swagger UI), specify `"enable_openapi": true` in the api_server configuration.
This will enable the Swagger UI at the `/docs` endpoint. By default, that's running at http://localhost:8080/docs/ - but it'll depend on your settings.
This will enable the Swagger UI at the `/docs` endpoint. By default, that's running at http://localhost:8080/docs - but it'll depend on your settings.
### Advanced API usage using JWT tokens

View File

@@ -13,12 +13,12 @@ Feel free to use a visual Database editor like SqliteBrowser if you feel more co
sudo apt-get install sqlite3
```
### Using sqlite3 via docker-compose
### Using sqlite3 via docker
The freqtrade docker image does contain sqlite3, so you can edit the database without having to install anything on the host system.
``` bash
docker-compose exec freqtrade /bin/bash
docker compose exec freqtrade /bin/bash
sqlite3 <database-file>.sqlite
```

View File

@@ -24,7 +24,7 @@ These modes can be configured with these values:
```
!!! Note
Stoploss on exchange is only supported for Binance (stop-loss-limit), Huobi (stop-limit), Kraken (stop-loss-market, stop-loss-limit), FTX (stop limit and stop-market) Gateio (stop-limit), and Kucoin (stop-limit and stop-market) as of now.
Stoploss on exchange is only supported for Binance (stop-loss-limit), Huobi (stop-limit), Kraken (stop-loss-market, stop-loss-limit), Gateio (stop-limit), and Kucoin (stop-limit and stop-market) as of now.
<ins>Do not set too low/tight stoploss value if using stop loss on exchange!</ins>
If set to low/tight then you have greater risk of missing fill on the order and stoploss will not work.
@@ -87,7 +87,7 @@ At this stage the bot contains the following stoploss support modes:
2. Trailing stop loss.
3. Trailing stop loss, custom positive loss.
4. Trailing stop loss only once the trade has reached a certain offset.
5. [Custom stoploss function](strategy-advanced.md#custom-stoploss)
5. [Custom stoploss function](strategy-callbacks.md#custom-stoploss)
### Static Stop Loss

View File

@@ -106,6 +106,12 @@ def custom_exit(self, pair: str, trade: Trade, current_time: datetime, current_r
!!! Note
`enter_tag` is limited to 100 characters, remaining data will be truncated.
!!! Warning
There is only one `enter_tag` column, which is used for both long and short trades.
As a consequence, this column must be treated as "last write wins" (it's just a dataframe column after all).
In fancy situations, where multiple signals collide (or if signals are deactivated again based on different conditions), this can lead to odd results with the wrong tag applied to an entry signal.
These results are a consequence of the strategy overwriting prior tags - where the last tag will "stick" and will be the one freqtrade will use.
## Exit tag
Similar to [Buy Tagging](#buy-tag), you can also specify a sell tag.

View File

@@ -75,7 +75,7 @@ class AwesomeStrategy(IStrategy):
```
### Stake size management
## Stake size management
Called before entering a trade, makes it possible to manage your position size when placing a new trade.
@@ -159,6 +159,7 @@ The stoploss price can only ever move upwards - if the stoploss value returned f
The method must return a stoploss value (float / number) as a percentage of the current price.
E.g. If the `current_rate` is 200 USD, then returning `0.02` will set the stoploss price 2% lower, at 196 USD.
During backtesting, `current_rate` (and `current_profit`) are provided against the candle's high (or low for short trades) - while the resulting stoploss is evaluated against the candle's low (or high for short trades).
The absolute value of the return value is used (the sign is ignored), so returning `0.05` or `-0.05` have the same result, a stoploss 5% below the current price.
@@ -423,7 +424,7 @@ class AwesomeStrategy(IStrategy):
!!! Warning "Backtesting"
Custom prices are supported in backtesting (starting with 2021.12), and orders will fill if the price falls within the candle's low/high range.
Orders that don't fill immediately are subject to regular timeout handling, which happens once per (detail) candle.
`custom_exit_price()` is only called for sells of type exit_signal and Custom exit. All other exit-types will use regular backtesting prices.
`custom_exit_price()` is only called for sells of type exit_signal, Custom exit and partial exits. All other exit-types will use regular backtesting prices.
## Custom order timeout rules
@@ -643,7 +644,7 @@ This callback is **not** called when there is an open order (either buy or sell)
Additional Buys are ignored once you have reached the maximum amount of extra buys that you have set on `max_entry_position_adjustment`, but the callback is called anyway looking for partial exits.
Position adjustments will always be applied in the direction of the trade, so a positive value will always increase your position (negative values will decrease your position), no matter if it's a long or short trade. Modifications to leverage are not possible.
Position adjustments will always be applied in the direction of the trade, so a positive value will always increase your position (negative values will decrease your position), no matter if it's a long or short trade. Modifications to leverage are not possible, and the stake-amount is assumed to be before applying leverage.
!!! Note "About stake size"
Using fixed stake size means it will be the amount used for the first order, just like without position adjustment.
@@ -654,7 +655,7 @@ Position adjustments will always be applied in the direction of the trade, so a
Stoploss is still calculated from the initial opening price, not averaged price.
Regular stoploss rules still apply (cannot move down).
While `/stopbuy` command stops the bot from entering new trades, the position adjustment feature will continue buying new orders on existing trades.
While `/stopentry` command stops the bot from entering new trades, the position adjustment feature will continue buying new orders on existing trades.
!!! Warning "Backtesting"
During backtesting this callback is called for each candle in `timeframe` or `timeframe_detail`, so run-time performance will be affected.
@@ -772,7 +773,7 @@ class DigDeeperStrategy(IStrategy):
* Sell 100@10\$ -> Avg price: 8.5\$, realized profit 150\$, 17.65%
* Buy 150@11\$ -> Avg price: 10\$, realized profit 150\$, 17.65%
* Sell 100@12\$ -> Avg price: 10\$, total realized profit 350\$, 20%
* Sell 150@14\$ -> Avg price: 10\$, total realized profit 950\$, 40%
* Sell 150@14\$ -> Avg price: 10\$, total realized profit 950\$, 40% <- *This will be the last "Exit" message*
The total profit for this trade was 950$ on a 3350$ investment (`100@8$ + 100@9$ + 150@11$`). As such - the final relative profit is 28.35% (`950 / 3350`).

View File

@@ -166,7 +166,7 @@ Additional technical libraries can be installed as necessary, or custom indicato
Most indicators have an instable startup period, in which they are either not available (NaN), or the calculation is incorrect. This can lead to inconsistencies, since Freqtrade does not know how long this instable period should be.
To account for this, the strategy can be assigned the `startup_candle_count` attribute.
This should be set to the maximum number of candles that the strategy requires to calculate stable indicators.
This should be set to the maximum number of candles that the strategy requires to calculate stable indicators. In the case where a user includes higher timeframes with informative pairs, the `startup_candle_count` does not necessarily change. The value is the maximum period (in candles) that any of the informatives timeframes need to compute stable indicators.
In this example strategy, this should be set to 100 (`startup_candle_count = 100`), since the longest needed history is 100 candles.
@@ -264,7 +264,8 @@ def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFram
### Exit signal rules
Edit the method `populate_exit_trend()` into your strategy file to update your exit strategy.
Please note that the exit-signal is only used if `use_exit_signal` is set to true in the configuration.
The exit-signal is only used for exits if `use_exit_signal` is set to true in the configuration.
`use_exit_signal` will not influence [signal collision rules](#colliding-signals) - which will still apply and can prevent entries.
It's important to always return the dataframe without removing/modifying the columns `"open", "high", "low", "close", "volume"`, otherwise these fields would contain something unexpected.
@@ -362,9 +363,9 @@ class AwesomeStrategy(IStrategy):
timeframe = "1d"
timeframe_mins = timeframe_to_minutes(timeframe)
minimal_roi = {
"0": 0.05, # 5% for the first 3 candles
str(timeframe_mins * 3)): 0.02, # 2% after 3 candles
str(timeframe_mins * 6)): 0.01, # 1% After 6 candles
"0": 0.05, # 5% for the first 3 candles
str(timeframe_mins * 3): 0.02, # 2% after 3 candles
str(timeframe_mins * 6): 0.01, # 1% After 6 candles
}
```
@@ -445,15 +446,17 @@ A full sample can be found [in the DataProvider section](#complete-data-provider
??? Note "Alternative candle types"
Informative_pairs can also provide a 3rd tuple element defining the candle type explicitly.
Availability of alternative candle-types will depend on the trading-mode and the exchange. Details about this can be found in the exchange documentation.
Availability of alternative candle-types will depend on the trading-mode and the exchange.
In general, spot pairs cannot be used in futures markets, and futures candles can't be used as informative pairs for spot bots.
Details about this may vary, if they do, this can be found in the exchange documentation.
``` python
def informative_pairs(self):
return [
("ETH/USDT", "5m", ""), # Uses default candletype, depends on trading_mode
("ETH/USDT", "5m", "spot"), # Forces usage of spot candles
("BTC/TUSD", "15m", "futures"), # Uses futures candles
("BTC/TUSD", "15m", "mark"), # Uses mark candles
("ETH/USDT", "5m", ""), # Uses default candletype, depends on trading_mode (recommended)
("ETH/USDT", "5m", "spot"), # Forces usage of spot candles (only valid for bots running on spot markets).
("BTC/TUSD", "15m", "futures"), # Uses futures candles (only bots with `trading_mode=futures`)
("BTC/TUSD", "15m", "mark"), # Uses mark candles (only bots with `trading_mode=futures`)
]
```
***
@@ -654,13 +657,13 @@ This is where calling `self.dp.current_whitelist()` comes in handy.
# fetch live / historical candle (OHLCV) data for the first informative pair
inf_pair, inf_timeframe = self.informative_pairs()[0]
informative = self.dp.get_pair_dataframe(pair=inf_pair,
timeframe=inf_timeframe)
timeframe=inf_timeframe)
```
!!! Warning "Warning about backtesting"
Be careful when using dataprovider in backtesting. `historic_ohlcv()` (and `get_pair_dataframe()`
for the backtesting runmode) provides the full time-range in one go,
so please be aware of it and make sure to not "look into the future" to avoid surprises when running in dry/live mode.
In backtesting, `dp.get_pair_dataframe()` behavior differs depending on where it's called.
Within `populate_*()` methods, `dp.get_pair_dataframe()` returns the full timerange. Please make sure to not "look into the future" to avoid surprises when running in dry/live mode.
Within [callbacks](strategy-callbacks.md), you'll get the full timerange up to the current (simulated) candle.
### *get_analyzed_dataframe(pair, timeframe)*
@@ -669,13 +672,13 @@ It can also be used in specific callbacks to get the signal that caused the acti
``` python
# fetch current dataframe
if self.dp.runmode.value in ('live', 'dry_run'):
dataframe, last_updated = self.dp.get_analyzed_dataframe(pair=metadata['pair'],
timeframe=self.timeframe)
dataframe, last_updated = self.dp.get_analyzed_dataframe(pair=metadata['pair'],
timeframe=self.timeframe)
```
!!! Note "No data available"
Returns an empty dataframe if the requested pair was not cached.
You can check for this with `if dataframe.empty:` and handle this case accordingly.
This should not happen when using whitelisted pairs.
### *orderbook(pair, maximum)*
@@ -722,7 +725,7 @@ if self.dp.runmode.value in ('live', 'dry_run'):
!!! Warning
Although the ticker data structure is a part of the ccxt Unified Interface, the values returned by this method can
vary for different exchanges. For instance, many exchanges do not return `vwap` values, the FTX exchange
vary for different exchanges. For instance, many exchanges do not return `vwap` values, some exchanges
does not always fills in the `last` field (so it can be None), etc. So you need to carefully verify the ticker
data returned from the exchange and add appropriate error handling / defaults.
@@ -824,6 +827,8 @@ Options:
- Merge the dataframe without lookahead bias
- Forward-fill (optional)
For a full sample, please refer to the [complete data provider example](#complete-data-provider-sample) below.
All columns of the informative dataframe will be available on the returning dataframe in a renamed fashion:
!!! Example "Column renaming"

View File

@@ -2,12 +2,37 @@
Debugging a strategy can be time-consuming. Freqtrade offers helper functions to visualize raw data.
The following assumes you work with SampleStrategy, data for 5m timeframe from Binance and have downloaded them into the data directory in the default location.
Please follow the [documentation](https://www.freqtrade.io/en/stable/data-download/) for more details.
## Setup
### Change Working directory to repository root
```python
import os
from pathlib import Path
# Change directory
# Modify this cell to insure that the output shows the correct path.
# Define all paths relative to the project root shown in the cell output
project_root = "somedir/freqtrade"
i=0
try:
os.chdirdir(project_root)
assert Path('LICENSE').is_file()
except:
while i<4 and (not Path('LICENSE').is_file()):
os.chdir(Path(Path.cwd(), '../'))
i+=1
project_root = Path.cwd()
print(Path.cwd())
```
### Configure Freqtrade environment
```python
from freqtrade.configuration import Configuration
# Customize these according to your needs.
@@ -15,14 +40,14 @@ from freqtrade.configuration import Configuration
# Initialize empty configuration object
config = Configuration.from_files([])
# Optionally (recommended), use existing configuration file
# config = Configuration.from_files(["config.json"])
# config = Configuration.from_files(["user_data/config.json"])
# Define some constants
config["timeframe"] = "5m"
# Name of the strategy class
config["strategy"] = "SampleStrategy"
# Location of the data
data_location = config['datadir']
data_location = config["datadir"]
# Pair to analyze - Only use one pair here
pair = "BTC/USDT"
```
@@ -36,12 +61,12 @@ from freqtrade.enums import CandleType
candles = load_pair_history(datadir=data_location,
timeframe=config["timeframe"],
pair=pair,
data_format = "hdf5",
data_format = "json", # Make sure to update this to your data
candle_type=CandleType.SPOT,
)
# Confirm success
print("Loaded " + str(len(candles)) + f" rows of data for {pair} from {data_location}")
print(f"Loaded {len(candles)} rows of data for {pair} from {data_location}")
candles.head()
```
@@ -232,7 +257,7 @@ graph = generate_candlestick_graph(pair=pair,
# Show graph inline
# graph.show()
# Render graph in a seperate window
# Render graph in a separate window
graph.show(renderer="browser")
```

View File

@@ -43,19 +43,25 @@ Note : `forcesell`, `forcebuy`, `emergencysell` are changed to `force_exit`, `fo
* `order_time_in_force` buy -> entry, sell -> exit.
* `order_types` buy -> entry, sell -> exit.
* `unfilledtimeout` buy -> entry, sell -> exit.
* `ignore_buying_expired_candle_after` -> moved to root level instead of "ask_strategy/exit_pricing"
* Terminology changes
* Sell reasons changed to reflect the new naming of "exit" instead of sells. Be careful in your strategy if you're using `exit_reason` checks and eventually update your strategy.
* `sell_signal` -> `exit_signal`
* `custom_sell` -> `custom_exit`
* `force_sell` -> `force_exit`
* `emergency_sell` -> `emergency_exit`
* Order pricing
* `bid_strategy` -> `entry_pricing`
* `ask_strategy` -> `exit_pricing`
* `ask_last_balance` -> `price_last_balance`
* `bid_last_balance` -> `price_last_balance`
* Webhook terminology changed from "sell" to "exit", and from "buy" to entry
* `webhookbuy` -> `webhookentry`
* `webhookbuyfill` -> `webhookentryfill`
* `webhookbuycancel` -> `webhookentrycancel`
* `webhooksell` -> `webhookexit`
* `webhooksellfill` -> `webhookexitfill`
* `webhooksellcancel` -> `webhookexitcancel`
* `webhookbuy` -> `entry`
* `webhookbuyfill` -> `entry_fill`
* `webhookbuycancel` -> `entry_cancel`
* `webhooksell` -> `exit`
* `webhooksellfill` -> `exit_fill`
* `webhooksellcancel` -> `exit_cancel`
* Telegram notification settings
* `buy` -> `entry`
* `buy_fill` -> `entry_fill`
@@ -332,8 +338,8 @@ After:
``` python hl_lines="2 3"
order_time_in_force: Dict = {
"entry": "gtc",
"exit": "gtc",
"entry": "GTC",
"exit": "GTC",
}
```
@@ -443,6 +449,7 @@ Please refer to the [pricing documentation](configuration.md#prices-used-for-ord
"use_order_book": true,
"order_book_top": 1,
"bid_last_balance": 0.0
"ignore_buying_expired_candle_after": 120
}
}
```
@@ -466,6 +473,7 @@ after:
"use_order_book": true,
"order_book_top": 1,
"price_last_balance": 0.0
}
},
"ignore_buying_expired_candle_after": 120
}
```

View File

@@ -77,11 +77,14 @@ Example configuration showing the different settings:
"enabled": true,
"token": "your_telegram_token",
"chat_id": "your_telegram_chat_id",
"allow_custom_messages": true,
"notification_settings": {
"status": "silent",
"warning": "on",
"startup": "off",
"entry": "silent",
"entry_fill": "on",
"entry_cancel": "silent",
"exit": {
"roi": "silent",
"emergency_exit": "on",
@@ -90,11 +93,10 @@ Example configuration showing the different settings:
"trailing_stop_loss": "on",
"stop_loss": "on",
"stoploss_on_exchange": "on",
"custom_exit": "silent"
"custom_exit": "silent",
"partial_exit": "on"
},
"entry_cancel": "silent",
"exit_cancel": "on",
"entry_fill": "off",
"exit_fill": "off",
"protection_trigger": "off",
"protection_trigger_global": "on",
@@ -114,6 +116,7 @@ Example configuration showing the different settings:
`show_candle` - show candle values as part of entry/exit messages. Only possible values are `"ohlc"` or `"off"`.
`balance_dust_level` will define what the `/balance` command takes as "dust" - Currencies with a balance below this will be shown.
`allow_custom_messages` completely disable strategy messages.
`reload` allows you to disable reload-buttons on selected messages.
## Create a custom keyboard (command shortcut buttons)
@@ -138,7 +141,7 @@ You can create your own keyboard in `config.json`:
"enabled": true,
"token": "your_telegram_token",
"chat_id": "your_telegram_chat_id",
"keyboard": [
"keyboard": [
["/daily", "/stats", "/balance", "/profit"],
["/status table", "/performance"],
["/reload_config", "/count", "/logs"]
@@ -149,7 +152,7 @@ You can create your own keyboard in `config.json`:
!!! Note "Supported Commands"
Only the following commands are allowed. Command arguments are not supported!
`/start`, `/stop`, `/status`, `/status table`, `/trades`, `/profit`, `/performance`, `/daily`, `/stats`, `/count`, `/locks`, `/balance`, `/stopbuy`, `/reload_config`, `/show_config`, `/logs`, `/whitelist`, `/blacklist`, `/edge`, `/help`, `/version`
`/start`, `/stop`, `/status`, `/status table`, `/trades`, `/profit`, `/performance`, `/daily`, `/stats`, `/count`, `/locks`, `/balance`, `/stopentry`, `/reload_config`, `/show_config`, `/logs`, `/whitelist`, `/blacklist`, `/edge`, `/help`, `/version`
## Telegram commands
@@ -161,7 +164,7 @@ official commands. You can ask at any moment for help with `/help`.
|----------|-------------|
| `/start` | Starts the trader
| `/stop` | Stops the trader
| `/stopbuy` | Stops the trader from opening new trades. Gracefully closes open trades according to their rules.
| `/stopbuy | /stopentry` | Stops the trader from opening new trades. Gracefully closes open trades according to their rules.
| `/reload_config` | Reloads the configuration file
| `/show_config` | Shows part of the current configuration with relevant settings to operation
| `/logs [limit]` | Show last log messages.
@@ -225,16 +228,16 @@ Once all positions are sold, run `/stop` to completely stop the bot.
For each open trade, the bot will send you the following message.
Enter Tag is configurable via Strategy.
> **Trade ID:** `123` `(since 1 days ago)`
> **Current Pair:** CVC/BTC
> **Trade ID:** `123` `(since 1 days ago)`
> **Current Pair:** CVC/BTC
> **Direction:** Long
> **Leverage:** 1.0
> **Amount:** `26.64180098`
> **Amount:** `26.64180098`
> **Enter Tag:** Awesome Long Signal
> **Open Rate:** `0.00007489`
> **Current Rate:** `0.00007489`
> **Current Profit:** `12.95%`
> **Stoploss:** `0.00007389 (-0.02%)`
> **Open Rate:** `0.00007489`
> **Current Rate:** `0.00007489`
> **Current Profit:** `12.95%`
> **Stoploss:** `0.00007389 (-0.02%)`
### /status table
@@ -261,26 +264,26 @@ current max
Return a summary of your profit/loss and performance.
> **ROI:** Close trades
> ∙ `0.00485701 BTC (2.2%) (15.2 Σ%)`
> ∙ `62.968 USD`
> **ROI:** All trades
> ∙ `0.00255280 BTC (1.5%) (6.43 Σ%)`
> ∙ `33.095 EUR`
>
> **Total Trade Count:** `138`
> **First Trade opened:** `3 days ago`
> **Latest Trade opened:** `2 minutes ago`
> **Avg. Duration:** `2:33:45`
> **Best Performing:** `PAY/BTC: 50.23%`
> **Trading volume:** `0.5 BTC`
> **Profit factor:** `1.04`
> **Max Drawdown:** `9.23% (0.01255 BTC)`
> **ROI:** Close trades
> ∙ `0.00485701 BTC (2.2%) (15.2 Σ%)`
> ∙ `62.968 USD`
> **ROI:** All trades
> ∙ `0.00255280 BTC (1.5%) (6.43 Σ%)`
> ∙ `33.095 EUR`
>
> **Total Trade Count:** `138`
> **First Trade opened:** `3 days ago`
> **Latest Trade opened:** `2 minutes ago`
> **Avg. Duration:** `2:33:45`
> **Best Performing:** `PAY/BTC: 50.23%`
> **Trading volume:** `0.5 BTC`
> **Profit factor:** `1.04`
> **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.
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.
Max drawdown corresponds to the backtesting metric `Absolute Drawdown (Account)` - calculated as `(Absolute Drawdown) / (DrawdownHigh + startingBalance)`.
### /forceexit <trade_id>
@@ -309,27 +312,27 @@ Note that for this to work, `force_entry_enable` needs to be set to true.
### /performance
Return the performance of each crypto-currency the bot has sold.
> Performance:
> 1. `RCN/BTC 0.003 BTC (57.77%) (1)`
> 2. `PAY/BTC 0.0012 BTC (56.91%) (1)`
> 3. `VIB/BTC 0.0011 BTC (47.07%) (1)`
> 4. `SALT/BTC 0.0010 BTC (30.24%) (1)`
> 5. `STORJ/BTC 0.0009 BTC (27.24%) (1)`
> ...
> Performance:
> 1. `RCN/BTC 0.003 BTC (57.77%) (1)`
> 2. `PAY/BTC 0.0012 BTC (56.91%) (1)`
> 3. `VIB/BTC 0.0011 BTC (47.07%) (1)`
> 4. `SALT/BTC 0.0010 BTC (30.24%) (1)`
> 5. `STORJ/BTC 0.0009 BTC (27.24%) (1)`
> ...
### /balance
Return the balance of all crypto-currency your have on the exchange.
> **Currency:** BTC
> **Available:** 3.05890234
> **Balance:** 3.05890234
> **Pending:** 0.0
> **Currency:** BTC
> **Available:** 3.05890234
> **Balance:** 3.05890234
> **Pending:** 0.0
> **Currency:** CVC
> **Available:** 86.64180098
> **Balance:** 86.64180098
> **Pending:** 0.0
> **Currency:** CVC
> **Available:** 86.64180098
> **Balance:** 86.64180098
> **Pending:** 0.0
### /daily <n>
@@ -376,7 +379,7 @@ Month (count) Profit BTC Profit USD Profit %
Shows the current whitelist
> Using whitelist `StaticPairList` with 22 pairs
> Using whitelist `StaticPairList` with 22 pairs
> `IOTA/BTC, NEO/BTC, TRX/BTC, VET/BTC, ADA/BTC, ETC/BTC, NCASH/BTC, DASH/BTC, XRP/BTC, XVG/BTC, EOS/BTC, LTC/BTC, OMG/BTC, BTG/BTC, LSK/BTC, ZEC/BTC, HOT/BTC, IOTX/BTC, XMR/BTC, AST/BTC, XLM/BTC, NANO/BTC`
### /blacklist [pair]
@@ -386,7 +389,7 @@ If Pair is set, then this pair will be added to the pairlist.
Also supports multiple pairs, separated by a space.
Use `/reload_config` to reset the blacklist.
> Using blacklist `StaticPairList` with 2 pairs
> Using blacklist `StaticPairList` with 2 pairs
>`DODGE/BTC`, `HOT/BTC`.
### /edge

View File

@@ -6,14 +6,14 @@ To update your freqtrade installation, please use one of the below methods, corr
Breaking changes / changed behavior will be documented in the changelog that is posted alongside every release.
For the develop branch, please follow PR's to avoid being surprised by changes.
## docker-compose
## docker
!!! Note "Legacy installations using the `master` image"
We're switching from master to stable for the release Images - please adjust your docker-file and replace `freqtradeorg/freqtrade:master` with `freqtradeorg/freqtrade:stable`
``` bash
docker-compose pull
docker-compose up -d
docker compose pull
docker compose up -d
```
## Installation via setup script
@@ -37,3 +37,12 @@ pip install -e .
# Ensure freqUI is at the latest version
freqtrade install-ui
```
### Problems updating
Update-problems usually come missing dependencies (you didn't follow the above instructions) - or from updated dependencies, which fail to install (for example TA-lib).
Please refer to the corresponding installation sections (common problems linked below)
Common problems and their solutions:
* [ta-lib update on windows](windows_installation.md#2-install-ta-lib)

View File

@@ -169,6 +169,43 @@ Example: Search dedicated strategy path.
freqtrade list-strategies --strategy-path ~/.freqtrade/strategies/
```
## List freqAI models
Use the `list-freqaimodels` subcommand to see all freqAI models available.
This subcommand is useful for finding problems in your environment with loading freqAI models: modules with models that contain errors and failed to load are printed in red (LOAD FAILED), while models with duplicate names are printed in yellow (DUPLICATE NAME).
```
usage: freqtrade list-freqaimodels [-h] [-v] [--logfile FILE] [-V] [-c PATH]
[-d PATH] [--userdir PATH]
[--freqaimodel-path PATH] [-1] [--no-color]
optional arguments:
-h, --help show this help message and exit
--freqaimodel-path PATH
Specify additional lookup path for freqaimodels.
-1, --one-column Print output in one column.
--no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file.
Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--logfile FILE Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more
details.
-V, --version show program's version number and exit
-c PATH, --config PATH
Specify configuration file (default:
`userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin.
-d PATH, --datadir PATH, --data-dir PATH
Path to directory with historical backtesting data.
--userdir PATH, --user-data-dir PATH
Path to userdata directory.
```
## List Exchanges
Use the `list-exchanges` subcommand to see the exchanges available for the bot.
@@ -226,7 +263,6 @@ equos True missing opt: fetchTicker, fetchTickers
eterbase True
fcoin True missing opt: fetchMyTrades, fetchTickers
fcoinjp True missing opt: fetchMyTrades, fetchTickers
ftx True
gateio True
gemini True
gopax True
@@ -332,7 +368,6 @@ fcoin True missing opt: fetchMyTrades, fetchTickers
fcoinjp True missing opt: fetchMyTrades, fetchTickers
flowbtc False missing: fetchOrder, fetchOHLCV
foxbit False missing: fetchOrder, fetchOHLCV
ftx True
gateio True
gemini True
gopax True
@@ -525,12 +560,14 @@ Requires a configuration with specified `pairlists` attribute.
Can be used to generate static pairlists to be used during backtesting / hyperopt.
```
usage: freqtrade test-pairlist [-h] [-v] [-c PATH]
usage: freqtrade test-pairlist [-h] [--userdir PATH] [-v] [-c PATH]
[--quote QUOTE_CURRENCY [QUOTE_CURRENCY ...]]
[-1] [--print-json] [--exchange EXCHANGE]
optional arguments:
-h, --help show this help message and exit
--userdir PATH, --user-data-dir PATH
Path to userdata directory.
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
-c PATH, --config PATH
Specify configuration file (default:
@@ -615,7 +652,7 @@ Common arguments:
You can also use webserver mode via docker.
Starting a one-off container requires the configuration of the port explicitly, as ports are not exposed by default.
You can use `docker-compose run --rm -p 127.0.0.1:8080:8080 freqtrade webserver` to start a one-off container that'll be removed once you stop it. This assumes that port 8080 is still available and no other bot is running on that port.
You can use `docker compose run --rm -p 127.0.0.1:8080:8080 freqtrade webserver` to start a one-off container that'll be removed once you stop it. This assumes that port 8080 is still available and no other bot is running on that port.
Alternatively, you can reconfigure the docker-compose file to have the command updated:
@@ -625,7 +662,7 @@ Alternatively, you can reconfigure the docker-compose file to have the command u
--config /freqtrade/user_data/config.json
```
You can now use `docker-compose up` to start the webserver.
You can now use `docker compose up` to start the webserver.
This assumes that the configuration has a webserver enabled and configured for docker (listening port = `0.0.0.0`).
!!! Tip
@@ -685,6 +722,7 @@ usage: freqtrade backtesting-analysis [-h] [-v] [--logfile FILE] [-V]
[--enter-reason-list ENTER_REASON_LIST [ENTER_REASON_LIST ...]]
[--exit-reason-list EXIT_REASON_LIST [EXIT_REASON_LIST ...]]
[--indicator-list INDICATOR_LIST [INDICATOR_LIST ...]]
[--timerange YYYYMMDD-[YYYYMMDD]]
optional arguments:
-h, --help show this help message and exit
@@ -707,6 +745,10 @@ optional arguments:
--indicator-list INDICATOR_LIST [INDICATOR_LIST ...]
Comma separated list of indicators to analyse. e.g.
'close,rsi,bb_lowerband,profit_abs'
--timerange YYYYMMDD-[YYYYMMDD]
Timerange to filter trades for analysis,
start inclusive, end exclusive. e.g.
20220101-20220201
Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).

View File

@@ -10,37 +10,37 @@ Sample configuration (tested using IFTTT).
"webhook": {
"enabled": true,
"url": "https://maker.ifttt.com/trigger/<YOUREVENT>/with/key/<YOURKEY>/",
"webhookentry": {
"entry": {
"value1": "Buying {pair}",
"value2": "limit {limit:8f}",
"value3": "{stake_amount:8f} {stake_currency}"
},
"webhookentrycancel": {
"entry_cancel": {
"value1": "Cancelling Open Buy Order for {pair}",
"value2": "limit {limit:8f}",
"value3": "{stake_amount:8f} {stake_currency}"
},
"webhookentryfill": {
"entry_fill": {
"value1": "Buy Order for {pair} filled",
"value2": "at {open_rate:8f}",
"value3": ""
},
"webhookexit": {
"exit": {
"value1": "Exiting {pair}",
"value2": "limit {limit:8f}",
"value3": "profit: {profit_amount:8f} {stake_currency} ({profit_ratio})"
},
"webhookexitcancel": {
"exit_cancel": {
"value1": "Cancelling Open Exit Order for {pair}",
"value2": "limit {limit:8f}",
"value3": "profit: {profit_amount:8f} {stake_currency} ({profit_ratio})"
},
"webhookexitfill": {
"exit_fill": {
"value1": "Exit Order for {pair} filled",
"value2": "at {close_rate:8f}.",
"value3": ""
},
"webhookstatus": {
"status": {
"value1": "Status: {status}",
"value2": "",
"value3": ""
@@ -57,7 +57,7 @@ You can set the POST body format to Form-Encoded (default), JSON-Encoded, or raw
"enabled": true,
"url": "https://<YOURSUBDOMAIN>.cloud.mattermost.com/hooks/<YOURHOOK>",
"format": "json",
"webhookstatus": {
"status": {
"text": "Status: {status}"
}
},
@@ -88,17 +88,30 @@ Optional parameters are available to enable automatic retries for webhook messag
"url": "https://<YOURHOOKURL>",
"retries": 3,
"retry_delay": 0.2,
"webhookstatus": {
"status": {
"status": "Status: {status}"
}
},
```
Custom messages can be sent to Webhook endpoints via the `self.dp.send_msg()` function from within the strategy. To enable this, set the `allow_custom_messages` option to `true`:
```json
"webhook": {
"enabled": true,
"url": "https://<YOURHOOKURL>",
"allow_custom_messages": true,
"strategy_msg": {
"status": "StrategyMessage: {msg}"
}
},
```
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.
### Webhookentry
### Entry
The fields in `webhook.webhookentry` are filled when the bot executes a long/short. Parameters are filled using string.format.
The fields in `webhook.entry` are filled when the bot executes a long/short. Parameters are filled using string.format.
Possible parameters are:
* `trade_id`
@@ -118,9 +131,9 @@ Possible parameters are:
* `current_rate`
* `enter_tag`
### Webhookentrycancel
### Entry cancel
The fields in `webhook.webhookentrycancel` are filled when the bot cancels a long/short order. Parameters are filled using string.format.
The fields in `webhook.entry_cancel` are filled when the bot cancels a long/short order. Parameters are filled using string.format.
Possible parameters are:
* `trade_id`
@@ -139,9 +152,9 @@ Possible parameters are:
* `current_rate`
* `enter_tag`
### Webhookentryfill
### Entry fill
The fields in `webhook.webhookentryfill` are filled when the bot filled a long/short order. Parameters are filled using string.format.
The fields in `webhook.entry_fill` are filled when the bot filled a long/short order. Parameters are filled using string.format.
Possible parameters are:
* `trade_id`
@@ -160,9 +173,9 @@ Possible parameters are:
* `current_rate`
* `enter_tag`
### Webhookexit
### Exit
The fields in `webhook.webhookexit` are filled when the bot exits a trade. Parameters are filled using string.format.
The fields in `webhook.exit` are filled when the bot exits a trade. Parameters are filled using string.format.
Possible parameters are:
* `trade_id`
@@ -184,9 +197,9 @@ Possible parameters are:
* `open_date`
* `close_date`
### Webhookexitfill
### Exit fill
The fields in `webhook.webhookexitfill` are filled when the bot fills a exit order (closes a Trade). Parameters are filled using string.format.
The fields in `webhook.exit_fill` are filled when the bot fills a exit order (closes a Trade). Parameters are filled using string.format.
Possible parameters are:
* `trade_id`
@@ -209,9 +222,9 @@ Possible parameters are:
* `open_date`
* `close_date`
### Webhookexitcancel
### Exit cancel
The fields in `webhook.webhookexitcancel` are filled when the bot cancels a exit order. Parameters are filled using string.format.
The fields in `webhook.exit_cancel` are filled when the bot cancels a exit order. Parameters are filled using string.format.
Possible parameters are:
* `trade_id`
@@ -234,9 +247,9 @@ Possible parameters are:
* `open_date`
* `close_date`
### Webhookstatus
### Status
The fields in `webhook.webhookstatus` are used for regular status messages (Started / Stopped / ...). Parameters are filled using string.format.
The fields in `webhook.status` are used for regular status messages (Started / Stopped / ...). Parameters are filled using string.format.
The only possible value here is `{status}`.
@@ -280,7 +293,6 @@ You can configure this as follows:
}
```
The above represents the default (`exit_fill` and `entry_fill` are optional and will default to the above configuration) - modifications are obviously possible.
Available fields correspond to the fields for webhooks and are documented in the corresponding webhook sections.
@@ -288,3 +300,13 @@ Available fields correspond to the fields for webhooks and are documented in the
The notifications will look as follows by default.
![discord-notification](assets/discord_notification.png)
Custom messages can be sent from a strategy to Discord endpoints via the dataprovider.send_msg() function. To enable this, set the `allow_custom_messages` option to `true`:
```json
"discord": {
"enabled": true,
"webhook_url": "https://discord.com/api/webhooks/<Your webhook URL ...>",
"allow_custom_messages": true,
},
```

View File

@@ -3,15 +3,16 @@
We **strongly** recommend that Windows users use [Docker](docker_quickstart.md) as this will work much easier and smoother (also more secure).
If that is not possible, try using the Windows Linux subsystem (WSL) - for which the Ubuntu instructions should work.
Otherwise, try the instructions below.
Otherwise, please follow the instructions below.
## Install freqtrade manually
!!! Note
Make sure to use 64bit Windows and 64bit Python to avoid problems with backtesting or hyperopt due to the memory constraints 32bit applications have under Windows.
!!! Note "64bit Python version"
Please make sure to use 64bit Windows and 64bit Python to avoid problems with backtesting or hyperopt due to the memory constraints 32bit applications have under Windows.
32bit python versions are no longer supported under Windows.
!!! Hint
Using the [Anaconda Distribution](https://www.anaconda.com/distribution/) under Windows can greatly help with installation problems. Check out the [Anaconda installation section](installation.md#Anaconda) in this document for more information.
Using the [Anaconda Distribution](https://www.anaconda.com/distribution/) under Windows can greatly help with installation problems. Check out the [Anaconda installation section](installation.md#installation-with-conda) in the documentation for more information.
### 1. Clone the git repository
@@ -23,7 +24,7 @@ git clone https://github.com/freqtrade/freqtrade.git
Install ta-lib according to the [ta-lib documentation](https://github.com/mrjbq7/ta-lib#windows).
As compiling from source on windows has heavy dependencies (requires a partial visual studio installation), there is also a repository of unofficial pre-compiled windows Wheels [here](https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib), which need to be downloaded and installed using `pip install TA_Lib-0.4.24-cp38-cp38-win_amd64.whl` (make sure to use the version matching your python version).
As compiling from source on windows has heavy dependencies (requires a partial visual studio installation), there is also a repository of unofficial pre-compiled windows Wheels [here](https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib), which need to be downloaded and installed using `pip install TA_Lib-0.4.25-cp38-cp38-win_amd64.whl` (make sure to use the version matching your python version).
Freqtrade provides these dependencies for the latest 3 Python versions (3.8, 3.9 and 3.10) and for 64bit Windows.
Other versions must be downloaded from the above link.
@@ -34,7 +35,7 @@ python -m venv .env
.env\Scripts\activate.ps1
# optionally install ta-lib from wheel
# Eventually adjust the below filename to match the downloaded wheel
pip install build_helpers/TA_Lib-0.4.19-cp38-cp38-win_amd64.whl
pip install --find-links build_helpers\ TA-Lib -U
pip install -r requirements.txt
pip install -e .
freqtrade

View File

@@ -34,6 +34,7 @@ dependencies:
- schedule
- python-dateutil
- joblib
- pyarrow
# ============================

View File

@@ -1,5 +1,5 @@
""" Freqtrade bot """
__version__ = '2022.8.dev'
__version__ = '2022.12.dev'
if 'dev' in __version__:
try:
@@ -16,6 +16,6 @@ if 'dev' in __version__:
from pathlib import Path
versionfile = Path('./freqtrade_commit')
if versionfile.is_file():
__version__ = f"docker-{versionfile.read_text()[:8]}"
__version__ = f"docker-{__version__}-{versionfile.read_text()[:8]}"
except Exception:
pass

View File

@@ -15,9 +15,9 @@ from freqtrade.commands.db_commands import start_convert_db
from freqtrade.commands.deploy_commands import (start_create_userdir, start_install_ui,
start_new_strategy)
from freqtrade.commands.hyperopt_commands import start_hyperopt_list, start_hyperopt_show
from freqtrade.commands.list_commands import (start_list_exchanges, start_list_markets,
start_list_strategies, start_list_timeframes,
start_show_trades)
from freqtrade.commands.list_commands import (start_list_exchanges, start_list_freqAI_models,
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)
from freqtrade.commands.pairlist_commands import start_test_pairlist

View File

@@ -60,10 +60,4 @@ def start_analysis_entries_exits(args: Dict[str, Any]) -> None:
logger.info('Starting freqtrade in analysis mode')
process_entry_exit_reasons(config['exportfilename'],
config['exchange']['pair_whitelist'],
config['analysis_groups'],
config['enter_reason_list'],
config['exit_reason_list'],
config['indicator_list']
)
process_entry_exit_reasons(config)

View File

@@ -25,7 +25,8 @@ ARGS_COMMON_OPTIMIZE = ["timeframe", "timerange", "dataformat_ohlcv",
ARGS_BACKTEST = ARGS_COMMON_OPTIMIZE + ["position_stacking", "use_max_market_positions",
"enable_protections", "dry_run_wallet", "timeframe_detail",
"strategy_list", "export", "exportfilename",
"backtest_breakdown", "backtest_cache"]
"backtest_breakdown", "backtest_cache",
"freqai_backtest_live_models"]
ARGS_HYPEROPT = ARGS_COMMON_OPTIMIZE + ["hyperopt", "hyperopt_path",
"position_stacking", "use_max_market_positions",
@@ -34,13 +35,15 @@ ARGS_HYPEROPT = ARGS_COMMON_OPTIMIZE + ["hyperopt", "hyperopt_path",
"print_colorized", "print_json", "hyperopt_jobs",
"hyperopt_random_state", "hyperopt_min_trades",
"hyperopt_loss", "disableparamexport",
"hyperopt_ignore_missing_space"]
"hyperopt_ignore_missing_space", "analyze_per_epoch"]
ARGS_EDGE = ARGS_COMMON_OPTIMIZE + ["stoploss_range"]
ARGS_LIST_STRATEGIES = ["strategy_path", "print_one_column", "print_colorized",
"recursive_strategy_search"]
ARGS_LIST_FREQAIMODELS = ["freqaimodel_path", "print_one_column", "print_colorized"]
ARGS_LIST_HYPEROPTS = ["hyperopt_path", "print_one_column", "print_colorized"]
ARGS_BACKTEST_SHOW = ["exportfilename", "backtest_show_pair_list"]
@@ -53,8 +56,8 @@ ARGS_LIST_PAIRS = ["exchange", "print_list", "list_pairs_print_json", "print_one
"print_csv", "base_currencies", "quote_currencies", "list_pairs_all",
"trading_mode"]
ARGS_TEST_PAIRLIST = ["verbosity", "config", "quote_currencies", "print_one_column",
"list_pairs_print_json", "exchange"]
ARGS_TEST_PAIRLIST = ["user_data_dir", "verbosity", "config", "quote_currencies",
"print_one_column", "list_pairs_print_json", "exchange"]
ARGS_CREATE_USERDIR = ["user_data_dir", "reset"]
@@ -62,14 +65,14 @@ ARGS_BUILD_CONFIG = ["config"]
ARGS_BUILD_STRATEGY = ["user_data_dir", "strategy", "template"]
ARGS_CONVERT_DATA = ["pairs", "format_from", "format_to", "erase"]
ARGS_CONVERT_DATA = ["pairs", "format_from", "format_to", "erase", "exchange"]
ARGS_CONVERT_DATA_OHLCV = ARGS_CONVERT_DATA + ["timeframes", "exchange", "trading_mode",
ARGS_CONVERT_DATA_OHLCV = ARGS_CONVERT_DATA + ["timeframes", "trading_mode",
"candle_types"]
ARGS_CONVERT_TRADES = ["pairs", "timeframes", "exchange", "dataformat_ohlcv", "dataformat_trades"]
ARGS_LIST_DATA = ["exchange", "dataformat_ohlcv", "pairs", "trading_mode"]
ARGS_LIST_DATA = ["exchange", "dataformat_ohlcv", "pairs", "trading_mode", "show_timerange"]
ARGS_DOWNLOAD_DATA = ["pairs", "pairs_file", "days", "new_pairs_days", "include_inactive",
"timerange", "download_trades", "exchange", "timeframes",
@@ -103,11 +106,11 @@ ARGS_HYPEROPT_SHOW = ["hyperopt_list_best", "hyperopt_list_profitable", "hyperop
"disableparamexport", "backtest_breakdown"]
ARGS_ANALYZE_ENTRIES_EXITS = ["exportfilename", "analysis_groups", "enter_reason_list",
"exit_reason_list", "indicator_list"]
"exit_reason_list", "indicator_list", "timerange"]
NO_CONF_REQURIED = ["convert-data", "convert-trade-data", "download-data", "list-timeframes",
"list-markets", "list-pairs", "list-strategies", "list-data",
"hyperopt-list", "hyperopt-show", "backtest-filter",
"list-markets", "list-pairs", "list-strategies", "list-freqaimodels",
"list-data", "hyperopt-list", "hyperopt-show", "backtest-filter",
"plot-dataframe", "plot-profit", "show-trades", "trades-to-ohlcv"]
NO_CONF_ALLOWED = ["create-userdir", "list-exchanges", "new-strategy"]
@@ -192,10 +195,11 @@ class Arguments:
start_create_userdir, start_download_data, start_edge,
start_hyperopt, start_hyperopt_list, start_hyperopt_show,
start_install_ui, start_list_data, start_list_exchanges,
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_test_pairlist, start_trading, start_webserver)
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_test_pairlist,
start_trading, start_webserver)
subparsers = self.parser.add_subparsers(dest='command',
# Use custom message when no subhandler is added
@@ -362,6 +366,15 @@ class Arguments:
list_strategies_cmd.set_defaults(func=start_list_strategies)
self._build_args(optionlist=ARGS_LIST_STRATEGIES, parser=list_strategies_cmd)
# Add list-freqAI Models subcommand
list_freqaimodels_cmd = subparsers.add_parser(
'list-freqaimodels',
help='Print available freqAI models.',
parents=[_common_parser],
)
list_freqaimodels_cmd.set_defaults(func=start_list_freqAI_models)
self._build_args(optionlist=ARGS_LIST_FREQAIMODELS, parser=list_freqaimodels_cmd)
# Add list-timeframes subcommand
list_timeframes_cmd = subparsers.add_parser(
'list-timeframes',

View File

@@ -108,7 +108,6 @@ def ask_user_config() -> Dict[str, Any]:
"binance",
"binanceus",
"bittrex",
"ftx",
"gateio",
"huobi",
"kraken",
@@ -211,6 +210,7 @@ def ask_user_config() -> Dict[str, Any]:
)
# Force JWT token to be a random string
answers['api_server_jwt_key'] = secrets.token_hex()
answers['api_server_ws_token'] = secrets.token_urlsafe(25)
return answers

View File

@@ -49,7 +49,7 @@ AVAILABLE_CLI_OPTIONS = {
default=0,
),
"logfile": Arg(
'--logfile',
'--logfile', '--log-file',
help="Log to the file specified. Special values are: 'syslog', 'journald'. "
"See the documentation for more details.",
metavar='FILE',
@@ -69,7 +69,7 @@ AVAILABLE_CLI_OPTIONS = {
metavar='PATH',
),
"datadir": Arg(
'-d', '--datadir',
'-d', '--datadir', '--data-dir',
help='Path to directory with historical backtesting data.',
metavar='PATH',
),
@@ -255,6 +255,13 @@ AVAILABLE_CLI_OPTIONS = {
nargs='+',
default='default',
),
"analyze_per_epoch": Arg(
'--analyze-per-epoch',
help='Run populate_indicators once per epoch.',
action='store_true',
default=False,
),
"print_all": Arg(
'--print-all',
help='Print all results, not only the best ones.',
@@ -367,7 +374,7 @@ AVAILABLE_CLI_OPTIONS = {
metavar='BASE_CURRENCY',
),
"trading_mode": Arg(
'--trading-mode',
'--trading-mode', '--tradingmode',
help='Select Trading mode',
choices=constants.TRADING_MODES,
),
@@ -386,7 +393,8 @@ AVAILABLE_CLI_OPTIONS = {
# Download data
"pairs_file": Arg(
'--pairs-file',
help='File containing a list of pairs to download.',
help='File containing a list of pairs. '
'Takes precedence over --pairs or pairs configured in the configuration.',
metavar='FILE',
),
"days": Arg(
@@ -432,7 +440,12 @@ AVAILABLE_CLI_OPTIONS = {
"dataformat_trades": Arg(
'--data-format-trades',
help='Storage format for downloaded trades data. (default: `jsongz`).',
choices=constants.AVAILABLE_DATAHANDLERS,
choices=constants.AVAILABLE_DATAHANDLERS_TRADES,
),
"show_timerange": Arg(
'--show-timerange',
help='Show timerange available for available data. (May take a while to calculate).',
action='store_true',
),
"exchange": Arg(
'--exchange',
@@ -443,14 +456,12 @@ AVAILABLE_CLI_OPTIONS = {
'-t', '--timeframes',
help='Specify which tickers to download. Space-separated list. '
'Default: `1m 5m`.',
choices=['1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h',
'6h', '8h', '12h', '1d', '3d', '1w', '2w', '1M', '1y'],
default=['1m', '5m'],
nargs='+',
),
"prepend_data": Arg(
'--prepend',
help='Allow data prepending.',
help='Allow data prepending. (Data-appending is disabled)',
action='store_true',
),
"erase": Arg(
@@ -657,4 +668,9 @@ AVAILABLE_CLI_OPTIONS = {
help='Specify additional lookup path for freqaimodels.',
metavar='PATH',
),
"freqai_backtest_live_models": Arg(
'--freqai-backtest-live-models',
help='Run backtest with ready models.',
action='store_true'
),
}

View File

@@ -5,13 +5,13 @@ from datetime import datetime, timedelta
from typing import Any, Dict, List
from freqtrade.configuration import TimeRange, setup_utils_configuration
from freqtrade.constants import DATETIME_PRINT_FORMAT
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.exceptions import OperationalException
from freqtrade.exchange import timeframe_to_minutes
from freqtrade.exchange.exchange import market_is_active
from freqtrade.exchange import market_is_active, timeframe_to_minutes
from freqtrade.plugins.pairlist.pairlist_helpers import dynamic_expand_pairlist, expand_pairlist
from freqtrade.resolvers import ExchangeResolver
@@ -80,7 +80,7 @@ def start_download_data(args: Dict[str, Any]) -> None:
data_format_trades=config['dataformat_trades'],
)
else:
if not exchange._ft_has.get('ohlcv_has_history', True):
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 "
@@ -177,17 +177,31 @@ def start_list_data(args: Dict[str, Any]) -> None:
paircombs = [comb for comb in paircombs if comb[0] in args['pairs']]
print(f"Found {len(paircombs)} pair / timeframe combinations.")
groupedpair = defaultdict(list)
for pair, timeframe, candle_type in sorted(
paircombs,
key=lambda x: (x[0], timeframe_to_minutes(x[1]), x[2])
):
groupedpair[(pair, candle_type)].append(timeframe)
if not config.get('show_timerange'):
groupedpair = defaultdict(list)
for pair, timeframe, candle_type in sorted(
paircombs,
key=lambda x: (x[0], timeframe_to_minutes(x[1]), x[2])
):
groupedpair[(pair, candle_type)].append(timeframe)
if groupedpair:
if groupedpair:
print(tabulate([
(pair, ', '.join(timeframes), candle_type)
for (pair, candle_type), timeframes in groupedpair.items()
],
headers=("Pair", "Timeframe", "Type"),
tablefmt='psql', stralign='right'))
else:
paircombs1 = [(
pair, timeframe, candle_type,
*dhc.ohlcv_data_min_max(pair, timeframe, candle_type)
) for pair, timeframe, candle_type in paircombs]
print(tabulate([
(pair, ', '.join(timeframes), candle_type)
for (pair, candle_type), timeframes in groupedpair.items()
],
headers=("Pair", "Timeframe", "Type"),
(pair, timeframe, candle_type,
start.strftime(DATETIME_PRINT_FORMAT),
end.strftime(DATETIME_PRINT_FORMAT))
for pair, timeframe, candle_type, start, end in paircombs1
],
headers=("Pair", "Timeframe", "Type", 'From', 'To'),
tablefmt='psql', stralign='right'))

View File

@@ -4,7 +4,7 @@ from typing import Any, Dict
from sqlalchemy import func
from freqtrade.configuration.config_setup import setup_utils_configuration
from freqtrade.enums.runmode import RunMode
from freqtrade.enums import RunMode
logger = logging.getLogger(__name__)

View File

@@ -36,24 +36,24 @@ def deploy_new_strategy(strategy_name: str, strategy_path: Path, subtemplate: st
"""
fallback = 'full'
indicators = render_template_with_fallback(
templatefile=f"subtemplates/indicators_{subtemplate}.j2",
templatefallbackfile=f"subtemplates/indicators_{fallback}.j2",
templatefile=f"strategy_subtemplates/indicators_{subtemplate}.j2",
templatefallbackfile=f"strategy_subtemplates/indicators_{fallback}.j2",
)
buy_trend = render_template_with_fallback(
templatefile=f"subtemplates/buy_trend_{subtemplate}.j2",
templatefallbackfile=f"subtemplates/buy_trend_{fallback}.j2",
templatefile=f"strategy_subtemplates/buy_trend_{subtemplate}.j2",
templatefallbackfile=f"strategy_subtemplates/buy_trend_{fallback}.j2",
)
sell_trend = render_template_with_fallback(
templatefile=f"subtemplates/sell_trend_{subtemplate}.j2",
templatefallbackfile=f"subtemplates/sell_trend_{fallback}.j2",
templatefile=f"strategy_subtemplates/sell_trend_{subtemplate}.j2",
templatefallbackfile=f"strategy_subtemplates/sell_trend_{fallback}.j2",
)
plot_config = render_template_with_fallback(
templatefile=f"subtemplates/plot_config_{subtemplate}.j2",
templatefallbackfile=f"subtemplates/plot_config_{fallback}.j2",
templatefile=f"strategy_subtemplates/plot_config_{subtemplate}.j2",
templatefallbackfile=f"strategy_subtemplates/plot_config_{fallback}.j2",
)
additional_methods = render_template_with_fallback(
templatefile=f"subtemplates/strategy_methods_{subtemplate}.j2",
templatefallbackfile="subtemplates/strategy_methods_empty.j2",
templatefile=f"strategy_subtemplates/strategy_methods_{subtemplate}.j2",
templatefallbackfile="strategy_subtemplates/strategy_methods_empty.j2",
)
strategy_text = render_template(templatefile='base_strategy.py.j2',

View File

@@ -1,7 +1,6 @@
import csv
import logging
import sys
from pathlib import Path
from typing import Any, Dict, List
import rapidjson
@@ -10,7 +9,6 @@ from colorama import init as colorama_init
from tabulate import tabulate
from freqtrade.configuration import setup_utils_configuration
from freqtrade.constants import USERPATH_STRATEGIES
from freqtrade.enums import RunMode
from freqtrade.exceptions import OperationalException
from freqtrade.exchange import market_is_active, validate_exchanges
@@ -41,7 +39,7 @@ def start_list_exchanges(args: Dict[str, Any]) -> None:
print(tabulate(exchanges, headers=['Exchange name', 'Valid', 'reason']))
def _print_objs_tabular(objs: List, print_colorized: bool, base_dir: Path) -> None:
def _print_objs_tabular(objs: List, print_colorized: bool) -> None:
if print_colorized:
colorama_init(autoreset=True)
red = Fore.RED
@@ -55,7 +53,7 @@ def _print_objs_tabular(objs: List, print_colorized: bool, base_dir: Path) -> No
names = [s['name'] for s in objs]
objs_to_print = [{
'name': s['name'] if s['name'] else "--",
'location': s['location'].relative_to(base_dir),
'location': s['location_rel'],
'status': (red + "LOAD FAILED" + reset if s['class'] is None
else "OK" if names.count(s['name']) == 1
else yellow + "DUPLICATE NAME" + reset)
@@ -76,9 +74,8 @@ def start_list_strategies(args: Dict[str, Any]) -> None:
"""
config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)
directory = Path(config.get('strategy_path', config['user_data_dir'] / USERPATH_STRATEGIES))
strategy_objs = StrategyResolver.search_all_objects(
directory, not args['print_one_column'], config.get('recursive_strategy_search', False))
config, not args['print_one_column'], config.get('recursive_strategy_search', False))
# Sort alphabetically
strategy_objs = sorted(strategy_objs, key=lambda x: x['name'])
for obj in strategy_objs:
@@ -90,7 +87,22 @@ def start_list_strategies(args: Dict[str, Any]) -> None:
if args['print_one_column']:
print('\n'.join([s['name'] for s in strategy_objs]))
else:
_print_objs_tabular(strategy_objs, config.get('print_colorized', False), directory)
_print_objs_tabular(strategy_objs, config.get('print_colorized', False))
def start_list_freqAI_models(args: Dict[str, Any]) -> None:
"""
Print files with FreqAI models custom classes available in the directory
"""
config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)
from freqtrade.resolvers.freqaimodel_resolver import FreqaiModelResolver
model_objs = FreqaiModelResolver.search_all_objects(config, not args['print_one_column'])
# Sort alphabetically
model_objs = sorted(model_objs, key=lambda x: x['name'])
if args['print_one_column']:
print('\n'.join([s['name'] for s in model_objs]))
else:
_print_objs_tabular(model_objs, config.get('print_colorized', False))
def start_list_timeframes(args: Dict[str, Any]) -> None:

View File

@@ -1,6 +1,5 @@
# flake8: noqa: F401
from freqtrade.configuration.check_exchange import check_exchange
from freqtrade.configuration.config_setup import setup_utils_configuration
from freqtrade.configuration.config_validation import validate_config_consistency
from freqtrade.configuration.configuration import Configuration

View File

@@ -1,4 +1,5 @@
import logging
from collections import Counter
from copy import deepcopy
from typing import Any, Dict
@@ -84,6 +85,10 @@ def validate_config_consistency(conf: Dict[str, Any], preliminary: bool = False)
_validate_protections(conf)
_validate_unlimited_amount(conf)
_validate_ask_orderbook(conf)
_validate_freqai_hyperopt(conf)
_validate_freqai_backtest(conf)
_validate_freqai_include_timeframes(conf)
_validate_consumers(conf)
validate_migrated_strategy_settings(conf)
# validate configuration before returning
@@ -323,6 +328,78 @@ def _validate_pricing_rules(conf: Dict[str, Any]) -> None:
del conf['ask_strategy']
def _validate_freqai_hyperopt(conf: Dict[str, Any]) -> None:
freqai_enabled = conf.get('freqai', {}).get('enabled', False)
analyze_per_epoch = conf.get('analyze_per_epoch', False)
if analyze_per_epoch and freqai_enabled:
raise OperationalException(
'Using analyze-per-epoch parameter is not supported with a FreqAI strategy.')
def _validate_freqai_include_timeframes(conf: Dict[str, Any]) -> None:
freqai_enabled = conf.get('freqai', {}).get('enabled', False)
if freqai_enabled:
main_tf = conf.get('timeframe', '5m')
freqai_include_timeframes = conf.get('freqai', {}).get('feature_parameters', {}
).get('include_timeframes', [])
from freqtrade.exchange import timeframe_to_seconds
main_tf_s = timeframe_to_seconds(main_tf)
offending_lines = []
for tf in freqai_include_timeframes:
tf_s = timeframe_to_seconds(tf)
if tf_s < main_tf_s:
offending_lines.append(tf)
if offending_lines:
raise OperationalException(
f"Main timeframe of {main_tf} must be smaller or equal to FreqAI "
f"`include_timeframes`.Offending include-timeframes: {', '.join(offending_lines)}")
# Ensure that the base timeframe is included in the include_timeframes list
if main_tf not in freqai_include_timeframes:
feature_parameters = conf.get('freqai', {}).get('feature_parameters', {})
include_timeframes = [main_tf] + freqai_include_timeframes
conf.get('freqai', {}).get('feature_parameters', {}) \
.update({**feature_parameters, 'include_timeframes': include_timeframes})
def _validate_freqai_backtest(conf: Dict[str, Any]) -> None:
if conf.get('runmode', RunMode.OTHER) == RunMode.BACKTEST:
freqai_enabled = conf.get('freqai', {}).get('enabled', False)
timerange = conf.get('timerange')
freqai_backtest_live_models = conf.get('freqai_backtest_live_models', False)
if freqai_backtest_live_models and freqai_enabled and timerange:
raise OperationalException(
'Using timerange parameter is not supported with '
'--freqai-backtest-live-models parameter.')
if freqai_backtest_live_models and not freqai_enabled:
raise OperationalException(
'Using --freqai-backtest-live-models parameter is only '
'supported with a FreqAI strategy.')
if freqai_enabled and not freqai_backtest_live_models and not timerange:
raise OperationalException(
'Please pass --timerange if you intend to use FreqAI for backtesting.')
def _validate_consumers(conf: Dict[str, Any]) -> None:
emc_conf = conf.get('external_message_consumer', {})
if emc_conf.get('enabled', False):
if len(emc_conf.get('producers', [])) < 1:
raise OperationalException("You must specify at least 1 Producer to connect to.")
producer_names = [p['name'] for p in emc_conf.get('producers', [])]
duplicates = [item for item, count in Counter(producer_names).items() if count > 1]
if duplicates:
raise OperationalException(
f"Producer names must be unique. Duplicate: {', '.join(duplicates)}")
if conf.get('process_only_new_candles', True):
# Warning here or require it?
logger.warning("To receive best performance with external data, "
"please set `process_only_new_candles` to False")
def _strategy_settings(conf: Dict[str, Any]) -> None:
process_deprecated_setting(conf, None, 'use_sell_signal', None, 'use_exit_signal')

View File

@@ -8,11 +8,11 @@ from pathlib import Path
from typing import Any, Callable, Dict, List, Optional
from freqtrade import constants
from freqtrade.configuration.check_exchange import check_exchange
from freqtrade.configuration.deprecated_settings import process_temporary_deprecated_settings
from freqtrade.configuration.directory_operations import create_datadir, create_userdata_dir
from freqtrade.configuration.environment_vars import enironment_vars_to_dict
from freqtrade.configuration.load_config import load_file, load_from_files
from freqtrade.constants import Config
from freqtrade.enums import NON_UTIL_MODES, TRADING_MODES, CandleType, RunMode, TradingMode
from freqtrade.exceptions import OperationalException
from freqtrade.loggers import setup_logging
@@ -30,10 +30,10 @@ class Configuration:
def __init__(self, args: Dict[str, Any], runmode: RunMode = None) -> None:
self.args = args
self.config: Optional[Dict[str, Any]] = None
self.config: Optional[Config] = None
self.runmode = runmode
def get_config(self) -> Dict[str, Any]:
def get_config(self) -> Config:
"""
Return the config. Use this method to get the bot config
:return: Dict: Bot config
@@ -65,7 +65,7 @@ class Configuration:
:return: Configuration dictionary
"""
# Load all configs
config: Dict[str, Any] = load_from_files(self.args.get("config", []))
config: Config = load_from_files(self.args.get("config", []))
# Load environment variables
env_data = enironment_vars_to_dict()
@@ -99,6 +99,9 @@ class Configuration:
self._process_freqai_options(config)
# Import check_exchange here to avoid import cycle problems
from freqtrade.exchange.check_exchange import check_exchange
# Check if the exchange set by the user is supported
check_exchange(config, config.get('experimental', {}).get('block_bad_exchanges', True))
@@ -108,7 +111,7 @@ class Configuration:
return config
def _process_logging_options(self, config: Dict[str, Any]) -> None:
def _process_logging_options(self, config: Config) -> None:
"""
Extract information for sys.argv and load logging configuration:
the -v/--verbose, --logfile options
@@ -121,7 +124,7 @@ class Configuration:
setup_logging(config)
def _process_trading_options(self, config: Dict[str, Any]) -> None:
def _process_trading_options(self, config: Config) -> None:
if config['runmode'] not in TRADING_MODES:
return
@@ -137,7 +140,7 @@ class Configuration:
logger.info(f'Using DB: "{parse_db_uri_for_logging(config["db_url"])}"')
def _process_common_options(self, config: Dict[str, Any]) -> None:
def _process_common_options(self, config: Config) -> None:
# Set strategy if not specified in config and or if it's non default
if self.args.get('strategy') or not config.get('strategy'):
@@ -161,7 +164,7 @@ class Configuration:
if 'sd_notify' in self.args and self.args['sd_notify']:
config['internals'].update({'sd_notify': True})
def _process_datadir_options(self, config: Dict[str, Any]) -> None:
def _process_datadir_options(self, config: Config) -> None:
"""
Extract information for sys.argv and load directory configurations
--user-data, --datadir
@@ -195,7 +198,7 @@ class Configuration:
config['exportfilename'] = (config['user_data_dir']
/ 'backtest_results')
def _process_optimize_options(self, config: Dict[str, Any]) -> None:
def _process_optimize_options(self, config: Config) -> None:
# This will override the strategy configuration
self._args_to_config(config, argname='timeframe',
@@ -276,6 +279,9 @@ class Configuration:
self._args_to_config(config, argname='disableparamexport',
logstring='Parameter --disableparamexport detected: {} ...')
self._args_to_config(config, argname='freqai_backtest_live_models',
logstring='Parameter --freqai-backtest-live-models detected ...')
# Edge section:
if 'stoploss_range' in self.args and self.args["stoploss_range"]:
txt_range = eval(self.args["stoploss_range"])
@@ -302,6 +308,9 @@ class Configuration:
self._args_to_config(config, argname='spaces',
logstring='Parameter -s/--spaces detected: {}')
self._args_to_config(config, argname='analyze_per_epoch',
logstring='Parameter --analyze-per-epoch detected.')
self._args_to_config(config, argname='print_all',
logstring='Parameter --print-all detected ...')
@@ -377,7 +386,7 @@ class Configuration:
self._args_to_config(config, argname="hyperopt_ignore_missing_space",
logstring="Paramter --ignore-missing-space detected: {}")
def _process_plot_options(self, config: Dict[str, Any]) -> None:
def _process_plot_options(self, config: Config) -> None:
self._args_to_config(config, argname='pairs',
logstring='Using pairs {}')
@@ -426,7 +435,10 @@ class Configuration:
self._args_to_config(config, argname='dataformat_trades',
logstring='Using "{}" to store trades data.')
def _process_data_options(self, config: Dict[str, Any]) -> None:
self._args_to_config(config, argname='show_timerange',
logstring='Detected --show-timerange')
def _process_data_options(self, config: Config) -> None:
self._args_to_config(config, argname='new_pairs_days',
logstring='Detected --new-pairs-days: {}')
self._args_to_config(config, argname='trading_mode',
@@ -437,7 +449,7 @@ class Configuration:
self._args_to_config(config, argname='candle_types',
logstring='Detected --candle-types: {}')
def _process_analyze_options(self, config: Dict[str, Any]) -> None:
def _process_analyze_options(self, config: Config) -> None:
self._args_to_config(config, argname='analysis_groups',
logstring='Analysis reason groups: {}')
@@ -450,7 +462,10 @@ class Configuration:
self._args_to_config(config, argname='indicator_list',
logstring='Analysis indicator list: {}')
def _process_runmode(self, config: Dict[str, Any]) -> None:
self._args_to_config(config, argname='timerange',
logstring='Filter trades by timerange: {}')
def _process_runmode(self, config: Config) -> None:
self._args_to_config(config, argname='dry_run',
logstring='Parameter --dry-run detected, '
@@ -463,7 +478,7 @@ class Configuration:
config.update({'runmode': self.runmode})
def _process_freqai_options(self, config: Dict[str, Any]) -> None:
def _process_freqai_options(self, config: Config) -> None:
self._args_to_config(config, argname='freqaimodel',
logstring='Using freqaimodel class name: {}')
@@ -473,7 +488,7 @@ class Configuration:
return
def _args_to_config(self, config: Dict[str, Any], argname: str,
def _args_to_config(self, config: Config, argname: str,
logstring: str, logfun: Optional[Callable] = None,
deprecated_msg: Optional[str] = None) -> None:
"""
@@ -496,7 +511,7 @@ class Configuration:
if deprecated_msg:
warnings.warn(f"DEPRECATED: {deprecated_msg}", DeprecationWarning)
def _resolve_pairs_list(self, config: Dict[str, Any]) -> None:
def _resolve_pairs_list(self, config: Config) -> None:
"""
Helper for download script.
Takes first found:

View File

@@ -3,15 +3,16 @@ Functions to handle deprecated settings
"""
import logging
from typing import Any, Dict, Optional
from typing import Optional
from freqtrade.constants import Config
from freqtrade.exceptions import OperationalException
logger = logging.getLogger(__name__)
def check_conflicting_settings(config: Dict[str, Any],
def check_conflicting_settings(config: Config,
section_old: Optional[str], name_old: str,
section_new: Optional[str], name_new: str) -> None:
section_new_config = config.get(section_new, {}) if section_new else config
@@ -28,7 +29,7 @@ def check_conflicting_settings(config: Dict[str, Any],
)
def process_removed_setting(config: Dict[str, Any],
def process_removed_setting(config: Config,
section1: str, name1: str,
section2: Optional[str], name2: str) -> None:
"""
@@ -47,7 +48,7 @@ def process_removed_setting(config: Dict[str, Any],
)
def process_deprecated_setting(config: Dict[str, Any],
def process_deprecated_setting(config: Config,
section_old: Optional[str], name_old: str,
section_new: Optional[str], name_new: str
) -> None:
@@ -69,7 +70,7 @@ def process_deprecated_setting(config: Dict[str, Any],
del section_old_config[name_old]
def process_temporary_deprecated_settings(config: Dict[str, Any]) -> None:
def process_temporary_deprecated_settings(config: Config) -> None:
# Kept for future deprecated / moved settings
# check_conflicting_settings(config, 'ask_strategy', 'use_sell_signal',

View File

@@ -1,16 +1,17 @@
import logging
import shutil
from pathlib import Path
from typing import Any, Dict, Optional
from typing import Optional
from freqtrade.constants import USER_DATA_FILES
from freqtrade.constants import (USER_DATA_FILES, USERPATH_FREQAIMODELS, USERPATH_HYPEROPTS,
USERPATH_NOTEBOOKS, USERPATH_STRATEGIES, Config)
from freqtrade.exceptions import OperationalException
logger = logging.getLogger(__name__)
def create_datadir(config: Dict[str, Any], datadir: Optional[str] = None) -> Path:
def create_datadir(config: Config, datadir: Optional[str] = None) -> Path:
folder = Path(datadir) if datadir else Path(f"{config['user_data_dir']}/data")
if not datadir:
@@ -49,8 +50,8 @@ def create_userdata_dir(directory: str, create_dir: bool = False) -> Path:
:param create_dir: Create directory if it does not exist.
:return: Path object containing the directory
"""
sub_dirs = ["backtest_results", "data", "hyperopts", "hyperopt_results", "logs",
"notebooks", "plot", "strategies", ]
sub_dirs = ["backtest_results", "data", USERPATH_HYPEROPTS, "hyperopt_results", "logs",
USERPATH_NOTEBOOKS, "plot", USERPATH_STRATEGIES, USERPATH_FREQAIMODELS]
folder = Path(directory)
chown_user_directory(folder)
if not folder.is_dir():

View File

@@ -10,7 +10,7 @@ from typing import Any, Dict, List
import rapidjson
from freqtrade.constants import MINIMAL_CONFIG
from freqtrade.constants import MINIMAL_CONFIG, Config
from freqtrade.exceptions import OperationalException
from freqtrade.misc import deep_merge_dicts
@@ -80,7 +80,7 @@ def load_from_files(files: List[str], base_path: Path = None, level: int = 0) ->
Recursively load configuration files if specified.
Sub-files are assumed to be relative to the initial config.
"""
config: Dict[str, Any] = {}
config: Config = {}
if level > 5:
raise OperationalException("Config loop detected.")

View File

@@ -3,11 +3,12 @@ This module contains the argument manager class
"""
import logging
import re
from datetime import datetime
from datetime import datetime, timezone
from typing import Optional
import arrow
from freqtrade.constants import DATETIME_PRINT_FORMAT
from freqtrade.exceptions import OperationalException
@@ -29,6 +30,52 @@ class TimeRange:
self.startts: int = startts
self.stopts: int = stopts
@property
def startdt(self) -> Optional[datetime]:
if self.startts:
return datetime.fromtimestamp(self.startts, tz=timezone.utc)
return None
@property
def stopdt(self) -> Optional[datetime]:
if self.stopts:
return datetime.fromtimestamp(self.stopts, tz=timezone.utc)
return None
@property
def timerange_str(self) -> str:
"""
Returns a string representation of the timerange as used by parse_timerange.
Follows the format yyyymmdd-yyyymmdd - leaving out the parts that are not set.
"""
start = ''
stop = ''
if startdt := self.startdt:
start = startdt.strftime('%Y%m%d')
if stopdt := self.stopdt:
stop = stopdt.strftime('%Y%m%d')
return f"{start}-{stop}"
@property
def start_fmt(self) -> str:
"""
Returns a string representation of the start date
"""
val = 'unbounded'
if (startdt := self.startdt) is not None:
val = startdt.strftime(DATETIME_PRINT_FORMAT)
return val
@property
def stop_fmt(self) -> str:
"""
Returns a string representation of the stop date
"""
val = 'unbounded'
if (stopdt := self.stopdt) is not None:
val = stopdt.strftime(DATETIME_PRINT_FORMAT)
return val
def __eq__(self, other):
"""Override the default Equals behavior"""
return (self.starttype == other.starttype and self.stoptype == other.stoptype

View File

@@ -3,9 +3,9 @@
"""
bot constants
"""
from typing import List, Literal, Tuple
from typing import Any, Dict, List, Literal, Tuple
from freqtrade.enums import CandleType
from freqtrade.enums import CandleType, RPCMessageType
DEFAULT_CONFIG = 'config.json'
@@ -23,19 +23,21 @@ REQUIRED_ORDERTIF = ['entry', 'exit']
REQUIRED_ORDERTYPES = ['entry', 'exit', 'stoploss', 'stoploss_on_exchange']
PRICING_SIDES = ['ask', 'bid', 'same', 'other']
ORDERTYPE_POSSIBILITIES = ['limit', 'market']
ORDERTIF_POSSIBILITIES = ['gtc', 'fok', 'ioc']
_ORDERTIF_POSSIBILITIES = ['GTC', 'FOK', 'IOC', 'PO']
ORDERTIF_POSSIBILITIES = _ORDERTIF_POSSIBILITIES + [t.lower() for t in _ORDERTIF_POSSIBILITIES]
HYPEROPT_LOSS_BUILTIN = ['ShortTradeDurHyperOptLoss', 'OnlyProfitHyperOptLoss',
'SharpeHyperOptLoss', 'SharpeHyperOptLossDaily',
'SortinoHyperOptLoss', 'SortinoHyperOptLossDaily',
'CalmarHyperOptLoss',
'MaxDrawDownHyperOptLoss', 'MaxDrawDownRelativeHyperOptLoss',
'ProfitDrawDownHyperOptLoss']
AVAILABLE_PAIRLISTS = ['StaticPairList', 'VolumePairList',
AVAILABLE_PAIRLISTS = ['StaticPairList', 'VolumePairList', 'ProducerPairList',
'AgeFilter', 'OffsetFilter', 'PerformanceFilter',
'PrecisionFilter', 'PriceFilter', 'RangeStabilityFilter',
'ShuffleFilter', 'SpreadFilter', 'VolatilityFilter']
AVAILABLE_PROTECTIONS = ['CooldownPeriod', 'LowProfitPairs', 'MaxDrawdown', 'StoplossGuard']
AVAILABLE_DATAHANDLERS = ['json', 'jsongz', 'hdf5']
AVAILABLE_DATAHANDLERS_TRADES = ['json', 'jsongz', 'hdf5']
AVAILABLE_DATAHANDLERS = AVAILABLE_DATAHANDLERS_TRADES + ['feather', 'parquet']
BACKTEST_BREAKDOWNS = ['day', 'week', 'month']
BACKTEST_CACHE_AGE = ['none', 'day', 'week', 'month']
BACKTEST_CACHE_DEFAULT = 'day'
@@ -59,6 +61,7 @@ USERPATH_FREQAIMODELS = 'freqaimodels'
TELEGRAM_SETTING_OPTIONS = ['on', 'off', 'silent']
WEBHOOK_FORMAT_OPTIONS = ['form', 'json', 'raw']
FULL_DATAFRAME_THRESHOLD = 100
ENV_VAR_PREFIX = 'FREQTRADE__'
@@ -157,6 +160,7 @@ CONF_SCHEMA = {
'ignore_buying_expired_candle_after': {'type': 'number'},
'trading_mode': {'type': 'string', 'enum': TRADING_MODES},
'margin_mode': {'type': 'string', 'enum': MARGIN_MODES},
'reduce_df_footprint': {'type': 'boolean', 'default': False},
'liquidation_buffer': {'type': 'number', 'minimum': 0.0, 'maximum': 0.99},
'backtest_breakdown': {
'type': 'array',
@@ -242,6 +246,7 @@ CONF_SCHEMA = {
'exchange': {'$ref': '#/definitions/exchange'},
'edge': {'$ref': '#/definitions/edge'},
'freqai': {'$ref': '#/definitions/freqai'},
'external_message_consumer': {'$ref': '#/definitions/external_message_consumer'},
'experimental': {
'type': 'object',
'properties': {
@@ -279,6 +284,7 @@ CONF_SCHEMA = {
'enabled': {'type': 'boolean'},
'token': {'type': 'string'},
'chat_id': {'type': 'string'},
'allow_custom_messages': {'type': 'boolean', 'default': True},
'balance_dust_level': {'type': 'number', 'minimum': 0.0},
'notification_settings': {
'type': 'object',
@@ -288,11 +294,12 @@ CONF_SCHEMA = {
'warning': {'type': 'string', 'enum': TELEGRAM_SETTING_OPTIONS},
'startup': {'type': 'string', 'enum': TELEGRAM_SETTING_OPTIONS},
'entry': {'type': 'string', 'enum': TELEGRAM_SETTING_OPTIONS},
'entry_cancel': {'type': 'string', 'enum': TELEGRAM_SETTING_OPTIONS},
'entry_fill': {'type': 'string',
'enum': TELEGRAM_SETTING_OPTIONS,
'default': 'off'
},
'entry_fill': {
'type': 'string',
'enum': TELEGRAM_SETTING_OPTIONS,
'default': 'off'
},
'entry_cancel': {'type': 'string', 'enum': TELEGRAM_SETTING_OPTIONS, },
'exit': {
'type': ['string', 'object'],
'additionalProperties': {
@@ -300,12 +307,12 @@ CONF_SCHEMA = {
'enum': TELEGRAM_SETTING_OPTIONS
}
},
'exit_cancel': {'type': 'string', 'enum': TELEGRAM_SETTING_OPTIONS},
'exit_fill': {
'type': 'string',
'enum': TELEGRAM_SETTING_OPTIONS,
'default': 'on'
},
'exit_cancel': {'type': 'string', 'enum': TELEGRAM_SETTING_OPTIONS},
'protection_trigger': {
'type': 'string',
'enum': TELEGRAM_SETTING_OPTIONS,
@@ -314,14 +321,17 @@ CONF_SCHEMA = {
'protection_trigger_global': {
'type': 'string',
'enum': TELEGRAM_SETTING_OPTIONS,
'default': 'on'
},
'show_candle': {
'type': 'string',
'enum': ['off', 'ohlc'],
'default': 'off'
},
'strategy_msg': {
'type': 'string',
'enum': TELEGRAM_SETTING_OPTIONS,
'default': 'on'
},
}
},
@@ -337,6 +347,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]),
# Below -> Deprecated
'webhookentry': {'type': 'object'},
'webhookentrycancel': {'type': 'object'},
'webhookentryfill': {'type': 'object'},
@@ -399,6 +411,7 @@ CONF_SCHEMA = {
},
'username': {'type': 'string'},
'password': {'type': 'string'},
'ws_token': {'type': ['string', 'array'], 'items': {'type': 'string'}},
'jwt_secret_key': {'type': 'string'},
'CORS_origins': {'type': 'array', 'items': {'type': 'string'}},
'verbosity': {'type': 'string', 'enum': ['error', 'info']},
@@ -427,7 +440,7 @@ CONF_SCHEMA = {
},
'dataformat_trades': {
'type': 'string',
'enum': AVAILABLE_DATAHANDLERS,
'enum': AVAILABLE_DATAHANDLERS_TRADES,
'default': 'jsongz'
},
'position_adjustment_enable': {'type': 'boolean'},
@@ -483,12 +496,56 @@ CONF_SCHEMA = {
},
'required': ['process_throttle_secs', 'allowed_risk']
},
'external_message_consumer': {
'type': 'object',
'properties': {
'enabled': {'type': 'boolean', 'default': False},
'producers': {
'type': 'array',
'items': {
'type': 'object',
'properties': {
'name': {'type': 'string'},
'host': {'type': 'string'},
'port': {
'type': 'integer',
'default': 8080,
'minimum': 0,
'maximum': 65535
},
'secure': {'type': 'boolean', 'default': False},
'ws_token': {'type': 'string'},
},
'required': ['name', 'host', 'ws_token']
}
},
'wait_timeout': {'type': 'integer', 'minimum': 0},
'sleep_time': {'type': 'integer', 'minimum': 0},
'ping_timeout': {'type': 'integer', 'minimum': 0},
'remove_entry_exit_signals': {'type': 'boolean', 'default': False},
'initial_candle_limit': {
'type': 'integer',
'minimum': 0,
'maximum': 1500,
'default': 1500
},
'message_size_limit': { # In megabytes
'type': 'integer',
'minimum': 1,
'maxmium': 20,
'default': 8,
}
},
'required': ['producers']
},
"freqai": {
"type": "object",
"properties": {
"enabled": {"type": "boolean", "default": False},
"keras": {"type": "boolean", "default": False},
"conv_width": {"type": "integer", "default": 2},
"write_metrics_to_disk": {"type": "boolean", "default": False},
"purge_old_models": {"type": "boolean", "default": True},
"conv_width": {"type": "integer", "default": 1},
"train_period_days": {"type": "integer", "default": 0},
"backtest_period_days": {"type": "number", "default": 7},
"identifier": {"type": "string", "default": "example"},
@@ -503,6 +560,7 @@ CONF_SCHEMA = {
"weight_factor": {"type": "number", "default": 0},
"principal_component_analysis": {"type": "boolean", "default": False},
"use_SVM_to_remove_outliers": {"type": "boolean", "default": False},
"plot_feature_importances": {"type": "integer", "default": 0},
"svm_params": {"type": "object",
"properties": {
"shuffle": {"type": "boolean", "default": False},
@@ -517,12 +575,31 @@ CONF_SCHEMA = {
"properties": {
"test_size": {"type": "number"},
"random_state": {"type": "integer"},
"shuffle": {"type": "boolean", "default": False}
},
},
"model_training_parameters": {
"type": "object"
},
"rl_config": {
"type": "object",
"properties": {
"n_estimators": {"type": "integer", "default": 1000}
"train_cycles": {"type": "integer"},
"max_trade_duration_candles": {"type": "integer"},
"add_state_info": {"type": "boolean", "default": False},
"max_training_drawdown_pct": {"type": "number", "default": 0.02},
"cpu_count": {"type": "integer", "default": 1},
"model_type": {"type": "string", "default": "PPO"},
"policy_type": {"type": "string", "default": "MlpPolicy"},
"net_arch": {"type": "array", "default": [128, 128]},
"randomize_startinng_position": {"type": "boolean", "default": False},
"model_reward_parameters": {
"type": "object",
"properties": {
"rr": {"type": "number", "default": 1},
"profit_aim": {"type": "number", "default": 0.025}
}
}
},
},
},
@@ -532,9 +609,8 @@ CONF_SCHEMA = {
"backtest_period_days",
"identifier",
"feature_parameters",
"data_split_parameters",
"model_training_parameters"
]
"data_split_parameters"
]
},
},
}
@@ -602,3 +678,6 @@ LongShort = Literal['long', 'short']
EntryExit = Literal['entry', 'exit']
BuySell = Literal['buy', 'sell']
MakerTaker = Literal['maker', 'taker']
BidAsk = Literal['bid', 'ask']
Config = Dict[str, Any]

View File

@@ -26,7 +26,7 @@ BT_DATA_COLUMNS = ['pair', 'stake_amount', 'amount', 'open_date', 'close_date',
'profit_ratio', 'profit_abs', 'exit_reason',
'initial_stop_loss_abs', 'initial_stop_loss_ratio', 'stop_loss_abs',
'stop_loss_ratio', 'min_rate', 'max_rate', 'is_open', 'enter_tag',
'is_short', 'open_timestamp', 'close_timestamp', 'orders'
'leverage', 'is_short', 'open_timestamp', 'close_timestamp', 'orders'
]
@@ -280,11 +280,13 @@ def load_backtest_data(filename: Union[Path, str], strategy: Optional[str] = Non
# Compatibility support for pre short Columns
if 'is_short' not in df.columns:
df['is_short'] = 0
if 'leverage' not in df.columns:
df['leverage'] = 1.0
if 'enter_tag' not in df.columns:
df['enter_tag'] = df['buy_tag']
df = df.drop(['buy_tag'], axis=1)
if 'orders' not in df.columns:
df.loc[:, 'orders'] = None
df['orders'] = None
else:
# old format - only with lists.
@@ -341,9 +343,9 @@ def trade_list_to_dataframe(trades: List[LocalTrade]) -> pd.DataFrame:
"""
df = pd.DataFrame.from_records([t.to_json(True) for t in trades], columns=BT_DATA_COLUMNS)
if len(df) > 0:
df.loc[:, 'close_date'] = pd.to_datetime(df['close_date'], utc=True)
df.loc[:, 'open_date'] = pd.to_datetime(df['open_date'], utc=True)
df.loc[:, 'close_rate'] = df['close_rate'].astype('float64')
df['close_date'] = pd.to_datetime(df['close_date'], utc=True)
df['open_date'] = pd.to_datetime(df['open_date'], utc=True)
df['close_rate'] = df['close_rate'].astype('float64')
return df

View File

@@ -3,14 +3,14 @@ Functions to convert data from one format to another
"""
import itertools
import logging
from datetime import datetime, timezone
from operator import itemgetter
from typing import Any, Dict, List
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, TradeList
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS, Config, TradeList
from freqtrade.enums import CandleType
@@ -47,8 +47,7 @@ def ohlcv_to_dataframe(ohlcv: list, timeframe: str, pair: str, *,
def clean_ohlcv_dataframe(data: DataFrame, timeframe: str, pair: str, *,
fill_missing: bool = True,
drop_incomplete: bool = True) -> DataFrame:
fill_missing: bool, drop_incomplete: bool) -> DataFrame:
"""
Cleanse a OHLCV dataframe by
* Grouping it by date (removes duplicate tics)
@@ -138,11 +137,9 @@ def trim_dataframe(df: DataFrame, timerange, df_date_col: str = 'date',
df = df.iloc[startup_candles:, :]
else:
if timerange.starttype == 'date':
start = datetime.fromtimestamp(timerange.startts, tz=timezone.utc)
df = df.loc[df[df_date_col] >= start, :]
df = df.loc[df[df_date_col] >= timerange.startdt, :]
if timerange.stoptype == 'date':
stop = datetime.fromtimestamp(timerange.stopts, tz=timezone.utc)
df = df.loc[df[df_date_col] <= stop, :]
df = df.loc[df[df_date_col] <= timerange.stopdt, :]
return df
@@ -237,7 +234,7 @@ def trades_to_ohlcv(trades: TradeList, timeframe: str) -> DataFrame:
return df_new.loc[:, DEFAULT_DATAFRAME_COLUMNS]
def convert_trades_format(config: Dict[str, Any], convert_from: str, convert_to: str, erase: bool):
def convert_trades_format(config: Config, convert_from: str, convert_to: str, erase: bool):
"""
Convert trades from one format to another format.
:param config: Config dictionary
@@ -263,7 +260,7 @@ def convert_trades_format(config: Dict[str, Any], convert_from: str, convert_to:
def convert_ohlcv_format(
config: Dict[str, Any],
config: Config,
convert_from: str,
convert_to: str,
erase: bool,
@@ -292,6 +289,7 @@ def convert_ohlcv_format(
timeframe,
candle_type=candle_type
))
config['pairs'] = sorted(set(config['pairs']))
logger.info(f"Converting candle (OHLCV) data for {config['pairs']}")
for timeframe in timeframes:
@@ -302,7 +300,7 @@ def convert_ohlcv_format(
drop_incomplete=False,
startup_candles=0,
candle_type=candle_type)
logger.info(f"Converting {len(data)} {candle_type} candles for {pair}")
logger.info(f"Converting {len(data)} {timeframe} {candle_type} candles for {pair}")
if len(data) > 0:
trg.ohlcv_store(
pair=pair,
@@ -313,3 +311,29 @@ def convert_ohlcv_format(
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:
"""
Ensure all values are float32 in the incoming dataframe.
:param df: Dataframe to be converted to float/int 32s
:return: Dataframe converted to float/int 32s
"""
logger.debug(f"Memory usage of dataframe is "
f"{df.memory_usage().sum() / 1024**2:.2f} MB")
df_dtypes = df.dtypes
for column, dtype in df_dtypes.items():
if column in ['open', 'high', 'low', 'close', 'volume']:
continue
if dtype == np.float64:
df_dtypes[column] = np.float32
elif dtype == np.int64:
df_dtypes[column] = np.int32
df = df.astype(df_dtypes)
logger.debug(f"Memory usage after optimization is: "
f"{df.memory_usage().sum() / 1024**2:.2f} MB")
return df

View File

@@ -9,14 +9,17 @@ from collections import deque
from datetime import datetime, timezone
from typing import Any, Dict, List, Optional, Tuple
from pandas import DataFrame
from pandas import DataFrame, to_timedelta
from freqtrade.configuration import TimeRange
from freqtrade.constants import ListPairsWithTimeframes, PairWithTimeframe
from freqtrade.constants import (FULL_DATAFRAME_THRESHOLD, Config, ListPairsWithTimeframes,
PairWithTimeframe)
from freqtrade.data.history import load_pair_history
from freqtrade.enums import CandleType, RunMode
from freqtrade.enums import CandleType, RPCMessageType, RunMode
from freqtrade.exceptions import ExchangeError, OperationalException
from freqtrade.exchange import Exchange, timeframe_to_seconds
from freqtrade.misc import append_candles_to_dataframe
from freqtrade.rpc import RPCManager
from freqtrade.util import PeriodicCache
@@ -28,17 +31,33 @@ MAX_DATAFRAME_CANDLES = 1000
class DataProvider:
def __init__(self, config: dict, exchange: Optional[Exchange], pairlists=None) -> None:
def __init__(
self,
config: Config,
exchange: Optional[Exchange],
pairlists=None,
rpc: Optional[RPCManager] = None
) -> None:
self._config = config
self._exchange = exchange
self._pairlists = pairlists
self.__rpc = rpc
self.__cached_pairs: Dict[PairWithTimeframe, Tuple[DataFrame, datetime]] = {}
self.__slice_index: Optional[int] = None
self.__cached_pairs_backtesting: Dict[PairWithTimeframe, DataFrame] = {}
self.__producer_pairs_df: Dict[str,
Dict[PairWithTimeframe, Tuple[DataFrame, datetime]]] = {}
self.__producer_pairs: Dict[str, List[str]] = {}
self._msg_queue: deque = deque()
self._default_candle_type = self._config.get('candle_type_def', CandleType.SPOT)
self._default_timeframe = self._config.get('timeframe', '1h')
self.__msg_cache = PeriodicCache(
maxsize=1000, ttl=timeframe_to_seconds(self._config.get('timeframe', '1h')))
maxsize=1000, ttl=timeframe_to_seconds(self._default_timeframe))
self.producers = self._config.get('external_message_consumer', {}).get('producers', [])
self.external_data_enabled = len(self.producers) > 0
def _set_dataframe_max_index(self, limit_index: int):
"""
@@ -63,9 +82,196 @@ class DataProvider:
:param dataframe: analyzed dataframe
:param candle_type: Any of the enum CandleType (must match trading mode!)
"""
self.__cached_pairs[(pair, timeframe, candle_type)] = (
pair_key = (pair, timeframe, candle_type)
self.__cached_pairs[pair_key] = (
dataframe, datetime.now(timezone.utc))
# For multiple producers we will want to merge the pairlists instead of overwriting
def _set_producer_pairs(self, pairlist: List[str], producer_name: str = "default"):
"""
Set the pairs received to later be used.
:param pairlist: List of pairs
"""
self.__producer_pairs[producer_name] = pairlist
def get_producer_pairs(self, producer_name: str = "default") -> List[str]:
"""
Get the pairs cached from the producer
:returns: List of pairs
"""
return self.__producer_pairs.get(producer_name, []).copy()
def _emit_df(
self,
pair_key: PairWithTimeframe,
dataframe: DataFrame,
new_candle: bool
) -> None:
"""
Send this dataframe as an ANALYZED_DF message to RPC
:param pair_key: PairWithTimeframe tuple
:param dataframe: Dataframe to emit
:param new_candle: This is a new candle
"""
if self.__rpc:
self.__rpc.send_msg(
{
'type': RPCMessageType.ANALYZED_DF,
'data': {
'key': pair_key,
'df': dataframe.tail(1),
'la': datetime.now(timezone.utc)
}
}
)
if new_candle:
self.__rpc.send_msg({
'type': RPCMessageType.NEW_CANDLE,
'data': pair_key,
})
def _replace_external_df(
self,
pair: str,
dataframe: DataFrame,
last_analyzed: datetime,
timeframe: str,
candle_type: CandleType,
producer_name: str = "default"
) -> None:
"""
Add the pair data to this class from an external source.
:param pair: pair to get the data for
:param timeframe: Timeframe to get data for
:param candle_type: Any of the enum CandleType (must match trading mode!)
"""
pair_key = (pair, timeframe, candle_type)
if producer_name not in self.__producer_pairs_df:
self.__producer_pairs_df[producer_name] = {}
_last_analyzed = datetime.now(timezone.utc) if not last_analyzed else last_analyzed
self.__producer_pairs_df[producer_name][pair_key] = (dataframe, _last_analyzed)
logger.debug(f"External DataFrame for {pair_key} from {producer_name} added.")
def _add_external_df(
self,
pair: str,
dataframe: DataFrame,
last_analyzed: datetime,
timeframe: str,
candle_type: CandleType,
producer_name: str = "default"
) -> Tuple[bool, int]:
"""
Append a candle to the existing external dataframe. The incoming dataframe
must have at least 1 candle.
:param pair: pair to get the data for
:param timeframe: Timeframe to get data for
:param candle_type: Any of the enum CandleType (must match trading mode!)
:returns: False if the candle could not be appended, or the int number of missing candles.
"""
pair_key = (pair, timeframe, candle_type)
if dataframe.empty:
# The incoming dataframe must have at least 1 candle
return (False, 0)
if len(dataframe) >= FULL_DATAFRAME_THRESHOLD:
# This is likely a full dataframe
# Add the dataframe to the dataprovider
self._replace_external_df(
pair,
dataframe,
last_analyzed=last_analyzed,
timeframe=timeframe,
candle_type=candle_type,
producer_name=producer_name
)
return (True, 0)
if (producer_name not in self.__producer_pairs_df
or pair_key not in self.__producer_pairs_df[producer_name]):
# We don't have data from this producer yet,
# or we don't have data for this pair_key
# return False and 1000 for the full df
return (False, 1000)
existing_df, _ = self.__producer_pairs_df[producer_name][pair_key]
# CHECK FOR MISSING CANDLES
timeframe_delta = to_timedelta(timeframe) # Convert the timeframe to a timedelta for pandas
local_last = existing_df.iloc[-1]['date'] # We want the last date from our copy
incoming_first = dataframe.iloc[0]['date'] # We want the first date from the incoming
# Remove existing candles that are newer than the incoming first candle
existing_df1 = existing_df[existing_df['date'] < incoming_first]
candle_difference = (incoming_first - local_last) / timeframe_delta
# If the difference divided by the timeframe is 1, then this
# is the candle we want and the incoming data isn't missing any.
# If the candle_difference is more than 1, that means
# we missed some candles between our data and the incoming
# so return False and candle_difference.
if candle_difference > 1:
return (False, candle_difference)
if existing_df1.empty:
appended_df = dataframe
else:
appended_df = append_candles_to_dataframe(existing_df1, dataframe)
# Everything is good, we appended
self._replace_external_df(
pair,
appended_df,
last_analyzed=last_analyzed,
timeframe=timeframe,
candle_type=candle_type,
producer_name=producer_name
)
return (True, 0)
def get_producer_df(
self,
pair: str,
timeframe: Optional[str] = None,
candle_type: Optional[CandleType] = None,
producer_name: str = "default"
) -> Tuple[DataFrame, datetime]:
"""
Get the pair data from producers.
:param pair: pair to get the data for
:param timeframe: Timeframe to get data for
:param candle_type: Any of the enum CandleType (must match trading mode!)
:returns: Tuple of the DataFrame and last analyzed timestamp
"""
_timeframe = self._default_timeframe if not timeframe else timeframe
_candle_type = self._default_candle_type if not candle_type else candle_type
pair_key = (pair, _timeframe, _candle_type)
# If we have no data from this Producer yet
if producer_name not in self.__producer_pairs_df:
# We don't have this data yet, return empty DataFrame and datetime (01-01-1970)
return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc))
# If we do have data from that Producer, but no data on this pair_key
if pair_key not in self.__producer_pairs_df[producer_name]:
# We don't have this data yet, return empty DataFrame and datetime (01-01-1970)
return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc))
# We have it, return this data
df, la = self.__producer_pairs_df[producer_name][pair_key]
return (df.copy(), la)
def add_pairlisthandler(self, pairlists) -> None:
"""
Allow adding pairlisthandler after initialization
@@ -86,14 +292,16 @@ class DataProvider:
"""
_candle_type = CandleType.from_string(
candle_type) if candle_type != '' else self._config['candle_type_def']
saved_pair = (pair, str(timeframe), _candle_type)
saved_pair: PairWithTimeframe = (pair, str(timeframe), _candle_type)
if saved_pair not in self.__cached_pairs_backtesting:
timerange = TimeRange.parse_timerange(None if self._config.get(
'timerange') is None else str(self._config.get('timerange')))
# Move informative start time respecting startup_candle_count
timerange.subtract_start(
timeframe_to_seconds(str(timeframe)) * self._config.get('startup_candle_count', 0)
)
# It is not necessary to add the training candles, as they
# were already added at the beginning of the backtest.
startup_candles = self.get_required_startup(str(timeframe), False)
tf_seconds = timeframe_to_seconds(str(timeframe))
timerange.subtract_start(tf_seconds * startup_candles)
self.__cached_pairs_backtesting[saved_pair] = load_pair_history(
pair=pair,
timeframe=timeframe or self._config['timeframe'],
@@ -105,6 +313,23 @@ class DataProvider:
)
return self.__cached_pairs_backtesting[saved_pair].copy()
def get_required_startup(self, timeframe: str, add_train_candles: bool = True) -> int:
freqai_config = self._config.get('freqai', {})
if not freqai_config.get('enabled', False):
return self._config.get('startup_candle_count', 0)
else:
startup_candles = self._config.get('startup_candle_count', 0)
indicator_periods = freqai_config['feature_parameters']['indicator_periods_candles']
# make sure the startupcandles is at least the set maximum indicator periods
self._config['startup_candle_count'] = max(startup_candles, max(indicator_periods))
tf_seconds = timeframe_to_seconds(timeframe)
train_candles = 0
if add_train_candles:
train_candles = freqai_config['train_period_days'] * 86400 / tf_seconds
total_candles = int(self._config['startup_candle_count'] + train_candles)
logger.info(f'Increasing startup_candle_count for freqai to {total_candles}')
return total_candles
def get_pair_dataframe(
self,
pair: str,
@@ -181,7 +406,9 @@ class DataProvider:
Clear pair dataframe cache.
"""
self.__cached_pairs = {}
self.__cached_pairs_backtesting = {}
# Don't reset backtesting pairs -
# otherwise they're reloaded each time during hyperopt due to with analyze_per_epoch
# self.__cached_pairs_backtesting = {}
self.__slice_index = 0
# Exchange functions

View File

@@ -1,11 +1,12 @@
import logging
from pathlib import Path
from typing import List, Optional
import joblib
import pandas as pd
from tabulate import tabulate
from freqtrade.configuration import TimeRange
from freqtrade.constants import Config
from freqtrade.data.btanalysis import (get_latest_backtest_filename, load_backtest_data,
load_backtest_stats)
from freqtrade.exceptions import OperationalException
@@ -152,37 +153,55 @@ def _do_group_table_output(bigdf, glist):
logger.warning("Invalid group mask specified.")
def _print_results(analysed_trades, stratname, analysis_groups,
enter_reason_list, exit_reason_list,
indicator_list, columns=None):
if columns is None:
columns = ['pair', 'open_date', 'close_date', 'profit_abs', 'enter_reason', 'exit_reason']
def _select_rows_within_dates(df, timerange=None, df_date_col: str = 'date'):
if timerange:
if timerange.starttype == 'date':
df = df.loc[(df[df_date_col] >= timerange.startdt)]
if timerange.stoptype == 'date':
df = df.loc[(df[df_date_col] < timerange.stopdt)]
return df
bigdf = pd.DataFrame()
def _select_rows_by_tags(df, enter_reason_list, exit_reason_list):
if enter_reason_list and "all" not in enter_reason_list:
df = df.loc[(df['enter_reason'].isin(enter_reason_list))]
if exit_reason_list and "all" not in exit_reason_list:
df = df.loc[(df['exit_reason'].isin(exit_reason_list))]
return df
def prepare_results(analysed_trades, stratname,
enter_reason_list, exit_reason_list,
timerange=None):
res_df = pd.DataFrame()
for pair, trades in analysed_trades[stratname].items():
bigdf = pd.concat([bigdf, trades], ignore_index=True)
res_df = pd.concat([res_df, trades], ignore_index=True)
if bigdf.shape[0] > 0 and ('enter_reason' in bigdf.columns):
res_df = _select_rows_within_dates(res_df, timerange)
if res_df is not None and res_df.shape[0] > 0 and ('enter_reason' in res_df.columns):
res_df = _select_rows_by_tags(res_df, enter_reason_list, exit_reason_list)
return res_df
def print_results(res_df, analysis_groups, indicator_list):
if res_df.shape[0] > 0:
if analysis_groups:
_do_group_table_output(bigdf, analysis_groups)
if enter_reason_list and "all" not in enter_reason_list:
bigdf = bigdf.loc[(bigdf['enter_reason'].isin(enter_reason_list))]
if exit_reason_list and "all" not in exit_reason_list:
bigdf = bigdf.loc[(bigdf['exit_reason'].isin(exit_reason_list))]
_do_group_table_output(res_df, analysis_groups)
if "all" in indicator_list:
print(bigdf)
print(res_df)
elif indicator_list is not None:
available_inds = []
for ind in indicator_list:
if ind in bigdf:
if ind in res_df:
available_inds.append(ind)
ilist = ["pair", "enter_reason", "exit_reason"] + available_inds
_print_table(bigdf[ilist], sortcols=['exit_reason'], show_index=False)
_print_table(res_df[ilist], sortcols=['exit_reason'], show_index=False)
else:
print("\\_ No trades to show")
print("\\No trades to show")
def _print_table(df, sortcols=None, show_index=False):
@@ -201,27 +220,34 @@ def _print_table(df, sortcols=None, show_index=False):
)
def process_entry_exit_reasons(backtest_dir: Path,
pairlist: List[str],
analysis_groups: Optional[List[str]] = ["0", "1", "2"],
enter_reason_list: Optional[List[str]] = ["all"],
exit_reason_list: Optional[List[str]] = ["all"],
indicator_list: Optional[List[str]] = []):
def process_entry_exit_reasons(config: Config):
try:
backtest_stats = load_backtest_stats(backtest_dir)
analysis_groups = config.get('analysis_groups', [])
enter_reason_list = config.get('enter_reason_list', ["all"])
exit_reason_list = config.get('exit_reason_list', ["all"])
indicator_list = config.get('indicator_list', [])
timerange = TimeRange.parse_timerange(None if config.get(
'timerange') is None else str(config.get('timerange')))
backtest_stats = load_backtest_stats(config['exportfilename'])
for strategy_name, results in backtest_stats['strategy'].items():
trades = load_backtest_data(backtest_dir, strategy_name)
trades = load_backtest_data(config['exportfilename'], strategy_name)
if not trades.empty:
signal_candles = _load_signal_candles(backtest_dir)
analysed_trades_dict = _process_candles_and_indicators(pairlist, strategy_name,
trades, signal_candles)
_print_results(analysed_trades_dict,
strategy_name,
analysis_groups,
enter_reason_list,
exit_reason_list,
indicator_list)
signal_candles = _load_signal_candles(config['exportfilename'])
analysed_trades_dict = _process_candles_and_indicators(
config['exchange']['pair_whitelist'], strategy_name,
trades, signal_candles)
res_df = prepare_results(analysed_trades_dict, strategy_name,
enter_reason_list, exit_reason_list,
timerange=timerange)
print_results(res_df,
analysis_groups,
indicator_list)
except ValueError as e:
raise OperationalException(e) from e

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