Стратегия обратного тренда полос Боллинджера

Автор:Чао Чжан, Дата: 2023-11-01 11:29:34
Тэги:

img

Обзор

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

Логика

В стратегии определены два сигнала входа:

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

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

Стоп-лосс использует фиксированный стоп-лосс. Уровень стоп-лосса устанавливается по цене входа плюс/минус соотношение риск/вознаграждение умножено на расстояние между ценой входа и уровнем получения прибыли.

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

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

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

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

  3. Фиксированный стоп-лосс облегчает управление рисками.

  4. Динамическая прибыль позволяет максимизировать прибыль.

Риски

  1. Стратегии прорыва могут остановить бегство.

  2. Частые стоп-лосы запускаются, когда рынок слишком неуравновешен.

  3. Фиксированный стоп-лосс не адаптируется к волатильности рынка.

  4. Плохая настройка параметров полос Боллинджера может привести к посредственным результатам.

Улучшение

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

  2. Внедрить адаптивную стоп-потерю, которая регулирует стоп-расстояние в зависимости от волатильности.

  3. Оптимизируйте параметры полос Боллинджера, чтобы найти лучшие комбинации параметров.

  4. Проверить различные периоды EMA для усиления эффекта поддержки/сопротивления EMA.

Резюме

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


/*backtest
start: 2023-10-24 00:00:00
end: 2023-10-31 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// Welcome to yet another script. This script was a lot easier since I was stuck for so long on the Donchian Channels one and learned so much from that one that I could use in this one
// This code should be a lot cleaner compared to the Donchian Channels, but we'll leave that up to the pro's
// This strategy has two entry signals, long = when price hits lower band, while above EMA, previous candle was bearish and current candle is bullish
// Short = when price hits upper band, while below EMA, previous candle was bullish and current candle is bearish
// Take profits are the opposite side's band(lower band for long signals, upper band for short signals). This means our take profit price will change per bar
// Our stop loss doesn't change, it's the difference between entry price and the take profit target divided by the input risk reward
// At the time of writing this, I could probably calculate that much easier by simply multiplying the opposite band by the input risk reward ratio
// Since I want to get this script out and working on the next one, I won't clean that up, I'm sorry
// strategy(shorttitle="BB Trending Reverse Strategy", title="Bollinger Bands Trending Reverse Strategy", overlay=true, default_qty_type = strategy.cash, default_qty_value = 150, initial_capital = 1000, currency = currency.USD, commission_type = "percent", commission_value = 0.036)

// The built-in Bollinger Band indicator inputs and variables, added some inputs of my own and organised the code
length              = input(20, minval=1)
src                 = input(close, title="Source")
mult                = input(2.0, minval=0.001, maxval=50, title="StdDev")
emaInput            = input(title = "EMA Input", type = input.integer, defval = 200, minval = 10, maxval = 400, step = 1)
riskreward          = input(title = "Risk/Reward Ratio", type = input.float, defval = 1.50, minval = 0.01, maxval = 100, step = 0.01)
offset              = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
basis               = sma(src, length)
dev                 = mult * stdev(src, length)
upper               = basis + dev
lower               = basis - dev
ema                 = ema(close, emaInput)

// These are our conditions as explained above
entryLong           = low[1] <= lower[1] and low <= lower and low > ema
entryShort          = high[1] >= upper[1] and high >= upper and high < ema
reversecandleLong   = close > open and close[1] < open[1]
reversecandleShort  = close < open and close[1] > open[1]
var stopLong        = 0.0
var stopShort       = 0.0

// These are our entry signals, notice how the stop condition is within the if statement while the strategy.exit is outside of the if statement, this way the take profit targets trails up or down depending on what the price does
if reversecandleLong and entryLong and strategy.position_size == 0
    stopLong := (((close / upper - 1) * riskreward + 1) * close)
    strategy.entry("Long Entry", strategy.long, comment = "Long Entry")
    
strategy.exit("Exit Long", "Long Entry", limit = upper, stop = stopLong, comment = "Exit Long")

if reversecandleShort and entryShort and strategy.position_size == 0
    stopShort := (((close / lower - 1) / riskreward + 1) * close)
    strategy.entry("Short Entry", strategy.short, comment = "Short Entry")

strategy.exit("Exit Short", "Short Entry", limit = lower, stop = stopShort, comment = "Exit Short")


// The built-in Bollinger Band plots
plot(basis, "Basis", color=#872323, offset = offset)
p1 = plot(upper, "Upper", color=color.teal, offset = offset)
p2 = plot(lower, "Lower", color=color.teal, offset = offset)
fill(p1, p2, title = "Background", color=#198787, transp=95)
plot(ema, color=color.red)

// These plots are to check the stoplosses, they can  make a mess of your chart so only use these if you want to make sure these work
// plot(stopLong)
// plot(stopShort)

Больше