Strategi perdagangan kombinasi Hull Moving Average dan Stochastic RSI

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

img

Gambaran umum

Strategi ini menggunakan Hull Moving Average untuk menentukan arah tren dan menggabungkannya dengan Stochastic RSI untuk sinyal masuk. perdagangan panjang diambil ketika garis tengah HMA melintasi di atas garis bawah, dan perdagangan pendek ketika melintasi di bawah garis atas. Selain itu, perdagangan panjang dimasukkan ketika garis Stochastic RSI K melintasi di bawah garis D dari zona overbought, sementara perdagangan pendek dimasukkan pada persilangan di atas dari zona oversold.

Logika Strategi

Komponen kunci dari strategi ini adalah Hull Moving Average untuk arah tren dan Stochastic RSI untuk sinyal masuk waktu.

Pertama, perhitungan Hull MA mencakup rumus untuk band tengah, atas dan bawah.

Arah tren ditentukan oleh hubungan antara band tengah dan band atas/bawah. Sebuah persilangan ke atas dari garis tengah menunjukkan tekanan beli dan tren naik, sementara persilangan ke bawah menandakan peningkatan tekanan jual dan tren turun.

Perhitungan Stochastic RSI juga didefinisikan, termasuk nilai Smoothed K dan D. Nilai K menggunakan smoothing SMA pada RSI, sedangkan nilai D adalah smoothing SMA kedua pada K.

Setelah arah tren ditentukan, perdagangan panjang dilakukan ketika garis K RSI Stoch melintasi di bawah garis D dari zona overbought selama tren naik.

Menggabungkan filter tren Hull dan analisis overbought/oversold Stoch RSI memberikan pendekatan multi-faktor yang kuat untuk memasuki perdagangan.

Keuntungan

Manfaat utama dari strategi ini adalah:

  1. Hull MA secara efektif mengidentifikasi arah tren pasar secara keseluruhan.

  2. Stoch RSI menentukan tingkat overbought/oversold untuk entri waktu.

  3. Menggunakan keduanya bersama mengurangi sinyal palsu dan menggabungkan kekuatan.

  4. Fleksibilitas untuk mengoptimalkan parameter untuk simbol dan kerangka waktu yang berbeda.

  5. Band lambung mengidentifikasi dukungan dan resistensi dinamis potensial.

  6. Ini mencakup ukuran posisi dan aturan manajemen risiko.

  7. Kemampuan multi-aset melalui kamus data lambung.

  8. Komponen yang dapat dioptimalkan untuk meningkatkan profitabilitas dan mengurangi penggunaan.

Risiko

Beberapa risiko yang perlu dipertimbangkan:

  1. Hull MA memiliki lag dan mungkin melewatkan perubahan tren.

  2. Stoch RSI dapat menghasilkan sinyal yang berlebihan jika parameter tidak dioptimalkan.

  3. Ketidakcocokan antara parameter Hull dan Stoch dapat menyebabkan sinyal yang buruk.

  4. Band lambung yang terlalu lebar atau sempit akan mempengaruhi kualitas sinyal.

  5. Pasar volatile baru-baru ini menantang indikator jangka menengah/panjang.

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

  7. Perubahan tren yang tajam yang tidak terdeteksi oleh Hull dapat menyebabkan kerugian.

  8. Butuh pengujian diperluas pada beberapa kerangka waktu dan simbol.

Beberapa cara untuk mengatasi hal-hal ini:

  1. Singkatkan panjang MA Hull untuk sensitivitas tren yang lebih besar.

  2. Optimalkan Stoch RSI untuk menyaring salib palsu.

  3. Cari lebar saluran band Hull yang optimal.

  4. Tambahkan indikator konfirmasi tambahan seperti MACD.

  5. Sertakan strategi stop loss untuk mengendalikan risiko.

Peluang Optimalisasi

Beberapa cara strategi ini dapat ditingkatkan:

  1. Uji lebih banyak simbol di berbagai jangka waktu untuk memverifikasi ketahanan.

  2. Sertakan mekanisme stop loss seperti trailing stop atau moving average.

  3. Mengoptimalkan aturan masuk, mengatur filter yang lebih ketat untuk mengurangi sinyal palsu.

  4. Jelajahi menggunakan band Hull untuk lebih menentukan dukungan dan resistensi.

  5. Evaluasi indikator konfirmasi tambahan untuk meningkatkan keandalan sinyal.

  6. Optimasi parameter untuk panjang, tingkat overbought / oversold, dll.

  7. Memperkenalkan ukuran posisi yang lebih baik dan manajemen risiko.

  8. Aturan masuk, stop loss dan take profit yang penting untuk trading langsung.

  9. Optimalkan panjang Hull untuk sensitivitas tren yang lebih baik.

  10. Tambahkan filter atau indikator konfirmasi untuk meningkatkan kualitas sinyal.

  11. Jelajahi band Hull untuk tingkat dukungan / resistensi dinamis.

  12. Mengoptimalkan parameter RSI seperti panjang, overbought/oversold.

  13. Menerapkan ukuran posisi dan manajemen risiko yang canggih.

Kesimpulan

Secara keseluruhan, ini adalah pendekatan yang efektif yang menggabungkan tren dan momentum. Namun, kelemahan indikator yang melekat berarti sinyal tidak boleh dipercaya secara membabi buta tanpa optimasi dan kontrol risiko lebih lanjut. Dengan parameter yang disempurnakan, filter tambahan, dan stop loss, strategi ini menawarkan potensi. pengujian yang lebih luas diperlukan untuk parameter, manajemen risiko, dan ukuran posisi untuk membuatnya kuat 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 banyak