Strategi Konsolidasi Bollinger Bands

Penulis:ChaoZhang, Tarikh: 2024-02-22 13:43:14
Tag:

img

Ringkasan

Strategi penyatuan Bollinger Bands adalah strategi terobosan yang mengenal pasti fasa penyatuan turun naik rendah menggunakan Bollinger Bands. Apabila pasaran memasuki tempoh julat, Bollinger Bands akan konvergen, menandakan peluang untuk memasuki pasaran.

Logika Strategi

Strategi ini bergantung terutamanya pada Bollinger Bands untuk mengesan apabila harga memasuki fasa penyatuan turun naik yang rendah. Band tengah Bollinger Bands adalah purata bergerak harga penutupan. Band atas dan bawah diimbangi oleh dua penyimpangan standard di atas dan di bawah band tengah. Apabila turun naik menurun, jarak antara band atas dan bawah menyempitkan dengan ketara.

Untuk membuktikan penurunan turun naik, kita memeriksa sama ada purata bergerak nilai ATR mempunyai trend menurun. Penurunan purata ATR juga mengesahkan dari sisi bahawa turun naik menurun. Apabila kedua-dua syarat dipenuhi secara serentak, kita menentukan Bollinger Bands telah menunjukkan konvergensi yang ketara, yang merupakan peluang pembelian yang sangat baik.

Selepas membeli, kita membolehkan strategi stop loss bergerak dengan jarak stop loss dua kali ganda nilai ATR. Ini berkesan mengawal kerugian.

Analisis Kelebihan

Kelebihan terbesar strategi ini adalah bahawa ia dapat menentukan dengan tepat apabila pasaran memasuki fasa penyatuan turun naik yang rendah dan mengenal pasti peluang pembelian terbaik.

Di samping itu, strategi ini juga menggunakan stop loss bergerak untuk mengawal risiko secara aktif. Ini memaksimumkan pengurangan kerugian walaupun sentimen pasaran tidak menguntungkan.

Analisis Risiko

Risiko utama strategi ini adalah bahawa penunjuk Bollinger Bands tidak dapat menentukan perubahan dalam turun naik harga dengan tepat 100% dari masa ke masa. Apabila Bollinger Bands salah menilai bahawa turun naik telah berkurangan, masa kemasukan kita mungkin tidak menguntungkan. Pada ketika ini, stop loss bergerak memainkan peranan penting dan boleh keluar dari perdagangan seawal mungkin.

Di samping itu, penetapan pelbagai parameter dalam strategi juga akan mempengaruhi hasil.

Arahan pengoptimuman

Kami boleh mempertimbangkan penambahan penunjuk lain untuk mengesahkan tanda-tanda perubahan pada penunjuk trend apabila Bollinger Bands konvergen. Sebagai contoh, apabila Bollinger Bands konvergen, kami juga memerlukan bahawa perbezaan MACD telah berubah dari positif menjadi negatif, atau RSI telah menarik diri dari zon overbought. Ini dapat meningkatkan lebih lanjut ketepatan isyarat pembelian.

Arahan lain adalah untuk menguji kesan tetapan parameter yang berbeza pada hasil, seperti tempoh Bollinger Bands, ATR dan pengganda stop loss bergerak.

Kesimpulan

Strategi penyatuan Bollinger Bands menggunakan Bollinger Bands untuk menentukan masa turunnya turun naik harga dan menggunakan stop loss bergerak untuk mengawal risiko dengan berkesan. Ini adalah strategi breakout jangka panjang yang agak stabil.


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

Lebih lanjut