Strategi Perdagangan Crypto Berdasarkan MACD

Penulis:ChaoZhang, Tanggal: 2023-09-19 11:21:42
Tag:

Gambaran umum

Strategi ini menggunakan indikator Moving Average Convergence Divergence (MACD) dan Relative Strength Index (RSI) untuk mengidentifikasi sinyal perdagangan untuk cryptocurrency.

Logika Strategi

  1. Menghitung 12 hari EMA dan 26 hari EMA sebagai jangka pendek dan jangka panjang moving average.

  2. Menghitung perbedaan antara EMA pendek dan panjang sebagai histogram MACD.

  3. Menghitung EMA 9 hari dari MACD sebagai garis sinyal.

  4. Hitung RSI 14 hari untuk menilai tingkat overbought/oversold.

  5. Tampilan sinyal beli ketika MACD melintasi di atas garis sinyal dan RSI lebih besar dari 81.

  6. Tampilkan sinyal jual ketika MACD melintasi di bawah garis sinyal dan RSI kurang dari 27.

  7. Gunakan modul strategi built-in untuk masuk dan keluar.

Analisis Keuntungan

  1. MACD dapat mengidentifikasi tren dan perubahan, RSI menunjukkan tingkat overbought/oversold.

  2. MACD di atas / di bawah garis nol menunjukkan arah / kekuatan tren jangka pendek vs jangka panjang.

  3. RSI pada tingkat tinggi/rendah menunjukkan kemungkinan overheating/oversold. Membantu menemukan sinyal perdagangan.

  4. Sinyal perdagangan yang jelas dan sederhana, mudah untuk melakukan perdagangan secara sistematis.

  5. Parameter yang dapat disesuaikan untuk optimalisasi dan beradaptasi dengan kondisi pasar yang berbeda.

Analisis Risiko

  1. Data MACD dan RSI rentan terhadap kebocoran palsu dan anomali, dapat menghasilkan sinyal yang salah.

  2. Parameter tetap mungkin tidak dapat beradaptasi dengan pasar yang berkembang, membutuhkan optimasi.

  3. Sinyal mungkin terlambat, tidak dapat berdagang pada titik balik.

  4. Hanya panjang/pendek, tidak bisa mendapatkan keuntungan dari pasar yang berbeda.

Arahan Optimasi

  1. Uji kombinasi parameter yang berbeda untuk menemukan pengaturan yang optimal.

  2. Tambahkan filter untuk menghindari perdagangan breakout palsu.

  3. Tambahkan stop loss untuk membatasi kerugian di pasar satu sisi.

  4. Mengelola ukuran posisi, peningkatan tren dan penurunan rentang.

  5. Gabungkan dengan indikator lain untuk sinyal yang lebih akurat.

  6. Uji pada instrumen dan kerangka waktu yang berbeda.

Ringkasan

Strategi ini memanfaatkan kekuatan pelengkap dari MACD dan RSI untuk mengidentifikasi tren dan sinyal perdagangan. Parameter penyesuaian halus dan menambahkan filter dapat meningkatkan ketahanan dan profitabilitas. Mengatur stop dan ukuran posisi juga membantu memaksimalkan keuntungan dan meminimalkan risiko. Pro dan kontra dari MACD dan RSI membuat strategi ini lebih cocok untuk menangkap tren jangka menengah hingga panjang daripada perdagangan jangka pendek. Secara keseluruhan, ini adalah strategi sederhana dan praktis yang layak diuji dan dioptimalkan lebih lanjut untuk mencapai hasil backtest dan live yang lebih baik.


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

Lebih banyak