Strategi Perdagangan Persentase Bollinger Bands


Tanggal Pembuatan: 2023-12-11 11:14:53 Akhirnya memodifikasi: 2023-12-11 11:14:53
menyalin: 0 Jumlah klik: 750
1
fokus pada
1621
Pengikut

Strategi Perdagangan Persentase Bollinger Bands

Ringkasan

Strategi ini didasarkan pada indikator Bollinger Bands, digabungkan dengan Moving Average dan ATR Technical Indicators, untuk mewujudkan sistem breakout dengan periode pendek. Strategi ini menghasilkan sinyal perdagangan dengan menghitung persentase posisi relatif harga dalam saluran Bollinger Bands untuk menilai kondisi harga overbought dan oversold, digabungkan dengan breakout baru pada titik tinggi dan rendah.

Prinsip Strategi

  1. Perhitungan Brin Belt dan persentase harga dalam Brin Belt
  2. Rata-rata bergerak dihitung untuk harga buka, tutup, tertinggi dan terendah
  3. Menghitung indikator ATR dan menetapkan stop loss line digabungkan dengan ATR
  4. Menentukan apakah harga berada di dekat titik tinggi atau rendah baru
  5. Perbandingan harga tertinggi dan terendah tahun ini untuk menilai tingkat besar.
  6. Apakah sinyal perdagangan dikirim melalui perubahan persentase Brin dan kenaikan dan penurunan baru

Strategi ini menggunakan Bollinger Bands untuk menentukan volatilitas pasar, dengan lebar Bollinger Bands ditentukan melalui standar deviasi. Harga adalah titik beli ketika harga dari Bollinger Bands turun dan harga adalah titik jual ketika harga dari Bollinger Bands naik. Rata-rata bergerak dapat meratakan pergerakan Bollinger Bands, mengurangi false breakout. Indikator ATR digabungkan dengan Stop Loss Line yang bergerak, dengan stop loss tetap.

Keunggulan Strategis

  1. Penghakiman Brin Beltway yang ketat dapat mengurangi sinyal palsu
  2. Moving Average untuk Meluruskan Harga dan Mengidentifikasi Tren Nyata
  3. ATR Indeks Dinamis Mengikuti Stop Loss, Membatasi Kerugian Tunggal
  4. Penghitungan tinggi baru dan rendah baru dan rendah tahunan, membuat sinyal lebih dapat diandalkan
  5. Mengintegrasikan berbagai indikator teknis untuk meningkatkan efektivitas strategi

Risiko Strategis dan Solusi

  1. Setting parameter Brin Beltway yang tidak tepat dapat menyebabkan terlalu banyak false breaks, dan kombinasi parameter yang berbeda harus diuji untuk hasil yang optimal
  2. Harga penutupan sebagai garis dasar mungkin terjadi penarikan balik melebihi stop loss yang ditetapkan ATR, dapat dipertimbangkan untuk menghitung persentase harga tertinggi dan terendah dengan menggunakan gelombang yang lebih besar
  3. Blink yang ketat dengan filter mungkin akan kehilangan peluang tren pada garis yang lebih panjang, dengan kondisi filter yang lebih longgar dan waktu memegang posisi yang lebih longgar
  4. Indikator ATR lebih lambat untuk melacak fluktuasi harga yang besar, dan indikator fluktuasi frekuensi yang lebih tinggi seperti real amplitude harus dipertimbangkan
  5. Penembusan baru yang tinggi dan baru yang rendah rentan terhadap gangguan dari kebisingan jangka pendek, yang harus dievaluasi secara signifikan dan berkelanjutan

Arah optimasi strategi

  1. Pengujian kombinasi parameter yang berbeda untuk menentukan parameter terbaik dan panjang rata-rata bergerak
  2. Menggunakan kombinasi model yang menggabungkan parameter Brin band yang berbeda atau sinyal penghakiman moving average
  3. Uji kesesuaian parameter untuk periode waktu yang berbeda dan varietas yang berbeda, meningkatkan stasionalitas
  4. Kombinasi dengan lebih banyak kriteria skala besar, seperti sinyal pita Brin pada skala solar atau faktor musiman
  5. Evaluasi peluang mengikuti tren untuk memperluas jangkauan strategi dan ruang untuk keuntungan

Meringkaskan

Strategi ini menggabungkan beberapa alat teknis, seperti persentase Brin-band, moving average, indikator ATR, new highs, new lows, dan highs and lows tahunan, untuk membangun strategi perdagangan terobosan yang relatif ketat dan efisien dalam jangka pendek. Kelebihannya yang menonjol adalah memanfaatkan berbagai macam alat untuk mengurangi kebisingan dan mengidentifikasi sinyal tren yang sebenarnya. Tentu saja, strategi ini juga memiliki beberapa parameter yang menentukan kesulitan dan kemungkinan kehilangan peluang di bawah kondisi yang ketat.

Kode Sumber Strategi
/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Bollinger %B Candles Strategy", overlay=false, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

BBLength = input(100, minval=1, step=1)
StdDev = 10
useMovingAverage = input(true)
MAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
lookbackPeriod = input(22, minval=10, step=10)
colorByPreviousClose = input(true)

AtrMAType = input(title="Moving Average Type", defval="hma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
AtrLength = input(10)
AtrMult = input(4)
wicks = input(false)

considerYearlyHighLow = input(false)
considerNewLongTermHighLows = input(false)
shortHighLowPeriod = 100
longHighLowPeriod = 200
tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])

backtestYears = input(10, minval=1, step=1)


//////////////////////////////////// Calculate new high low condition //////////////////////////////////////////////////
f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)=>
    newHigh = highest(shortHighLowPeriod) == highest(longHighLowPeriod) or not considerNewLongTermHighLows
    newLow = lowest(shortHighLowPeriod) == lowest(longHighLowPeriod) or not considerNewLongTermHighLows
    [newHigh,newLow]

//////////////////////////////////// Calculate Yearly High Low //////////////////////////////////////////////////
f_getYearlyHighLowCondition(considerYearlyHighLow)=>
    yhigh = security(syminfo.tickerid, '12M', high[1]) 
    ylow = security(syminfo.tickerid, '12M', low[1]) 
    yhighlast = yhigh[365]
    ylowlast = ylow[365]
    yhighllast = yhigh[2 * 365]
    ylowllast = ylow[2 * 365]
    
    yearlyTrendUp = na(yhigh)? true : na(yhighlast)? close > yhigh : na(yhighllast)? close > max(yhigh,yhighlast) : close > max(yhigh, min(yhighlast, yhighllast))
    yearlyHighCondition = (  (na(yhigh) or na(yhighlast) ? true : (yhigh > yhighlast) ) and ( na(yhigh) or na(yhighllast) ? true : (yhigh > yhighllast))) or yearlyTrendUp or not considerYearlyHighLow
    yearlyTrendDown = na(ylow)? true : na(ylowlast)? close < ylow : na(ylowllast)? close < min(ylow,ylowlast) : close < min(ylow, max(ylowlast, ylowllast))
    yearlyLowCondition = (  (na(ylow) or na(ylowlast) ? true : (ylow < ylowlast) ) and ( na(ylow) or na(ylowllast) ? true : (ylow < ylowllast))) or yearlyTrendDown or not considerYearlyHighLow
    
    label_x = time+(60*60*24*1000*1)
    [yearlyHighCondition,yearlyLowCondition]

f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

inDateRange = true
[yearlyHighCondition,yearlyLowCondition] = f_getYearlyHighLowCondition(considerYearlyHighLow)
[newHighS,newLowS] = f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)
[middleclose, upperclose, lowerclose] = bb(close, BBLength, StdDev)
[middleopen, upperopen, loweropen] = bb(open, BBLength, StdDev)
[middlehigh, upperhigh, lowerhigh] = bb(high, BBLength, StdDev)
[middlelow, upperlow, lowerlow] = bb(low, BBLength, StdDev)

percentBClose = (close - lowerclose)*100/(upperclose-lowerclose)
percentBOpen = (open - loweropen)*100/(upperopen-loweropen)
percentBHigh = (high - lowerhigh)*100/(upperhigh-lowerhigh)
percentBLow = (low - lowerlow)*100/(upperlow-lowerlow)

percentBMAClose = f_getMovingAverage(percentBClose, MAType, lookbackPeriod)
percentBMAOpen = f_getMovingAverage(percentBOpen, MAType, lookbackPeriod)
percentBMAHigh = f_getMovingAverage(percentBHigh, MAType, lookbackPeriod)
percentBMALow = f_getMovingAverage(percentBLow, MAType, lookbackPeriod)

newOpen = useMovingAverage? percentBMAOpen : percentBOpen
newClose = useMovingAverage? percentBMAClose : percentBClose
newHigh = useMovingAverage? percentBMAHigh : percentBHigh
newLow = useMovingAverage? percentBMALow : percentBLow

truerange = max(newHigh, newClose[1]) - min(newLow, newClose[1])

averagetruerange = f_getMovingAverage(truerange, AtrMAType, AtrLength)
atr = averagetruerange * AtrMult

longStop = newClose - atr
longStopPrev = nz(longStop[1], longStop)
longStop := (wicks ? newLow[1] : newClose[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = newClose + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := (wicks ? newHigh[1] : newClose[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and (wicks ? newHigh : newClose) > shortStopPrev ? 1 : dir == 1 and (wicks ? newLow : newClose) < longStopPrev ? -1 : dir

trailingStop = dir == 1? longStop : shortStop

candleColor = colorByPreviousClose ?
                 (newClose[1] < newClose ? color.green : newClose[1] > newClose ? color.red : color.silver) : 
                 (newOpen < newClose ? color.green : newOpen > newClose ? color.red : color.silver)
plotcandle(newOpen, newHigh, newLow, newClose, title='PercentBCandle', color = candleColor, wickcolor=candleColor)
plot(trailingStop, title="TrailingStop", style=plot.style_linebr, linewidth=1, color= dir == 1 ? color.green : color.red)

buyCondition = dir==1 and yearlyHighCondition and newHighS
exitBuyCondition = dir == -1
sellCondition = dir == -1 and yearlyLowCondition and newLowS
exitSellCondition = dir == 1
strategy.risk.allow_entry_in(tradeDirection)

barcolor(buyCondition? color.lime : sellCondition ? color.orange : color.silver)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=exitBuyCondition)

strategy.entry("Sell", strategy.short, when=sellCondition and inDateRange, oca_name="oca_sell")
strategy.close("Sell", when=exitSellCondition)