MACD Moving Average Combination Cross-Period Dynamic Trend Strategy (MACD) - Chiến lược xu hướng động xuyên giai đoạn

Tác giả:ChaoZhang, Ngày: 2024-02-19 10:48:11
Tags:

img

Tổng quan

Chiến lược này dựa trên sự kết hợp giữa các đường trung bình động của chỉ số MACD để nhận ra phán đoán xu hướng động qua các khoảng thời gian. Nó thuộc về một chiến lược theo dõi xu hướng cổ điển hơn. Nó chủ yếu đánh giá hướng và sức mạnh xu hướng hiện tại thông qua sự khác biệt giữa đường trung bình động nhanh và chậm của MACD và mối quan hệ giữa đường tín hiệu của nó. Đồng thời, phán đoán chéo thời gian được giới thiệu để cải thiện độ chính xác và điều chỉnh vị trí một cách năng động.

Nguyên tắc chiến lược

  1. Đánh giá hướng xu hướng hiện tại dựa trên sự khác biệt giữa các đường trung bình di chuyển nhanh và chậm của chỉ số MACD và mối quan hệ đường tín hiệu của nó.
  2. Sự khác biệt MACD vượt qua trên đường tín hiệu là một tín hiệu dài, và vượt qua bên dưới là một tín hiệu ngắn.
  3. Đưa ra sự khác biệt MACD và biểu đồ MACD theo cùng một hướng để tăng cường tín hiệu chiến lược.
  4. Thêm một mô-đun đánh giá chu kỳ chéo, sử dụng chỉ số MACD của khung thời gian cao hơn làm bộ lọc tín hiệu và cơ sở điều chỉnh vị trí.
  5. Điều chỉnh vị trí động, giảm kích thước vị trí khi tín hiệu chu kỳ chéo yếu hơn và tăng vị trí khi tín hiệu được tăng cường.

Phân tích lợi thế

  1. Hiệu quả của MACD trong việc xác định hướng xu hướng tương đối cao.
  2. Sự kết hợp của sự khác biệt MACD và xác minh hai lần biểu đồ có thể cải thiện độ chính xác tín hiệu.
  3. Quyết định chu kỳ chéo tăng cường tính ổn định của chiến lược và tránh bị đánh lừa bởi các tín hiệu tần số cao.
  4. Điều chỉnh vị trí năng động cho phép chiến lược nắm bắt tốt hơn các cơ hội và tăng lợi nhuận dư thừa.

Phân tích rủi ro và giải pháp

  1. Các tín hiệu MACD có độ trễ, có thể dẫn đến hiệu ứng tín hiệu kém một chút.
  • Giải pháp: Tăng sự khác biệt giữa các đường trung bình di chuyển nhanh và chậm để nắm bắt tín hiệu trước.
  1. Các tín hiệu chu kỳ chéo không nhất thiết phải chính xác và có thể gây hiểu lầm cho các chiến lược.
  • Giải pháp: Thiết lập một cơ chế điều chỉnh vị trí năng động để đảm bảo chiến lược chu kỳ chính chiếm ưu thế.
  1. Sự ổn định tổng thể của các chiến lược kết hợp nhiều yếu tố có thể không đủ.
  • Giải pháp: Điều chỉnh cẩn thận tỷ lệ trọng lượng của mỗi tham số chiến lược để đảm bảo độ bền tổng thể.

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

  1. Kiểm tra tác động của các kết hợp tham số chu kỳ khác nhau.
  2. Kiểm tra tác động của các kết hợp chéo chu kỳ khác nhau đối với hiệu quả của chiến lược.
  3. Điều chỉnh các thông số chỉ số MACD, chẳng hạn như chu kỳ trung bình di chuyển nhanh và chậm, chu kỳ đường tín hiệu, v.v.
  4. Kiểm tra tác động của các yếu tố điều chỉnh vị trí khác nhau.
  5. Kiểm tra hiệu ứng backtest trên các giống khác.

Tóm lại

Chiến lược xu hướng động liên giai đoạn của MACD này tích hợp các lợi thế của các chỉ số cổ điển và tham chiếu khung thời gian đa. Thông qua tối ưu hóa tham số và thử nghiệm kết hợp, một chiến lược theo dõi xu hướng tương đối ổn định và có lợi nhuận có thể được xây dựng. Nó đáng để thử nghiệm và áp dụng tiền thật.


/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@temelbulut
//@version=5
strategy('MACD Strategy %80', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=50)

fastLength = input.int(title='MACD Fast Length', defval=12, minval=1)
slowLength = input.int(title='MACD Slow Length', defval=26, minval=1)
signalLength = input.int(title='MACD Signal Length', defval=9, minval=1)
crossscore = input(title='Cross (buy/sell) Score', defval=10.)
indiside = input(title='indicator Direction Score', defval=8)
histside = input(title='Histogram Direction Score', defval=2)
shotsl = input(title='Show Stop Loss Line', defval=false)
Mult = input.float(title='Stop Loss Factor', defval=1.2, minval=0.1, maxval=100)
Period = input.int(title='Stop Loss Period', defval=10, minval=1, maxval=100)
lookaheadi = input(title='Lookahead', defval=true)

HTF = timeframe.period == '1' ? '5' : timeframe.period == '3' ? '15' : timeframe.period == '5' ? '15' : timeframe.period == '15' ? '60' : timeframe.period == '30' ? '60' : timeframe.period == '45' ? '60' : timeframe.period == '60' ? '240' : timeframe.period == '120' ? '240' : timeframe.period == '180' ? '240' : timeframe.period == '240' ? 'D' : timeframe.period == 'D' ? 'W' : 'W'

calc = timeframe.period == '1' ? 5 : timeframe.period == '3' ? 5 : timeframe.period == '5' ? 3 : timeframe.period == '15' ? 4 : timeframe.period == '30' ? 4 : timeframe.period == '45' ? 4 : timeframe.period == '60' ? 4 : timeframe.period == '120' ? 3 : timeframe.period == '180' ? 3 : timeframe.period == '240' ? 6 : timeframe.period == 'D' ? 5 : 1

count() =>
    indi = ta.ema(close, fastLength) - ta.ema(close, slowLength)
    signal = ta.ema(indi, signalLength)
    Anlyse = 0.0
    // direction of indi and histogram
    hist = indi - signal
    Anlyse := indi > indi[1] ? hist > hist[1] ? indiside + histside : hist == hist[1] ? indiside : indiside - histside : 0
    Anlyse += (indi < indi[1] ? hist < hist[1] ? -(indiside + histside) : hist == hist[1] ? -indiside : -(indiside - histside) : 0)
    Anlyse += (indi == indi[1] ? hist > hist[1] ? histside : hist < hist[1] ? -histside : 0 : 0)
    // cross now earlier ?
    countcross = indi >= signal and indi[1] < signal[1] ? crossscore : indi <= signal and indi[1] > signal[1] ? -crossscore : 0.
    countcross += nz(countcross[1]) * 0.6
    Anlyse += countcross
    nz(Anlyse)

Anlys = count()
AnlysHfrm = lookaheadi ? request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_on) : request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_off)
Result = (AnlysHfrm * calc + Anlys) / (calc + 1)

longCondition = ta.change(Result) != 0 and Result > 0
if longCondition
    strategy.entry('MACD Long', strategy.long,alert_message = 'MACD Long')

shortCondition = ta.change(Result) != 0 and Result < 0
if shortCondition
    strategy.entry('MACD Short', strategy.short,alert_message = 'MACD Short')

countstop(pos) =>
    Upt = hl2 - Mult * ta.atr(Period)
    Dnt = hl2 + Mult * ta.atr(Period)
    TUp = 0.
    TDown = 0.
    TUp := close[1] > TUp[1] ? math.max(Upt, TUp[1]) : Upt
    TDown := close[1] < TDown[1] ? math.min(Dnt, TDown[1]) : Dnt
    tslmtf = pos == 1 ? TUp : TDown
    tslmtf

pos = longCondition ? 1 : -1
stline = 0.
countstop__1 = countstop(pos)
security_1 = request.security(syminfo.tickerid, HTF, countstop__1)
stline := ta.change(time(HTF)) != 0 or longCondition or shortCondition ? security_1 : nz(stline[1])
plot(stline, color=shotsl ? color.rgb(148, 169, 18) : na, style=plot.style_line, linewidth=2, title='Stop Loss')



Thêm nữa