Chiến lược này tạo ra các tín hiệu giao dịch dựa trên đường trung bình động để đi dài khi giá cổ phiếu tăng và đóng các vị trí khi giá giảm. Bằng cách kết hợp các lợi thế của các chỉ số động lực và đường trung bình động, nó nhằm theo dõi xu hướng giá trung hạn để có lợi nhuận ổn định.
Chiến lược này chủ yếu dựa trên ba biến thể Hull Moving Average (HMA)
Công thức cho HMA là:
HMA = WMA ((2*WMA ((gần, n/2)-WMA ((gần, n), vuông))
Trong đó WMA là Đường trung bình động cân và n là tham số thời gian.
Công thức cho WHMA và EHMA tương tự nhau.
Sau khi tính toán HMA, chiến lược sử dụng giá trị đường trung của HMA làm tín hiệu giao dịch. Nó đi dài khi giá vượt qua đường trung của HMA và đóng các vị trí khi giá giảm xuống dưới đường. Do đó, nó theo dõi xu hướng trung hạn bằng cách sử dụng đường trung của HMA để kiếm lợi nhuận.
So với các chiến lược MA truyền thống, chiến lược này có những lợi thế sau:
Ngoài ra còn có một số rủi ro:
Giải pháp:
Chiến lược cũng có thể được tăng cường từ các khía cạnh sau:
Chiến lược giao dịch MA năng động tích hợp phản ứng nhanh của HMA để theo dõi hiệu quả xu hướng giá trung hạn. Bằng cách mở các vị trí dài vào thời điểm thích hợp và dừng đóng, nó đã chứng minh kết quả kiểm tra hậu quả tốt. Những cải tiến hơn nữa trong điều chỉnh tham số và lọc cổ phiếu sẽ dẫn đến lợi nhuận dư thừa ổn định hơn. Đây là một chiến lược định lượng dễ thực hiện, kiểm soát rủi ro.
/*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)