]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
perf(qav3): more reactive dynamic TP target computation
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Wed, 21 May 2025 19:11:08 +0000 (21:11 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Wed, 21 May 2025 19:11:08 +0000 (21:11 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py
quickadapter/user_data/strategies/QuickAdapterV3.py

index 16f70b5ed4461fdd2f71495db159b8470e55510f..71fbf78f535528488f323d9b268146f8fc04b291 100644 (file)
@@ -45,7 +45,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel):
     https://github.com/sponsors/robcaulk
     """
 
-    version = "3.7.52"
+    version = "3.7.53"
 
     @cached_property
     def _optuna_config(self) -> dict:
index fc05aea572d73c15213b68bf34be7d97fb4b5c9f..710a4798588668b04fea5ae4089d3bf6aba2fcb5 100644 (file)
@@ -18,7 +18,8 @@ import pandas_ta as pta
 from Utils import (
     alligator,
     bottom_change_percent,
-    calculate_quantile,
+    get_ma_fn,
+    zero_lag_series,
     zigzag,
     ewo,
     non_zero_diff,
@@ -59,7 +60,7 @@ class QuickAdapterV3(IStrategy):
     INTERFACE_VERSION = 3
 
     def version(self) -> str:
-        return "3.3.50"
+        return "3.3.51"
 
     timeframe = "5m"
 
@@ -448,22 +449,6 @@ class QuickAdapterV3(IStrategy):
     def get_trade_entry_date(trade: Trade) -> datetime:
         return timeframe_to_prev_date(QuickAdapterV3.timeframe, trade.open_date_utc)
 
-    @staticmethod
-    def get_trade_entry_candle(df: DataFrame, trade: Trade) -> Optional[DataFrame]:
-        entry_date = QuickAdapterV3.get_trade_entry_date(trade)
-        entry_candle = df.loc[(df["date"] == entry_date)]
-        if entry_candle.empty:
-            return None
-        return entry_candle
-
-    @staticmethod
-    def get_trade_entry_natr(df: DataFrame, trade: Trade) -> Optional[float]:
-        entry_candle = QuickAdapterV3.get_trade_entry_candle(df, trade)
-        if entry_candle is None:
-            return None
-        entry_candle = entry_candle.squeeze()
-        return entry_candle["natr_label_period_candles"]
-
     @staticmethod
     def get_trade_duration_candles(df: DataFrame, trade: Trade) -> Optional[int]:
         """
@@ -505,24 +490,17 @@ class QuickAdapterV3(IStrategy):
         trade_duration_candles = QuickAdapterV3.get_trade_duration_candles(df, trade)
         if not QuickAdapterV3.is_trade_duration_valid(trade_duration_candles):
             return None
-        entry_natr = QuickAdapterV3.get_trade_entry_natr(df, trade)
-        if isna(entry_natr) or entry_natr < 0:
-            return None
-        current_natr = df["natr_label_period_candles"].iloc[-1]
-        if isna(current_natr) or current_natr < 0:
-            return None
         entry_date = QuickAdapterV3.get_trade_entry_date(trade)
-        trade_natr_values = df.loc[
-            df["date"] >= entry_date, "natr_label_period_candles"
-        ].values
-        current_natr_quantile = calculate_quantile(trade_natr_values, current_natr)
-        if isna(current_natr_quantile):
+        kama = get_ma_fn("kama")
+        take_profit_natr = kama(
+            zero_lag_series(
+                df.loc[df["date"] >= entry_date, "natr_label_period_candles"],
+                period=trade_duration_candles,
+            ),
+            timeperiod=trade_duration_candles,
+        ).iloc[-1]
+        if isna(take_profit_natr) or take_profit_natr < 0:
             return None
-        entry_natr_weight = 1.0 - current_natr_quantile
-        current_natr_weight = current_natr_quantile
-        take_profit_natr = (
-            entry_natr_weight * entry_natr + current_natr_weight * current_natr
-        )
         return (
             trade.open_rate
             * (take_profit_natr / 100.0)