Chiến lược giao cắt MACD và EMA


Ngày tạo: 2023-09-23 15:24:12 sửa đổi lần cuối: 2023-09-23 15:24:12
sao chép: 0 Số nhấp chuột: 746
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này là một chiến lược giao dịch đơn giản và hiệu quả, nó kết hợp chỉ số dao động MACD với đường trung bình di chuyển EMA. Hiện tại, nó được thiết lập với đường K 4 giờ và có thể điều chỉnh cho các chu kỳ thời gian khác khi cần thiết. Nó hoạt động tốt hơn trên dữ liệu Bitcoin và Ethereum trong 3 năm qua, so với chiến lược nắm giữ đơn thuần.

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

Chiến lược này bao gồm:

  1. Chỉ số MACD: Xác định động lực thay đổi giá

  2. Đường trung bình EMA: Xác định xu hướng của giá

  3. Điều kiện thời gian: giới hạn thời gian chiến lược có hiệu lực.

  4. Lựa chọn nhiều chỗ trống: Lựa chọn làm nhiều hoặc làm trống hướng.

Các quy tắc giao dịch cụ thể như sau:

  1. Lợi/Sống: Lợi/Sống khi giá đóng cửa cao hơn EMA, đường MACD là dương, và đường K hiện tại cao hơn ngày trước.

  2. Bỏ / Bán: Bỏ / Bán khi giá đóng cửa thấp hơn EMA, đường MACD là âm, và đường K hiện tại thấp hơn ngày trước.

Chiến lược này rất rõ ràng, kết hợp xu hướng và tư duy giao dịch ngắn hạn để tạo ra một hệ thống quyết định định lượng hiệu quả.

Phân tích lợi thế

Chiến lược này có những ưu điểm chính so với chỉ số đơn lẻ:

  1. MACD xác định động lực ngắn hạn, EMA xác định hướng xu hướng, chỉ số phối hợp chặt chẽ.

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

  3. Các tham số có thể được điều chỉnh linh hoạt, áp dụng cho các giống và thời gian khác nhau.

  4. Bạn có thể chọn giao dịch một chiều hoặc giao dịch hai chiều.

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

  6. Các công ty này đã có những năm kinh doanh ổn định và lợi nhuận liên tục.

  7. Quản lý tài chính có thể kiểm soát được để tránh tổn thất quá lớn.

  8. Có thể giới thiệu công nghệ học máy để tối ưu hóa và nâng cấp.

Phân tích rủi ro

Mặc dù chiến lược này có nhiều ưu điểm, nhưng cũng có những rủi ro cần lưu ý:

  1. Các tham số được tối ưu hóa có phạm vi rộng và có nguy cơ tối ưu hóa quá mức.

  2. Không đặt lệnh dừng lỗ, có nguy cơ gia tăng lỗ.

  3. Không tính đến số lượng giao dịch, có thể có một sự đột phá giả.

  4. Lưu ý rằng các nhà đầu tư có thể nhận diện được các điểm thay đổi trong xu hướng và không thể hoàn toàn tránh được sự mất mát.

  5. Hiệu quả có thể bị suy giảm do môi trường thị trường thay đổi.

  6. Chỉ dựa trên dữ liệu lịch sử, bạn cần quan tâm đến sự ổn định của mô hình.

  7. Lượng giao dịch cao và chi phí giao dịch có thể cao hơn.

  8. Cần chú ý đến tỷ lệ thu hồi lợi nhuận để tránh đường cong quá dốc.

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

Theo phân tích trên, chiến lược này có thể được tối ưu hóa từ các khía cạnh sau:

  1. Tham gia chỉ số giao dịch để tránh phá vỡ giả.

  2. Tăng thiết lập dừng lỗ, kiểm soát lỗ đơn.

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

  4. Giới thiệu công nghệ học máy để tối ưu hóa động lực.

  5. Chứng thực đa thị trường, tăng cường tính bền vững.

  6. Điều chỉnh kích thước vị trí, giảm tần suất giao dịch.

  7. Tối ưu hóa chiến lược quản lý tài chính.

  8. Thử nghiệm các hợp đồng chênh lệch giá, tăng tần suất.

  9. Kiểm tra liên tục để tránh quá phù hợp.

Tóm tắt

Nhìn chung, chiến lược này tạo ra một chiến lược định lượng đơn giản và hiệu quả khi kết hợp với các chỉ số MACD và EMA. Tuy nhiên, bất kỳ chiến lược nào cũng cần phải được tối ưu hóa và xác minh liên tục để có thể thích ứng và ổn định với sự thay đổi của môi trường thị trường. Chiến lược giao dịch cần phải được phát triển và cập nhật liên tục.

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