
Chiến lược này kết hợp lợi thế của chỉ số động lượng và trung bình di chuyển để theo dõi xu hướng giá cổ phiếu trong thời gian trung bình và tạo ra lợi nhuận ổn định.
Chiến lược này chủ yếu dựa trên ba biến thể của Hull Moving Average, bao gồm Hull Moving Average ((HMA), Hull Moving Average ((WHMA) và Hull Moving Average ((EHMA). Theo mã, chiến lược cho phép người dùng chuyển đổi giữa ba loại Hull MA.
HMA được tính bằng công thức:
HMA = WMA(2*WMA(close,n/2)-WMA(close,n),sqrt(n))
Trong đó, WMA đại diện cho trung bình di chuyển trọng lượng, n đại diện cho tham số chu kỳ. HMA phản ứng nhanh hơn với biến động giá so với SMA (trung bình di chuyển đơn giản).
Công thức tính toán của WHMA và EHMA tương tự như HMA. Chính sách cho HMA là tùy chọn mặc định.
Sau khi tính toán HMA, chiến lược này sử dụng giá trị đường trung bình của HMA làm tín hiệu giao dịch. Khi giá vượt qua đường trung bình HMA, nhập nhiều; Khi giá vượt qua đường trung bình HMA, xuất cảnh bằng phẳng. Như vậy, nó sử dụng đường trung bình HMA để theo dõi xu hướng giá trong thời gian trung bình và thực hiện lợi nhuận.
Chiến lược này có những ưu điểm sau đây so với chiến lược trung bình di chuyển truyền thống:
Chiến lược này cũng có một số rủi ro:
Phản ứng:
Chiến lược này cũng có thể được tối ưu hóa bằng cách:
Chiến lược giao dịch trung bình chuyển động này tích hợp lợi thế phản ứng nhanh của Hull MA, có thể theo dõi hiệu quả xu hướng giá cổ phiếu trong giai đoạn trung hạn, mở nhiều vị trí và dừng lỗ vào thời điểm thích hợp, phản hồi lịch sử hoạt động tốt. Bằng cách tối ưu hóa thêm các tham số thiết lập, lựa chọn phạm vi cổ phiếu, chiến lược này có thể thu được lợi nhuận vượt trội ổn định hơn.
/*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)