Strategi Saluran Volatilitas Penembusan Ganda

Penulis:ChaoZhang, Tanggal: 2024-01-31 10:24:00
Tag:

img

Gambaran umum

Strategi saluran volatilitas pecah ganda menghitung band tengah, atas dan bawah saluran dan menggunakan indikator tren dan volume untuk menentukan arah dan momentum pasar.

Logika Strategi

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.

Analisis Keuntungan

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.

Analisis Risiko

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.

Arahan Optimasi

Strategi ini juga memiliki potensi optimalisasi yang besar, yang dapat ditingkatkan dalam aspek berikut:

  1. Optimalisasi parameter, seperti penyetelan halus panjang DI dan ADX DMI, pengaturan periode dan pengganda saluran volatilitas, dll.

  2. Meningkatkan kondisi penyaringan, seperti menggabungkan MACD dan indikator lain untuk menghindari pecah palsu

  3. Mengimplementasikan pelacakan otomatis mengambil keuntungan dan stop loss untuk lebih mengendalikan risiko

  4. Mengoptimalkan pengaturan parameter dan aturan penyaringan untuk produk yang berbeda

Ringkasan

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



Lebih banyak