Chiến lược giao dịch tiền điện tử dựa trên MACD

Tác giả:ChaoZhang, Ngày: 2023-09-19
Tags:

Tổng quan

Chiến lược này sử dụng các chỉ số Moving Average Convergence Divergence (MACD) và Relative Strength Index (RSI) để xác định các tín hiệu giao dịch cho tiền điện tử. Nó tính toán sự khác biệt giữa trung bình động ngắn hạn và dài hạn cùng với RSI để đánh giá xu hướng thị trường và mức mua quá mức / bán quá mức để đưa ra quyết định giao dịch.

Chiến lược logic

  1. Tính toán EMA 12 ngày và EMA 26 ngày như trung bình động ngắn hạn và dài hạn.

  2. Tính toán sự khác biệt giữa EMA ngắn và dài dưới dạng biểu đồ MACD.

  3. Tính toán EMA 9 ngày của MACD như đường tín hiệu.

  4. Tính toán chỉ số RSI 14 ngày để đánh giá mức mua quá mức / bán quá mức.

  5. Hiển thị tín hiệu mua khi MACD vượt trên đường tín hiệu và RSI lớn hơn 81.

  6. Hiển thị tín hiệu bán khi MACD vượt dưới đường tín hiệu và RSI dưới 27.

  7. Sử dụng mô-đun chiến lược tích hợp để vào và ra.

Phân tích lợi thế

  1. MACD có thể xác định xu hướng và thay đổi, chỉ số RSI cho thấy mức mua quá mức / bán quá mức.

  2. MACD trên/dưới đường không chỉ ra hướng/sức mạnh của xu hướng ngắn hạn so với xu hướng dài hạn.

  3. RSI ở mức cao / thấp chỉ ra khả năng quá nóng / quá bán.

  4. Các tín hiệu giao dịch rõ ràng và đơn giản, dễ thực hiện các giao dịch một cách có hệ thống.

  5. Các thông số tùy chỉnh để tối ưu hóa và thích nghi với các điều kiện thị trường khác nhau.

Phân tích rủi ro

  1. Dữ liệu MACD và RSI dễ bị đột phá và bất thường sai, có thể tạo ra tín hiệu không chính xác.

  2. Các thông số cố định có thể không thích nghi với thị trường phát triển, cần tối ưu hóa.

  3. Các tín hiệu có thể bị chậm trễ, không thể giao dịch tại các điểm chuyển đổi.

  4. Chỉ dài / ngắn, không thể lợi nhuận từ các thị trường khác nhau.

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

  1. Kiểm tra các kết hợp tham số khác nhau để tìm các thiết lập tối ưu.

  2. Thêm các bộ lọc để tránh giao dịch thoát sai.

  3. Thêm stop loss để hạn chế lỗ trong thị trường một mặt.

  4. Quản lý kích thước vị trí, tăng xu hướng và giảm phạm vi.

  5. Kết hợp với các chỉ số khác để có tín hiệu chính xác hơn.

  6. Thử nghiệm trên các dụng cụ và khung thời gian khác nhau.

Tóm lại

Chiến lược này sử dụng các điểm mạnh bổ sung của MACD và RSI để xác định xu hướng và tín hiệu giao dịch. Các thông số điều chỉnh tinh tế và thêm các bộ lọc có thể cải thiện độ bền và lợi nhuận. Điều chỉnh điểm dừng và kích thước vị trí cũng giúp tối đa hóa lợi nhuận và giảm thiểu rủi ro.


/*backtest
start: 2023-09-11 00:00:00
end: 2023-09-12 04:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
// Revision:        5
// Author:          @Hugo_Moriceau
//study("Thesis_EMLYON_Withdate-strategies-Daily_Crypto_Moriceau_indicator",overlay=true)

// Pyramide 10 order size 100, every tick

strategy("Daily_Crypto_Moriceau_indicator",overlay=true)

// === GENERAL INPUTS ===

fast = 12, slow = 26
fastMA = ema(close, fast)
slowMA = ema(close, slow)

macd = fastMA - slowMA
signal = sma(macd, 9)
rsi = rsi(close,14)



tradeInvert     = input(defval = false, title = "Invert Trade Direction?")

// === LOGIC ===

// is fast ma above slow ma?
aboveBelow = fastMA >= slowMA ? true : false

// are we inverting our trade direction?
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

// === Plot Setting ===

//plot(fastMA,color=red)
//plot(slowMA,color=blue)
//barcolor(color=iff(fastMA > slowMA, yellow, na))
//barcolor(color=iff(fastMA < slowMA, black, na))
barcolor(color=iff(macd > 0.12*close , fuchsia, na))
barcolor(color=iff(macd < -0.1*close , lime, na))
dataS= macd > 0.125 and rsi>81 and fastMA > slowMA
dataB= macd < -0.1  and rsi<27 and fastMA< slowMA


plotchar(dataB, char='B',color=black,size = size.tiny,location = location.belowbar,transp= 0)  
plotchar(dataS, char='S',color=black,size = size.tiny,location = location.abovebar,transp= 0)


// === BACKTEST RANGE ===
FromMonth = input(defval = 01, title = "From Month", minval = 1)
FromDay   = input(defval = 01, title = "From Day", minval = 1)
FromYear  = input(defval = 2017, title = "From Year", minval = 2014)
ToMonth   = input(defval = 2, title = "To Month", minval = 1)
ToDay     = input(defval = 10, title = "To Day", minval = 1)
ToYear    = input(defval = 2019, title = "To Year", minval = 2018)


// === STRATEGY RELATED INPUTS ===+
// the risk management inputs
inpTakeProfit   = input(defval = 20000, title = "Take Profit", minval = 0)
inpStopLoss     = input(defval = 1500, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 100, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===

// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na


// === STRATEGY - LONG POSITION EXECUTION ===

enterLong() => not tradeDirection[1] and tradeDirection 
exitLong() => tradeDirection[1] and not tradeDirection
strategy.entry(id = "Long", long = true, when = enterLong()) // use function or simple condition to decide when to get in
strategy.close(id = "Long", when = exitLong()) // ...and when to get out

// === STRATEGY - SHORT POSITION EXECUTION ===

enterShort() => tradeDirection[1] and not tradeDirection
exitShort() => not tradeDirection[1] and tradeDirection
strategy.entry(id = "Short", long = false, when = enterShort())
strategy.close(id = "Short", when = exitShort())

// === STRATEGY RISK MANAGEMENT EXECUTION ===

// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)

Thêm nữa