From f23bdeba62a203d18f0a04414fe0dca53c2449ca Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Wed, 21 May 2025 16:57:21 +0200 Subject: [PATCH] fix(qav3): use NATR as per its definition semantic MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- quickadapter/user_data/config-template.json | 2 +- .../freqaimodels/QuickAdapterRegressorV3.py | 14 +++++++------- .../user_data/strategies/QuickAdapterV3.py | 10 +++++----- quickadapter/user_data/strategies/Utils.py | 6 +++--- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/quickadapter/user_data/config-template.json b/quickadapter/user_data/config-template.json index 24719cd..517e55a 100644 --- a/quickadapter/user_data/config-template.json +++ b/quickadapter/user_data/config-template.json @@ -137,7 +137,7 @@ "&s-minima_threshold": -2, "&s-maxima_threshold": 2, "label_period_candles": 100, - "label_natr_ratio": 0.12125, + "label_natr_ratio": 12, "hp_rmse": -1, "train_rmse": -1 }, diff --git a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py index f4d7b70..78b747e 100644 --- a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py +++ b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py @@ -115,7 +115,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel): "label_period_candles": self.ft_params.get( "label_period_candles", 50 ), - "label_natr_ratio": self.ft_params.get("label_natr_ratio", 0.12125), + "label_natr_ratio": self.ft_params.get("label_natr_ratio", 12.0), } ) logger.info( @@ -872,7 +872,7 @@ class TrendDirection(IntEnum): def zigzag( df: pd.DataFrame, natr_period: int = 14, - natr_ratio: float = 0.12125, + natr_ratio: float = 12.0, confirmation_window: int = 3, initial_depth: int = 12, ) -> tuple[list[int], list[float], list[int]]: @@ -885,8 +885,8 @@ def zigzag( def get_natr_values(period: int) -> np.ndarray: if period not in natr_values_cache: natr_values_cache[period] = ( - ta.NATR(df, timeperiod=period).fillna(method="bfill").values - ) + ta.NATR(df, timeperiod=period).fillna(method="bfill") / 100 + ).values return natr_values_cache[period] indices = df.index.tolist() @@ -1171,7 +1171,7 @@ def label_objective( max_label_period_candles, step=candles_step, ) - label_natr_ratio = trial.suggest_float("label_natr_ratio", 0.06, 0.3, step=0.0025) + label_natr_ratio = trial.suggest_float("label_natr_ratio", 6.0, 30.0, step=0.25) df = df.iloc[ -( @@ -1194,8 +1194,8 @@ def label_objective( return -np.inf, -np.inf scaled_natr_label_period_candles = ( - ta.NATR(df, timeperiod=label_period_candles) * label_natr_ratio - ) + ta.NATR(df, timeperiod=label_period_candles).fillna(method="bfill") / 100 + ) * label_natr_ratio return scaled_natr_label_period_candles.median(), n diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 70c02a5..b18f08b 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -172,7 +172,7 @@ class QuickAdapterV3(IStrategy): "label_period_candles", 50 ), "label_natr_ratio": self.freqai_info["feature_parameters"].get( - "label_natr_ratio", 0.12125 + "label_natr_ratio", 12.0 ), } ) @@ -360,7 +360,7 @@ class QuickAdapterV3(IStrategy): label_natr_ratio = self._label_params.get(pair, {}).get("label_natr_ratio") if label_natr_ratio: return label_natr_ratio - return self.freqai_info["feature_parameters"].get("label_natr_ratio", 0.12125) + return self.freqai_info["feature_parameters"].get("label_natr_ratio", 12.0) def set_label_natr_ratio(self, pair: str, label_natr_ratio: float): if label_natr_ratio and isinstance(label_natr_ratio, float): @@ -496,7 +496,7 @@ class QuickAdapterV3(IStrategy): return None return ( current_rate - * current_natr + * (current_natr / 100) * self.get_stoploss_natr_ratio(trade.pair) * (1 / math.log10(3.75 + 0.25 * trade_duration_candles)) ) @@ -525,7 +525,7 @@ class QuickAdapterV3(IStrategy): ) return ( trade.open_rate - * take_profit_natr + * (take_profit_natr / 100) * self.get_take_profit_natr_ratio(trade.pair) * math.log10(9.75 + 0.25 * trade_duration_candles) ) @@ -640,7 +640,7 @@ class QuickAdapterV3(IStrategy): return False lower_bound = 0 upper_bound = 0 - price_deviation = last_candle_natr * self.get_entry_natr_ratio(pair) + price_deviation = (last_candle_natr / 100) * self.get_entry_natr_ratio(pair) if side == "long": lower_bound = last_candle_low * (1 - price_deviation) upper_bound = last_candle_close * (1 + price_deviation) diff --git a/quickadapter/user_data/strategies/Utils.py b/quickadapter/user_data/strategies/Utils.py index 73bfb30..0a90334 100644 --- a/quickadapter/user_data/strategies/Utils.py +++ b/quickadapter/user_data/strategies/Utils.py @@ -363,7 +363,7 @@ class TrendDirection(IntEnum): def zigzag( df: pd.DataFrame, natr_period: int = 14, - natr_ratio: float = 0.12125, + natr_ratio: float = 12.0, confirmation_window: int = 3, initial_depth: int = 12, ) -> tuple[list[int], list[float], list[int]]: @@ -376,8 +376,8 @@ def zigzag( def get_natr_values(period: int) -> np.ndarray: if period not in natr_values_cache: natr_values_cache[period] = ( - ta.NATR(df, timeperiod=period).fillna(method="bfill").values - ) + ta.NATR(df, timeperiod=period).fillna(method="bfill") / 100 + ).values return natr_values_cache[period] indices = df.index.tolist() -- 2.43.0