Chiến lược củng cố Bollinger Bands

Tác giả:ChaoZhang, Ngày: 2024-02-22 13:43:14
Tags:

img

Tổng quan

Chiến lược củng cố Bollinger Bands là một chiến lược đột phá xác định các giai đoạn củng cố biến động thấp bằng cách sử dụng Bollinger Bands. Khi thị trường bước vào một giai đoạn dao động, Bollinger Bands sẽ hội tụ, báo hiệu cơ hội tham gia thị trường. Chúng tôi cũng kết hợp chỉ số Average True Range để xác nhận sự giảm biến động.

Chiến lược logic

Chiến lược này dựa chủ yếu trên các dải Bollinger để phát hiện khi nào giá vào giai đoạn củng cố biến động thấp. Dải giữa của dải Bollinger là một đường trung bình động của giá đóng cửa. Dải trên và dưới được bù đắp bằng hai độ lệch chuẩn trên và dưới dải giữa. Khi biến động giảm, khoảng cách giữa dải trên và dưới thu hẹp đáng kể. Chúng tôi kiểm tra trước tiên xem giá trị ATR hiện tại có nhỏ hơn so với độ lệch chuẩn giữa các dải Bollinger để xác nhận sơ bộ sự hội tụ. Điều này báo hiệu giá vừa bước vào sự hợp nhất.

Để chứng minh thêm sự giảm biến động, chúng ta kiểm tra xem trung bình động của giá trị ATR có xu hướng giảm hay không. Sự giảm của trung bình ATR cũng xác nhận từ phía rằng biến động đang giảm. Khi cả hai điều kiện được đáp ứng đồng thời, chúng ta xác định Bollinger Bands đã cho thấy sự hội tụ đáng kể, đó là một cơ hội mua hàng tuyệt vời.

Sau khi mua vào, chúng tôi cho phép một chiến lược dừng lỗ di chuyển với một khoảng cách dừng lỗ gấp đôi giá trị ATR. Điều này có hiệu quả kiểm soát tổn thất.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là nó có thể xác định chính xác khi nào thị trường bước vào giai đoạn củng cố biến động thấp và xác định cơ hội mua tốt nhất.

Ngoài ra, chiến lược này cũng sử dụng lệnh dừng lỗ để kiểm soát rủi ro một cách tích cực. Điều này tối đa hóa việc giảm lỗ ngay cả khi tâm lý thị trường không thuận lợi. Nhiều chiến lược dài hạn thiếu điều này.

Phân tích rủi ro

Rủi ro chính của chiến lược này là chỉ số Bollinger Bands không thể xác định chính xác những thay đổi về biến động giá 100% thời gian. Khi Bollinger Bands đánh giá sai rằng biến động đã giảm, thời gian vào của chúng ta có thể không thuận lợi. Tại thời điểm này, stop loss di chuyển đóng một vai trò quan trọng và có thể thoát khỏi giao dịch càng sớm càng tốt.

Ngoài ra, việc thiết lập các tham số khác nhau trong chiến lược cũng sẽ ảnh hưởng đến kết quả.

Hướng dẫn tối ưu hóa

Chúng ta có thể xem xét thêm các chỉ số khác để xác nhận các dấu hiệu chuyển hướng trên các chỉ số xu hướng khi Bollinger Bands hội tụ. Ví dụ, khi Bollinger Bands hội tụ, chúng ta cũng yêu cầu rằng chênh lệch MACD đã chuyển từ dương thành âm, hoặc RSI đã rút khỏi vùng mua quá mức. Điều này có thể cải thiện thêm độ chính xác của các tín hiệu mua.

Một hướng khác là kiểm tra tác động của các thiết lập tham số khác nhau đối với kết quả, chẳng hạn như thời gian của Bollinger Bands, ATR và nhân stop loss di chuyển.

Kết luận

Chiến lược củng cố Bollinger Bands sử dụng Bollinger Bands để xác định thời gian giảm biến động giá và sử dụng stop loss di chuyển để kiểm soát rủi ro hiệu quả. Đây là một chiến lược phá vỡ tương đối ổn định dài hạn. Chúng ta vẫn cần tối ưu hóa thêm các tham số và kết hợp các chỉ số khác để tăng cường độ bền của chiến lược.


/*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
                

Thêm nữa