Strategi ini menghasilkan isyarat perdagangan berdasarkan purata bergerak dinamik untuk pergi lama apabila harga saham naik dan menutup kedudukan apabila harga jatuh. Dengan menggabungkan kelebihan penunjuk momentum dan purata bergerak, ia bertujuan untuk mengesan trend harga jangka sederhana untuk keuntungan yang stabil.
Strategi ini terutamanya bergantung kepada tiga varian Hull Moving Average (HMA)
Rumus untuk HMA ialah:
HMA = WMA(2*WMA(dekat, n/2)-WMA(dekat, n), sqrt(n))
Di mana WMA adalah Purata Bergerak Bertimbang dan n adalah parameter tempoh.
Rumus WHMA dan EHMA adalah sama. HMA dipilih sebagai pilihan lalai.
Selepas mengira HMA, strategi menggunakan nilai midline HMA sebagai isyarat perdagangan. Ia pergi lama apabila harga melintasi di atas midline HMA dan menutup kedudukan apabila harga jatuh di bawah garis. Oleh itu, ia mengesan trend jangka sederhana menggunakan midline HMA untuk keuntungan.
Berbanding dengan strategi MA tradisional, strategi ini mempunyai kelebihan berikut:
Terdapat juga beberapa risiko:
Penyelesaian:
Strategi ini juga boleh ditingkatkan dari aspek berikut:
Strategi perdagangan MA yang dinamik mengintegrasikan tindak balas cepat HMA untuk mengesan trend harga jangka sederhana dengan berkesan. Dengan membuka kedudukan panjang pada masa yang sesuai dan berhenti penutupan, ia telah menunjukkan hasil backtest yang baik. Penambahbaikan lanjut dalam penyesuaian parameter dan penapisan stok akan membawa kepada pulangan yang lebih stabil. Ini adalah strategi kuantitatif yang mudah dilaksanakan, yang boleh dikawal risiko.
/*backtest start: 2022-12-14 00:00:00 end: 2023-12-20 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy('Position Investing by SirSeff', overlay=true, pyramiding=1, 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) strat_dir_input = input.string(title='Strategy Direction', defval='long', 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(2000, '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) testPeriod() => true // Component Code Stop ////////////////////////////////////////////////////////////////////// //INPUT src = input(close, title='Source') modeSwitch = input.string('Hma', title='Hull Variation', options=['Hma', 'Thma', 'Ehma']) length = input(55, 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.int(40, title='Band Transparency', step=5) //FUNCTIONS //HMA HMA(_src, _length) => ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length))) //EHMA EHMA(_src, _length) => ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length))) //THMA THMA(_src, _length) => ta.wma(ta.wma(_src, _length / 3) * 3 - ta.wma(_src, _length / 2) - ta.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) if HULL[0] > HULL[2] and testPeriod() strategy.entry('Invest', strategy.long) if HULL[0] < HULL[2] and testPeriod() strategy.entry('Pause', strategy.short)