
Strategi ini mengidentifikasi bentuk tren dan memungkinkan untuk melacak tren dengan menghitung indikator channel dan momentum. Secara khusus, strategi ini menggabungkan indikator momentum dan indikator saluran keseimbangan, menggunakan keduanya dalam kombinasi, dan menggunakan saluran keseimbangan untuk mengunci area keuntungan multi-head, sambil mengintervensi tren jangka panjang.
Strategi ini didasarkan pada dua indikator:
Indikator momentum ((DMI): untuk menilai tren pasar kosong, indikator lebih besar dari sinyal perdagangan yang dihasilkan saat menetapkan nilai ambang.
Saluran keseimbangan (Keltner Channel): untuk menentukan zona tren, harga menembus orbit atas sebagai waktu untuk membeli, harga jatuh di tengah orbit sebagai sinyal posisi kosong.
Logika perdagangan spesifik adalah: Ketika + DI indikator momentum lebih besar dari set threshold ((default 32), menilai sebagai tren multihead terbentuk, saat ini seperti harga menembus saluran keseimbangan di atas lintasan, menghasilkan sinyal beli; Kemudian menggunakan saluran keseimbangan di tengah lintasan sebagai stop loss line, melacak stop loss, untuk mencapai perlindungan keuntungan.
Strategi ini menggabungkan keuntungan dari dua indikator, menggunakan indikator momentum untuk menentukan arah tren, menggunakan saluran keseimbangan untuk menentukan waktu masuk dan area berhenti. Kombinasi indikator ganda memungkinkan strategi untuk masuk dengan efisien pada awal penemuan tren, sekaligus menggunakan indikator saluran untuk mengunci keuntungan dan berhenti.
Strategi menggunakan indikator momentum untuk menilai tren pasar lebih awal dan lebih efektif daripada indikator yang tertinggal seperti rata-rata bergerak sederhana.
Penggunaan saluran keseimbangan untuk menentukan zona transaksi tertentu, dapat secara efektif mengunci zona keuntungan.
Parameter indikator dan aturan perdagangan yang ketat dan masuk akal, kinerja data retrospektif yang baik, dan validasi langsung.
Strategi yang sederhana dan jelas, mudah dipahami, cocok untuk pemula dalam trading kuantitatif.
Strategi risiko yang dapat dikendalikan, menggunakan stop loss dinamis rata-rata di tengah jalur, untuk mengontrol kerugian tunggal secara efektif.
Strategi ini hanya berlaku untuk tren dan tidak berlaku untuk pasar yang bergejolak, seperti ketika saluran QtCore tumbuh dan stop loss di tengah terlalu longgar dan tidak dapat mengendalikan kerugian.
Indikator DMI memiliki keterlambatan tertentu, tidak dapat memastikan konfirmasi tren, dan mungkin melakukan intervensi tren lebih awal dapat menyebabkan kerugian.
Ada risiko dalam metode stop loss persentase tetap, yang tidak dapat kembali ke tren setelah guncangan besar, dan tidak mengikuti tren berikutnya.
Data deteksi cukup, tetapi masih membutuhkan waktu yang lama untuk menjalankan hard disk untuk memverifikasi stabilitas parameter.
Metode stop loss yang berbeda dapat diuji, seperti stop loss ATR, stop loss bergerak, dan lain-lain untuk menggantikan stop loss persentase tetap.
Indikator konfirmasi tingkat bawah dapat ditambahkan, seperti peningkatan volume transaksi, untuk memastikan penerimaan setelah konfirmasi tren.
Optimalisasi kombinasi parameter yang berbeda dapat diuji untuk menemukan kombinasi parameter yang optimal.
Stabilitas parameter dapat diverifikasi melalui stepwise optimization dan floating feedback.
Strategi ini menggunakan penilaian indikator ganda, untuk menangkap tren yang efisien. Strategi ini relatif sederhana, intuitif, logis jelas, kinerja yang baik, dan dapat digunakan sebagai salah satu strategi masuk untuk perdagangan kuantitatif. Namun, masih perlu memverifikasi data real-time dan parameter optimasi, untuk mengurangi risiko real-time berjalan keluar, akan menjadi fokus masa depan.
/*backtest
start: 2023-11-11 00:00:00
end: 2023-12-11 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//Original Idea by: @Wunderbit
//@version=4
strategy("Keltner Channel [LINKUSDT] 1H", overlay=true, initial_capital=3000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent,commission_value=0.1)
/// TREND
trend_cond = input(true, title="Enable Ribbon Filter")
ribbon_period = input(30, "Ribbon 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(80, "KELTNER Period", step=1, minval=1)
mult = input(3.0,"KELTNER Multiple", step=0.1)
// Calculate Keltner Channel
ma = ema(source, length)
range = useTrueRange ? tr : high - low
rangema = ema(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 //
lensig = input(14, title="ADX Smoothing", minval=1, maxval=50)
len = input(14, minval=1, title="DI Length")
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
trur = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / trur)
minus = fixnan(100 * rma(minusDM, len) / trur)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)
trig_level=input(title="+DI Trigger Level", defval=32, minval=1,step=1)
//trig_level_adx=input(title="ADX Trigger Level", defval=30, minval=1,step=1)
//plot(adx, color=#FF006E, title="ADX")
//plot(plus, color=#0094FF, title="+DI")
//plot(minus, color=#FF6A00, title="-DI")
// plot(trig_level, 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(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
///// Component Code Stop //////////////////////////////////////////
//////////////// STRATEGY EXECUTION //////////////////////////
// STRATEGY CONDITION
// LONG
long = ((open > lower and open < upper) and close > upper) and plus > minus and plus > trig_level and volume[0] > volume[1]
entry_long = trend_cond ? long and UT : long
exit_long = (close < ma) //or low < SL_long
//LONG SET UP
// Take Profit / Stop Loss
entry_price_long=valuewhen(entry_long,close,0)
//SL_long = entry_price_long * (1 - long_sl_inp)
long_tp1_inp = input(8, title='Long Take Profit 1 Target %', step=0.1)/100
long_tp1_qty = input(20, title="Long Take Profit 1 Qty %", step=1)
long_tp2_inp = input(16, title='Long Take Profit 2 Target %', step=0.1)/100
long_tp2_qty = input(30, 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 EXECUTION
if testPeriod()
// LONG
strategy.entry(id="Long", long=true, when=entry_long, comment = "INSERT ENTRY 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")