Chiến lược giao dịch đường trung bình động động


Ngày tạo: 2023-12-21 11:33:50 sửa đổi lần cuối: 2023-12-21 11:33:50
sao chép: 1 Số nhấp chuột: 736
1
tập trung vào
1623
Người theo dõi

Chiến lược giao dịch đường trung bình động động

Tổng quan

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.

Nguyên tắc

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.

Ưu điểm

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:

  1. Tốc độ phản ứng nhanh hơn, khả năng theo dõi xu hướng mạnh hơn, thực hiện nhập cảnh và dừng lỗ kịp thời
  2. Giảm tần suất giao dịch vô nghĩa, tránh theo đuổi đà giảm giá
  3. Tính năng Hull MA có thể được cấu hình linh hoạt để phù hợp với môi trường thị trường rộng lớn hơn
  4. Có thể chuyển đổi giữa HMA, WHMA và EHMA, mở rộng phạm vi ứng dụng

Rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Có thể tạo ra nhiều tín hiệu vô hiệu trong việc cân bằng, làm tăng tần suất giao dịch và chi phí trượt điểm
  2. Hull MA tham số được thiết lập không đúng cách có thể bỏ lỡ điểm đảo ngược xu hướng, tăng nguy cơ mất mát
  3. Chọn sai cổ phiếu, chọn cổ phiếu thiếu thanh khoản, có thể sẽ bị trượt giá lớn

Phản ứng:

  1. Tối ưu hóa tham số Hull MA để tìm giá trị tối ưu
  2. Kết hợp các chỉ số khác để đánh giá điểm đảo ngược xu hướng
  3. Lựa chọn các cổ phiếu có lưu lượng tốt và có khối lượng giao dịch cao

Hướng tối ưu hóa

Chiến lược này cũng có thể được tối ưu hóa bằng cách:

  1. Tăng khối lượng giao dịch hoặc lọc các chỉ số khác để đảm bảo độ tin cậy của tín hiệu giao dịch
  2. Kết hợp với các chỉ số khác như MACD, KDJ để xác định thời gian nhập cảnh, tăng tỷ lệ thắng
  3. Điều chỉnh tham số chu kỳ Hull MA dựa trên dữ liệu quay ngược ổ cứng
  4. Chuyển sang WHMA hoặc EHMA, kiểm tra biến thể Hull hoạt động tốt nhất trên một cổ phiếu cụ thể
  5. Tăng chiến lược dừng lỗ để kiểm soát lỗ đơn lẻ

Tóm tắt

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.

Mã nguồn chiến lược
/*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)