Strategi Pengesanan Trend Saluran Impulse Equilibrium

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

img

Ringkasan

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.

Prinsip Strategi

Strategi ini terutamanya menggunakan dua penunjuk berikut untuk penilaian:

  1. Indikator Momentum (DMI): Menghakimi trend panjang dan pendek di pasaran dan menghasilkan isyarat perdagangan apabila indeks lebih besar daripada ambang yang ditetapkan.

  2. 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.

Analisis Kelebihan

  1. Strategi ini menggunakan penunjuk momentum untuk menentukan peringkat awal trend pasaran, yang lebih cekap daripada penunjuk yang tertinggal seperti purata bergerak mudah.

  2. Menggunakan saluran keseimbangan untuk menentukan julat perdagangan tertentu dapat mengunci zon keuntungan dengan berkesan.

  3. Parameter penunjuk dan peraturan perdagangan adalah ketat dan munasabah, dan data backtest melakukan dengan baik dan mengesahkan kesan pertempuran sebenar.

  4. Strategi ini agak mudah dan jelas, mudah difahami dan dilaksanakan, dan sesuai untuk pemula perdagangan kuantitatif belajar.

  5. Risiko strategi boleh dikawal, dan ia menggunakan stop loss dinamik dengan garis median untuk mengawal kerugian tunggal dengan berkesan.

Analisis risiko

  1. Strategi ini hanya sesuai untuk pasaran trend dan tidak sesuai untuk konsolidasi dan pasaran turun naik.

  2. Penunjuk DMI mempunyai kelewatan tertentu dan tidak dapat menentukan pengesahan trend.

  3. Kaedah stop loss peratusan tetap mempunyai risiko. Ia tidak dapat campur tangan semula dalam trend selepas turun naik tajam, dengan itu kehilangan trend berikutnya.

  4. Terdapat data backtest yang mencukupi, tetapi berjalan jangka panjang masih diperlukan untuk mengesahkan kestabilan parameter dalam perdagangan sebenar.

Pengoptimuman

  1. Kaedah stop loss yang berbeza boleh diuji, seperti ATR stop loss, stop loss bergerak dan sebagainya untuk menggantikan stop loss peratusan tetap.

  2. Penunjuk pengesahan sekunder boleh ditambah, seperti penguatan jumlah, untuk memastikan kemasukan selepas pengesahan trend.

  3. Gabungan parameter yang berbeza boleh diuji untuk mencari kombinasi parameter yang optimum.

  4. Kekuatan parameter boleh disahkan melalui pengoptimuman langkah demi langkah dan ujian berjalan maju.

Ringkasan

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

Lebih lanjut