Strategi Saluran Volatiliti Penembusan Berganda

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

img

Ringkasan

Strategi saluran turun naik pecah berganda mengira jalur tengah, atas dan bawah saluran dan menggunakan penunjuk trend dan jumlah untuk menentukan arah dan momentum pasaran.

Logika Strategi

Indikator teras strategi ini adalah saluran turun naik yang berasaskan statistik garis lilin. Band tengah menggunakan algoritma purata bergerak dan band atas dan bawah menggunakan kaedah julat sebenar purata untuk menangkap secara dinamik sempadan turun naik harga. Pada masa yang sama, strategi ini menggabungkan kriteria DMI dan jumlah untuk mengelakkan pecah palsu.

Khususnya, apabila harga keluar dari rel bawah ke saluran, garis +DI DMI melebihi garis -DI dan penanda aras ADX yang ditetapkan, dan jumlah dagangan meningkat, isyarat beli dihasilkan. Sebaliknya, apabila harga menembusi saluran ke bawah dari rel atas, peraturan penilaian bertentangan dengan di atas, menghasilkan isyarat jual.

Analisis Kelebihan

Kelebihan terbesar strategi ini adalah menangkap arah kejayaan utama harga. Penghakiman pecah dua dapat dengan berkesan mengelakkan pasaran sampingan dan kejutan dan mengurangkan bilangan kerugian berhenti. Berbanding dengan strategi purata bergerak yang mudah, penghakiman pecah saluran turun naik lebih beradaptasi dengan turun naik harga.

Di samping itu, pengenalan penunjuk tambahan DMI dan jumlah juga memainkan peranan penapisan yang baik, mengelakkan isyarat palsu.

Analisis Risiko

Risiko terbesar dari strategi pecah berganda adalah bahawa ia tidak dapat menilai pembalikan pasaran. Jika pembalikan berbentuk V berlaku di pasaran, titik stop loss boleh dengan mudah dicetuskan. Di samping itu, tetapan parameter yang tidak betul juga boleh memberi kesan negatif kepada sistem perdagangan.

Untuk menangani risiko, kita boleh mengoptimumkan lagi tetapan parameter dan menyempitkan kerugian berhenti untuk mengurangkan risiko.

Arahan pengoptimuman

Strategi ini juga mempunyai potensi yang besar untuk pengoptimuman, yang boleh ditingkatkan dalam aspek berikut:

  1. Pengoptimuman parameter, seperti penyesuaian halus panjang DI dan ADX DMI, tetapan tempoh dan pengganda saluran turun naik, dll.

  2. Meningkatkan keadaan penapisan, seperti menggabungkan MACD dan penunjuk lain untuk mengelakkan pecah palsu

  3. Melaksanakan pengesanan automatik mengambil keuntungan dan hentikan kerugian untuk mengawal risiko lebih lanjut

  4. Mengoptimumkan tetapan parameter dan peraturan penapisan untuk produk yang berbeza

Ringkasan

Secara umum, strategi saluran turun naik pecah berganda adalah sistem pecah yang berkesan. Ia dapat menentukan arah trend utama dan momentum dengan berkesan, dan mempunyai potensi yang besar dalam pengoptimuman dan kawalan risiko. Jika ditingkatkan dan dioptimumkan secara sistematik, strategi dapat memperoleh keuntungan secara mantap 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 lanjut