Strategi Berasaskan Tren Saluran Keltner

Penulis:ChaoZhang, Tarikh: 2023-11-03 16:59:39
Tag:

img

Ringkasan

Strategi ini berdasarkan tiga penunjuk utama: penunjuk trend, Saluran Keltner dan penunjuk DM.

Indikator trend terdiri daripada SMA dan EMA. Saluran Keltner digunakan untuk menentukan harga buka dan tutup lilin. Indikator DM adalah untuk menilai arah panjang dan pendek.

Isyarat masuk diaktifkan apabila:

  1. EMA melintasi SMA, mengesahkan trend menaik
  2. Lilin dibuka di atas band atas dan ditutup di dalam saluran
  3. Indikator DM di atas penanda aras

Strategi ini mempunyai dua tahap mengambil keuntungan dan satu tahap berhenti kerugian.

Prinsip Strategi

Pengesanan Trend

SMA dan EMA crossovers digunakan untuk menentukan arah trend. EMA (46) melintasi SMA (46) menunjukkan trend menaik.

Saluran Keltner

Saluran ini mempunyai tiga garis: tengah, atas dan bawah. Garis tengah adalah SMA harga dekat dengan panjang 81. Band atas dan bawah diletakkan pada kelipatan julat sebenar di atas dan di bawah garis tengah. Di sini kita menggunakan 2.5 kali julat sebenar.

Saluran Keltner menunjukkan tahap sokongan dan rintangan. Pergerakan harga berkaitan dengan saluran dianalisis.

Indikator DM

Indikator DM mengandungi ADX, +DI dan -DI. +DI mengukur kekuatan trend menaik manakala -DI mengukur kekuatan trend menurun. ADX menunjukkan kekuatan trend.

Di sini ADX (10), DI (19) digunakan. Apabila +DI melintasi di atas penanda aras (default 27), ia menandakan aliran menaik yang kuat dan baik untuk masuk panjang.

Analisis Kelebihan

Strategi ini menggabungkan penunjuk trend, saluran dan momentum untuk menentukan tindakan harga dan arah panjang / pendek dengan berkesan.

  1. Pengesanan trend agak tepat untuk mengelakkan perdagangan kontra-trend.

  2. Saluran Keltner menunjukkan tahap sokongan dan rintangan yang jelas.

  3. Indikator DM mengukur momentum panjang/pendek untuk memastikan arah.

  4. Peraturan kemasukan yang ketat membantu menapis pelarian palsu.

  5. Ambil keuntungan dan titik stop loss membolehkan menangkap keuntungan.

Analisis Risiko

Terdapat juga beberapa risiko yang perlu dipertimbangkan:

  1. Trend boleh berbalik apabila EMA melintasi di bawah SMA, jadi keluar tepat pada masanya.

  2. Saluran boleh gagal dalam trend yang kuat, bukan sokongan / rintangan yang ketat.

  3. DM boleh menghasilkan isyarat palsu, memeriksa tindakan harga.

  4. Penembusan palsu boleh mencetuskan masuk tetapi dengan cepat jatuh, gunakan stop loss yang munasabah.

  5. Ambil keuntungan dan hentikan kerugian memerlukan pengoptimuman berterusan untuk menyesuaikan diri dengan keadaan pasaran yang berubah.

Arahan pengoptimuman

Beberapa cara untuk mengoptimumkan lagi strategi:

  1. Sesuaikan parameter dan uji kaedah pengenalan trend yang berbeza.

  2. Mengoptimumkan parameter saluran untuk lebih sesuai dengan julat sebenar.

  3. Uji parameter DM yang berbeza dan cari kombinasi yang optimum.

  4. Tambah lebih banyak penapis seperti kelantangan.

  5. Cuba stop loss untuk mendapatkan lebih banyak keuntungan.

  6. Uji secara berasingan untuk produk yang berbeza untuk mencari set parameter terbaik.

Kesimpulan

Strategi ini mengintegrasikan pelbagai penunjuk untuk menentukan trend, sokongan / rintangan dan momentum, yang membolehkan menangkap trend dan mengawal risiko dengan berkesan. Tetapi risiko perlu diperhatikan dan parameter memerlukan pengoptimuman sebagai perubahan pasaran. Secara keseluruhan, ini adalah strategi dengan kepraktisan yang kuat.


/*backtest
start: 2022-10-27 00:00:00
end: 2023-11-02 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Original Idea by: Wunderbit Trading

//@version=4
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(46, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = 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(81, step=1, minval=1)
mult         = input(2.5, step=0.1)

// Calculate Keltner Channel
ma      = sma(source, length)
range   = useTrueRange ? tr : high - low
rangema = sma(range, length)
upper = ma + rangema * mult
lower = ma - rangema * mult

plot(ma, title="Middle", color=color.orange)
p1=plot(upper, title="Upper", color=color.orange)
p2=plot(lower, title="Lower", color=color.orange)
fill(p1,p2)


// 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 = change(high)
	down = -change(low)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange)
	[plus, minus]

adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
	[adx, plus, minus]

[sig, up, down] = adx(dilen, adxlen)

benchmark=input(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(4.5, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(15, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(20, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(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(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=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", long=true, 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.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")

Lebih lanjut