def top_change_percent(dataframe: DataFrame, period: int) -> Series:
"""
- Percentage change of the current close relative to the top close price in previous period.
- :param dataframe: DataFrame The original OHLCV dataframe
- :param period: int The period size to look back
- :return: Series The percentage change 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
+ """
+ if period < 1:
+ raise ValueError("period must be greater than or equal to 1")
+
+ previous_close_top = dataframe["close"].rolling(period).max().shift(1)
+
+ return (dataframe["close"] - previous_close_top) / previous_close_top
+
+
+def price_retracement_percent(dataframe: DataFrame, period: int) -> Series:
+ """
+ Calculate the percentage retracement of the current close within the high/low close price range
+ of the previous `period` bars.
+
+ :param dataframe: OHLCV DataFrame
+ :param period: Window size for calculating historical closes high/low (>=1)
+ :return: Retracement percentage series
"""
- if period < 0:
- raise ValueError("period must be greater than or equal to 0")
- if period == 0:
- previous_close = dataframe["close"].shift(1)
- else:
- previous_close = dataframe["close"].rolling(period).max().shift(1)
-
- return (dataframe["close"] - previous_close) / previous_close
+ 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)
+
+ return (dataframe["close"] - previous_close_low) / (
+ previous_close_high - previous_close_low
+ ).fillna(0.0)
# VWAP bands