
Strategi ini menggunakan Indikator Hall untuk menentukan arah tren, kemudian digabungkan dengan Indikator Random untuk masuk ke dalam. Ketika Hall melintasi rel di tengah rel, dia masuk ke dalam, dan masuk ke dalam ketika dia melintasi.
Strategi perdagangan ini menggunakan indikator Hall untuk menentukan arah tren pasar, kemudian menggunakan indikator acak untuk masuk spesifik.
Pertama, strategi mendefinisikan metode perhitungan indikator Hall, termasuk rumus perhitungan untuk mid-trail, up-trail, dan down-trail. Mid-trail menggunakan perhitungan rata-rata bergerak berbobot WMA, dengan up-trail dan down-trail masing-masing sebagai deflection dari mid-trail.
Kemudian, berdasarkan hubungan antara rel tengah dan rel atas dan bawah, menilai arah tren. Ketika rel tengah melewati rel bawah, mewakili harga yang lebih tinggi, termasuk tren bullish; Ketika rel bawah melewati rel, harga yang lebih tinggi, termasuk tren bullish.
Selain itu, strategi ini juga mendefinisikan metode perhitungan indikator acak, termasuk rumus perhitungan nilai K dan nilai D. Nilai K digunakan untuk smoothing SMA RSI, dan nilai D untuk smoothing SMA lagi dari nilai K.
Setelah menilai arah tren, jika bullish, maka ketika K-line dari indikator acak melintasi D-line dari bawah zona oversold; jika bearish, maka ketika K-line melintasi D-line dari zona oversold.
Dengan demikian, kombinasi dari penilaian tren dari indikator Hall dan penilaian overbought dan oversold dari indikator acak, dapat membuat entri yang lebih stabil dan akurat.
Keuntungan terbesar dari strategi ini adalah kombinasi dari penilaian tren dan penilaian overbought dan oversold, yang memungkinkan analisis multi-dimensi dari pasar, dengan akurasi masuk yang lebih tinggi.
Secara khusus, ada beberapa keuntungan utama:
Indikator Hall dapat secara efektif menentukan arah tren pasar, untuk posisi tingkat besar;
Indikator acak untuk menilai overbought dan oversold, untuk mengetahui perubahan kekuatan jual beli dan waktu masuk yang lebih baik;
Kedua teknologi ini dapat digunakan bersama-sama, dan masing-masing menggunakan keunggulan masing-masing untuk saling memverifikasi sinyal dan mengurangi sinyal palsu.
Adaptasi yang fleksibel terhadap varietas dan periode waktu yang berbeda dengan penyesuaian parameter;
Menggunakan pergeseran orbit tengah untuk membentuk saluran perdagangan di atas dan bawah orbit yang dapat menemukan dukungan dan resistensi potensial.
STOP LOSS, EXIT ON TARGETS persen digunakan untuk skala posisi
Use of hull data Dictionary gives multiple asset class flexibility
Optimisasi yang dipilih dapat meningkatkan stabilitas strategi dan pengembalian
Strategi ini juga memiliki beberapa risiko yang perlu diperhatikan, terutama:
Indeks Hall memiliki keterlambatan dan mungkin akan kehilangan titik balik tren, menyebabkan kerugian yang tidak perlu.
Setting parameter indikator acak yang tidak tepat dapat menghasilkan sinyal berlebih, sinyal silang dari garis K dan garis D harus disaring dengan tepat.
Indikator Hall digunakan bersama dengan indikator acak. Jika parameter tidak cocok, sinyal yang salah juga dapat terjadi.
Terlalu besar atau terlalu kecil lebar lintasan dapat mempengaruhi kualitas sinyal perdagangan, yang memerlukan pengujian yang cermat untuk mencari parameter optimal.
Dalam beberapa hari terakhir, situasi tidak stabil, dan indikator garis tengah dan panjang mungkin tidak bekerja dengan baik.
Data mismatches between hull and stoch causing false signals
Sharp trend changes not caught by hull can cause losses
Testing on more timeframes/symbols needed to verify robustness
Ada beberapa cara untuk mengoptimalkan risiko ini:
Hal ini dilakukan untuk mempersingkat panjang indikator Hall dan meningkatkan sensitivitas terhadap perubahan tren.
Optimalkan parameter indikator acak, mengurangi sinyal palsu.
Menyesuaikan parameter atas dan bawah untuk mencari lebar saluran optimal.
Menambahkan sinyal validasi indikator lainnya, seperti MACD dan sebagainya.
Meningkatkan strategi stop loss untuk mengendalikan risiko.
Strategi ini juga dapat dioptimalkan dalam beberapa hal:
Uji lebih banyak varietas dan lebih banyak parameter siklus waktu untuk memverifikasi stabilitas strategi.
Meningkatkan mekanisme penghentian kerugian. Mengontrol risiko yang lebih baik, seperti penghentian kerugian, penghentian kerugian bergerak, dll.
Optimalkan logik kondisi masuk, atur kondisi penyaringan yang lebih ketat, dan kurangi sinyal palsu.
Hal ini dilakukan untuk mempelajari bagaimana saluran indikator Hall dapat digunakan untuk lebih menentukan posisi dukungan dan resistensi.
Mencari apakah sinyal verifikasi dapat ditambahkan ke indikator lain.
Pengoptimalan parameter. Pengoptimalan parameter seperti panjang indikator Hall, indikator acak K, parameter kelancaran D, dll.
Tambahkan fungsi manajemen posisi. Sesuaikan ukuran posisi berdasarkan jumlah penarikan dan kemenangan beruntun.
Penambahan aturan stop loss dan stop stop.
Optimize hull length parameter for better trend sensitivity
Add additional filters or confirming indicators to improve signal quality
Explore using hull bands to identify dynamic support/resistance levels
Parameter optimization for stoch RSI lengths, overbought/oversold levels
Introduce better position sizing and risk management rules
Secara keseluruhan, strategi ini mengintegrasikan penilaian tren dan penilaian overbought dan oversold untuk masuk ke pasar adalah ide yang berhasil. Namun, karena ada masalah dengan indikator itu sendiri, sinyal perdagangan tidak sepenuhnya dapat diandalkan dan perlu dioptimalkan lebih lanjut. Efek strategi ini dapat diharapkan jika dapat menemukan kombinasi parameter terbaik, dan didukung dengan indikator verifikasi dan kontrol risiko lainnya.
/*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)