Strategi Dagangan Gabungan Hull Moving Average dan Stochastic RSI

Penulis:ChaoZhang, Tarikh: 2023-10-18 12:40:23
Tag:

img

Ringkasan

Strategi ini menggunakan Hull Moving Average untuk menentukan arah trend dan menggabungkannya dengan Stochastic RSI untuk isyarat kemasukan. Dagangan panjang diambil apabila garis tengah HMA melintasi di atas garis bawah, dan perdagangan pendek apabila ia melintasi di bawah garis atas. Di samping itu, perdagangan panjang dimasukkan apabila garis Stochastic RSI K melintasi di bawah garis D dari zon overbought, sementara perdagangan pendek dimasukkan pada salib di atas dari zon oversold.

Logika Strategi

Komponen utama strategi ini adalah Hull Moving Average untuk arah trend dan Stochastic RSI untuk isyarat kemasukan masa.

Pertama, pengiraan MA Hull merangkumi formula untuk jalur tengah, atas dan bawah.

Arah trend ditentukan oleh hubungan antara jalur tengah dan jalur atas/bawah. Persalinan ke atas garis tengah menunjukkan tekanan membeli dan trend menaik, sementara penyeberangan ke bawah menandakan peningkatan tekanan jual dan trend menurun.

Pengiraan RSI Stochastic juga ditakrifkan, termasuk nilai Smoothed K dan D. Nilai K menggunakan smoothing SMA pada RSI, sementara nilai D adalah smoothing SMA kedua pada K.

Selepas arah trend ditentukan, perdagangan panjang diambil apabila garisan Stoch RSI K melintasi di bawah garisan D dari zon overbought semasa trend menaik. Perdagangan pendek diambil apabila garisan K melintasi di atas garisan D dari kawasan oversold semasa trend menurun.

Menggabungkan penapis trend Hull dan analisis overbought / oversold Stoch RSI memberikan pendekatan pelbagai faktor yang kukuh untuk memasuki perdagangan.

Kelebihan

Manfaat utama strategi ini ialah:

  1. Hull MA secara berkesan mengenal pasti arah trend pasaran secara keseluruhan.

  2. Stoch RSI menentukan tahap overbought / oversold untuk entri masa.

  3. Menggunakan kedua-duanya bersama-sama mengurangkan isyarat palsu dan menggabungkan kekuatan.

  4. Fleksibiliti untuk mengoptimumkan parameter untuk simbol dan jangka masa yang berbeza.

  5. Band lambung mengenal pasti sokongan dan rintangan dinamik yang berpotensi.

  6. Menggabungkan ukuran kedudukan dan peraturan pengurusan risiko.

  7. Kemampuan pelbagai aset melalui kamus data lambung.

  8. Komponen yang boleh dioptimumkan untuk meningkatkan keuntungan dan mengurangkan penggunaan.

Risiko

Beberapa risiko yang perlu dipertimbangkan:

  1. Hull MA mempunyai lag dan mungkin terlepas perubahan trend.

  2. Stoch RSI boleh menghasilkan isyarat berlebihan jika parameter tidak dioptimumkan.

  3. Ketidaksesuaian antara parameter Hull dan Stoch boleh menyebabkan isyarat yang buruk.

  4. Band badan yang terlalu lebar atau sempit akan menjejaskan kualiti isyarat.

  5. Pasaran yang tidak stabil baru-baru ini mencabar penunjuk jangka sederhana/panjang.

  6. Ketidaksesuaian data antara Hull dan Stoch menyebabkan isyarat palsu.

  7. Perubahan trend yang tajam yang tidak dicatatkan oleh Hull boleh menyebabkan kerugian.

  8. Perlu diperluaskan ujian pada pelbagai jangka masa dan simbol.

Beberapa cara untuk menangani masalah ini:

  1. Memendekkan panjang Hull MA untuk sensitiviti trend yang lebih besar.

  2. Mengoptimumkan Stoch RSI untuk menapis salib palsu.

  3. Cari lebar saluran band Hull yang optimum.

  4. Tambah penunjuk pengesahan tambahan seperti MACD.

  5. Menggabungkan strategi stop loss untuk mengawal risiko.

Peluang Pengoptimuman

Beberapa cara strategi ini boleh ditingkatkan:

  1. Uji pada lebih banyak simbol dalam pelbagai jangka masa untuk mengesahkan ketahanan.

  2. Menggabungkan mekanikal stop loss seperti berhenti belakang atau purata bergerak.

  3. Mengoptimumkan peraturan kemasukan, menetapkan penapis yang lebih ketat untuk mengurangkan isyarat palsu.

  4. Terokai menggunakan band Hull untuk lebih menentukan sokongan dan rintangan.

  5. Menilai penunjuk pengesahan tambahan untuk meningkatkan kebolehpercayaan isyarat.

  6. Pengoptimuman parameter untuk panjang, tahap overbought / oversold, dll.

  7. Memperkenalkan ukuran kedudukan dan pengurusan risiko yang lebih baik.

  8. Tambah masuk, hentikan kerugian dan mengambil keuntungan peraturan penting untuk perdagangan langsung.

  9. Mengoptimumkan panjang lambung untuk sensitiviti trend yang lebih baik.

  10. Tambah penapis atau penunjuk pengesahan untuk meningkatkan kualiti isyarat.

  11. Meneroka band Hull untuk tahap sokongan / rintangan dinamik.

  12. Mengoptimumkan parameter Stoch RSI seperti panjang, overbought / oversold.

  13. Melaksanakan ukuran kedudukan dan pengurusan risiko yang maju.

Kesimpulan

Secara keseluruhan, ini adalah pendekatan yang berkesan menggabungkan trend dan momentum. Walau bagaimanapun, kelemahan penunjuk yang melekat bermakna isyarat tidak boleh dipercayai secara buta tanpa pengoptimuman dan kawalan risiko yang lebih lanjut. Dengan parameter yang halus, penapis tambahan, dan stop loss, strategi ini menawarkan potensi. Ujian yang lebih luas diperlukan untuk parameter, pengurusan risiko, dan saiz kedudukan untuk menjadikannya kukuh dan menguntungkan untuk perdagangan langsung.


/*backtest
start: 2023-10-16 00:00:00
end: 2023-10-17 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Basic Hull Ma Pack tinkered by InSilico 
//Converted to Strategy by DashTrader
strategy("Hull Suite + Stoch RSI Strategy v1.1", overlay=true, pyramiding=1, initial_capital=100, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.023)
strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"])
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
//////////////////////////////////////////////////////////////////////
// Testing Start dates
testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

stoch_upper_input = input(88, "Stoch Upper Threshold", type=input.float)
stoch_lower_input = input(5, "Stoch Lower Threshold", type=input.float)
sl = input(0.7, "SL %", type=input.float, step=0.1)
tp = input(2.1, "TP %", type=input.float, step=0.1)
// slowEMA = ema(close, slowEMA_input)

// vwap = vwap(close)
// rsi = rsi(close, rsi_input)


// stoch rsi
smoothK = 3
smoothD = 3
lengthRSI = 14
lengthStoch = 14
rsi1 = rsi(close, 14)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
// Component Code Stop
//////////////////////////////////////////////////////////////////////
//INPUT
src = input(close, title="Source")
modeSwitch = input("Hma", title="Hull Variation", options=["Hma", "Thma", "Ehma"])
length = input(180, title="Length(180-200 for floating S/R , 55 for swing entry)")
switchColor = input(true, "Color Hull according to trend?")
candleCol = input(false,title="Color candles based on Hull's Trend?")
visualSwitch  = input(true, title="Show as a Band?")
thicknesSwitch = input(1, title="Line Thickness")
transpSwitch = input(40, title="Band Transparency",step=5)

//FUNCTIONS
//HMA
HMA(_src, _length) =>  wma(2 * wma(_src, _length / 2) - wma(_src, _length), round(sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>  ema(2 * ema(_src, _length / 2) - ema(_src, _length), round(sqrt(_length)))
//THMA    
THMA(_src, _length) =>  wma(wma(_src,_length / 3) * 3 - wma(_src, _length / 2) - wma(_src, _length), _length)
    
//SWITCH
Mode(modeSwitch, src, len) =>
      modeSwitch == "Hma"  ? HMA(src, len) :
      modeSwitch == "Ehma" ? EHMA(src, len) : 
      modeSwitch == "Thma" ? THMA(src, len/2) : na
      
//OUT
HULL = Mode(modeSwitch, src, length)
MHULL = HULL[0]
SHULL = HULL[2]

//COLOR
hullColor = switchColor ? (HULL > HULL[2] ? #00ff00 : #ff0000) : #ff9800

//PLOT
///< Frame
Fi1 = plot(MHULL, title="MHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(visualSwitch ? SHULL : na, title="SHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
///< Ending Filler
fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch)
///BARCOLOR
barcolor(color = candleCol ? (switchColor ? hullColor : na) : na)

bgcolor(color = k < stoch_lower_input  and crossover(k, d) ? color.green : na)
bgcolor(color = d > stoch_upper_input and crossover(d, k) ? color.red : na)

notInTrade = strategy.position_size == 0

if notInTrade and HULL[0] > HULL[2] and testPeriod() and k < stoch_lower_input and crossover(k, d)
// if HULL[0] > HULL[2] and testPeriod()
    stopLoss = close * (1 - sl / 100) 
    profit25 = close * (1 + (tp / 100) * 0.25)
    profit50 = close * (1 + (tp / 100) * 0.5)
    takeProfit = close * (1 + tp / 100)
    
    
    strategy.entry("long", strategy.long, alert_message="buy")
    strategy.exit("exit long 25%", "long", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit long 50%", "long", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

    
if notInTrade and HULL[0] < HULL[2] and testPeriod() and d > stoch_upper_input and crossover(d, k)
// if HULL[0] < HULL[2] and testPeriod()
    stopLoss = close * (1 + sl / 100)
    profit25 = close * (1 - (tp / 100) * 0.25)
    profit50 = close * (1 - (tp / 100) * 0.5)
    takeProfit = close * (1 - tp / 100)
    
    

    strategy.entry("short", strategy.short, alert_message="sell")
    strategy.exit("exit short 25%", "short", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit short 50%", "short", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

// var table winrateDisplay = table.new(position.bottom_right, 1, 1)
// table.cell(winrateDisplay, 0, 0, "Winrate: " + tostring(strategy.wintrades / strategy.closedtrades * 100, '#.##')+" %", text_color=color.white)

Lebih lanjut