MACD Oscillator với EMA Crossover Strategy

Tác giả:ChaoZhang, Ngày: 2023-09-23 15:24:12
Tags:

Tổng quan

Đây là một chiến lược giao dịch đơn giản nhưng hiệu quả kết hợp dao động MACD và giao dịch chéo EMA. Hiện được thiết lập cho nến 4h nhưng có thể thích nghi với các khung thời gian khác. Nó đã hoạt động tốt trên BTC và ETH trong 3 năm qua, đánh bại mua và giữ. Với tối ưu hóa nó có thể được thích nghi cho tương lai, chỉ số, ngoại hối, cổ phiếu vv

Chiến lược logic

Các thành phần chính là:

  1. MACD: Đánh giá sự thay đổi động lực giá.

  2. EMA: Định hướng xu hướng giá.

  3. Điều kiện thời gian: Định nghĩa khoảng thời gian chiến lược hợp lệ.

  4. Tùy chọn dài / ngắn: Chọn hướng dài hoặc ngắn.

Các quy tắc giao dịch là:

  1. Long / exit short: Khi đóng trên EMA, biểu đồ MACD dương tính và nến hiện tại cao hơn nến trước.

  2. Short/exit long: Khi đóng dưới EMA, biểu đồ MACD âm, và nến hiện tại thấp hơn nến trước.

Chiến lược kết hợp theo xu hướng và động lực trong một hệ thống đơn giản và hiệu quả.

Ưu điểm

So với các chỉ số đơn lẻ, những lợi thế chính là:

  1. MACD đánh giá động lực ngắn hạn, EMA xác định hướng xu hướng.

  2. Quy tắc đơn giản và rõ ràng, dễ hiểu và thực hiện.

  3. Điều chỉnh tham số linh hoạt cho các sản phẩm và khung thời gian khác nhau.

  4. Tùy chọn chỉ giao dịch dài/ ngắn hoặc giao dịch hai chiều.

  5. Có thể xác định thời gian chiến lược hợp lệ để tránh giao dịch không cần thiết.

  6. Hiệu suất vượt trội ổn định trong nhiều năm.

  7. Rủi ro có thể kiểm soát được cho mỗi giao dịch.

  8. Khả năng tối ưu hóa hơn nữa với máy học.

Rủi ro

Bất chấp những lợi ích, rủi ro để xem xét:

  1. Chế độ điều chỉnh tham số rộng có nguy cơ quá mức.

  2. Không dừng lại, có nguy cơ mất mát không giới hạn.

  3. Không có bộ lọc âm lượng, có nguy cơ phát ra âm thanh giả.

  4. Trễ trong việc bắt kịp xu hướng biến, không thể tránh được tất cả các tổn thất.

  5. Sự suy giảm hiệu suất do thay đổi chế độ thị trường.

  6. Chỉ dựa trên dữ liệu lịch sử, sự vững chắc của mô hình là chìa khóa.

  7. Tần suất giao dịch cao làm tăng chi phí giao dịch.

  8. Cần phải theo dõi tỷ lệ lợi nhuận / rủi ro và đường cong vốn chủ sở hữu.

Những cải tiến

Chiến lược có thể được tăng cường bằng cách:

  1. Thêm bộ lọc âm lượng để tránh các sự đột phá giả.

  2. Thực hiện dừng để kiểm soát lỗ cho mỗi giao dịch.

  3. Đánh giá hiệu quả của các tham số qua các khoảng thời gian.

  4. Kết hợp máy học để tối ưu hóa động.

  5. Kiểm tra độ bền trên các thị trường.

  6. Điều chỉnh kích thước vị trí để giảm tần số.

  7. Tối ưu hóa các chiến lược quản lý rủi ro.

  8. Kiểm tra các thiết bị truyền để tăng tần số.

  9. Kiểm tra liên tục để tránh quá tải.

Kết luận

Tóm lại, chiến lược tạo thành một hệ thống đơn giản nhưng mạnh mẽ từ sự kết hợp của MACD và EMA. Nhưng tối ưu hóa liên tục và kiểm tra độ bền là rất quan trọng cho bất kỳ chiến lược nào để thích nghi với điều kiện thị trường thay đổi.


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

//@version=4
strategy("My Script", overlay=true)

//heiking ashi calculation
UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")
//
// === /INPUTS ===

// === BASE FUNCTIONS ===

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//timecondition
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2020, title = "From Year", minval = 1970)
 //monday and session 
 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2021, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true

//ema data  -- moving average
len = input(9, minval=1, title="Length")
src = input(hl2, title="Source")
out = ema(src, len)
//plot(out, title="EMA", color=color.blue)

//histogram
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
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)

// 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


//main variables to apply conditions are going to be out(moving avg) and hist(macd)

long = haClose > out and haClose > haClose[1] and out > out[1] and hist> 0 and hist[1] < 0 and time_cond
short = haClose < out and haClose < haClose[1] and out < out[1] and hist < 0 and hist[1] > 0 and time_cond

//limit to 1 entry
var longOpeneda = false
var shortOpeneda = false
var int timeOfBuya = na



longCondition= long and not longOpeneda 

if longCondition
    longOpeneda := true
    timeOfBuya := time


longExitSignala = short
exitLongCondition = longOpeneda[1] and longExitSignala

if exitLongCondition
    longOpeneda := false
    timeOfBuya := na


plotshape(longCondition, style=shape.labelup, location=location.belowbar, color=color.green, size=size.tiny, title="BUY", text="BUY", textcolor=color.white)
plotshape(exitLongCondition, style=shape.labeldown, location=location.abovebar, color=color.red, size=size.tiny, title="SELL", text="SELL", textcolor=color.white)

//automatization

longEntry= input(true)
shortEntry=input(false)

if(longEntry)
    strategy.entry("long",strategy.long,when=longCondition)
    strategy.close("long",when=exitLongCondition)

if(shortEntry)
    strategy.entry("short",strategy.short,when=exitLongCondition)
    strategy.close("short",when=longCondition)



Thêm nữa