From 9ae6a02d315620574b0c0069dde27138fd0f37e8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 16 Jun 2025 09:36:57 +0200 Subject: [PATCH] refactor(qav3): volatility ajusted pivots labeling confirmation MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- ReforceXY/docker/Dockerfile.custom | 2 +- quickadapter/docker/Dockerfile.custom | 2 +- .../freqaimodels/QuickAdapterRegressorV3.py | 17 ++++++++++++++--- .../user_data/strategies/QuickAdapterV3.py | 2 +- quickadapter/user_data/strategies/Utils.py | 15 +++++++++++++-- 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/ReforceXY/docker/Dockerfile.custom b/ReforceXY/docker/Dockerfile.custom index e787e8d..7c5211c 100644 --- a/ReforceXY/docker/Dockerfile.custom +++ b/ReforceXY/docker/Dockerfile.custom @@ -1,4 +1,4 @@ FROM freqtradeorg/freqtrade:stable_freqairl -ARG optuna_version=4.3.0 +ARG optuna_version=4.4.0 RUN pip install --user optuna==${optuna_version} optuna-dashboard diff --git a/quickadapter/docker/Dockerfile.custom b/quickadapter/docker/Dockerfile.custom index b6601ad..34cf282 100644 --- a/quickadapter/docker/Dockerfile.custom +++ b/quickadapter/docker/Dockerfile.custom @@ -1,4 +1,4 @@ FROM freqtradeorg/freqtrade:stable_freqai -ARG optuna_version=4.3.0 +ARG optuna_version=4.4.0 RUN pip install --user optuna==${optuna_version} optuna-integration==${optuna_version} optuna-dashboard diff --git a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py index fca8a27..dd7d97c 100644 --- a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py +++ b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py @@ -50,7 +50,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel): https://github.com/sponsors/robcaulk """ - version = "3.7.91" + version = "3.7.92" @cached_property def _optuna_config(self) -> dict: @@ -1325,7 +1325,18 @@ def zigzag( max_window, ).astype(int) - @lru_cache(maxsize=8) + def calculate_slopes_ok_threshold( + pos: int, + min_threshold: float = 0.65, + max_threshold: float = 0.75, + ) -> float: + volatility_quantile = calculate_volatility_quantile(pos) + if np.isnan(volatility_quantile): + return median([min_threshold, max_threshold]) + + return min_threshold + (max_threshold - min_threshold) * volatility_quantile + + @lru_cache(maxsize=4096) def calculate_slopes_ok_min_max(slopes_ok_threshold: float) -> tuple[int, int]: raw_bound1 = math.ceil(1 / slopes_ok_threshold) raw_bound2 = math.ceil(1 / (1 - slopes_ok_threshold)) @@ -1423,7 +1434,6 @@ def zigzag( direction: TrendDirection, enable_weighting: bool = False, min_slope: float = np.finfo(float).eps, - slopes_ok_threshold: float = 0.65, ) -> bool: slope_confirmation_window = calculate_slope_confirmation_window( candidate_pivot_pos @@ -1441,6 +1451,7 @@ def zigzag( ) ) + slopes_ok_threshold = calculate_slopes_ok_threshold(candidate_pivot_pos) min_slopes_ok = calculate_min_slopes_ok( candidate_pivot_pos, slopes_ok_threshold ) diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index c404e4a..4a0a812 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -64,7 +64,7 @@ class QuickAdapterV3(IStrategy): INTERFACE_VERSION = 3 def version(self) -> str: - return "3.3.95" + return "3.3.96" timeframe = "5m" diff --git a/quickadapter/user_data/strategies/Utils.py b/quickadapter/user_data/strategies/Utils.py index 7fbd6ed..2fabfba 100644 --- a/quickadapter/user_data/strategies/Utils.py +++ b/quickadapter/user_data/strategies/Utils.py @@ -449,7 +449,18 @@ def zigzag( max_window, ).astype(int) - @lru_cache(maxsize=8) + def calculate_slopes_ok_threshold( + pos: int, + min_threshold: float = 0.65, + max_threshold: float = 0.75, + ) -> float: + volatility_quantile = calculate_volatility_quantile(pos) + if np.isnan(volatility_quantile): + return median([min_threshold, max_threshold]) + + return min_threshold + (max_threshold - min_threshold) * volatility_quantile + + @lru_cache(maxsize=4096) def calculate_slopes_ok_min_max(slopes_ok_threshold: float) -> tuple[int, int]: raw_bound1 = math.ceil(1 / slopes_ok_threshold) raw_bound2 = math.ceil(1 / (1 - slopes_ok_threshold)) @@ -547,7 +558,6 @@ def zigzag( direction: TrendDirection, enable_weighting: bool = False, min_slope: float = np.finfo(float).eps, - slopes_ok_threshold: float = 0.65, ) -> bool: slope_confirmation_window = calculate_slope_confirmation_window( candidate_pivot_pos @@ -565,6 +575,7 @@ def zigzag( ) ) + slopes_ok_threshold = calculate_slopes_ok_threshold(candidate_pivot_pos) min_slopes_ok = calculate_min_slopes_ok( candidate_pivot_pos, slopes_ok_threshold ) -- 2.43.0