Strategi Pelacakan Tren Saluran Momentum Equilibrium

Penulis:ChaoZhang, Tanggal: 2023-12-12 18:07:31
Tag:

img

Gambaran umum

Strategi ini mengidentifikasi formasi tren dengan menghitung saluran dan indikator momentum untuk mencapai perdagangan pelacakan tren. Secara khusus, ini menggabungkan indikator momentum dan indikator saluran keseimbangan, dan memanfaatkan keduanya untuk campur tangan dalam tren jangka panjang sambil menggunakan saluran keseimbangan untuk mengunci area keuntungan panjang.

Prinsip Strategi

Strategi ini terutama menggunakan dua indikator berikut untuk penilaian:

  1. Indikator Momentum (DMI): Menghakimi tren jangka panjang dan pendek di pasar dan menghasilkan sinyal perdagangan ketika indeks lebih besar dari ambang batas yang ditetapkan.

  2. Saluran Keseimbangan (Saluran Keltner): Menentukan area tren. Ketika harga menembus rel atas, saatnya untuk membeli, dan ketika harga turun di bawah rel tengah, itu adalah sinyal untuk menutup posisi.

Logika perdagangan khusus adalah: Ketika indikator momentum +DI lebih besar dari ambang batas yang ditetapkan (default 32), ditentukan bahwa tren bullish telah terbentuk. Pada saat ini, jika harga menembus rel atas saluran keseimbangan, sinyal beli dihasilkan; setelah itu, saluran keseimbangan digunakan. Jalur tengah digunakan sebagai garis stop loss untuk melacak stop loss dan mencapai perlindungan keuntungan.

Strategi ini menggabungkan keuntungan dari dua indikator, menggunakan indikator momentum untuk menentukan arah tren, dan menggunakan saluran keseimbangan untuk menentukan waktu masuk dan area stop loss.

Analisis Keuntungan

  1. Strategi ini menggunakan indikator momentum untuk menentukan tahap awal tren pasar, yang lebih efisien daripada indikator yang tertinggal seperti rata-rata bergerak sederhana.

  2. Menggunakan saluran keseimbangan untuk menentukan rentang perdagangan tertentu dapat secara efektif mengunci zona keuntungan.

  3. Parameter indikator dan aturan perdagangan ketat dan wajar, dan data backtest berkinerja baik dan memverifikasi efek tempur yang sebenarnya.

  4. Strategi ini relatif sederhana dan jelas, mudah dimengerti dan diterapkan, dan cocok untuk pemula perdagangan kuantitatif untuk belajar.

  5. Risiko strategi dapat dikendalikan, dan mengadopsi stop loss dinamis dengan garis median untuk secara efektif mengendalikan kerugian tunggal.

Analisis risiko

  1. Strategi ini hanya cocok untuk pasar tren dan tidak cocok untuk konsolidasi dan fluktuasi pasar. Jika saluran QtCore meningkat dan penghentian rel tengah kehilangan terlalu longgar, ia tidak dapat mengendalikan kerugian.

  2. Indikator DMI memiliki keterlambatan tertentu dan tidak dapat menentukan konfirmasi tren.

  3. Metode stop loss persentase tetap memiliki risiko karena tidak dapat melakukan intervensi kembali pada tren setelah fluktuasi tajam, sehingga kehilangan tren berikutnya.

  4. Ada data backtest yang cukup, tetapi masih diperlukan operasi jangka panjang untuk memverifikasi stabilitas parameter dalam perdagangan nyata.

Optimalisasi

  1. Metode stop loss yang berbeda dapat diuji, seperti stop loss ATR, stop loss bergerak dan sebagainya untuk menggantikan stop loss persentase tetap.

  2. Indikator konfirmasi sekunder dapat ditambahkan, seperti amplifikasi volume, untuk memastikan masuk setelah konfirmasi tren.

  3. Kombinasi parameter yang berbeda dapat diuji untuk menemukan kombinasi parameter yang optimal.

  4. Kekuatan parameter dapat diverifikasi melalui optimasi bertahap dan pengujian berjalan maju.

Ringkasan

Strategi ini mencapai penangkapan yang efisien dari pasar tren dengan menggunakan penilaian indikator ganda. Strategi ini relatif sederhana dan intuitif dengan logika yang jelas dan kinerja backtest yang baik. Ini dapat berfungsi sebagai salah satu strategi masuk untuk perdagangan kuantitatif.


/*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")

Lebih banyak