Strategi saluran volatilitas pecah ganda menghitung band tengah, atas dan bawah saluran dan menggunakan indikator tren dan volume untuk menentukan arah dan momentum pasar.
Indikator inti dari strategi ini adalah saluran volatilitas yang berbasis statistik dari garis lilin. Band tengah mengadopsi algoritma moving average dan band atas dan bawah mengadopsi metode rata-rata rentang sejati untuk menangkap secara dinamis batas-batas fluktuasi harga. Pada saat yang sama, strategi ini menggabungkan kriteria DMI dan volume untuk menghindari pecah palsu.
Secara khusus, ketika harga keluar dari rel bawah ke saluran, garis +DI dari DMI melebihi garis -DI dan tolok ukur ADX yang ditetapkan, dan volume perdagangan meningkat, sinyal beli dihasilkan. Sebaliknya, ketika harga menembus saluran ke bawah dari rel atas, aturan penilaian bertentangan dengan yang di atas, menghasilkan sinyal jual.
Keuntungan terbesar dari strategi ini adalah menangkap arah terobosan utama harga. Penghakiman terobosan ganda dapat secara efektif menghindari sisi dan pasar kejutan dan mengurangi jumlah stop loss. Dibandingkan dengan strategi rata-rata bergerak sederhana, penilaian terobosan saluran volatilitas lebih beradaptasi dengan fluktuasi harga.
Selain itu, pengenalan indikator tambahan DMI dan volume juga memainkan peran penyaring yang baik, menghindari sinyal palsu.
Risiko terbesar dari strategi dual breakout adalah tidak dapat menilai pembalikan pasar. Jika pembalikan berbentuk V terjadi di pasar, titik stop loss dapat dengan mudah dipicu. Selain itu, pengaturan parameter yang tidak tepat juga dapat berdampak negatif pada sistem perdagangan.
Untuk mengatasi risiko, kita dapat lebih mengoptimalkan pengaturan parameter dan mempersempit stop loss untuk mengurangi risiko.
Strategi ini juga memiliki potensi optimalisasi yang besar, yang dapat ditingkatkan dalam aspek berikut:
Optimalisasi parameter, seperti penyetelan halus panjang DI dan ADX DMI, pengaturan periode dan pengganda saluran volatilitas, dll.
Meningkatkan kondisi penyaringan, seperti menggabungkan MACD dan indikator lain untuk menghindari pecah palsu
Mengimplementasikan pelacakan otomatis mengambil keuntungan dan stop loss untuk lebih mengendalikan risiko
Mengoptimalkan pengaturan parameter dan aturan penyaringan untuk produk yang berbeda
Secara umum, strategi saluran volatilitas breakout ganda adalah sistem breakout yang efektif. Ini dapat secara efektif menentukan arah tren utama dan momentum, dan memiliki potensi besar dalam pengoptimalan dan pengendalian risiko. Jika ditingkatkan dan dioptimalkan secara sistematis, strategi dapat menguntungkan secara stabil dalam jangka panjang.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Original Idea by: Wunderbit Trading //@version=5 strategy('Keltner Channel ETH/USDT 1H', overlay=true, initial_capital=1000, pyramiding=0, currency='USD', default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.07) /// TREND ribbon_period = input.int(46, 'Period', step=1) leadLine1 = ta.ema(close, ribbon_period) leadLine2 = ta.sma(close, ribbon_period) // p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1) // p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1) // fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c) //Upward Trend UT = leadLine2 < leadLine1 DT = leadLine2 > leadLine1 ///////////////////////////////////////INDICATORS // KELTNER // source = close useTrueRange = input(true) length = input.int(81, step=1, minval=1) mult = input.float(2.5, step=0.1) // Calculate Keltner Channel ma = ta.sma(source, length) range_1 = useTrueRange ? ta.tr : high - low rangema = ta.sma(range_1, length) upper = ma + rangema * mult lower = ma - rangema * mult plot(ma, title='Middle', color=color.new(color.orange, 0)) p1 = plot(upper, title='Upper', color=color.new(color.orange, 0)) p2 = plot(lower, title='Lower', color=color.new(color.orange, 0)) fill(p1, p2, transp=90) // DMI INDICATOR // adxlen = 10 // input(10, title="ADX Smoothing") dilen = input(19, title='DI Length') keyLevel = 23 // input(23, title="key level for ADX") dirmov(len) => up = ta.change(high) down = -ta.change(low) truerange = ta.rma(ta.tr, len) plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange) minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) [adx, plus, minus] [sig, up, down] = adx(dilen, adxlen) benchmark = input.int(title='DMI Benchmark', defval=27, minval=1, step=1) // plot(sig, color=color.red, title="ADX") // plot(up, style=plot.style_histogram, color=color.green, title="+DI") // plot(down, style=plot.style_histogram, color=color.red, title="-DI") // plot(keyLevel, color=color.white, title="Key Level") /////////////////////////////////////////////////////////// ////////////////////////////////////////////////////Component Code Start testStartYear = input(2019, 'Backtest Start Year') testStartMonth = input(1, 'Backtest Start Month') testStartDay = input(1, 'Backtest Start Day') testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0) testStopYear = input(9999, 'Backtest Stop Year') testStopMonth = input(12, 'Backtest Stop Month') testStopDay = input(31, 'Backtest Stop Day') testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0) testPeriod() => true ///// Component Code Stop ////////////////////////////////////////// //////////////// STRATEGY EXECUTION ////////////////////////// //LONG SET UP // Take Profit / Stop Loss long_tp1_inp = input.float(4.5, title='Long Take Profit 1 %', step=0.1) / 100 long_tp1_qty = input.int(15, title='Long Take Profit 1 Qty', step=1) long_tp2_inp = input.float(20, title='Long Take Profit 2%', step=0.1) / 100 long_tp2_qty = input.int(100, title='Long Take Profit 2 Qty', step=1) long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp) long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp) long_sl_inp = input.float(4, title='Long Stop Loss %', step=0.1) / 100 long_stop_level = strategy.position_avg_price * (1 - long_sl_inp) // STRATEGY CONDITION // LONG entry_long = open > lower and open < upper and close > upper and up > down and up > benchmark // and volume[0] > volume[1] entry_price_long = ta.valuewhen(entry_long, close, 0) SL_long = entry_price_long * (1 - long_sl_inp) exit_long = close < lower or low < SL_long // STRATEGY EXECUTION if testPeriod() // LONG if UT strategy.entry(id='Long', direction=strategy.long, when=entry_long, comment='INSERT ENTER LONG COMMAND') strategy.exit('TP1', 'Long', qty_percent=long_tp1_qty, limit=long_take_level_1) // PLACE TAKE PROFIT IN WBT BOT SETTINGS strategy.exit('TP2', 'Long', qty_percent=long_tp2_qty, limit=long_take_level_2) // PLACE TAKE PROFIT IN WBT BOT SETTINGS strategy.close(id='Long', when=exit_long, comment='INSERT EXIT LONG COMMAND') //PLOT FIXED SLTP LINE // LONG POSITION plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='1st Long Take Profit') plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='2nd Long Take Profit') plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='Long Stop Loss')