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

kozak

Members
  • Публикации

    9
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем kozak

  1. 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. При вызове этой функции

     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

     

     

  3. 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

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

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

  5. Добрый день.

    Попробовал добавить индикатор 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?

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

  6. Добрый день.

    Надеюсь, не буду сильно повторяться со своими вопросами, они встречались в обсуждении, под статьей о боте, но не на все там сумел найти ответ.

    Андрей, подскажите, у вас в боте есть индикатор побития верхней полосы Боллинджера.

    upper, middle, lower = ta.BBANDS(closes, ma_period=21)
                            if high[-1] > upper[-1]:
                                # Свеча пробила верхнюю полосу Боллинджера

    Но ведь при побитии верхней границы полосы Боллинджера мы ожидаем спада цены, и тогда действительно ли мы должны входить в рынок с покупкой?

    Возможно нужно внести измененный индикатор, нам необходимо побитие именно нижней полосы Боллинджера?

     

    Еще вопрос, видел что он тут звучал, но не заметил ответа, возможно подскажите.

    Мы же используем индикаторы, есть ли такой вариант их настройки, при котором вход на рынок не будет осуществляться при пиках цен? 

    Ну и вопрос ко всему сообществу. Никто не пытался прикрутить трайлинг стоп к этому боту? Он даже более важен в варианте Short,  когда мы входим в рынок и попадаем на ситуацию, связанную с пиком и резким падением цены. Так мы хотя бы частично защитимся от покупки валютной пары по самым максимальным ценам, она будет скользить к обратному развороту, связанному с ростом? Если я в чем-то ошибаюсь, поправьте меня.

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

    Андрей, бот великолепен. Спасибо вам.

     

  7. Добрый день.

    У вас в заголовке основного блога написано, что можно заказать бота.

    Если у вас заказать реализацию подобного, в какую сумму вы это оцените?

    Можно ответить на почту - kozak666mur@bk.ru

  8. Добрый день.

    Не заметил в форумах подобного вопроса, и решил его озвучить.

    Сейчас настройки бота задаются одним файлом конфига, где прописываются все пары для отслеживания. 

    Вопрос вот в чем: можно ли автоматически выбирать пары с биржи, которые соответствуют условиям срабатывания индикатора (больше 7), помещать их в отдельный список и выбирать из него к примеру 5 пар с наибольшим параметром индикатора.

    На основе этих пар формировать свой файл конфига для каждой пары и для него же запускать свой экземпляр бота. 

    Далее уже каждый бот работает отдельно. Идет проверка его работы.

    Мы дожидаемся момента пока бот по любому из потоков закроет все ордера.

    И если появляется место среди доступных пар (из примера: по 4-м идут торги, пятая с параметром индикатора меньше 7), то в этом случае снова срабатывает проверка на поиск пар и нужный конфиг пересоздается, а необходимый поток отработки ботом перезапускается, считываются новые параметры пары, с подходящим индикатором и бот снова вступает в торги, но по уже другой паре.

    Такое возможно реализовать? 

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