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:
Strategi ini mempunyai dua tahap mengambil keuntungan dan satu tahap berhenti kerugian.
SMA dan EMA crossovers digunakan untuk menentukan arah trend. EMA (46) melintasi SMA (46) menunjukkan trend menaik.
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 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.
Strategi ini menggabungkan penunjuk trend, saluran dan momentum untuk menentukan tindakan harga dan arah panjang / pendek dengan berkesan.
Pengesanan trend agak tepat untuk mengelakkan perdagangan kontra-trend.
Saluran Keltner menunjukkan tahap sokongan dan rintangan yang jelas.
Indikator DM mengukur momentum panjang/pendek untuk memastikan arah.
Peraturan kemasukan yang ketat membantu menapis pelarian palsu.
Ambil keuntungan dan titik stop loss membolehkan menangkap keuntungan.
Terdapat juga beberapa risiko yang perlu dipertimbangkan:
Trend boleh berbalik apabila EMA melintasi di bawah SMA, jadi keluar tepat pada masanya.
Saluran boleh gagal dalam trend yang kuat, bukan sokongan / rintangan yang ketat.
DM boleh menghasilkan isyarat palsu, memeriksa tindakan harga.
Penembusan palsu boleh mencetuskan masuk tetapi dengan cepat jatuh, gunakan stop loss yang munasabah.
Ambil keuntungan dan hentikan kerugian memerlukan pengoptimuman berterusan untuk menyesuaikan diri dengan keadaan pasaran yang berubah.
Beberapa cara untuk mengoptimumkan lagi strategi:
Sesuaikan parameter dan uji kaedah pengenalan trend yang berbeza.
Mengoptimumkan parameter saluran untuk lebih sesuai dengan julat sebenar.
Uji parameter DM yang berbeza dan cari kombinasi yang optimum.
Tambah lebih banyak penapis seperti kelantangan.
Cuba stop loss untuk mendapatkan lebih banyak keuntungan.
Uji secara berasingan untuk produk yang berbeza untuk mencari set parameter terbaik.
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")