from math import exp, pi, sqrt, cos import numpy as np import talib as ta from pandas import Series def went_up(series: Series) -> bool: return series > series.shift(1) def went_down(series: Series) -> bool: return series < series.shift(1) def ehlers_super_smoother(series: Series, smoothing: float = 6) -> Series: magic = pi * sqrt(2) / smoothing a1 = exp(-magic) coeff2 = 2 * a1 * cos(magic) coeff3 = -a1 * a1 coeff1 = (1 - coeff2 - coeff3) / 2 filtered = series.copy() for i in range(2, len(series)): filtered.iloc[i] = coeff1 * (series.iloc[i] + series.iloc[i-1]) + \ coeff2 * filtered.iloc[i-1] + coeff3 * filtered.iloc[i-2] return filtered def fishers_inverse(series: Series, smoothing: float = 0) -> np.ndarray: """ Does a smoothed fishers inverse transformation. Can be used with any oscillator that goes from 0 to 100 like RSI or MFI """ v1 = 0.1 * (series - 50) if smoothing > 0: v2 = ta.WMA(v1.values, timeperiod=smoothing) else: v2 = v1 return (np.exp(2 * v2)-1) / (np.exp(2 * v2) + 1)