Эта стратегия - стратегия следования трендам и прорыва, основанная на индикаторе рекурсивных полос, разработанном Алекс Гроувером.
Показатель рекурсивных полос состоит из верхней полосы, нижней полосы и средней линии.
Верхняя полоса = Макс. Предыдущая полоса - верхняя полоса, цена закрытия + nВолатильность)
Нижняя полоса = Min(Предыдущая полоса
Здесь n - коэффициент масштабирования, а волатильность может быть выбрана из ATR, стандартного отклонения, среднего истинного диапазона или специального метода RFV. Параметр длины контролирует чувствительность, более высокие значения делают индикатор менее частым.
Стратегия сначала проверяет, не движутся ли нижняя и верхняя полосы в одном направлении, чтобы избежать ложных прорывов.
Когда цена опускается ниже нижней полосы, идете в длинный курс. Когда цена опускается выше верхней полосы, идете в короткий.
Кроме того, реализована логика стоп-лосса.
Преимущества этой стратегии:
Эта стратегия также сопряжена с некоторыми рисками:
Эти риски можно управлять путем оптимизации параметров, внедрения стоп-лосса, увеличения порога скольжения и т.д.
Некоторые направления дальнейшей оптимизации стратегии:
В целом, это очень практичная и эффективная стратегия следования трендам. Она сочетает в себе рекурсивную структуру для вычислительной эффективности, использует поддержку / сопротивление тренда для определения основных тенденций, добавляет импульсные условия для фильтрации ложных прорывов и обеспечения качества сигнала. При правильной настройке параметров и контроле рисков она может достичь хороших результатов. Достойна дальнейших исследований и оптимизации для адаптации к более сложным рыночным режимам.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // @version=5 // Original indicator by alexgrover strategy('Extended Recursive Bands Strategy', overlay=true, commission_type=strategy.commission.percent,commission_value=0.06,default_qty_type =strategy.percent_of_equity,default_qty_value = 100,initial_capital =1000) length = input.int(260, step=10, title='Length') src = input(close, title='Source') method = input.string('Classic', options=['Classic', 'Atr', 'Stdev', 'Ahlr', 'Rfv'], title='Method') bandDirectionCheck = input.bool(true, title='Bands Hold Direction') lookback = input(3) //---- atr = ta.atr(length) stdev = ta.stdev(src, length) ahlr = ta.sma(high - low, length) rfv = 0. rfv := ta.rising(src, length) or ta.falling(src, length) ? math.abs(ta.change(src)) : rfv[1] //----- f(a, b, c) => method == a ? b : c v(x) => f('Atr', atr, f('Stdev', stdev, f('Ahlr', ahlr, f('Rfv', rfv, x)))) //---- sc = 2 / (length + 1) a = 0. a := math.max(nz(a[1], src), src) - sc * v(math.abs(src - nz(a[1], src))) b = 0. b := math.min(nz(b[1], src), src) + sc * v(math.abs(src - nz(b[1], src))) c = (a+b)/2 // Colors beColor = #675F76 buColor = #a472ff // Plots pA = plot(a, color=color.new(beColor, 0), linewidth=2, title='Upper Band') pB = plot(b, color=color.new(buColor, 0), linewidth=2, title='Lower Band') pC = plot(c, color=color.rgb(120,123,134,0), linewidth=2, title='Middle Band') fill(pC, pA, color=color.new(beColor,90)) fill(pC, pB, color=color.new(buColor,90)) // Band keeping direction // By Adulari longc = 0 shortc = 0 for i = 0 to lookback-1 if b[i] > b[i+1] longc:=longc+1 if a[i] < a[i+1] shortc:=shortc+1 bhdLong = if bandDirectionCheck longc==lookback else true bhdShort = if bandDirectionCheck shortc==lookback else true // Strategy if b>=low and bhdLong strategy.entry(id='Long',direction=strategy.long) if high>=a and bhdShort strategy.entry(id='Short',direction=strategy.short) // TP at middle line //if low<=c and strategy.position_size<0 and strategy.position_avg_price>close //strategy.exit(id="Short",limit=close) //if high>=c and strategy.position_size>0 and strategy.position_avg_price<close //strategy.exit(id="Long",limit=close)