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.
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.
Manfaat utama strategi ini ialah:
Hull MA secara berkesan mengenal pasti arah trend pasaran secara keseluruhan.
Stoch RSI menentukan tahap overbought / oversold untuk entri masa.
Menggunakan kedua-duanya bersama-sama mengurangkan isyarat palsu dan menggabungkan kekuatan.
Fleksibiliti untuk mengoptimumkan parameter untuk simbol dan jangka masa yang berbeza.
Band lambung mengenal pasti sokongan dan rintangan dinamik yang berpotensi.
Menggabungkan ukuran kedudukan dan peraturan pengurusan risiko.
Kemampuan pelbagai aset melalui kamus data lambung.
Komponen yang boleh dioptimumkan untuk meningkatkan keuntungan dan mengurangkan penggunaan.
Beberapa risiko yang perlu dipertimbangkan:
Hull MA mempunyai lag dan mungkin terlepas perubahan trend.
Stoch RSI boleh menghasilkan isyarat berlebihan jika parameter tidak dioptimumkan.
Ketidaksesuaian antara parameter Hull dan Stoch boleh menyebabkan isyarat yang buruk.
Band badan yang terlalu lebar atau sempit akan menjejaskan kualiti isyarat.
Pasaran yang tidak stabil baru-baru ini mencabar penunjuk jangka sederhana/panjang.
Ketidaksesuaian data antara Hull dan Stoch menyebabkan isyarat palsu.
Perubahan trend yang tajam yang tidak dicatatkan oleh Hull boleh menyebabkan kerugian.
Perlu diperluaskan ujian pada pelbagai jangka masa dan simbol.
Beberapa cara untuk menangani masalah ini:
Memendekkan panjang Hull MA untuk sensitiviti trend yang lebih besar.
Mengoptimumkan Stoch RSI untuk menapis salib palsu.
Cari lebar saluran band Hull yang optimum.
Tambah penunjuk pengesahan tambahan seperti MACD.
Menggabungkan strategi stop loss untuk mengawal risiko.
Beberapa cara strategi ini boleh ditingkatkan:
Uji pada lebih banyak simbol dalam pelbagai jangka masa untuk mengesahkan ketahanan.
Menggabungkan mekanikal stop loss seperti berhenti belakang atau purata bergerak.
Mengoptimumkan peraturan kemasukan, menetapkan penapis yang lebih ketat untuk mengurangkan isyarat palsu.
Terokai menggunakan band Hull untuk lebih menentukan sokongan dan rintangan.
Menilai penunjuk pengesahan tambahan untuk meningkatkan kebolehpercayaan isyarat.
Pengoptimuman parameter untuk panjang, tahap overbought / oversold, dll.
Memperkenalkan ukuran kedudukan dan pengurusan risiko yang lebih baik.
Tambah masuk, hentikan kerugian dan mengambil keuntungan peraturan penting untuk perdagangan langsung.
Mengoptimumkan panjang lambung untuk sensitiviti trend yang lebih baik.
Tambah penapis atau penunjuk pengesahan untuk meningkatkan kualiti isyarat.
Meneroka band Hull untuk tahap sokongan / rintangan dinamik.
Mengoptimumkan parameter Stoch RSI seperti panjang, overbought / oversold.
Melaksanakan ukuran kedudukan dan pengurusan risiko yang maju.
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)