]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
refactor(quickadapter): add price target tunables constant.
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 26 Dec 2025 16:05:32 +0000 (17:05 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 26 Dec 2025 16:05:32 +0000 (17:05 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
README.md
quickadapter/user_data/strategies/QuickAdapterV3.py
quickadapter/user_data/strategies/Utils.py

index 765926dc1eb9a997e2c1405004e4261b7ce9cd7b..ae3662d255f8a7b48c50da0581a5a34ddc9c1568 100644 (file)
--- a/README.md
+++ b/README.md
@@ -50,7 +50,7 @@ docker compose up -d --build
 | _Leverage_                                           |                               |                                                                                                                                            |                                                                                                                                                                                                                                                                                                                                                                         |
 | leverage                                             | `proposed_leverage`           | float [1.0, max_leverage]                                                                                                                  | Leverage. Fallback to `proposed_leverage` for the pair.                                                                                                                                                                                                                                                                                                                 |
 | _Exit pricing_                                       |                               |                                                                                                                                            |                                                                                                                                                                                                                                                                                                                                                                         |
-| exit_pricing.trade_price_target                      | `moving_average`              | enum {`moving_average`,`interpolation`,`weighted_interpolation`}                                                                           | Trade NATR computation method.                                                                                                                                                                                                                                                                                                                                          |
+| exit_pricing.trade_price_target                      | `moving_average`              | enum {`moving_average`,`quantile_interpolation`,`weighted_average`}                                                                        | Trade NATR computation method.                                                                                                                                                                                                                                                                                                                                          |
 | exit_pricing.thresholds_calibration.decline_quantile | 0.75                          | float (0,1)                                                                                                                                | PnL decline quantile threshold.                                                                                                                                                                                                                                                                                                                                         |
 | _Reversal confirmation_                              |                               |                                                                                                                                            |                                                                                                                                                                                                                                                                                                                                                                         |
 | reversal_confirmation.lookback_period                | 0                             | int >= 0                                                                                                                                   | Prior confirming candles; 0 = none.                                                                                                                                                                                                                                                                                                                                     |
index 376ae516d6238d3f546781a212577421d99e7623..b086144d83af813803cf163eb1a69070fe9fc15d 100644 (file)
@@ -40,6 +40,7 @@ from Utils import (
     SMOOTHING_METHODS,
     SMOOTHING_MODES,
     STANDARDIZATION_TYPES,
+    TRADE_PRICE_TARGETS,
     WEIGHT_STRATEGIES,
     alligator,
     bottom_change_percent,
@@ -1278,7 +1279,7 @@ class QuickAdapterV3(IStrategy):
             isna(trade_duration) or trade_duration <= 0
         )
 
-    def get_trade_weighted_interpolation_natr(
+    def get_trade_weighted_average_natr(
         self, df: DataFrame, trade: Trade
     ) -> Optional[float]:
         label_natr = df.get("natr_label_period_candles")
@@ -1333,7 +1334,7 @@ class QuickAdapterV3(IStrategy):
             weights=np.array([entry_weight, current_weight, median_weight]),
         )
 
-    def get_trade_interpolation_natr(
+    def get_trade_quantile_interpolation_natr(
         self, df: DataFrame, trade: Trade
     ) -> Optional[float]:
         label_natr = df.get("natr_label_period_candles")
@@ -1395,21 +1396,27 @@ class QuickAdapterV3(IStrategy):
         self, df: DataFrame, trade: Trade, trade_duration_candles: int
     ) -> Optional[float]:
         trade_price_target = self.config.get("exit_pricing", {}).get(
-            "trade_price_target", "moving_average"
+            "trade_price_target",
+            TRADE_PRICE_TARGETS[0],  # "moving_average"
         )
         trade_price_target_methods: dict[str, Callable[[], Optional[float]]] = {
-            "moving_average": lambda: self.get_trade_moving_average_natr(
+            # 0 - "moving_average"
+            TRADE_PRICE_TARGETS[0]: lambda: self.get_trade_moving_average_natr(
                 df, trade.pair, trade_duration_candles
             ),
-            "interpolation": lambda: self.get_trade_interpolation_natr(df, trade),
-            "weighted_interpolation": lambda: self.get_trade_weighted_interpolation_natr(
+            # 1 - "quantile_interpolation"
+            TRADE_PRICE_TARGETS[1]: lambda: self.get_trade_quantile_interpolation_natr(
+                df, trade
+            ),
+            # 2 - "weighted_average"
+            TRADE_PRICE_TARGETS[2]: lambda: self.get_trade_weighted_average_natr(
                 df, trade
             ),
         }
         trade_price_target_fn = trade_price_target_methods.get(trade_price_target)
         if trade_price_target_fn is None:
             raise ValueError(
-                f"Invalid trade_price_target: {trade_price_target}. Available: {', '.join(sorted(trade_price_target_methods.keys()))}"
+                f"Invalid trade_price_target: {trade_price_target}. Available: {', '.join(sorted(TRADE_PRICE_TARGETS))}"
             )
         return trade_price_target_fn()
 
@@ -1463,6 +1470,10 @@ class QuickAdapterV3(IStrategy):
     def get_take_profit_distance(
         self, df: DataFrame, trade: Trade, natr_ratio_percent: float
     ) -> Optional[float]:
+        if not (0.0 <= natr_ratio_percent <= 1.0):
+            raise ValueError(
+                f"natr_ratio_percent must be in [0, 1], got {natr_ratio_percent}"
+            )
         trade_duration_candles = self.get_trade_duration_candles(df, trade)
         if not QuickAdapterV3.is_trade_duration_valid(trade_duration_candles):
             return None
index 5b9e8b5913db32ba8b5976fff620bbedd8f2f5c3..8e194f9fad58a836aa56402d30308a167551349a 100644 (file)
@@ -119,6 +119,15 @@ SMOOTHING_MODES: Final[tuple[SmoothingMode, ...]] = (
     "interp",
 )
 
+TradePriceTarget = Literal[
+    "moving_average", "quantile_interpolation", "weighted_average"
+]
+TRADE_PRICE_TARGETS: Final[tuple[TradePriceTarget, ...]] = (
+    "moving_average",
+    "quantile_interpolation",
+    "weighted_average",
+)
+
 
 DEFAULTS_EXTREMA_SMOOTHING: Final[dict[str, Any]] = {
     "method": SMOOTHING_METHODS[0],  # "gaussian"