]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
refactor(qav3): cleanup price retracement indicator implementation
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 23 Mar 2025 13:06:26 +0000 (14:06 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 23 Mar 2025 13:06:26 +0000 (14:06 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
quickadapter/user_data/strategies/QuickAdapterV3.py

index f007417e11d71a8ccb0dfc7b905454283ea63eae..5fcce28c4b9013a3915b5f482ba5f6cdeca38e82 100644 (file)
@@ -188,6 +188,7 @@ class QuickAdapterV3(IStrategy):
             fillna=0.0,
         )
         dataframe["%-tcp-period"] = top_change_percent(dataframe, period=period)
+        # dataframe["%-bcp-period"] = bottom_change_percent(dataframe, period=period)
         # dataframe["%-prp-period"] = price_retracement_percent(dataframe, period=period)
         dataframe["%-cti-period"] = pta.cti(dataframe["close"], length=period)
         dataframe["%-chop-period"] = pta.chop(
@@ -672,18 +673,39 @@ class QuickAdapterV3(IStrategy):
 def top_change_percent(dataframe: DataFrame, period: int) -> Series:
     """
     Percentage change of the current close relative to the top close price in the previous `period` bars.
-    :param dataframe: DataFrame OHLCV dataframe
-    :param period: int The previous period window size to look back (>=1)
-    :return: Series The top change percentage series
+
+    :param dataframe: OHLCV DataFrame
+    :param period: The previous period window size to look back (>=1)
+    :return: The top change percentage series
     """
     if period < 1:
         raise ValueError("period must be greater than or equal to 1")
 
-    previous_close_top = dataframe["close"].rolling(period).max().shift(1)
+    previous_close_top = (
+        dataframe["close"].rolling(period, min_periods=period).max().shift(1)
+    )
 
     return (dataframe["close"] - previous_close_top) / previous_close_top
 
 
+def bottom_change_percent(dataframe: DataFrame, period: int) -> Series:
+    """
+    Percentage change of the current close relative to the bottom close price in the previous `period` bars.
+
+    :param dataframe: OHLCV DataFrame
+    :param period: The previous period window size to look back (>=1)
+    :return: The bottom change percentage series
+    """
+    if period < 1:
+        raise ValueError("period must be greater than or equal to 1")
+
+    previous_close_bottom = (
+        dataframe["close"].rolling(period, min_periods=period).min().shift(1)
+    )
+
+    return (dataframe["close"] - previous_close_bottom) / previous_close_bottom
+
+
 def price_retracement_percent(dataframe: DataFrame, period: int) -> Series:
     """
     Calculate the percentage retracement of the current close within the high/low close price range
@@ -696,8 +718,12 @@ def price_retracement_percent(dataframe: DataFrame, period: int) -> Series:
     if period < 1:
         raise ValueError("period must be greater than or equal to 1")
 
-    previous_close_low = dataframe["close"].rolling(period).min().shift(1)
-    previous_close_high = dataframe["close"].rolling(period).max().shift(1)
+    previous_close_low = (
+        dataframe["close"].rolling(period, min_periods=period).min().shift(1)
+    )
+    previous_close_high = (
+        dataframe["close"].rolling(period, min_periods=period).max().shift(1)
+    )
 
     return (dataframe["close"] - previous_close_low) / (
         previous_close_high - previous_close_low