Strategi Stop Loss Bollinger Bands yang Dinamis

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

img

Gambaran umum

Strategi ini menggunakan rel atas dan bawah Bollinger Bands untuk menerapkan stop loss dinamis. Ini akan pendek ketika harga melanggar rel atas dan akan panjang ketika harga melanggar rel bawah. Dan menetapkan stop loss dinamis untuk melacak pergerakan harga.

Prinsip

Inti dari strategi ini terletak pada rel atas dan bawah Bollinger Bands. rel tengah adalah rata-rata bergerak n hari. rel atas adalah rel tengah + kdeviasi standar n hari. rel bawah adalah rel tengah − kn-day standard deviation. Ketika harga bangkit dari rel bawah, pergi panjang. Ketika harga jatuh kembali dari rel atas, pergi pendek. Pada saat yang sama, strategi menetapkan titik stop loss dan secara dinamis menyesuaikannya selama pergerakan harga untuk menetapkan titik mengambil keuntungan untuk menerapkan kontrol risiko yang bijaksana.

Keuntungan

  1. Menggunakan Bollinger Bands regresi yang kuat ke karakteristik rel tengah untuk menangkap tren jangka menengah dan panjang;
  2. Sinyal panjang dan pendek yang jelas, mudah dioperasikan;
  3. Atur stop loss geser dinamis untuk memaksimalkan penguncian keuntungan dan mengendalikan risiko;
  4. Parameter yang dapat disesuaikan untuk menyesuaikan diri dengan kondisi pasar yang berbeda.

Risiko dan Solusi

  1. Bollinger Bands dapat menghasilkan beberapa sinyal panjang dan pendek selama pasar yang terikat rentang, menyebabkan pengguna terjebak dalam whipsaws.
  2. Pengaturan parameter yang tidak tepat dapat menyebabkan tingkat kemenangan yang lebih rendah. Solusinya adalah dengan memoptimalkan parameter untuk produk yang berbeda.

Arahan Optimasi

  1. Mengoptimalkan parameter rata-rata bergerak untuk menyesuaikan dengan karakteristik produk;
  2. Tambahkan penyaringan tren untuk menghindari pasar yang terikat jangkauan;
  3. Gabungkan dengan indikator lain sebagai kondisi penyaringan untuk meningkatkan stabilitas strategi.

Kesimpulan

Strategi ini memanfaatkan atribut regresi Bollinger Bands bersama dengan stop loss geser dinamis untuk mendapatkan keuntungan tren jangka menengah dan panjang sambil mengendalikan risiko. Ini adalah strategi kuantitatif yang sangat fleksibel dan stabil. Melalui optimasi parameter dan optimasi logika, dapat disesuaikan dengan lebih banyak produk dan mendapatkan 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 banyak