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

Автор:Чао Чжан, Дата: 2023-11-23 15:49:12
Тэги:

img

Обзор

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

Стратегия оценивает условия перекупки/перепродажи с помощью золотых/мертвых кроссоверов верхних/нижних полос Боллинджера для установления позиций. Площадь между полосами отражает текущий диапазон волатильности рынка. Полосы состоят из средних, верхних и нижних полос, где средняя полоса представляет собой простую скользящую среднюю за N дней, а верхние/нижние полосы представляют собой среднюю полосу +/- K стандартных отклонений.

Принципы

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

Эта стратегия объединяет сигналы перекупленности/перепроданности от полос Боллинджера для отслеживания тренда.

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

После выполнения ордеров, фиксированные процентные уровни стоп-лосса устанавливаются для управления рисками.

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

  1. Определить уровни перекупа/перепродажи с помощью полос Боллинджера для установки низких покупок-высоких продаж, судя по кроссоверу полос.

  2. Зафиксировать тенденции через свойство волатильности полос Боллинджера.

  3. Механизм стоп-лосса эффективно ограничивает максимальную потерю на одну сделку.

  4. Сочетание отслеживания тренда и стоп-лосса приводит к стабильным прибылям.

Риски и оптимизация

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

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

  3. Дополнительные фильтры с другими индикаторами могут улучшить точность сигнала.

  4. Различные параметры периода хранения могут быть проверены, например, объединение часовых или более коротких периодов для повышения частоты торговли и повышения эффективности использования капитала.

Заключение

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


/*backtest
start: 2023-11-15 00:00:00
end: 2023-11-22 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Bollinger Bands Strategy", overlay=false, shorttitle="BBS", pyramiding=0, currency=currency.USD, commission_type=strategy.commission.percent, commission_value=0.03, initial_capital=1000)
source = input(close, "Source")
length = input.int(20, minval=1)
mult = input.float(2.0, minval=0.001, maxval=50, step=0.001)
stopLossFactor = input.float(1, "Stop Loss Percent", maxval = 100, minval = 0, step=0.1)

basis = ta.sma(source, length)
dev = mult * ta.stdev(source, length)
upper = basis + dev
lower = basis - dev

var float lastTradePrice = na
var float stopLossLow = na
var float stopLossHigh = na
var bool currentIsLong = na

var bool nextExpectedIsLong = true

var bool existedLong = false
var bool existedShort = false

buyEntry = ta.crossover(source, lower)
sellEntry = ta.crossunder(source, upper)

if (buyEntry and nextExpectedIsLong == true)
	strategy.entry("BBandLE", strategy.long, comment="BBandLE")
	nextExpectedIsLong := false
	if(nz(strategy.position_size[1], 0) < 0) // new position detected
	    lastTradePrice := close
	    stopLossLow := lastTradePrice * (1 - (stopLossFactor / 100))
	    stopLossHigh := lastTradePrice * (1 + (stopLossFactor / 100))
else
    strategy.cancel("BBandLE")

if (sellEntry and nextExpectedIsLong == false)
	strategy.entry("BBandSE", strategy.short, comment="BBandSE")
	nextExpectedIsLong := true
	if(nz(strategy.position_size[1], 0) > 0) // new position detected
        lastTradePrice := close
        stopLossLow := lastTradePrice * (1 - (stopLossFactor / 100))
        stopLossHigh := lastTradePrice * (1 + (stopLossFactor / 100))
else
    strategy.cancel("BBandSE")

strategy.close("BBandLE", close < stopLossLow)
strategy.close("BBandSE", close > stopLossHigh)

// if(nz(strategy.position_size[1], 0) < 0 and close > stopLossHigh)
//     strategy.entry("BBandLE", strategy.long, comment="BBandLE")
// 	lastTradePrice := close
// 	stopLossLow := lastTradePrice * (1 - (stopLossFactor / 100))
// 	stopLossHigh := lastTradePrice * (1 + (stopLossFactor / 100))
// if(nz(strategy.position_size[1], 0) > 0 and close < stopLossLow)
//     strategy.exit("BBandSE", strategy.short, comment="BBandSE")
//     lastTradePrice := close
//     stopLossLow := lastTradePrice * (1 - (stopLossFactor / 100))
//     stopLossHigh := lastTradePrice * (1 + (stopLossFactor / 100))

plot(source, "close", color.blue)
plot(lower, "lower", color.red)
plot(upper, "upper", color.red)
plot(stopLossLow, "StopLossLow", color.black)
plot(stopLossHigh, "StopLossHigh", color.black)
plot(lastTradePrice, "lastTradePrice", color.green)
plotchar(strategy.position_size > 0, char="-", size=size.tiny, location=location.bottom, color=color.green)
plotchar(strategy.position_size < 0, char="-", size=size.tiny, location=location.bottom, color=color.red)




Больше