def aroon(df, aroon_per, aroon_sl, aroon_wl):
    df_aroon = df.ta.aroon(length=aroon_per)
    aroon_u, aroon_d = df_aroon.iloc[:, 0], df_aroon.iloc[:, 1]
    aroon_usl = ta.above_value(aroon_u, aroon_sl)  # strenght in aroon up
    aroon_dsl = ta.above_value(aroon_d, aroon_sl)  # strenght in aroon down
    aroon_uwl = ta.below_value(aroon_u, aroon_wl)  # weakness in aroon up
    aroon_dwl = ta.below_value(aroon_d, aroon_wl)  # weakness in aroon down
    aroon_usl.iloc[:aroon_per] = np.nan
    aroon_dsl.iloc[:aroon_per] = np.nan
    aroon_uwl.iloc[:aroon_per] = np.nan
    aroon_dwl.iloc[:aroon_per] = np.nan
    return aroon_usl, aroon_dsl, aroon_uwl, aroon_dwl
def mfi(df, mfi_per, mfi_ll, mfi_ul):
    mfi = df.ta.mfi(length=mfi_per)
    mfi_buy = ta.above_value(mfi, mfi_ul)
    mfi_sell = ta.below_value(mfi, mfi_ll)
    mfi_buy.iloc[:mfi_per] = np.nan
    mfi_sell.iloc[:mfi_per] = np.nan
    return mfi_buy, mfi_sell
def rsi(df, rsi_per, rsi_llv, rsi_ulv):
    s_rsi = df.ta.rsi(length=rsi_per)
    s_rsi.iloc[:rsi_per] = np.nan  # ta includes first values
    rsi_ll = ta.below_value(s_rsi, value=rsi_llv)
    rsi_ul = ta.above_value(s_rsi, value=rsi_ulv)
    rsi_ll.iloc[:rsi_per] = np.nan
    rsi_ul.iloc[:rsi_per] = np.nan
    return rsi_ll, rsi_ul
def adx(df, adx_len, adx_ul):
    df_adx = df.ta.adx(length=adx_len)
    adx, dmp, dmm = df_adx.iloc[:, 0], df_adx.iloc[:, 1], df_adx.iloc[:, 2]
    adx_force = ta.above_value(adx, adx_ul)
    adx_buy = ta.cross(dmp, dmm, above=True)
    adx_sell = ta.cross(dmp, dmm, above=False)
    adx_upw = ta.above(dmp, dmm)
    adx_force.iloc[:adx_len] = np.nan
    adx_buy.iloc[:adx_len] = np.nan
    adx_sell.iloc[:adx_len] = np.nan
    adx_upw.iloc[:adx_len] = np.nan
    return adx_force, adx_buy, adx_sell, adx_upw