Стратегия волны Боллинджера

Автор:Чао Чжан, Дата: 2024-01-15 15:16:27
Тэги:

img

Обзор

Стратегия волны Боллинджера - это количественная стратегия торговли, которая сочетает в себе полосы Боллинджера и скользящие средние значения.

Логика стратегии

Стратегия сначала рассчитывает экспоненциальную скользящую среднюю (EMA) за определенный период в качестве базовой линии. Верхняя полоса (EMA + n раз стандартное отклонение) и нижняя полоса (EMA - n раз стандартное отклонение) затем рассчитываются на основе этой EMA. Перерыв выше верхней полосы указывает на сигнал перекупления, в то время как перерыв ниже нижней полосы указывает на сигнал перепродажи.

Кроме того, стратегия сочетает в себе другие индикаторы, такие как RSI, для фильтрации торговых сигналов и снижения частоты торговли, чтобы минимизировать ненужные потери.

В частности, правила торгового сигнала:

  1. Длинный сигнал: Close > Upper band и RSI ((14) > 60
  2. Короткий сигнал: Close < Нижняя полоса и RSI ((14) < 40

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

Преимущества

Стратегия сочетает в себе определение тренда и суждение о перекупе/перепродаже, чтобы избежать неправильных сделок на рынках с ограниченным диапазоном.

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

Кроме того, двойное подтверждение от RSI и других индикаторов помогает отфильтровать некоторые ложные сигналы и избежать неправильных сделок вокруг поворотных точек тренда.

Анализ рисков

Основными рисками этой стратегии являются:

  1. Риск оптимизации параметров. Если параметры скользящей средней или стандартного отклонения установлены ненадлежащим образом, это может привести к более шумным сделкам или упущенным торговым возможностям. Эти параметры нуждаются в итеративном тестировании и оптимизации.

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

  3. Риск высокой частоты торговли. Если диапазоны имеют очень узкие разрывы, это может увеличить количество сделок и оплаченные комиссии, что влияет на конечную прибыльность. Это может быть смягчено умеренным увеличением периода скользящей средней.

Руководство по оптимизации

Существует возможность дальнейшей оптимизации стратегии:

  1. Использование последующего стоп-лосса или временного стоп-лосса помогает реализовать потери во времени и контролировать сумму потерь на одной сделке.

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

  3. Комбинировать с другими индикаторами для фильтрации сигналов. Подобные индикаторы, как KDJ и MACD, могут служить вспомогательными инструментами для оценки. Это помогает еще больше улучшить прибыльность стратегии.

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

Заключение

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


/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@FiboBuLL

strategy(shorttitle='FB Wave', title='FiboBuLL Wave', overlay=true, pyramiding=1, currency=currency.NONE, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

src = input(close, title='Source')
length = input.int(55, minval=1, title='EMA length')  // 20 for classis Bollinger Bands SMA line (basis)


mult = input.float(1., minval=0.236, maxval=2, title='Standard Deviation')  //2 for Classic Bollinger Bands //Maxval = 2 as higher the deviation, higher the risk
basis = ta.sma(src, length)
dev = mult * ta.stdev(src, length)

Show = input.string('Both', options=['Longs Only', 'Shorts Only', 'Both'], title='Trade Type')
CC = input(true, 'Color Bars')

upper = basis + dev
lower = basis - dev

//Conditions for Long and Short - Extra filter condition can be used such as RSI or CCI etc.

short = src < lower  // and rsi(close,14)<40
long = src > upper  // and rsi(close,14)>60

L1 = ta.barssince(long)
S1 = ta.barssince(short)

longSignal = L1 < S1 and not (L1 < S1)[1]
shortSignal = S1 < L1 and not (S1 < L1)[1]

//Plots and Fills


////Long/Short shapes with text
// plotshape(S1<L1 and not (S1<L1)[1]?close:na, text = "sᴇʟʟ", textcolor=#ff0100, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "SELL", editable = true)
// plotshape(L1<S1 and not (L1<S1)[1]?close:na, text = "ʙᴜʏ", textcolor = #008000, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "BUY", editable = true)  

// plotshape(shortSignal?close:na, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "Short Signal", editable = true)
// plotshape(longSignal?close:na, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "Long Signal", editable = true)  


p1 = plot(upper, color=color.new(#ff0000, 75), display=display.all, title='Upper Band')
p2 = plot(lower, color=color.new(#008000, 75), display=display.all, title='Lower Band')

p = plot(basis, color=L1 < S1 ? #008000 : S1 < L1 ? #ff0000 : na, linewidth=2, editable=false, title='Basis')

fill(p, p1, color=color.new(color.teal, 85), title='Top Fill')  //fill for basis-upper
fill(p, p2, color=color.rgb(217, 161, 161), title='Bottom Fill', transp=85)  //fill for basis-lower

//Barcolor

bcol = src > upper ? color.new(#8ceb07, 0) : src < lower ? color.new(#ff0000, 0) : src > basis ? color.green : src < basis ? color.red : na

barcolor(CC ? bcol : na, editable=false, title='Color Bars')


// //Alerts ----  // Use 'Once per bar close'

// alertcondition(condition=longSignal, title="Long - BB Filter", message='BB Filter Long @ {{close}}') // Use 'Once per bar close'
// alertcondition(condition=shortSignal, title="Short - BB Filter", message='BB Filter Short @ {{close}}')  // Use 'Once per bar close'

Notestart1 = input(true, '╔═══ Time Range to BackTest ═══╗')

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

// === FUNCTION EXAMPLE === 
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

if window() and (Show == 'Longs Only' or Show == 'Both')
    strategy.entry('AL', direction=strategy.long, when=longSignal)
    strategy.close('LongAL', when=shortSignal, comment='AL KAPA')

if window() and (Show == 'Shorts Only' or Show == 'Both')
    strategy.entry('SAT', direction=strategy.short, when=shortSignal)
    strategy.close('SAT', when=longSignal, comment='SAT KAPA')














Больше