Strategi Dagangan Peratusan Bollinger Bands


Tarikh penciptaan: 2023-12-11 11:14:53 Akhirnya diubah suai: 2023-12-11 11:14:53
Salin: 0 Bilangan klik: 750
1
fokus pada
1621
Pengikut

Strategi Dagangan Peratusan Bollinger Bands

Gambaran keseluruhan

Strategi ini adalah berdasarkan pada indikator Brin Belt, digabungkan dengan purata bergerak dan indikator teknikal ATR, untuk mewujudkan sistem penembusan jangka pendek. Strategi ini menghasilkan isyarat dagangan dengan mengira peratusan kedudukan relatif harga dalam saluran Brin Belt untuk menilai keadaan harga yang terlalu tinggi dan terlalu tinggi, digabungkan dengan penembusan baru untuk titik tinggi dan rendah.

Prinsip Strategi

  1. Mengira peratusan kedudukan harga di dalam saluran dan laluan Brin
  2. Rata-rata bergerak dihitung untuk harga pembukaan, harga penutupan, harga tertinggi, dan harga terendah
  3. Mengira indikator ATR dan menetapkan garis hentikan ATR
  4. Menentukan sama ada harga berada di kedudukan tinggi atau rendah baru
  5. Perbandingan harga tertinggi dan terendah bagi tahun ini
  6. Menerusi perubahan peratusan Brin dan penilaian apakah isyarat dagangan akan keluar

Strategi ini menggunakan Bollinger Bands untuk menentukan kadar turun naik pasaran, lebar Bollinger Bands ditentukan melalui standard deviasi. Harga adalah titik beli apabila harga dari Bollinger Bands turun, harga adalah titik jual apabila harga dari Bollinger Bands naik.

Kelebihan Strategik

  1. Penghakiman yang ketat terhadap penembusan Brin Belt dapat mengurangkan isyarat palsu
  2. Rata-rata bergerak untuk meluruskan harga dan mengenal pasti trend sebenar
  3. Penunjuk ATR Dinamik Mengesan Hentikan Kerugian, Mengehadkan Kerugian Tunggal
  4. Penghakiman tinggi baru dan rendah baru dan rendah tahunan menjadikan isyarat lebih dipercayai
  5. Menggabungkan pelbagai petunjuk teknologi untuk meningkatkan kecekapan strategi

Risiko strategi dan penyelesaian

  1. Tidak betul menetapkan parameter laluan tali pinggang Brin boleh menyebabkan terlalu banyak penembusan palsu, kombinasi parameter yang berbeza harus diuji untuk hasil yang terbaik
  2. Harga penutupan boleh menjadi garis dasar untuk penarikan balik melebihi stop loss yang ditetapkan oleh ATR, peratusan untuk mengira harga tertinggi dan terendah yang boleh dipertimbangkan dengan menggunakan gelombang yang lebih besar
  3. Brin yang ketat dengan penyaringan mungkin terlepas peluang trend pada garis yang lebih panjang, dengan syarat penyaringan dan tempoh memegang yang lebih longgar
  4. Indikator ATR lebih lambat untuk mengesan turun naik harga yang besar, dan lebih kerap indikator turun naik seperti gelombang sebenar dan lain-lain harus dipertimbangkan
  5. Penembusan tinggi dan rendah baru mudah terganggu oleh kebisingan jangka pendek, ketara statistik dan kemampanan trend harus dinilai

Arah pengoptimuman strategi

  1. Uji kombinasi parameter yang berbeza untuk menentukan parameter terbaik dan purata bergerak
  2. Menggunakan kombinasi model yang menggabungkan parameter Brin yang berbeza atau isyarat penghakiman purata bergerak
  3. Uji kesesuaian parameter untuk tempoh masa yang berbeza dan varieti yang berbeza untuk meningkatkan stamina
  4. Menggabungkan lebih banyak penghakiman peringkat besar, seperti isyarat pita Brin peringkat sunset atau faktor bermusim
  5. Penilaian peluang trend-following untuk meluaskan ruang untuk penyaluran dan keuntungan strategi

ringkaskan

Strategi ini menggunakan pelbagai alat teknikal, seperti peratusan Brin, purata bergerak, petunjuk ATR, tinggi baru dan rendah dan tinggi tahunan, untuk membina strategi perdagangan pecah yang agak ketat dan cekap dalam jangka masa yang singkat. Kelebihannya yang menonjol adalah menggunakan pelbagai jenis alat untuk mengurangkan kebisingan dan mengenali isyarat trend yang benar.

Kod 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)