Chiến lược định lượng của MACD

Tác giả:ChaoZhang, Ngày: 2024-02-22 15:32:42
Tags:

img

Tổng quan

Chiến lược này tạo ra chỉ số MACD bằng cách tính toán sự khác biệt giữa các đường trung bình di chuyển nhanh và chậm, và đánh giá xu hướng và khu vực mua quá mức / bán quá mức của thị trường tài chính cùng với đường tín hiệu. Nó đi dài khi MACD và đường tín hiệu tạo thành một chéo vàng trong khi giá nằm trên đường MA 200 ngày, và đi ngắn khi hình thành một chéo chết trong khi giá nằm dưới đường MA 200 ngày. Đây là một chiến lược vượt qua chéo trung bình di chuyển kép điển hình.

Chiến lược logic

Định hướng xu hướng của thị trường là theo đường MACD, và đường tín hiệu là theo đường MACD. Khi MACD và đường tín hiệu tạo thành một đường chéo vàng, đó là một tín hiệu dài để đi dài. Khi hình thành một đường chéo chết, đó là một tín hiệu ngắn để đi ngắn. Trong khi đó, nó sử dụng mối quan hệ giá với đường MA 200 ngày để lọc các tín hiệu, chỉ lấy tín hiệu dài khi giá trên 200 ngày MA và tín hiệu ngắn khi giá dưới 200 ngày MA, để tránh những biến động trong thời gian xu hướng mạnh.

Phương pháp tính toán cụ thể là:

  1. Trung bình di chuyển nhanh (EMA 12 ngày) trừ đi trung bình di chuyển chậm (EMA 26 ngày) để có được MACD
  2. EMA 9 ngày của MACD để có được đường tín hiệu
  3. MACD trừ đường tín hiệu để có được biểu đồ MACD

Khi MACD vượt qua trên đường tín hiệu trong khi cả hai đều dưới 0, đó là tín hiệu dài chéo vàng. Khi MACD vượt qua dưới đường tín hiệu trong khi cả hai đều trên 0, đó là tín hiệu ngắn chéo chết. Trong khi đó, chỉ mất thời gian dài khi giá trên 200 ngày MA, và ngắn khi giá dưới 200 ngày MA.

Ưu điểm

  1. Sử dụng hệ thống chỉ số kép tránh những hạn chế của chỉ số duy nhất và cải thiện độ chính xác
  2. Kết hợp hành động giá và bộ lọc hai MA tránh những cú sốc trong thời gian xu hướng mạnh
  3. Không gian tối ưu hóa tham số lớn để thích nghi với môi trường thị trường khác nhau
  4. Cài đặt tham số thận trọng dẫn đến tín hiệu ít hơn nhưng chất lượng cao hơn
  5. Logic chiến lược đơn giản và dễ thực hiện

Rủi ro

  1. Sự biến động của thị trường có thể gây ra lỗi trong đánh giá chỉ số
  2. Tính chất chậm của các MA ảnh hưởng đến tính kịp thời của chiến lược
  3. Ít tín hiệu có thể bỏ lỡ cơ hội xu hướng
  4. Rủi ro tối ưu hóa quá mức khi tối ưu hóa các tham số
  5. Thiếu kiểm soát rút tiền và cơ chế dừng lỗ

Có thể giảm rủi ro bằng cách rút ngắn thời gian MA, thêm các chỉ số khác và thêm stop loss.

Hướng dẫn tối ưu hóa

1. Được thử nghiệm trên các khung thời gian khác nhau từ 15m đến 1D, kết quả tối ưu trên 4H trong lợi nhuận điều chỉnh rủi ro

2. Tối ưu hóa MA nhanh và chậm để MACD nắm bắt chu kỳ, 7-21 tốt cho 15m

3.Hull MA cho MACD cho kết quả tốt

4.Stoploss kéo dài cải thiện quản lý rủi ro

Kết luận

Đây là một chiến lược rất đơn giản và thực tế, tạo ra các tín hiệu giao dịch có xác suất cao thông qua hệ thống chỉ số kép và lọc giá. Nó có tỷ lệ lợi nhuận tương đối cao, sử dụng sự kết hợp tham số MACD cổ điển để tránh tối ưu hóa quá mức. Vẫn còn nhiều chỗ để tối ưu hóa bằng cách điều chỉnh các tham số MA, thêm các chỉ số khác và cơ chế dừng lỗ để cải thiện hiệu suất hơn nữa.


/*backtest
start: 2024-02-14 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Hurmun

//@version=4
strategy("Simple MACD strategy ", overlay=true, margin_long=100, margin_short=100)


fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false)
// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


movinga2 = input(title="movinga 2", type=input.integer, defval=200)

movinga200 = sma(close, movinga2)

plot(movinga200, "MA", color.orange)
longCondition = crossover(macd, signal) and macd < 0 and signal < 0 and close > movinga200
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = crossunder(macd, signal) and macd > 0 and signal > 0 and close < movinga200
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)
    
shortProfitPerc = input(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100
longProfitPerc = input(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100
    
stoploss = input(title="stoploss in %", minval = 0.0, step=1, defval=2) /100

longStoploss = strategy.position_avg_price * (1 - stoploss)
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)

shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)
shortStoploss = strategy.position_avg_price * (1 + stoploss)
    
if (strategy.position_size > 0 )
    strategy.exit(id="XL TP", limit=longExitPrice, stop=longStoploss)






if (strategy.position_size < 0 )
    strategy.exit(id="XS TP", limit=shortExitPrice, stop=shortStoploss)

Thêm nữa