Strategi perdagangan jangka pendek berbasis MACD dan RSI

Penulis:ChaoZhang, Tanggal: 2023-10-09 15:33:17
Tag:

Gambaran umum

Strategi ini menggabungkan indikator MACD dan RSI untuk mengimplementasikan perdagangan panjang dan pendek secara bersamaan, untuk mendapatkan hasil yang berlebihan dalam situasi tren yang tidak jelas.

Logika Strategi

  1. Menghitung EMA cepat (12 hari) dan EMA lambat (26 hari)
  2. Menghitung divergensi konvergensi MACD (EMA cepat dikurangi EMA lambat)
  3. Menghitung rata-rata bergerak 9 hari dari MACD sebagai garis sinyal
  4. Menghitung RSI 14 hari
  5. Pergi panjang ketika MACD<-0.1, RSI<27 dan EMA cepat di bawah EMA lambat
  6. Pergi short ketika MACD>0.125, RSI>81 dan EMA cepat di atas EMA lambat
  7. Menggunakan mengambil keuntungan, stop loss, trailing stop loss untuk mengelola posisi

Analisis Keuntungan

  1. Pergi baik panjang maupun pendek dapat menghasilkan hasil yang berlebihan di pasar non-trend
  2. Menggabungkan indikator tren EMA dan indikator pembalikan RSI meningkatkan kualitas sinyal
  3. Menggunakan stop loss untuk mengunci keuntungan secara efektif mengendalikan risiko kerugian

Analisis Risiko

  1. Perdagangan kedua arah membutuhkan lebih banyak modal untuk mendukung persyaratan margin
  2. Harga dapat mencapai stop loss pada posisi panjang dan pendek saat membalikkan tajam
  3. Pengaturan parameter yang tidak benar dapat menyebabkan over-trading

Solusi Risiko:

  1. Modal yang cukup untuk mendukung ukuran posisi
  2. Jarak stop loss yang wajar untuk menghindari stop yang penuh sesak
  3. Mengoptimalkan parameter untuk mengurangi frekuensi perdagangan

Arahan Optimasi

  1. Pertimbangkan untuk menggabungkan indikator volatilitas untuk meningkatkan waktu masuk
  2. Uji kombinasi parameter yang berbeda untuk menemukan optimal
  3. Mengoptimalkan strategi stop loss berdasarkan kondisi pasar, seperti trailing stop loss
  4. Gunakan algoritma pembelajaran mesin untuk mengoptimalkan parameter secara otomatis

Ringkasan

Strategi ini mengimplementasikan perdagangan dua arah dengan kombinasi MACD dan RSI. Menggunakan stop loss trailing untuk mengunci keuntungan dapat menghasilkan hasil yang berlebihan di pasar non-trending. Strategi dapat dioptimalkan lebih lanjut pada parameter, strategi stop loss dll untuk mendapatkan hasil yang lebih konsisten.


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

Lebih banyak