talib 不是万能的、有些其它指标 如:BBI、PSY、BIAS等这些指标是没有的

def BBI(df, n1=3, n2=6, n3=12, n4=24):
    """
    多空指数
    """
    bbi = (MA(df["close"], n1) + MA(df["close"], n2) + MA(df["close"], n3) + MA(df["close"], n4)) / 4
    new_df = pd.DataFrame(data=list(bbi), columns=["bbi"])
    return new_df
 
def PSY(df, n=12, m=6):
    """
    心理线
    """
    new_df = pd.DataFrame()
    new_df["psy"] = COUNT(df["close"] > df["close"].shift(1), n) / n * 100
    new_df["psyma"] = MA(new_df["psy"], m)
    return new_df
 
def BIAS(df, n=6):
    """
    乖离率
    """
    ma1 = MA(df["close"], n)
    new_df = pd.DataFrame(data=list((df["close"] - ma1) / ma1 * 100), columns=["bias"])
    return new_df
 
def MA(close, n=5):
    """
    简单移动平均线
    """
    ma_data = close.rolling(n).mean()
    return ma_data
 
def COUNT(cond, n):
    """
    统计n周期中满足cond条件的个数
    """
    if n == 0:  # 从第一个有效值开始统计
        count_data = pd.Series(np.where(cond, 1, 0).cumsum())
    else:  # 统计每个n周期
        count_data = pd.Series(pd.Series(np.where(cond, 1, 0)).rolling(n).sum())
    return count_data
 
调用方法:
bbi = BBI(df, 6, 12, 24, 48)
if df['close'].values[-2] < bbi.values[-2] and df['close'].values[-1] >= bbi.values[-1]:
    order.up_cross(symbol, 'bbi 策略做多')
if df['close'].values[-2] > bbi.values[-2] and df['close'].values[-1] <= bbi.values[-1]:
    order.down_cross(symbol, 'bbi 策略做空')
psy = PSY(df, 10, 10)
if (psy['psy'].iloc[-2] < 30) and (psy['psy'].iloc[-1] >= 30):
    order.up_cross(symbol, 'psy 策略做多')
if (psy['psy'].iloc[-2] > 70) and (psy['psy'].iloc[-1] <= 70):
    order.down_cross(symbol, 'psy 策略做空')
bias = BIAS(df, 12)
if (bias['bias'].iloc[-2] > -10) and (bias['bias'].iloc[-1] <= -10):
    order.up_cross(symbol, 'bias 策略做多')
if (bias['bias'].iloc[-2] < 10) and (bias['bias'].iloc[-1] >= 10):
    order.down_cross(symbol, 'bias 策略做空')