Chiến lược giao dịch xu hướng dựa trên trung bình động động

Tác giả:ChaoZhang, Ngày: 2023-12-21 11:33:50
Tags:

img

Tổng quan

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.

Nguyên tắc

Chiến lược này chủ yếu dựa trên ba biến thể Hull Moving Average (HMA) HMA thông thường, HMA cân nhắc (WHMA) và HMA theo cấp số (EHMA).

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.

Ưu điểm

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:

  1. Phản ứng nhanh hơn và khả năng theo dõi xu hướng mạnh mẽ hơn cho các mục nhập và dừng kịp thời
  2. Tỷ lệ giao dịch không cần thiết thấp hơn, tránh theo đuổi đợt tăng và dừng
  3. Các thông số HMA linh hoạt để thích nghi với nhiều môi trường thị trường hơn
  4. Các biến thể HMA có thể chuyển đổi để mở rộng khả năng áp dụng

Rủi ro

Ngoài ra còn có một số rủi ro:

  1. Tạo ra nhiều tín hiệu sai trong các thị trường giới hạn phạm vi, tăng tần suất giao dịch và chi phí trượt
  2. Không có điểm đảo ngược xu hướng nếu các thông số HMA không được thiết lập đúng cách, dẫn đến rủi ro mất mát lớn hơn
  3. Rủi ro thanh khoản và trượt lớn khi giao dịch cổ phiếu thanh khoản thấp

Giải pháp:

  1. Tối ưu hóa các thông số HMA cho các giá trị tốt nhất
  2. Thêm các chỉ số khác để xác định các điểm đảo ngược xu hướng
  3. Chọn các dự trữ thanh khoản với khối lượng trung bình hàng ngày lớn

Cải tiến

Chiến lược cũng có thể được tăng cường từ các khía cạnh sau:

  1. Thêm âm lượng hoặc các bộ lọc khác để đảm bảo độ tin cậy tín hiệu
  2. Kết hợp MACD, KDJ cho thời gian tốt hơn, cải thiện tỷ lệ thắng
  3. Điều chỉnh thời gian HMA dựa trên các thử nghiệm ngược kinh doanh thực tế
  4. Chuyển sang WHMA hoặc EHMA có hiệu suất tốt nhất cho các cổ phiếu cụ thể
  5. Thêm các cơ chế dừng lỗ để kiểm soát lỗ giao dịch duy nhất

Tóm lại

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)



Thêm nữa