Strategi Bollinger Bands Stop Loss Dinamik

Penulis:ChaoZhang, Tarikh: 2024-02-01 10:48:52
Tag:

img

Ringkasan

Strategi ini menggunakan rel atas dan bawah Bollinger Bands untuk melaksanakan stop loss dinamik. Ia pergi pendek apabila harga memecahkan melalui rel atas dan pergi panjang apabila harga memecahkan melalui rel bawah. dan ia menetapkan stop loss dinamik untuk mengesan pergerakan harga.

Prinsip

Inti strategi ini terletak pada rel atas dan bawah Bollinger Bands. rel tengah adalah purata bergerak n hari. rel atas adalah rel tengah + kPengecualian standard n hari. Rel bawah adalah rel tengah − kn hari deviasi standard. Apabila harga melantun dari rel bawah, pergi panjang. Apabila harga jatuh kembali dari rel atas, pergi pendek. Pada masa yang sama, strategi menetapkan titik stop loss dan secara dinamik menyesuaikannya semasa pergerakan harga untuk menetapkan titik mengambil keuntungan untuk melaksanakan kawalan risiko yang berhati-hati.

Kelebihan

  1. Menggunakan Bollinger Bands regresi yang kuat kepada ciri rel tengah untuk menangkap trend jangka sederhana dan panjang;
  2. Isyarat panjang dan pendek yang jelas, mudah dikendalikan;
  3. Tetapkan stop loss bergeser dinamik untuk memaksimumkan kunci keuntungan dan mengawal risiko;
  4. Parameter yang boleh diselaraskan untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.

Risiko dan Penyelesaian

  1. Bollinger Bands boleh menghasilkan beberapa isyarat panjang dan pendek semasa pasaran terikat julat, menyebabkan pengguna terperangkap dalam whipsaws.
  2. Tetapan parameter yang tidak betul boleh menyebabkan kadar kemenangan yang lebih rendah.

Arahan pengoptimuman

  1. Mengoptimumkan parameter purata bergerak untuk menyesuaikan dengan ciri produk;
  2. Tambah penapisan trend untuk mengelakkan pasaran terikat julat;
  3. Gabungkan dengan penunjuk lain sebagai keadaan penapisan untuk meningkatkan kestabilan strategi.

Kesimpulan

Strategi ini menggunakan atribut regresi Bollinger Bands bersama-sama dengan kehilangan berhenti bergerak dinamik untuk mendapatkan keuntungan trend jangka menengah dan panjang sambil mengawal risiko. Ini adalah strategi kuantitatif yang sangat beradaptasi dan stabil. Melalui pengoptimuman parameter dan pengoptimuman logik, ia boleh disesuaikan dengan lebih banyak produk dan memperoleh keuntungan yang stabil dalam perdagangan langsung.


/*backtest
start: 2024-01-24 00:00:00
end: 2024-01-31 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(shorttitle="BB Strategy", title="Bollinger Bands Strategy", overlay=true)
length = input.int(20, minval=1, group = "Bollinger Bands")
maType = input.string("SMA", "Basis MA Type", options = ["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group = "Bollinger Bands")
src = input(close, title="Source", group = "Bollinger Bands")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev", group = "Bollinger Bands")

ma(source, length, _type) =>
    switch _type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

basis = ma(src, length, maType)
dev = mult * ta.stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input.int(0, "Offset", minval = -500, maxval = 500, group = "Bollinger Bands")
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))

lo = input.bool(true, "Long", group = "Strategy")
sh = input.bool(true, "Short", group = "Strategy")
x = input.float(3.0, "Target Multiplier (X)", group = "Strategy", minval = 1.0, step = 0.1)
token = input.string(defval = "", title = "Token", group = "AUTOMATION")
Buy_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(1) + '"}'
Buy_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(2) + '"}'
Exit_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(-1) + '"}'
Exit_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(-2) + '"}'
Exit_PE_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(2.5) + '"}'
Exit_CE_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(1.5) + '"}'
long = high < lower
short = low > upper
var sl_b = 0.0
var tar_b = 0.0
var sl_s = 0.0
var tar_s = 0.0
var static_sl = 0.0
entry = strategy.opentrades.entry_price(strategy.opentrades - 1)
if long and lo and strategy.position_size == 0
    strategy.entry("Long", strategy.long, alert_message = Buy_CE, stop = high)
    strategy.exit("LX", "Long", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = low, alert_message = Exit_CE)
    sl_b := low
    tar_b := high + (math.abs(high - low) * x)
    static_sl := math.abs(low - high)
if short and sh and strategy.position_size == 0
    strategy.entry("Short", strategy.short, alert_message = Buy_PE, stop = low)
    strategy.exit("SX", "Short", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = high, alert_message = Exit_PE)
    sl_s := high
    tar_s := low - (math.abs(high - low) * x)
    static_sl := math.abs(high - low)
// if long and strategy.position_size < 0
//     strategy.entry("Long", strategy.long, alert_message = Exit_PE_CE, stop = high)
//     strategy.exit("LX", "Long", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = low, alert_message = Exit_CE)
//     sl_b := low
//     tar_b := high + (math.abs(high - low) * x)
// if short and strategy.position_size > 0
//     strategy.entry("Short", strategy.short, alert_message = Exit_CE_PE, stop = low)
//     strategy.exit("SX", "Short", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = high, alert_message = Exit_PE)
//     sl_s := math.max(high[1], high)
//     tar_s := low - (math.abs(high - low) * x)
if ta.change(dayofmonth) or (long[1] and not long[2])
    strategy.cancel("Long")
if ta.change(dayofmonth) or (short[1] and not short[2])
    strategy.cancel("Short")
var count = 1
if strategy.position_size != 0
    if strategy.position_size > 0
        if close > (entry + (static_sl * count))
            strategy.exit("LX", "Long", limit = tar_b, stop = sl_b, alert_message = Exit_CE)
            sl_b := entry + (static_sl * (count - 1))
            count += 1
            
    else
        if close < (entry - (static_sl * count))
            strategy.exit("SX", "Short", limit = tar_s, stop = sl_s, alert_message = Exit_PE)
            sl_s := entry - (static_sl * (count - 1))
            count += 1
// label.new(bar_index, high, str.tostring(static_sl))
if strategy.position_size == 0
    count := 1
plot(strategy.position_size > 0 ? sl_b : na, "", color.red, style = plot.style_linebr)
plot(strategy.position_size < 0 ? sl_s : na, "", color.red, style = plot.style_linebr)
plot(strategy.position_size > 0 ? tar_b : na, "", color.green, style = plot.style_linebr)
plot(strategy.position_size < 0 ? tar_s : na, "", color.green, style = plot.style_linebr)

Lebih lanjut