Strategi Breakout Volatilitas Dinamis


Tanggal Pembuatan: 2023-11-13 11:26:50 Akhirnya memodifikasi: 2023-11-13 11:26:50
menyalin: 1 Jumlah klik: 753
1
fokus pada
1621
Pengikut

Strategi Breakout Volatilitas Dinamis

Ringkasan

Strategi ini memanfaatkan tren naik turun yang dinamis di Bollinger Bands, untuk mencapai posisi lebih tinggi ketika harga menembus tren naik Bollinger Bands, dan posisi rata ketika harga turun di bawah tren Bollinger Bands. Berbeda dengan strategi penembusan tradisional, tren naik turun Bollinger Bands akan berubah berdasarkan dinamika fluktuasi historis, sehingga lebih baik untuk menilai keadaan pasar yang terlalu banyak membeli dan terlalu banyak menjual.

Prinsip Strategi

Strategi ini terutama bergantung pada penembusan harga dalam indikator Brin Belt. Brin Belt terdiri dari tiga garis:

  1. Garis tengah: rata-rata bergerak n hari
  2. Jalur atas: garis tengah + k * n hari standar perbedaan
  3. Garis bawah: garis tengah - k * n hari standar perbedaan

Ketika harga naik melebihi tren naik, menganggap bahwa pasar berada dalam kondisi overbuy, dapat dilakukan lebih banyak. Ketika harga turun melebihi tren turun, menganggap bahwa pasar berada dalam kondisi oversold, harus dihapus.

Kebijakan ini memungkinkan untuk menyesuaikan parameter Brinet: panjang garis tengah n dan kelipatan dari perbedaan standar k. Default panjang garis tengah adalah 20 hari dan perbedaan standar adalah kelipatan 2.

Setelah saham ditutup setiap hari, akan diperiksa apakah harga penutupan hari itu telah menerobos ke atas. Jika demikian, maka akan dilakukan sinyal plus pada hari berikutnya. Setelah melakukan plus, akan dipantau secara real time apakah harga telah menerobos ke bawah, dan jika telah menerobos maka akan dihapus.

Strategi ini juga memperkenalkan filter rata-rata, yang hanya akan menghasilkan sinyal ganda jika harga lebih tinggi dari rata-rata. Anda dapat memilih untuk memetakan rata-rata pada periode saat ini atau periode yang lebih tinggi untuk mengontrol titik waktu masuk.

Stop loss juga menawarkan dua pilihan: stop loss persentase tetap atau track down Brin. Yang terakhir dapat memberikan ruang yang lebih besar untuk menjalankan keuntungan.

Keunggulan Strategis

  • SUPERBUY/SUPPERSELL menggunakan pita Brin untuk menilai pasar
  • Filter rata-rata untuk menghindari perdagangan berlawanan
  • Parameter pita Brin yang dapat disesuaikan untuk siklus yang berbeda
  • Ada dua opsi untuk menghentikan kerugian
  • Mendukung parameter pengoptimalan feedback, strategi verifikasi langsung

Risiko Strategis

  • Blinken tidak bisa sepenuhnya menilai overbuying dan overselling.
  • Filter rata-rata mungkin melewatkan kesempatan untuk terobosan lebih cepat
  • Stop loss tetap mungkin terlalu konservatif, stop loss tracking mungkin terlalu radikal
  • Parameter yang perlu dioptimalkan untuk varietas dan siklus yang berbeda
  • Tidak ada batasan untuk ukuran kerugian, harus mempertimbangkan pengelolaan dana

Optimasi Strategi

  • Uji kombinasi parameter rata-rata yang berbeda
  • Mencoba berbagai parameter Brinet
  • Bandingkan persentase stop loss yang tetap dengan stop loss yang dilacak
  • Menambahkan Modul Manajemen Uang untuk Membatasi Kerugian Tunggal
  • Sinyal pita Brin digabungkan dengan indikator lain untuk verifikasi

Meringkaskan

Strategi ini memanfaatkan tren naik turun yang dinamis dari Brin Belt untuk menilai overbought dan oversold, merujuk pada sinyal penyaringan linear, menggunakan dana perlindungan stop loss. Dibandingkan dengan terobosan orbit tetap tradisional, lebih dapat beradaptasi dengan fluktuasi pasar. Dengan pengoptimalan parameter dan kontrol risiko, stabilitas dan tingkat pengembalian strategi dapat ditingkatkan lebih lanjut. Secara keseluruhan, strategi ini memanfaatkan karakteristik dinamis dari Brin Belt dan mengambil keuntungan dari strategi terobosan yang layak untuk verifikasi saham dan pengoptimalan pelacakan jangka panjang.

Kode Sumber Strategi
/*backtest
start: 2022-11-06 00:00:00
end: 2023-11-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5

// Revision:        1
// Author:          @millerrh
// Strategy:  
//      Entry: Buy when price breaks out of upper Bollinger Band
//      Exit: Trail a stop with the lower Bollinger Band 
// Conditions/Variables:
//    1. Can add a filter to only take setups that are above a user-defined moving average on current timeframe and/or longer timeframe (helps avoid trading counter trend) 
//    2. Manually configure which dates to back test
//    3. User-Configurable Bollinger Band Settings
//    4. Optionally use a tighter initial stop level.  Once Bollinger Band catches up, trail with lower Bollinger Band to give more breathing room.

// strategy('Donchian Breakout', overlay=true, initial_capital=100000, currency='USD', default_qty_type=strategy.percent_of_equity, calc_on_every_tick = true,
//   default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)

strategy('Bollinger Breakout', overlay=true, initial_capital=100000, currency='USD', default_qty_type=strategy.percent_of_equity,
  default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0, calc_on_order_fills=true)

// === BACKTEST RANGE ===
Start = input(defval = timestamp("01 Jan 2019 06:00 +0000"), title = "Backtest Start Date", group = "backtest window")
Finish = input(defval = timestamp("01 Jan 2100 00:00 +0000"), title = "Backtest End Date", group = "backtest window")

// == INPUTS ==
// Bollinger Band Inputs
bbLength = input.int(20, minval=1, group = "Bollinger Band Settings", title="Bollinger Band Length",
  tooltip = "Bollinger Band moving average length.")
bbMultTop = input.float(2.0, minval=0.001, maxval=50, title="Standard Deviation (Top)")
bbMultBot = input.float(2.0, minval=0.001, maxval=50, title="Standard Deviation (Bottom)")

useTightStop = input.bool(title='Use Fixed Percentage for Initial Stop?', defval=false, group = "order entry",
  tooltip = "'Keep your losers small and let winners run' is the saying.  This will allow you to use a tight initial stop
  until the lower Bollinger Band catches up.")
percStop = input.int(title="Stop", defval=8, group = "order entry", inline = "perc")
trigInput = input.string(title='Execute Trades On...', defval='Wick', options=['Wick', 'Close'], group = "order entry",
  tooltip = "Useful for comparing standing stop orders at the Bollinger Band boundary (executing on the wick) vs. waiting for candle closes prior to taking action")

// Moving Average Filtering Inputs
useMaFilter = input.bool(title='Use Moving Average for Filtering (Current Timeframe)?', defval=false, group = "moving average filtering",
  tooltip = "Signals will be ignored when price is under this moving average.  The intent is to keep you out of bear periods and only buying when 
             price is showing strength.")
maType = input.string(defval='SMA', options=['EMA', 'SMA'], title='MA Type For Filtering', group = "moving average filtering")
maLength = input.int(defval=50, title="Moving Average:    Length", minval=1, group = "moving average filtering", inline = "1ma")
ma1Color = input.color(color.new(color.green, 50), title = " Color", group = "moving average filtering", inline = "1ma")
useMaFilter2 = input.bool(title='Use Moving Average for Filtering (High Timeframe)?', defval=false, group = "moving average filtering")
tfSet = input.timeframe(defval="D", title="Timeframe of Moving Average", group = "moving average filtering",
  tooltip = "Allows you to set a different time frame for a moving average filter.  Trades will be ignored when price is under this moving average.
  The idea is to keep your eye on the larger moves in the market and stay on the right side of the longer term trends and help you be pickier about 
  the stocks you trade.")
ma2Type = input.string(defval='SMA', options=['EMA', 'SMA'], title='MA Type For Filtering', group = "moving average filtering")
ma2Length = input.int(defval=50, title="Moving Average:    Length", minval=1, group = "moving average filtering", inline = "2ma")
ma2Color = input.color(color.new(color.white, 50), title = " Color", group = "moving average filtering", inline = "2ma")


// === THE BOLLINGER BAND ===
// Logic
bbBasis = ta.sma(close, bbLength)
bbUpper = bbBasis + bbMultTop * ta.stdev(close, bbLength)
bbLower = bbBasis - bbMultBot * ta.stdev(close, bbLength)

// Plotting
plot(bbBasis, "Basis", color=color.new(color.white, 50))
p1 = plot(bbUpper, color=color.new(color.blue, 50), linewidth=1, title='Upper Bollinger Band')
p2 = plot(bbLower, color=color.new(color.blue, 50), linewidth=1, title='Lower Bollinger Band')
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))

// == FILTERING LOGIC ==
// Declare function to be able to swap out EMA/SMA
ma(maType, src, length) =>
    maType == 'EMA' ? ta.ema(src, length) : ta.sma(src, length)  //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = ma(maType, close, maLength)
maFilter2 = request.security(syminfo.tickerid, tfSet, ma(ma2Type, close, ma2Length))

// Plotting
plot(useMaFilter ? maFilter : na, title='Trend Filter MA - CTF', color=ma1Color, linewidth=2, style=plot.style_line)
plot(useMaFilter2 ? maFilter2 : na, title='Trend Filter MA - HTF', color=ma2Color, linewidth=2, style=plot.style_line)


// == ENTRY AND EXIT CRITERIA ==
// Trigger stop based on candle close or High/Low (i.e. Wick)
trigResistance = trigInput == 'Close' ? close : trigInput == 'Wick' ? high : na
trigSupport = trigInput == 'Close' ? close : trigInput == 'Wick' ? low : na
buySignal = trigResistance >= bbUpper 

buyConditions = (useMaFilter ? bbUpper > maFilter : true) and
  (useMaFilter2 ? bbUpper > maFilter2 : true) 
  
// == STOP AND PRICE LEVELS ==
// Configure initial stop level
inPosition = strategy.position_size > 0
stopLevel = strategy.position_avg_price - (strategy.position_avg_price * percStop/100)
posStop = stopLevel > bbLower ? stopLevel : bbLower


// Check if using stop vs. not
stop = useTightStop ? posStop : bbLower
plot(inPosition ? stop : na, style=plot.style_linebr, color=color.new(color.red, 40), linewidth = 1, title = "Stop Levels", trackprice=false)

sellSignal = trigSupport <= stop

// == STRATEGY ENTRIES & EXITS ==
// This string of code enters and exits at the candle close
if trigInput == 'Close'
    strategy.entry('Long', strategy.long, when=buyConditions and buySignal)
    strategy.close('Long', when=sellSignal)

// This string of code enters and exits at the wick (i.e. with pre-set stops)
if trigInput == 'Wick'
    strategy.entry('Long', strategy.long, stop=bbUpper, when=buyConditions)
    strategy.exit('Exit Long', from_entry='Long', stop=stop)
strategy.cancel('Long',when= not(buyConditions)) // Resets stop level once buyConditions aren't true anymore