Chiến lược theo xu hướng dựa trên đường trung bình động kép và chỉ báo MACD


Ngày tạo: 2023-11-02 16:09:08 sửa đổi lần cuối: 2023-11-02 16:09:08
sao chép: 2 Số nhấp chuột: 821
1
tập trung vào
1621
Người theo dõi

Chiến lược theo xu hướng dựa trên đường trung bình động kép và chỉ báo MACD

Tổng quan

Ý tưởng cốt lõi của chiến lược này là kết hợp hai đường trung bình và chỉ số MACD để đánh giá hướng xu hướng, để thực hiện giao dịch theo dõi xu hướng. Khi đường trung bình ngắn hạn vượt qua đường trung bình dài hạn, đánh giá là cơ hội đà; Khi đường trung bình ngắn hạn vượt qua đường trung bình dài hạn, đánh giá là cơ hội giảm giá.

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

  1. Tính toán đường nhanh EMA (đường thứ 12), đường chậm EMA (đường thứ 26) và đường tín hiệu EMA (đường thứ 9).

  2. Tính MACD cột ((cột nhanh - cột chậm) và MACD tín hiệu ((cột 9 của MACD) }}

  3. Tính đường 50 ngày và đường 200 ngày làm đường trung bình để đánh giá xu hướng lớn.

  4. MACD trục trên 0 là tín hiệu đi lên, dưới 0 là tín hiệu đi xuống.

  5. Đường trung bình ngắn hạn được sử dụng như một tín hiệu báo hiệu.

  6. Đường nhanh đi qua đường chậm và đường trung bình ngắn hạn đi qua đường trung bình dài hạn như một tín hiệu giảm giá.

  7. Mỗi lần thay đổi hướng đường trung bình, cho phép vào thị trường một vài lần giao dịch, được kiểm soát bởi các tham số Max trades after EMA cross.

  8. Sau khi nhập vào, bằng cách dừng lỗ để thanh toán các vị trí.

Lợi thế chiến lược

  1. Các nhà đầu tư có thể sử dụng các phương pháp này để đánh giá các xu hướng lớn và tránh giao dịch ngược.

  2. MACD đánh giá điểm mua và bán, có thể bắt kịp xu hướng chuyển đổi.

  3. Kết hợp với đường hai chiều và MACD, nó có thể nắm bắt được thời gian đầu vào tốt hơn trong xu hướng.

  4. Cài đặt số lần giao dịch tối đa để tránh bị chặn.

  5. Kiểm soát rủi ro của hệ thống ngăn chặn.

  6. Có thể có được sự kết hợp tham số tốt hơn bằng cách tối ưu hóa tham số.

Rủi ro chiến lược

  1. Những sai lầm trong việc đánh giá xu hướng lớn dẫn đến tổn thất trong giao dịch ngược. Yêu cầu chênh lệch đường trung bình có thể được nới lỏng thích hợp để đảm bảo nắm bắt xu hướng lớn.

  2. MACD có tín hiệu mua và bán bị chậm trễ, có thể dẫn đến việc tham gia quá sớm hoặc quá muộn. Các tham số MACD có thể được điều chỉnh, hoặc có thể kết hợp với các tín hiệu lọc của các chỉ số khác.

  3. Chống hư hỏng được thiết lập không đúng cách, có thể quá nới lỏng hoặc quá chặt, dẫn đến quá nhiều hoặc không đủ hư hỏng. Cần thử nghiệm tối ưu hóa tham số cho các giống khác nhau.

  4. Các tham số tối ưu hóa khó khăn, các giống và thời gian khác nhau cần các kết hợp tham số khác nhau, cần một lượng lớn công việc thử nghiệm trước.

Hướng tối ưu hóa chiến lược

  1. Thử các chỉ số khác để đánh giá xu hướng lớn, chẳng hạn như chỉ số KD.

  2. Cố gắng kết hợp các chỉ số khác hỗ trợ MACD lọc tín hiệu, chẳng hạn như băng Brin, ATR dừng.

  3. Tối ưu hóa các tham số dừng lỗ, tìm ra các tham số kết hợp tốt nhất cho các thử nghiệm riêng biệt đối với các giống khác nhau.

  4. Sử dụng phương pháp tối ưu hóa tiến bộ và tối ưu hóa ngẫu nhiên để tìm kiếm các tổ hợp tham số tốt hơn.

  5. Thêm các cơ chế giảm tần suất giao dịch, chẳng hạn như thiết lập vùng cấm giao dịch gần trục MACD.

  6. Tự động tối ưu hóa tham số và kết hợp cho nhiều giống.

Tóm tắt

Chiến lược này kết hợp sử dụng hai đường ngang để xác định xu hướng lớn và lợi thế của MACD để xác định điểm mua bán, tạo thành một chiến lược theo dõi xu hướng mạnh mẽ hơn. Bằng cách tối ưu hóa tham số và kết hợp các chỉ số, bạn có thể nâng cao hiệu suất chiến lược hơn nữa. Nói chung, chiến lược này có khả năng chống rủi ro và lợi nhuận mạnh mẽ, đáng để xem xét trong thực tế.

Mã nguồn chiến lược
/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="ComiCo - Joel on Crypto - MACD Scalping", shorttitle="ComiCo - Joel on Crypto - MACD Scalping")
// Getting inputs
slow_length1 = input(title="EMA Trend 1", defval=50)
slow_length2 = input(title="EMA Trend 2 ", defval=200)
fast_length = input(title="MACD Fast Length", defval=12)
slow_length = input(title="MACD Slow Length", defval=26)
signal_length = input.int(title="MACD Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
src = input(title="MACD Source", defval=close)

i_switch = input.string(title="Tick Highlight", defval="Moving average" ,options=["Moving average","Fixed value" ])
i_switch2 = input.string(title="Tick Source", defval="Highest bar" ,options=["Highest bar","Average","Last bar"])

signal_lengthup = input.int(title="Upticks Avg. Length",  minval = 1, maxval = 5000, defval = 72)
signal_lengthdown = input.int(title="Downticks Avg. Length",  minval = 1, maxval = 5000, defval = 72)

signal_lengthMA = input.float(title="Ticks Avg. Multiplier",  minval = 0, maxval = 5000, defval = 2, step = 0.1)

sma_source = "EMA"
sma_signal = "EMA"
// Plot colors

col_grow_above = #26A69A
col_fall_above =#B2DFDB
col_grow_below = #FFCDD2
col_fall_below = #FF5252
// Calculating

fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)

time_macd=timeframe.period=="1"?"1": timeframe.period=="3"?"1": timeframe.period=="5"?"1": timeframe.period=="15"?"3":timeframe.period=="30"?"5":timeframe.period=="60"?"15":timeframe.period=="120"?"30":timeframe.period=="240"?"60":timeframe.period=="D"?"240":timeframe.period=="W"?"D":timeframe.period=="M"?"W":timeframe.period=="12M"?"M":timeframe.period



macd = fast_ma - slow_ma
macd1=request.security(syminfo.tickerid, time_macd, macd)
signal = sma_signal == "SMA" ? ta.sma(macd1, signal_length) : ta.ema(macd1, signal_length)

ema50=ta.ema(close,slow_length1)
ema200=ta.ema(close ,slow_length2)

var TradeCounter = 0
MaxCount = input.int(title = "Max trades after EMA cross", minval = 0, maxval = 1000, defval = 3)
bull = ema50>ema200
if bull != bull[1]
    TradeCounter := 0


hist = request.security(syminfo.tickerid, time_macd, macd1 - signal)


f() => [hist[4],hist[3],hist[2],hist[1], hist]
ss=request.security(syminfo.tickerid, time_macd, hist, barmerge.gaps_on,barmerge.lookahead_off)



[ss5,ss4,ss3,ss2,ss1]=request.security(syminfo.tickerid, time_macd, f(), barmerge.gaps_on,barmerge.lookahead_off)



a = array.from(ss5,ss4,ss3,ss2,ss1)

s3=i_switch2=="Highest bar"?(ss>0? array.max(a, 0) : array.min(a, 0)):i_switch2=="Average"?array.avg(a):i_switch2=="Last bar"?ss1:0

saa=timeframe.period == '1'? ss:s3

saa2=timeframe.period == '1'? ss:s3*signal_lengthMA


colorss=(s3>=0 ? (s3[1] < s3 ? col_grow_above : col_fall_above) : (s3[1] < s3 ? col_grow_below : col_fall_below))


saadown = saa2
saaup = saa2

saadown:=saa>=0? saa2:saadown[1]

saaup:=saa<0? saa2:saaup[1]



verr=ta.ema(saadown,signal_lengthup)
dowww=ta.ema(saaup,signal_lengthdown)

ss22=plot(verr, title="Avg. Cloud Upper 1", color=color.new(color.white, 100))
ss33=plot(dowww, title="Avg. Cloud Lower 1", color=color.new(color.white, 100))

fill(ss22, ss33, color.new(color.white, 93), title="Avg. Cloud Background")

fixeduptick = input(title="Fixed Uptick Value", defval=30)
fixeddowntick = input(title="Fixed Downtick Value", defval=-30)
minl = i_switch=="Fixed value"? fixeduptick  :  verr
maxl = i_switch=="Fixed value"? fixeddowntick : dowww 

plot(minl, title="Avg. Cloud Upper 2", color=color.new(color.white, 81))
plot(maxl, title="Avg. Cloud Lower 2", color=color.new(color.white, 81))


colors2= s3<=minl and s3>=maxl ? #2a2e39 : colorss

coro2=s3>0? ema50>ema200 ? #2a2e39 :  colors2 : ema50<ema200 ? #2a2e39: colors2
plot(saa, title="Histogram", style=plot.style_columns, color=coro2)

LimitDiff = input.float(title="Limit Price Difference",  minval = 0, maxval = 0.1, defval = 0.005, step = 0.0005)
TP = input.float(title="Take Profit",  minval = 0, maxval = 0.1, defval = 0.005, step = 0.0005)
SL = input.float(title="Stop Loss",  minval = 0, maxval = 0.1, defval = 0.004, step = 0.0005)

minEMAdiff = input.float(title = "Min EMA difference", defval = 100, step = 10)

if #2a2e39 != coro2
    a22 = 0
    if ema50<ema200 and TradeCounter < MaxCount and math.abs(ema50-ema200) > minEMAdiff
        LimitPrice = close * (1 + LimitDiff)
        strategy.entry("enter short", strategy.short, limit = LimitPrice)
        strategy.exit("exit short", "enter short", limit = LimitPrice * (1 - TP), stop = LimitPrice * (1 + SL))
        TradeCounter := TradeCounter + 1
    if ema50>ema200 and TradeCounter < MaxCount and math.abs(ema50-ema200) > minEMAdiff
        LimitPrice = close * (1 - LimitDiff)
        strategy.entry("enter long", strategy.long, limit = LimitPrice)
        strategy.exit("exit long", "enter long", limit = LimitPrice * (1 + TP), stop = LimitPrice * (1 - SL))
        TradeCounter := TradeCounter + 1

//alertcondition(#2a2e39 != coro2 , title='MACD Tick Alert', message='Joel on Crypto - MACD Tick Alert')