Chiến lược phán đoán xu hướng động MACD dựa trên đường trung bình động


Ngày tạo: 2024-02-19 10:48:11 sửa đổi lần cuối: 2024-02-19 10:48:11
sao chép: 0 Số nhấp chuột: 598
1
tập trung vào
1617
Người theo dõi

Chiến lược phán đoán xu hướng động MACD dựa trên đường trung bình động

Tổng quan

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

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

  1. Định hướng xu hướng hiện tại dựa trên sự chênh lệch đường trung bình nhanh của MACD và mối quan hệ đường tín hiệu của nó
  2. MACD khác biệt trên đường tín hiệu là tín hiệu đa, dưới là tín hiệu trống
  3. Tiến hành MACD chênh lệch và MACD cột đồng chiều tăng cường tín hiệu chiến lược
  4. Thêm mô-đun phán đoán xuyên chu kỳ, lấy chỉ số MACD chu kỳ thời gian cao hơn làm cơ sở điều chỉnh sóng và vị trí của tín hiệu
  5. Hoạt động điều chỉnh vị trí, giảm quy mô vị trí khi tín hiệu xuyên chu kỳ yếu, tăng vị trí khi tín hiệu tăng

Phân tích lợi thế

  1. Chỉ số MACD có hiệu quả cao hơn trong việc xác định xu hướng
  2. Sự khác biệt MACD kết hợp và xác thực kép đường cột, có thể cải thiện độ chính xác của tín hiệu
  3. Quá trình phán đoán xuyên chu kỳ giúp tăng sự ổn định của chiến lược, tránh bị sai lệch bởi tín hiệu tần số cao
  4. Động thái điều chỉnh vị thế giúp chiến lược nắm bắt cơ hội tốt hơn 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 bị chậm và có thể gây ra hiệu quả tín hiệu kém
  • Giải pháp: Tăng giá trị chênh lệch giữa đường trung bình nhanh và đường trung bình chậm để bắt tín hiệu sớm hơn
  1. Các tín hiệu xuyên chu kỳ không nhất thiết phải chính xác và có thể gây hiểu nhầm chiến lược
  • Giải pháp: đưa ra cơ chế điều chỉnh vị trí động, để chiến lược chu kỳ chính chiếm ưu thế
  1. Chiến lược kết hợp nhiều yếu tố có thể không ổn định tổng thể
  • Giải pháp: Điều chỉnh tỉ trọng các tham số của chiến lược để đảm bảo sự ổn định tổng thể

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

  1. Kiểm tra hiệu quả của các kết hợp các tham số chu kỳ khác nhau
  2. Kiểm tra tác động của các kết hợp khác nhau trên các chiến lược
  3. Điều chỉnh các tham số chỉ số MACD, chẳng hạn như chu kỳ đường trung bình chậm, chu kỳ đường tín hiệu
  4. Kiểm tra hiệu quả của các yếu tố điều chỉnh vị trí khác nhau
  5. Thử nghiệm phản hồi trên các giống khác

Tóm tắt

Các MACD đường trung bình kết hợp các chiến lược xu hướng động xuyên chu kỳ, tích hợp các lợi thế của các chỉ số cổ điển phán đoán và nhiều khung thời gian tham khảo. Bằng cách tối ưu hóa tham số và thử nghiệm kết hợp, có thể xây dựng một chiến lược theo dõi xu hướng ổn định hơn, lợi nhuận tốt.

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