From 8c52ba3360667a7eb9611f0ddb83709d48bc14ef Mon Sep 17 00:00:00 2001 From: incrementby1 <91958753+incrementby1@users.noreply.github.com> Date: Sat, 27 Nov 2021 16:21:23 +0100 Subject: [PATCH 1/7] ShuffleFilterDetectLiveMode # Apply seed in backtesting mode to get comparable results, # but not in live modes to get a non-repeating order of pairs during live modes. --- freqtrade/plugins/pairlist/ShuffleFilter.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/freqtrade/plugins/pairlist/ShuffleFilter.py b/freqtrade/plugins/pairlist/ShuffleFilter.py index 4d3dd29e3..834fc9a43 100644 --- a/freqtrade/plugins/pairlist/ShuffleFilter.py +++ b/freqtrade/plugins/pairlist/ShuffleFilter.py @@ -18,7 +18,15 @@ class ShuffleFilter(IPairList): pairlist_pos: int) -> None: super().__init__(exchange, pairlistmanager, config, pairlistconfig, pairlist_pos) - self._seed = pairlistconfig.get('seed') + # Apply seed in backtesting mode to get comparable results, + # but not in live modes to get a non-repeating order of pairs during live modes. + if config['runmode'].value in ('live', 'dry_run'): + self._seed = None + logger.info("live mode detected, not applying seed.") + else: + self._seed = pairlistconfig.get('seed') + logger.info("Backtesting mode detected, applying seed value: " + str(self._seed)) + self._random = random.Random(self._seed) @property From 2f0f576fce8af2d41e02136b759382d5746dff78 Mon Sep 17 00:00:00 2001 From: incrementby1 <91958753+incrementby1@users.noreply.github.com> Date: Sat, 27 Nov 2021 16:28:41 +0100 Subject: [PATCH 2/7] Update pairlists.md ShuffleFilter will automatically detect runmodes and apply the `seed` only for backtesting modes - if ad `seed` value is set. --- docs/includes/pairlists.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/includes/pairlists.md b/docs/includes/pairlists.md index bbfe74510..c6b320e62 100644 --- a/docs/includes/pairlists.md +++ b/docs/includes/pairlists.md @@ -254,10 +254,10 @@ Min price precision for SHITCOIN/BTC is 8 decimals. If its price is 0.00000011 - #### ShuffleFilter -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. +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. !!! 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. + 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. #### SpreadFilter From b90303c9a3d2bdbbb46f4557a6b68bdee463bcd4 Mon Sep 17 00:00:00 2001 From: incrementby1 <91958753+incrementby1@users.noreply.github.com> Date: Sat, 27 Nov 2021 18:26:30 +0100 Subject: [PATCH 3/7] Update ShuffleFilter.py random.Random() is deprecated since 3.9 --- freqtrade/plugins/pairlist/ShuffleFilter.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/freqtrade/plugins/pairlist/ShuffleFilter.py b/freqtrade/plugins/pairlist/ShuffleFilter.py index 834fc9a43..3cefee236 100644 --- a/freqtrade/plugins/pairlist/ShuffleFilter.py +++ b/freqtrade/plugins/pairlist/ShuffleFilter.py @@ -27,7 +27,8 @@ class ShuffleFilter(IPairList): self._seed = pairlistconfig.get('seed') logger.info("Backtesting mode detected, applying seed value: " + str(self._seed)) - self._random = random.Random(self._seed) + # deprecated since 3.9 + #self._random = random.Random(self._seed) @property def needstickers(self) -> bool: @@ -54,6 +55,7 @@ class ShuffleFilter(IPairList): :return: new whitelist """ # Shuffle is done inplace - self._random.shuffle(pairlist) + random.seed(self._seed) + random.shuffle(pairlist) return pairlist From 2b3e7eeb2136e1f50ff9de7573ed1cd82bb23d96 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 27 Nov 2021 19:41:36 +0100 Subject: [PATCH 4/7] Use Enum values within bot code --- freqtrade/plugins/pairlist/ShuffleFilter.py | 7 ++++--- tests/plugins/test_pairlist.py | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/freqtrade/plugins/pairlist/ShuffleFilter.py b/freqtrade/plugins/pairlist/ShuffleFilter.py index 3cefee236..dfdfdda73 100644 --- a/freqtrade/plugins/pairlist/ShuffleFilter.py +++ b/freqtrade/plugins/pairlist/ShuffleFilter.py @@ -5,6 +5,7 @@ import logging import random from typing import Any, Dict, List +from freqtrade.enums.runmode import RunMode from freqtrade.plugins.pairlist.IPairList import IPairList @@ -20,12 +21,12 @@ class ShuffleFilter(IPairList): # Apply seed in backtesting mode to get comparable results, # but not in live modes to get a non-repeating order of pairs during live modes. - if config['runmode'].value in ('live', 'dry_run'): + if config.get('runmode') in (RunMode.LIVE, RunMode.DRY_RUN): self._seed = None - logger.info("live mode detected, not applying seed.") + logger.info("Live mode detected, not applying seed.") else: self._seed = pairlistconfig.get('seed') - logger.info("Backtesting mode detected, applying seed value: " + str(self._seed)) + logger.info(f"Backtesting mode detected, applying seed value: {self._seed}") # deprecated since 3.9 #self._random = random.Random(self._seed) diff --git a/tests/plugins/test_pairlist.py b/tests/plugins/test_pairlist.py index 6333266aa..ba8e6c3c3 100644 --- a/tests/plugins/test_pairlist.py +++ b/tests/plugins/test_pairlist.py @@ -7,6 +7,7 @@ import pytest import time_machine from freqtrade.constants import AVAILABLE_PAIRLISTS +from freqtrade.enums.runmode import RunMode from freqtrade.exceptions import OperationalException from freqtrade.persistence import Trade from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist @@ -657,6 +658,22 @@ def test_PerformanceFilter_error(mocker, whitelist_conf, caplog) -> None: assert log_has("PerformanceFilter is not available in this mode.", caplog) +def test_ShuffleFilter_init(mocker, whitelist_conf, caplog) -> None: + whitelist_conf['pairlists'] = [ + {"method": "StaticPairList"}, + {"method": "ShuffleFilter", "seed": 42} + ] + + exchange = get_patched_exchange(mocker, whitelist_conf) + PairListManager(exchange, whitelist_conf) + assert log_has("Backtesting mode detected, applying seed value: 42", caplog) + caplog.clear() + whitelist_conf['runmode'] = RunMode.DRY_RUN + PairListManager(exchange, whitelist_conf) + assert not log_has("Backtesting mode detected, applying seed value: 42", caplog) + assert log_has("Live mode detected, not applying seed.", caplog) + + @pytest.mark.usefixtures("init_persistence") def test_PerformanceFilter_lookback(mocker, whitelist_conf, fee, caplog) -> None: whitelist_conf['exchange']['pair_whitelist'].append('XRP/BTC') From c7d10e2c7e85cabb3b34e8ffd0e3fbc1da4b121c Mon Sep 17 00:00:00 2001 From: incrementby1 <91958753+incrementby1@users.noreply.github.com> Date: Sun, 28 Nov 2021 19:05:02 +0100 Subject: [PATCH 5/7] delete unneeded comment --- freqtrade/plugins/pairlist/ShuffleFilter.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/freqtrade/plugins/pairlist/ShuffleFilter.py b/freqtrade/plugins/pairlist/ShuffleFilter.py index dfdfdda73..d0eff1b17 100644 --- a/freqtrade/plugins/pairlist/ShuffleFilter.py +++ b/freqtrade/plugins/pairlist/ShuffleFilter.py @@ -28,9 +28,6 @@ class ShuffleFilter(IPairList): self._seed = pairlistconfig.get('seed') logger.info(f"Backtesting mode detected, applying seed value: {self._seed}") - # deprecated since 3.9 - #self._random = random.Random(self._seed) - @property def needstickers(self) -> bool: """ From 60eca8b1f1de636d19b5e6d2c07f412c8c25e866 Mon Sep 17 00:00:00 2001 From: incrementby1 <91958753+incrementby1@users.noreply.github.com> Date: Mon, 29 Nov 2021 20:35:43 +0100 Subject: [PATCH 6/7] revert to random object --- freqtrade/plugins/pairlist/ShuffleFilter.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/freqtrade/plugins/pairlist/ShuffleFilter.py b/freqtrade/plugins/pairlist/ShuffleFilter.py index d0eff1b17..55cf9938f 100644 --- a/freqtrade/plugins/pairlist/ShuffleFilter.py +++ b/freqtrade/plugins/pairlist/ShuffleFilter.py @@ -28,6 +28,8 @@ class ShuffleFilter(IPairList): self._seed = pairlistconfig.get('seed') logger.info(f"Backtesting mode detected, applying seed value: {self._seed}") + self._random = random.Random(self._seed) + @property def needstickers(self) -> bool: """ @@ -53,7 +55,6 @@ class ShuffleFilter(IPairList): :return: new whitelist """ # Shuffle is done inplace - random.seed(self._seed) - random.shuffle(pairlist) + self._random.shuffle(pairlist) return pairlist From 85b1f6f6b34491ae88026789b3e765eba76a0b75 Mon Sep 17 00:00:00 2001 From: incrementby1 <91958753+incrementby1@users.noreply.github.com> Date: Mon, 29 Nov 2021 20:44:51 +0100 Subject: [PATCH 7/7] Update pairlists.md --- docs/includes/pairlists.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/includes/pairlists.md b/docs/includes/pairlists.md index c6b320e62..9ef4204f4 100644 --- a/docs/includes/pairlists.md +++ b/docs/includes/pairlists.md @@ -254,7 +254,7 @@ Min price precision for SHITCOIN/BTC is 8 decimals. If its price is 0.00000011 - #### ShuffleFilter -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. +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. !!! 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.