Strategi ini mengenal pasti pembentukan trend dengan mengira saluran dan penunjuk momentum untuk mencapai perdagangan penjejakan trend. Khususnya, ia menggabungkan penunjuk momentum dan penunjuk saluran keseimbangan, dan memanfaatkan kedua-duanya untuk campur tangan dalam trend jangka panjang sambil menggunakan saluran keseimbangan untuk mengunci kawasan keuntungan panjang.
Strategi ini terutamanya menggunakan dua penunjuk berikut untuk penilaian:
Indikator Momentum (DMI): Menghakimi trend panjang dan pendek di pasaran dan menghasilkan isyarat perdagangan apabila indeks lebih besar daripada ambang yang ditetapkan.
Saluran Keseimbangan (Saluran Keltner): Tentukan kawasan trend. Apabila harga memecahkan rel atas, sudah tiba masanya untuk membeli, dan apabila harga jatuh di bawah rel tengah, ini adalah isyarat untuk menutup kedudukan.
Logik dagangan khusus ialah: Apabila penunjuk momentum +DI lebih besar daripada ambang yang ditetapkan (default 32), ia ditentukan bahawa trend menaik telah terbentuk. Pada masa ini, jika harga memecahkan rel atas saluran keseimbangan, isyarat beli dihasilkan; selepas itu, saluran keseimbangan digunakan. Rel tengah digunakan sebagai garis stop loss untuk mengesan stop loss dan mencapai perlindungan keuntungan.
Strategi ini menggabungkan kelebihan dua penunjuk, menggunakan penunjuk momentum untuk menentukan arah trend, dan menggunakan saluran keseimbangan untuk menentukan masa kemasukan dan kawasan stop loss.
Strategi ini menggunakan penunjuk momentum untuk menentukan peringkat awal trend pasaran, yang lebih cekap daripada penunjuk yang tertinggal seperti purata bergerak mudah.
Menggunakan saluran keseimbangan untuk menentukan julat perdagangan tertentu dapat mengunci zon keuntungan dengan berkesan.
Parameter penunjuk dan peraturan perdagangan adalah ketat dan munasabah, dan data backtest melakukan dengan baik dan mengesahkan kesan pertempuran sebenar.
Strategi ini agak mudah dan jelas, mudah difahami dan dilaksanakan, dan sesuai untuk pemula perdagangan kuantitatif belajar.
Risiko strategi boleh dikawal, dan ia menggunakan stop loss dinamik dengan garis median untuk mengawal kerugian tunggal dengan berkesan.
Strategi ini hanya sesuai untuk pasaran trend dan tidak sesuai untuk konsolidasi dan pasaran turun naik.
Penunjuk DMI mempunyai kelewatan tertentu dan tidak dapat menentukan pengesahan trend.
Kaedah stop loss peratusan tetap mempunyai risiko. Ia tidak dapat campur tangan semula dalam trend selepas turun naik tajam, dengan itu kehilangan trend berikutnya.
Terdapat data backtest yang mencukupi, tetapi berjalan jangka panjang masih diperlukan untuk mengesahkan kestabilan parameter dalam perdagangan sebenar.
Kaedah stop loss yang berbeza boleh diuji, seperti ATR stop loss, stop loss bergerak dan sebagainya untuk menggantikan stop loss peratusan tetap.
Penunjuk pengesahan sekunder boleh ditambah, seperti penguatan jumlah, untuk memastikan kemasukan selepas pengesahan trend.
Gabungan parameter yang berbeza boleh diuji untuk mencari kombinasi parameter yang optimum.
Kekuatan parameter boleh disahkan melalui pengoptimuman langkah demi langkah dan ujian berjalan maju.
Strategi ini mencapai penangkapan yang cekap pasaran trend dengan menggunakan penghakiman penunjuk berganda. Strategi ini agak mudah dan intuitif dengan logik yang jelas dan prestasi backtest yang baik. Ia boleh berfungsi sebagai salah satu strategi kemasukan untuk perdagangan kuantitatif. Tetapi pengesahan data perdagangan sebenar yang mencukupi dan pengoptimuman parameter masih diperlukan untuk mengurangkan kerugian perdagangan sebenar. Ini akan menjadi tumpuan kerja 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")