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


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

Tổng quan

Chiến lược này kết hợp hai chỉ số MACD và RSI để thực hiện trong trường hợp xu hướng không rõ ràng, đồng thời thực hiện nhiều giao dịch ngắn hạn để có được lợi nhuận vượt mức.

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

  1. Tính toán EMA nhanh (đường 12 ngày) và EMA chậm (đường 26 ngày)
  2. Tính độ lệch hội tụ MACD ((EMA nhanh trừ EMA chậm)
  3. Tính trung bình di chuyển 9 ngày của MACD
  4. Tính toán RSI 14 ngày
  5. Làm nhiều hơn khi MACD <-0.1, RSI <27 và EMA nhanh thấp hơn EMA chậm
  6. Khi MACD> 0.125, RSI> 81 và EMA nhanh cao hơn EMA chậm
  7. Thiết lập Stop Loss, Stop Loss và Move Stop Loss để quản lý vị trí

Phân tích lợi thế

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

Phân tích rủi ro

  1. Giao dịch hai chiều cần nhiều tiền hơn để hỗ trợ yêu cầu bảo lãnh
  2. Trong trường hợp có sự thay đổi mạnh mẽ, các nhà đầu tư có thể cùng lúc phá vỡ các vị thế dư thừa.
  3. Thiết lập tham số không đúng có thể dẫn đến giao dịch quá thường xuyên

Phương pháp giải quyết rủi ro:

  1. Hỗ trợ tài chính đầy đủ, kiểm soát quy mô vị trí
  2. Đặt khoảng cách dừng hợp lý để tránh dừng quá nhiều
  3. Tối ưu hóa các tham số, giảm tần suất giao dịch

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

  1. Có thể xem xét kết hợp các chỉ số biến động để tối ưu hóa thời gian đầu tư
  2. Có thể thử nghiệm các kết hợp tham số khác nhau để tìm tham số tốt nhất
  3. Các chiến lược dừng lỗ có thể được tối ưu hóa theo điều kiện thị trường, chẳng hạn như dừng lỗ theo dõi
  4. Các tham số tự động tối ưu hóa có thể kết hợp với thuật toán học máy

Tóm tắt

Chiến lược này thực hiện giao dịch hai chiều thông qua sự kết hợp của MACD và RSI. Sử dụng dừng di chuyển để khóa lợi nhuận, có thể thu được lợi nhuận dư thừa trong tình huống không có xu hướng. Chiến lược này có thể tối ưu hóa thêm các tham số thiết lập, chiến lược dừng lỗ, v.v., để có được lợi nhuận dư thừa ổn định hơn.

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