Перейти к публикации
Форум ботоводов

Индикатор ATR для БОТА Binance с индикаторами.


Рекомендованные сообщения

Добрый день.

Попробовал добавить индикатор ATR (Average True Range) и ATRP (проценты от ATR) для ограничения пика цен при входе в торги (тут же на форуме видел, что при превышении 70 процентов волотильности цены, высока вероятность на ее разворот). Именно это и хотел использовать в производном индикаторе ATRP = (atr/close)*100 (пруф - https://www.fidelity.com/learning-center/trading-investing/technical-analysis/technical-indicator-guide/atrp)

Но похоже что-то у меня не так (уже на первом шаге).

Нашел несколько реализаций ATR:

Первая (на мой взгляд самая правильная, но она не работает): 

def ExpMovingAverage(values, window):
    weights = np.exp(np.linspace(-1., 0., window))
    weights /= weights.sum()
    a =  np.convolve(values, weights, mode='full')[:len(values)]
    a[:window] = a[window]
    return a

def TR(d,c,h,l,o,yc):
    x = h-1
    y = abs(h-yc)
    z = abs(l-yc)
        
    if y <= x >= z:
        TR = x
    elif x <= y >=z:
        TR = y
    elif x <= z >=y:
        TR = z
            
    return TR

#ATR - average true range
def ATR(d,c,h,l,o,yc,atf):

    x = 1
    TrueRanges = []

    while x < len(d):
        TrueRange = TR(d[x],c[x],h[x],l[x],o[x],c[x-1])  <<< - тут ошибка     TrueRange = TR(d[x],c[x],h[x],l[x],o[x],c[x-1])  TypeError: 'builtin_function_or_method' object is not subscriptable
        TrueRanges.append(TrueRange)
        x += 1

    ATR = ExpMovingAverage(TrueRanges,14)

    return ATR

Адаптировал ее и упростил, на основе той, что используется в panda

Вариант 2 (рабочий, но выдает какую-то фигню, мало похожую на правду😞

def ExpMovingAverage(values, window):
    weights = np.exp(np.linspace(-1., 0., window))
    weights /= weights.sum()
    a =  np.convolve(values, weights, mode='full')[:len(values)]
    a[:window] = a[window]
    return a

def ATR1(d,c,h,l,n):  
    i = 0  
    TR_l = [0]  
    while i < len(d):  
        TR = max(h, c[i-1]) - min(l, c[i-1])  
        TR_l.append(TR)  
        i = i + 1  
    #TR_s = pd.Series(TR_l)  
    #ATR = pd.ewm(TR_s, span = n, min_periods = n) << для разных версий панда
    #ATR = pd.DataFrame.ewm(TR_s, span = n, min_periods = n).mean() <<  для разных версий панда
    ATR = ExpMovingAverage(TR_l,n) << если вставить TR_s вместо TR_l результат не изменяется, но так не нужно подгружать панду.
    #df = df.join(ATR)  
    return ATR

Господа, может кто подскажет, в чем косяк в первой реализации?

Ну, или у кого-то есть рабочее решение именно под бота с индикаторами Binance?

Всем спасибо.

Ссылка на сообщение
Поделиться на других сайтах
  • 2 weeks later...

Нашел еще два интересных индикатора для бота, оба трендовые. ADX и Parabbolic SAR. в обоих случаях совместно с другими можно входить в покупку, когда они показывают бычий тренд. Есть код, найденный в сети, но не могу его адаптировать к Боту для Binance с индикаторами. Готов поделиться, может кто-то приведет их к нужному виду.

Выложу отдельными ответами, они немного большие.

Ссылка на сообщение
Поделиться на других сайтах

def TR(d,c,h,l,o,yc):
    x = h-l
    y = abs(h-yc)
    z = abs(l-yc)


    if y <= x >= z:
        TR = x
    elif x <= y >= z:
        TR = y
    elif x <= z >= y:
        TR = z
    return d, TR

def DM(d,o,h,l,c,yo,yh,yl,yc):
    moveUp = h-yh
    moveDown = yl-l

    if 0 < moveUp > moveDown:
        PDM = moveUp
    else:
        PDM = 0

    if 0 < moveDown > moveUp:
        NDM = moveDown
    else:
        NDM = 0
    return d,PDM,NDM


def ExpMovingAverage(values, window):
    weights = np.exp(np.linspace(-1., 0., window))
    weights /= weights.sum()
    a =  np.convolve(values, weights, mode='full')[:len(values)]
    a[:window] = a[window]
    return a

def calcDIs(date,openp,highp,lowp,closep,openp,highp,lowp,closep,tf):
    x = 1
    TRDates = []
    TrueRanges = []
    PosDMs = []
    NegDMs = []

    while x < len(date):
        TRDate,TrueRange = TR(date[x],closep[x],highp[x],lowp[x],openp[x],closep[x-1])
        TRDates.append(TRDate)
        TrueRanges.append(TrueRange)

        DMdate,PosDM,NegDM = DM(date[x],openp[x],highp[x],lowp[x],closep[x],openp[x-1],highp[x-1],lowp[-1],closep[x-1])
        PosDMs.append(PosDM)
        NegDMs.append(NegDM)

        x +=1

    expPosDM = ExpMovingAverage(PosDMs,14)
    expNegDM = ExpMovingAverage(NegDMs,14)
    ATR = ExpMovingAverage(TrueRanges,14)


    xx = 0
    PDIs = []
    NDIs = []


    while xx < len(ATR):
        PDI = 100*(expPosDM[xx]/ATR[xx])
        PDIs.append(PDI)


        NDI = 100*(expNegDM[xx]/ATR[xx])
        NDIs.append(NDI)

        xx +=1


    return PDIs,NDIs


def ADX(date,openp,highp,lowp,closep,openp,highp,lowp,closep,tf,tf):
    PositiveDI,NegativeDI = calcDIs(date,openp,highp,lowp,closep,openp,highp,lowp,closep,tf)


    xxx = 0
    DXs =[]

    while xxx < len(date[1:]):
        DX = 100*( (abs(PositiveDI[xxx]-NegativeDI[xxx])
                    /(PositiveDI[xxx]+NegativeDI[xxx])))


        DXs.append(DX)

        xxx += 1


    ADX = ExpMovingAverage(DXs,14)
    
    return PositiveDI, NegativeDI, ADX

Ссылка на сообщение
Поделиться на других сайтах

При вызове этой функции

 while x < len(date):
        TRDate,TrueRange = TR(date[x],closep[x],highp[x],lowp[x],openp[x],closep[x-1])
        TRDates.append(TRDate)
        TrueRanges.append(TrueRange)

        DMdate,PosDM,NegDM = DM(date[x],openp[x],highp[x],lowp[x],closep[x],openp[x-1],highp[x-1],lowp[-1],closep[x-1])
        PosDMs.append(PosDM)
        NegDMs.append(NegDM)

возникает ошибка, писал о ней выше - TypeError: 'builtin_function_or_method' object is not subscriptable

 

 

Ссылка на сообщение
Поделиться на других сайтах

PSAR вообще адаптировать не получается. Но общая функция такая

def psar(barsdata, iaf = 0.02, maxaf = 0.2😞
    length = len(barsdata)
    dates = list(barsdata['Date'])
    high = list(barsdata['High'])
    low = list(barsdata['Low'])
    close = list(barsdata['Close'])
    psar = close[0:len(close)]
    psarbull = [None] * length
    psarbear = [None] * length
    bull = True
    af = iaf
    ep = low[0]
    hp = high[0]
    lp = low[0]
    for i in range(2,length):
        if bull:
            psar = psar[i - 1] + af * (hp - psar[i - 1])
        else:
            psar = psar[i - 1] + af * (lp - psar[i - 1])
        reverse = False
        if bull:
            if low < psar:
                bull = False
                reverse = True
                psar = hp
                lp = low
                af = iaf
        else:
            if high > psar:
                bull = True
                reverse = True
                psar = lp
                hp = high
                af = iaf
        if not reverse:
            if bull:
                if high > hp:
                    hp = high
                    af = min(af + iaf, maxaf)
                if low[i - 1] < psar:
                    psar = low[i - 1]
                if low[i - 2] < psar:
                    psar = low[i - 2]
            else:
                if low < lp:
                    lp = low
                    af = min(af + iaf, maxaf)
                if high[i - 1] > psar:
                    psar = high[i - 1]
                if high[i - 2] > psar:
                    psar = high[i - 2]
        if bull:
            psarbull = psar
        else:
            psarbear = psar
    return {"dates":dates, "high":high, "low":low, "close":close, "psar":psar, "psarbear":psarbear, "psarbull":psarbull}
Ссылка на сообщение
Поделиться на других сайтах
  • 2 months later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...