Strategi Dagangan Pendek Panjang Berasaskan MACD dan RSI

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

Ringkasan

Strategi ini menggabungkan penunjuk MACD dan RSI untuk melaksanakan perdagangan panjang dan pendek secara serentak, untuk mendapatkan pulangan yang berlebihan dalam situasi trend yang tidak jelas.

Logika Strategi

  1. Mengira EMA pantas (12 hari) dan EMA perlahan (26 hari)
  2. Mengira perbezaan konvergensi MACD (EMA pantas tolak EMA perlahan)
  3. Mengira purata bergerak 9 hari MACD sebagai garis isyarat
  4. Mengira RSI 14 hari
  5. Pergi panjang apabila MACD<-0.1, RSI<27 dan EMA cepat di bawah EMA perlahan
  6. Pergi pendek apabila MACD>0.125, RSI>81 dan EMA cepat di atas EMA perlahan
  7. Gunakan mengambil keuntungan, stop loss, trailing stop loss untuk menguruskan kedudukan

Analisis Kelebihan

  1. Pergi panjang dan pendek boleh menjana pulangan yang berlebihan di pasaran bukan tren
  2. Menggabungkan indikator trend EMA dan indikator pembalikan RSI meningkatkan kualiti isyarat
  3. Menggunakan penghentian kerugian untuk mengunci keuntungan secara berkesan mengawal risiko kerugian

Analisis Risiko

  1. Perdagangan kedua arah memerlukan lebih banyak modal untuk menyokong keperluan margin
  2. Harga boleh mencapai stop loss pada kedua-dua kedudukan panjang dan pendek apabila membalikkan secara mendadak
  3. Tetapan parameter yang tidak betul boleh menyebabkan perdagangan berlebihan

Penyelesaian Risiko:

  1. Modal yang mencukupi untuk menyokong saiz kedudukan
  2. Jarak kehilangan hentian yang munasabah untuk mengelakkan hentian yang terlalu sesak
  3. Mengoptimumkan parameter untuk mengurangkan kekerapan dagangan

Arahan pengoptimuman

  1. Pertimbangkan untuk menggabungkan penunjuk turun naik untuk meningkatkan masa kemasukan
  2. Uji kombinasi parameter yang berbeza untuk mencari optimum
  3. Mengoptimumkan strategi stop loss berdasarkan keadaan pasaran, seperti trailing stop loss
  4. Gunakan algoritma pembelajaran mesin untuk mengoptimumkan parameter secara automatik

Ringkasan

Strategi ini melaksanakan perdagangan dua arah dengan kombinasi MACD dan RSI. Menggunakan stop loss yang mengikuti untuk mengunci keuntungan dapat menghasilkan pulangan yang berlebihan di pasaran bukan trend. Strategi ini boleh dioptimumkan lebih lanjut pada parameter, strategi stop loss dan lain-lain untuk mendapatkan pulangan 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 lanjut