Стратегия консолидации Bollinger Bands

Автор:Чао Чжан, Дата: 2024-02-22 13:43:14
Тэги:

img

Обзор

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

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

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

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

После покупки мы включим движущуюся стратегию стоп-лосса с расстоянием стоп-лосса в два раза больше значения ATR. Это эффективно контролирует потери.

Анализ преимуществ

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

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

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

Основной риск стратегии заключается в том, что индикатор Bollinger Bands не может точно определить изменения волатильности цены 100% времени. Когда Bollinger Bands ошибочно оценивает, что волатильность снизилась, наше время входа может быть неблагоприятным. В этот момент движущийся стоп-лосс играет важную роль и может выйти из торговли как можно раньше.

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

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

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

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

Заключение

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


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © DojiEmoji

//@version=4
strategy("[KL] Bollinger Bands Consolidation Strategy",overlay=true,pyramiding=1)

// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2016 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("19 Apr 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }

// Indicator: BOLL bands {
BOLL_length = 20//input(20,title="Periods to lookback for BOLL and ATR calc. (default 20)")
BOLL_src = close
BOLL_center = sma(BOLL_src, BOLL_length)
BOLL_sDEV_x2 = 2 * stdev(BOLL_src, BOLL_length)
BOLL_upper = BOLL_center + BOLL_sDEV_x2
BOLL_lower = BOLL_center - BOLL_sDEV_x2
plot(BOLL_center, "Basis", color=#872323, offset = 0)
BOLL_p1 = plot(BOLL_upper, "Upper", color=color.navy, offset = 0, transp=50)
BOLL_p2 = plot(BOLL_lower, "Lower", color=color.navy, offset = 0, transp=50)
fill(BOLL_p1, BOLL_p2, title = "Background", color=#198787, transp=85)
// }
// ATR and volatility Indicator {
ATR_x2 = atr(BOLL_length) * 2 // multiplier aligns with BOLL
avg_volat = sma(ATR_x2, BOLL_length)
//}

// Trailing stop loss {
var entry_price = float(0)
var trailing_SL_buffer = float(0)
var stop_loss_price = float(0)
trail_profit_line_color = color.green
UPDATE_ATR_TSL = false
if strategy.position_size == 0 or not within_timeframe // make TSL line less visible
    trail_profit_line_color := color.black
    stop_loss_price := close - trailing_SL_buffer
else if strategy.position_size > 0
    if UPDATE_ATR_TSL and ATR_x2 < trailing_SL_buffer
        trailing_SL_buffer := ATR_x2
    stop_loss_price := max(stop_loss_price, close[1] - trailing_SL_buffer)
plot(stop_loss_price,color=trail_profit_line_color)
// }


IGNORE_BOLL_SHAPE = false//input(false,title="Ignore BOLL (vs ATR) during entry (experimental)")
IGNORE_VOLATILITY = false///input(false,title="Ignore average ATR during entry (experimental)")
// Main:
if within_timeframe
    // ENTRY:
    if (ATR_x2 > BOLL_sDEV_x2 or IGNORE_BOLL_SHAPE) and (avg_volat < avg_volat[1] or IGNORE_VOLATILITY)
        if strategy.position_size == 0
            entry_price := close
            trailing_SL_buffer := ATR_x2
            stop_loss_price := close - ATR_x2
            strategy.entry("Long",strategy.long, comment="enter")
        if strategy.position_size > 0
            strategy.entry("Long",strategy.long, comment="+")

    // EXIT:
    if strategy.position_size > 0
        if low <= stop_loss_price
            if close > entry_price
                strategy.close("Long", comment="take profit")
            else if low <= entry_price
                strategy.close("Long", comment="stop loss")
    
            if strategy.position_size == 0
                entry_price := 0
                

Больше