Strategi ini menggunakan purata bergerak Hull jangka pendek dan jangka panjang untuk menjana dan menapis isyarat perdagangan. purata bergerak Hull jangka pendek digunakan untuk menjana isyarat, sementara purata bergerak Hull jangka panjang digunakan untuk menapis isyarat. Perdagangan hanya diambil apabila purata bergerak Hull jangka pendek mengubah arah dan purata bergerak Hull jangka panjang bergerak ke arah yang sama secara keseluruhan.
Strategi ini juga menggunakan penunjuk ATR untuk menetapkan stop loss secara dinamik dan mengambil tahap keuntungan apabila memasuki perdagangan.
Purata bergerak jangka pendek Hull menangkap trend harga jangka pendek dan titik perubahan.
Purata bergerak jangka panjang Hull menentukan trend harga keseluruhan.
Perdagangan hanya diambil apabila purata bergerak jangka pendek Hull bertukar arah, dan arah barunya sejajar dengan arah purata bergerak jangka panjang Hull. Ini menapis isyarat yang bertentangan dengan trend keseluruhan dan mungkin hanya bunyi pasaran jangka pendek.
Selepas memasuki kedudukan, tahap stop loss dan take profit ditetapkan berdasarkan nilai penunjuk ATR. ATR mencerminkan turun naik pasaran dan tahap risiko. Stop loss diletakkan di bawah harga terendah sementara mengambil keuntungan sasaran harga tinggi, dengan julat terikat dengan bacaan ATR semasa.
Menggabungkan isyarat jangka pendek dan penapis jangka panjang secara berkesan mengenal pasti trend jangka menengah dan titik perubahan, mengelakkan isyarat palsu dari bunyi pasaran.
Stop loss dinamik dan mengambil keuntungan berdasarkan ATR menetapkan julat yang munasabah berdasarkan turun naik semasa, menyeimbangkan pengambilan keuntungan dan pencegahan kerugian.
Purata bergerak Hull mempunyai kelebihan fleksibiliti dan ketepatan berbanding purata bergerak standard, dengan penjejakan trend yang lebih baik.
Strategi ini bergantung pada persilangan antara purata bergerak Hull untuk menjana isyarat. persilangan palsu boleh mengakibatkan perdagangan yang buruk, yang memerlukan analisis struktur pasaran secara keseluruhan.
Dalam julat, pasaran yang berbelit-belit dengan harga berayun dalam julat dagangan, kesilapan isyarat dan perdagangan yang tidak perlu boleh menumpuk. Ini dapat dielakkan dengan menapis isyarat dengan keadaan yang lebih luas semasa pasaran tersebut.
Stop loss dan mengambil keuntungan bergantung pada ATR bermakna bacaan turun naik yang tidak tepat akan mengakibatkan penempatan yang buruk.
Penunjuk jangka pendek tambahan seperti RSI boleh meningkatkan ketepatan isyarat melalui konvergensi.
Logik penapis antara purata bergerak Hull boleh ditingkatkan untuk mempunyai keperluan kemasukan yang lebih ketat, mengelakkan isyarat palsu.
Penyelidikan penyesuaian parameter boleh mendedahkan peningkatan kestabilan dan keuntungan daripada perubahan panjang purata bergerak, tempoh ATR, dll.
Strategi ini menggabungkan penjanaan isyarat jangka pendek, penapisan isyarat jangka panjang, dan Stop Loss / Take Profit berasaskan ATR dalam rangka trend jangka menengah yang kukuh. Ia mampu mengenal pasti titik perubahan jangka menengah sambil menapis bunyi bising jangka pendek. Dengan pengoptimuman parameter dan penapis tambahan, ia dapat mencapai prestasi yang lebih baik.
/*backtest start: 2023-12-04 00:00:00 end: 2024-01-03 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Hull Filtered Strategy", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity, default_qty_value = 10, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0) // Parameters for Hull Moving Averages src = input(close, title="Source") signal_period = input(50, title="Period of signal HMA") filter_period = input(200, title="Period of filter HMA") strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"]) // Set allowed trading directions 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) // stop loss and take profit sl_factor = input(2,title="Stop Loss Factor") tp_factor = input(3,title="Take Profit Factor") atr_period = input(14, title="ATR Period (SL/TP)") // Testing Start dates testStartYear = input(2010, "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(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) // ----------------------------------------------------------------------------- // Global variables // ----------------------------------------------------------------------------- var float tp = na var float sl = na var float position = na // ----------------------------------------------------------------------------- // Functions // ----------------------------------------------------------------------------- testWindow() => time >= testPeriodStart and time <= testPeriodStop ? true : false // ----------------------------------------------------------------------------- // The engine // ----------------------------------------------------------------------------- hma_signal = hma(src, signal_period) hma_filter = hma(src, filter_period) // Used to determine exits and stop losses atr_e = atr(atr_period) // if hma_filter increases hma_trend is set to 1, if it decreases hma_trend is set to -1. If no trend is available, hma_trend is set to ß0 trend = hma_filter > hma_filter[1] ? 1 : hma_filter < hma_filter[1] ? -1 : 0 signal = hma_signal > hma_signal[1] ? 1 : hma_signal < hma_signal[1] ? -1 : 0 // ----------------------------------------------------------------------------- // signals // ----------------------------------------------------------------------------- if signal[0] == 1 and signal[1] != 1 and trend == 1 and testWindow() sl := close - sl_factor*atr_e tp := close + tp_factor*atr_e strategy.entry("HMA_LNG", strategy.long) strategy.exit("LE", "HMA_LNG", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e) if signal[0] == -1 and signal[1] != -1 and trend == -1 and testWindow() sl := close + sl_factor*atr_e tp := close - tp_factor*atr_e strategy.entry("HMA_SHRT", strategy.short) strategy.exit("SE", "HMA_SHRT", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e) if strategy.position_size != 0 sl := sl[1] tp := tp[1] // ----------------------------------------------------------------------------- // PLOT // ----------------------------------------------------------------------------- hma_s = plot(hma_signal, title="SIGNAL", color = signal == 1 ? color.green : color.red) hma_l = plot(hma_filter, title="TREND", color = trend == 1 ? color.green : color.red) plot(tp, title="TAKE PROFIT", color= strategy.position_size != 0 ? color.blue: na, linewidth=1) plot(sl, title="STOP LOSS", color= strategy.position_size != 0 ? color.red: na, linewidth = 1)