Chiến lược giao dịch ngắn dài dựa trên MACD và RSI

Tác giả:ChaoZhang, Ngày: 2023-10-09 15:33:17
Tags:

Tổng quan

Chiến lược này kết hợp các chỉ số MACD và RSI để thực hiện giao dịch dài và ngắn đồng thời, để có được lợi nhuận dư thừa trong các tình huống xu hướng không rõ ràng.

Chiến lược logic

  1. Tính toán EMA nhanh (12 ngày) và EMA chậm (26 ngày)
  2. Tính toán MACD convergence divergence (EMA nhanh trừ EMA chậm)
  3. Tính toán trung bình động 9 ngày của MACD dưới dạng đường tín hiệu
  4. Tính toán RSI 14 ngày
  5. Đi dài khi MACD<-0.1, RSI<27 và EMA nhanh dưới EMA chậm
  6. Đi ngắn khi MACD>0.125, RSI>81 và EMA nhanh trên EMA chậm
  7. Sử dụng lấy lợi nhuận, dừng lỗ, dừng lỗ để quản lý các vị trí

Phân tích lợi thế

  1. Đi cả dài và ngắn có thể tạo ra lợi nhuận dư thừa trong thị trường không xu hướng
  2. Kết hợp chỉ số xu hướng EMA và chỉ số đảo ngược RSI cải thiện chất lượng tín hiệu
  3. Sử dụng dừng lỗ để khóa lợi nhuận có hiệu quả kiểm soát rủi ro mất mát

Phân tích rủi ro

  1. Giao dịch cả hai hướng đòi hỏi nhiều vốn hơn để hỗ trợ các yêu cầu ký quỹ
  2. Giá có thể dừng lỗ trên cả hai vị trí dài và ngắn khi đảo ngược mạnh
  3. Cài đặt tham số không chính xác có thể gây ra giao dịch quá mức

Giải pháp rủi ro:

  1. Số vốn đủ để hỗ trợ việc xác định kích thước vị thế
  2. Khoảng cách dừng mất mát hợp lý để tránh dừng quá đông
  3. Tối ưu hóa các tham số để giảm tần suất giao dịch

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

  1. Xem xét kết hợp các chỉ số biến động để cải thiện thời gian nhập cảnh
  2. Kiểm tra các kết hợp tham số khác nhau để tìm tối ưu
  3. Tối ưu hóa chiến lược dừng lỗ dựa trên điều kiện thị trường, chẳng hạn như dừng lỗ sau
  4. Sử dụng thuật toán học máy để tự động tối ưu hóa các thông số

Tóm lại

Chiến lược này thực hiện giao dịch hai hướng với sự kết hợp của MACD và RSI. Sử dụng stop loss để khóa lợi nhuận có thể tạo ra lợi nhuận dư thừa trong các thị trường không có xu hướng. Chiến lược có thể được tối ưu hóa thêm về các thông số, chiến lược stop loss vv để có được lợi nhuận dư thừa nhất quán hơn.


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

//@version=3
// Revision:        290
// Author:          @Hugo_Moriceau
//study("Moriceau_Crypto_strategies_Long_short_indicator_thesis",overlay=true)

// Pyramide 10 order size 100, every tick

strategy("Moriceau_Crypto_strategies_Long_short_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)

dataB = macd < -0.1  and rsi<27 and fastMA < slowMA
// data1 = macd > 0.125  and rsi>81 and fastMA> slowMA
dataS = macd > 0.125 and rsi > 81 and fastMA > slowMA

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

// === LOGIC ===

// is fast ma above slow ma?
Achat = macd < -0.1  and rsi < 27 and fastMA < slowMA ? true : false
vente = macd > 0.125 and rsi > 81 and fastMA > slowMA ? true : false

// are we inverting our trade direction?
tradeDirection = vente ? Achat ? false : true : Achat ? 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))
plotchar(dataB, char='B',color=black,size = size.auto,location = location.belowbar,transp= 0)  
plotchar(dataS, char='S',color=black,size = size.auto,location = location.abovebar,transp= 0)

//fast = plot(maFast, title = "FastMA", color = yellow, linewidth = 2, style = line, transp = 50)
//slow = plot(maSlow, title = "SlowMA", color = black, linewidth = 2, style = line, transp = 50)

// === BACKTEST RANGE ===
FromMonth = input(defval = 05, title = "From Month", minval = 1)
FromDay   = input(defval = 23, title = "From Day", minval = 1)
FromYear  = input(defval = 2021, title = "From Year", minval = 2017)
ToMonth   = input(defval = 5, title = "To Month", minval = 1)
ToDay     = input(defval = 25, title = "To Day", minval = 1)
ToYear    = input(defval = 2021, title = "To Year", minval = 2017)


// === STRATEGY RELATED INPUTS ===+
// the risk management inputs
inpTakeProfit   = input(defval = 2500, title = "Take Profit", minval = 28)
inpStopLoss     = input(defval = 600, title = "Stop Loss", minval = 15)
inpTrailStop    = input(defval = 300, title = "Trailing Stop Loss", minval = 5)
inpTrailOffset  = input(defval = 50, title = "Trailing Stop Loss Offset", minval = 1)

// === 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 = "Achat", long = true, when = enterLong()) // use function or simple condition to decide when to get in
strategy.close(id = "TP 50% Sell", 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 = "Vente", long = false, when = enterShort())
strategy.close(id = "Vente", when = exitShort())

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

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

Thêm nữa