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

kozak

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

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

  • Посещение

kozak's Achievements

Newbie

Newbie (1/14)

0

Репутация

  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. И вообще, вопрос в дополнение. Какие еще индикаторы вы бы привязали к боту и с какими параметрами?
  6. Добрый день. Попробовал добавить индикатор 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? Всем спасибо.
  7. Добрый день. Надеюсь, не буду сильно повторяться со своими вопросами, они встречались в обсуждении, под статьей о боте, но не на все там сумел найти ответ. Андрей, подскажите, у вас в боте есть индикатор побития верхней полосы Боллинджера. upper, middle, lower = ta.BBANDS(closes, ma_period=21) if high[-1] > upper[-1]: # Свеча пробила верхнюю полосу Боллинджера Но ведь при побитии верхней границы полосы Боллинджера мы ожидаем спада цены, и тогда действительно ли мы должны входить в рынок с покупкой? Возможно нужно внести измененный индикатор, нам необходимо побитие именно нижней полосы Боллинджера? Еще вопрос, видел что он тут звучал, но не заметил ответа, возможно подскажите. Мы же используем индикаторы, есть ли такой вариант их настройки, при котором вход на рынок не будет осуществляться при пиках цен? Ну и вопрос ко всему сообществу. Никто не пытался прикрутить трайлинг стоп к этому боту? Он даже более важен в варианте Short, когда мы входим в рынок и попадаем на ситуацию, связанную с пиком и резким падением цены. Так мы хотя бы частично защитимся от покупки валютной пары по самым максимальным ценам, она будет скользить к обратному развороту, связанному с ростом? Если я в чем-то ошибаюсь, поправьте меня. Всем спасибо. Андрей, бот великолепен. Спасибо вам.
  8. Добрый день. У вас в заголовке основного блога написано, что можно заказать бота. Если у вас заказать реализацию подобного, в какую сумму вы это оцените? Можно ответить на почту - kozak666mur@bk.ru
  9. Добрый день. Не заметил в форумах подобного вопроса, и решил его озвучить. Сейчас настройки бота задаются одним файлом конфига, где прописываются все пары для отслеживания. Вопрос вот в чем: можно ли автоматически выбирать пары с биржи, которые соответствуют условиям срабатывания индикатора (больше 7), помещать их в отдельный список и выбирать из него к примеру 5 пар с наибольшим параметром индикатора. На основе этих пар формировать свой файл конфига для каждой пары и для него же запускать свой экземпляр бота. Далее уже каждый бот работает отдельно. Идет проверка его работы. Мы дожидаемся момента пока бот по любому из потоков закроет все ордера. И если появляется место среди доступных пар (из примера: по 4-м идут торги, пятая с параметром индикатора меньше 7), то в этом случае снова срабатывает проверка на поиск пар и нужный конфиг пересоздается, а необходимый поток отработки ботом перезапускается, считываются новые параметры пары, с подходящим индикатором и бот снова вступает в торги, но по уже другой паре. Такое возможно реализовать?
×
×
  • Создать...