Адаптивная стратегия следования за трендом на основе полос Боллинджера


Дата создания: 2023-11-16 16:35:01 Последнее изменение: 2023-11-16 16:35:01
Копировать: 1 Количество просмотров: 605
1
Подписаться
1617
Подписчики

Адаптивная стратегия следования за трендом на основе полос Боллинджера

Обзор

Стратегия основана на показателях Бринского канала в сочетании с адаптируемой движущейся средней линией для точного определения и отслеживания тенденций. Динамическая корректировка параметров позволяет стратегии адаптироваться к различным сортам и рыночным условиям, имея более высокую стабильность и адаптивность.

Стратегический принцип

Стратегия состоит из следующих частей:

  1. Вычисление адаптированной скользящей средней. Здесь используется индикатор линейной регрессии для вычисления кривой линейной регрессии в течение определенного периода в качестве скользящей средней.

  2. Вычислить трассу вверх и вниз по Пулину. Здесь используется самостоятельно адаптированный ATR-показатель для вычисления полосы пропускания, а затем в сочетании с параметром ratio2, указанным пользователем, вычисляется трасса вверх и вниз по Пулину.

  3. Определяйте время покупки и продажи. Направление тренда и время покупки и продажи определяются тем, пробилась ли цена вверх и вниз по Буринскому каналу.

  4. Установка остановки убытков. Использование фиксированного количества остановок для контроля риска, в то же время использование предыдущего фиксированного количества после отслеживания остановок для установки остановок, чтобы максимизировать тенденцию, гарантируя прибыль.

  5. В сочетании с периодом обратной проверки устанавливается время начала и окончания обратной проверки, чтобы оптимизировать тестирование стратегии.

Стратегические преимущества

  1. Разработка адаптивных параметров. Каналные полосы и подвижная средняя линия каналов Блинна рассчитываются адаптивно, что позволяет стратегии адаптироваться к изменениям рынка.

  2. Прорывная оценка четкая. Используйте прорыв вверх и вниз по каналу Бурин, чтобы определить поворотный момент тренда, биосигнал более четкий.

  3. Стоп-стоп устанавливается разумно. Применяется фиксированный контроль риска стоп-стопа, отслеживание стоп-стопа для максимизации прибыли от тренда.

  4. Проверка эффективности обратной связи. Установка обратной связи для проверки стратегии, чтобы она была эффективной в исторических условиях.

  5. Легко понятная реализация. Концепция стратегии ясна и понятна, а код прост и прост в понимании и эксплуатации на диске.

Стратегический риск

  1. Пути буринга требуют оптимизации параметров. Полоса и циклы регрессии для путей буринга должны быть оптимизированы в зависимости от разных сортов и рыночных условий. Неправильная оптимизация может привести к многократным ошибочным сигналам или частому возникновению ложных триггеров.

  2. Возврат может быть недостаточно длительным. Этот обзор устанавливает только недавний обзор, который не может охватывать более длинную историю, чтобы полностью проверить стабильность стратегии.

  3. Возможно существование риска пересогласования. Текущие параметры отсчета могут быть оптимизированы только для конкретных недавних ситуаций, что создает риск исторического пересогласования.

  4. Количество остановочных точек необходимо оценить. Нынешние остановочные точки имеют небольшое количество, и могут быть слишком чувствительны, чтобы быть повреждены небольшими толчками.

  5. Отсутствие количественных показателей для проверки. В настоящее время торговые сигналы оцениваются только на основе графических прорывов, а количественные показатели для проверки эффективности сигналов не введены.

Направление оптимизации стратегии

  1. Введение большего количества адаптивных индикаторов. Можно тестировать различные комбинации адаптивных средних линий, адаптивных канальных индикаторов, создавать более надежные стратегии отслеживания тенденций.

  2. Оптимизация параметров. Наиболее оптимальное сочетание путей Буринга и равномерных параметров можно найти с помощью более системных методов, таких как генетические алгоритмы.

  3. Расширение диапазона времени отсчета. Расширение диапазона времени отсчета, проверка стабильности оптимизации параметров. Введение скользящих точек, комиссионных и других транзакционных затрат для более реалистичного отсчета.

  4. Введение правил количественной фильтрации. Настройка правил количественных показателей, таких как объем сделок, разрыв столба MACD, чтобы избежать ошибочного сигнала прорыва буринговых каналов.

  5. Оптимизация механизма остановки. Оценка различных фиксированных параметров остановки и различных способов отслеживания остановки, чтобы найти оптимальную модель остановки.

  6. Проверка в реальном мире. Запуск оптимизированной стратегии в реальном мире, запись отмены доходов, дальнейшее совершенствование стабильной надежности стратегии.

Подвести итог

Эта стратегия имеет четкую общую концепцию, используя путь Буринга для определения направления тенденции и захвата сигналов прорыва, а также для определения общего направления тенденции с помощью движущейся равной линии. С определенной оптимизацией она может стать более стабильной и надежной стратегией отслеживания тенденции.

Исходный код стратегии
/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-09 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Linear Regression (Backtest / Trailing Stop)",overlay=true)
close_price = close[0]

len = input(40)
linear_reg = linreg(close_price, len, 0)

calculationToPlotAverageMeanLine=linear_reg
useUpperDeviation = input(true, "Upper Deviation", bool)
useLowerDeviation = input(true, "Lower Deviation", bool)
ratio2=input(defval=2,title=" Ratio 2")
avg=atr(len)
r2=avg*ratio2
top=linear_reg+r2
bott=linear_reg-r2

calculationToPlotUpperLine=top
calculationToPlotLowerLine=bott

plotUpperDeviationLine = plot(not useUpperDeviation ? na : calculationToPlotUpperLine, color=color(blue,0))
plotAverageMeanLine = plot(calculationToPlotAverageMeanLine, color=color(olive,0))
plotLowererDeviationLine = plot(not useLowerDeviation ? na : calculationToPlotLowerLine, color=color(red,0))
fill(plotUpperDeviationLine, plotAverageMeanLine, color=color(blue,85))
fill(plotLowererDeviationLine, plotAverageMeanLine, color=color(red,85))


//
length = input(title="linear Length",  defval=40, minval=1)
multiplier = input(title="linear Deviation", type=float, defval=2, minval=1)
overbought = input(title="Overbought",  defval=1, minval=1)
oversold = input(title="Oversold",  defval=0, minval=1)
custom_timeframe = input(title="Use another Timeframe?", type=bool, defval=false)
highTimeFrame = input(title="Select The Timeframe",  defval="60")
res1 = custom_timeframe ? highTimeFrame : timeframe.period

fixedSL = input(title="SL Activation", defval=70)
trailSL = input(title="SL Trigger", defval=10)
fixedTP = input(title="TP Activation", defval=50)
trailTP = input(title="TP Trigger", defval=10)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2015)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2015)

start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

smabasis = linreg(close_price, length, 0)
stdev = stdev(close, length)
cierre = request.security(syminfo.tickerid, res1, close, false)
alta = request.security(syminfo.tickerid, res1, high, false)
baja = request.security(syminfo.tickerid, res1, low, false)
basis1 = request.security(syminfo.tickerid, res1, smabasis, false)
stdevb = request.security(syminfo.tickerid, res1, stdev, false)
dev = multiplier * stdevb // stdev(cierre, length)
upper = basis1 + dev
lower = basis1 - dev

bbr = (cierre - lower)/(upper - lower)

// plot(bbr)

// // MARCA LAS RESISTENCIAS
pintarojo = 0.0
pintarojo := nz(pintarojo[1])
pintarojo := bbr[1] > overbought and bbr < overbought ? alta[1] :  nz(pintarojo[1])
p = plot(pintarojo, color = red, style=circles, linewidth=2)

// // MARCA LOS SOPORTES
pintaverde = 0.0
pintaverde := nz(pintaverde[1])
pintaverde := bbr[1] < oversold and bbr > oversold ? baja[1] :  nz(pintaverde[1])
g = plot(pintaverde, color = black, style=circles, linewidth=2)
zz= crossover(pintaverde,pintaverde[1]) or crossunder(pintaverde,pintaverde[1])
kp= crossover(pintarojo,pintarojo[1]) or crossunder(pintarojo,pintarojo[1]) 
plotshape(zz,  title="buy", style=shape.triangleup,location=location.belowbar, color=green, transp=0, size=size.small)
plotshape(kp, title="sell", style=shape.triangledown,location=location.abovebar, color=red, transp=0, size=size.small)


strategy.entry("BUY", strategy.long, qty=10, oca_name="BUY",  when=zz and window())
strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)

strategy.entry("SELL", strategy.short, qty=10, oca_name="SELL",  when=kp and window())
strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=trailSL, trail_points=fixedTP)