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.
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.
Manfaat utama dari strategi ini adalah:
Hull MA secara efektif mengidentifikasi arah tren pasar secara keseluruhan.
Stoch RSI menentukan tingkat overbought/oversold untuk entri waktu.
Menggunakan keduanya bersama mengurangi sinyal palsu dan menggabungkan kekuatan.
Fleksibilitas untuk mengoptimalkan parameter untuk simbol dan kerangka waktu yang berbeda.
Band lambung mengidentifikasi dukungan dan resistensi dinamis potensial.
Ini mencakup ukuran posisi dan aturan manajemen risiko.
Kemampuan multi-aset melalui kamus data lambung.
Komponen yang dapat dioptimalkan untuk meningkatkan profitabilitas dan mengurangi penggunaan.
Beberapa risiko yang perlu dipertimbangkan:
Hull MA memiliki lag dan mungkin melewatkan perubahan tren.
Stoch RSI dapat menghasilkan sinyal yang berlebihan jika parameter tidak dioptimalkan.
Ketidakcocokan antara parameter Hull dan Stoch dapat menyebabkan sinyal yang buruk.
Band lambung yang terlalu lebar atau sempit akan mempengaruhi kualitas sinyal.
Pasar volatile baru-baru ini menantang indikator jangka menengah/panjang.
Ketidaksesuaian data antara Hull dan Stoch menyebabkan sinyal palsu.
Perubahan tren yang tajam yang tidak terdeteksi oleh Hull dapat menyebabkan kerugian.
Butuh pengujian diperluas pada beberapa kerangka waktu dan simbol.
Beberapa cara untuk mengatasi hal-hal ini:
Singkatkan panjang MA Hull untuk sensitivitas tren yang lebih besar.
Optimalkan Stoch RSI untuk menyaring salib palsu.
Cari lebar saluran band Hull yang optimal.
Tambahkan indikator konfirmasi tambahan seperti MACD.
Sertakan strategi stop loss untuk mengendalikan risiko.
Beberapa cara strategi ini dapat ditingkatkan:
Uji lebih banyak simbol di berbagai jangka waktu untuk memverifikasi ketahanan.
Sertakan mekanisme stop loss seperti trailing stop atau moving average.
Mengoptimalkan aturan masuk, mengatur filter yang lebih ketat untuk mengurangi sinyal palsu.
Jelajahi menggunakan band Hull untuk lebih menentukan dukungan dan resistensi.
Evaluasi indikator konfirmasi tambahan untuk meningkatkan keandalan sinyal.
Optimasi parameter untuk panjang, tingkat overbought / oversold, dll.
Memperkenalkan ukuran posisi yang lebih baik dan manajemen risiko.
Aturan masuk, stop loss dan take profit yang penting untuk trading langsung.
Optimalkan panjang Hull untuk sensitivitas tren yang lebih baik.
Tambahkan filter atau indikator konfirmasi untuk meningkatkan kualitas sinyal.
Jelajahi band Hull untuk tingkat dukungan / resistensi dinamis.
Mengoptimalkan parameter RSI seperti panjang, overbought/oversold.
Menerapkan ukuran posisi dan manajemen risiko yang canggih.
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)