]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
fix(qav3): use NATR as per its definition semantic
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Wed, 21 May 2025 14:57:21 +0000 (16:57 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Wed, 21 May 2025 14:57:21 +0000 (16:57 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
quickadapter/user_data/config-template.json
quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py
quickadapter/user_data/strategies/QuickAdapterV3.py
quickadapter/user_data/strategies/Utils.py

index 24719cd8836fe95601206fed8c8313758881663e..517e55a7520dc935ecd46c2b53b0d96e20c4f349 100644 (file)
       "&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
     },
index f4d7b7003721a5f9f52612120b7301e67ec51ce5..78b747e01a4cc86bb09152e088e40b78be38edf7 100644 (file)
@@ -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
 
index 70c02a5de4b3c0b4f6ab2bf51b42d6d5d0958b95..b18f08b9a91015a6b8ed5108a26ee657b4c723e7 100644 (file)
@@ -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)
index 73bfb307b740368133f30daacd7989163476da6d..0a90334333001f09a99734d8536fb591154edc0c 100644 (file)
@@ -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()