Strategi perdagangan ganda berbasis MACD

Penulis:ChaoZhang, Tanggal: 2023-12-07 17:11:52
Tag:

img

Gambaran umum

Strategi ini mengimplementasikan strategi perdagangan ganda berdasarkan indikator MACD. Ini dapat panjang ketika ada salib emas pada MACD dan pendek ketika ada salib kematian, dengan filter tambahan berdasarkan indikator lain untuk menghilangkan beberapa sinyal yang tidak valid.

Prinsip Strategi

Inti dari strategi ini adalah memanfaatkan indikator MACD untuk mewujudkan perdagangan dua arah. Secara khusus, ini menghitung rata-rata bergerak cepat, rata-rata bergerak lambat dan garis sinyal MACD. Ketika MA cepat melintasi MA lambat, sebuah salib emas dihasilkan untuk pergi panjang. Ketika MA cepat melintasi di bawah MA lambat, sebuah salib kematian dihasilkan untuk pergi pendek.

Untuk menyaring beberapa sinyal yang tidak valid, strategi ini juga menetapkan kisaran ±30 sebagai filter, sehingga sinyal perdagangan hanya dipicu ketika histogram MACD melebihi kisaran ini.

Keuntungan

  • Indikator MACD digunakan sebagai sinyal perdagangan utama yang sensitif terhadap pergerakan harga di kedua arah
  • Filter tambahan membantu menghilangkan beberapa sinyal yang tidak valid
  • Logika arah dua bar untuk menutup posisi menghindari beberapa false breakout sampai batas tertentu

Risiko

  • Indikator MACD cenderung menghasilkan sinyal perdagangan yang sering, yang mengarah pada frekuensi perdagangan yang tinggi
  • Bergantung hanya pada satu indikator membuat strategi rentan terhadap keterlambatan sinyal
  • Logika penutupan berdasarkan arah histogram tidak cukup ketat, risiko kehilangan beberapa sinyal

Arahan Optimasi

  • Pertimbangkan untuk menggabungkan dengan indikator lain untuk konfirmasi sinyal, seperti KDJ, Bollinger Bands dll.
  • Penelitian indikator yang lebih maju untuk menggantikan MACD, seperti KD
  • Mengoptimalkan logika penutupan dengan mengatur stop loss dan mengambil keuntungan untuk mengendalikan kerugian perdagangan tunggal

Kesimpulan

Pada dasarnya, ini adalah strategi perdagangan dua arah yang layak. Ini memanfaatkan keuntungan dari indikator MACD dan juga menambahkan beberapa filter untuk mengontrol kualitas sinyal. Namun, MACD itu sendiri juga memiliki beberapa masalah. Pengujian lebih lanjut dan pengoptimalan dalam perdagangan langsung masih diperlukan untuk membuat strategi lebih dapat diandalkan. Secara keseluruhan, strategi ini meletakkan dasar untuk strategi perdagangan dua arah, dan dapat dioptimalkan lebih lanjut secara bertahap untuk menjadi strategi perdagangan kuantitatif yang kuat.

]


/*backtest
start: 2022-11-30 00:00:00
end: 2023-12-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3

//Created by user ChrisMoody updated 4-10-2014
//Regular MACD Indicator with Histogram that plots 4 Colors Based on Direction Above and Below the Zero Line
//Update allows Check Box Options, Show MacD & Signal Line, Show Change In color of MacD Line based on cross of Signal Line.
//Show Dots at Cross of MacD and Signal Line, Histogram can show 4 colors or 1, Turn on and off Histogram.
//Special Thanks to that incredible person in Tech Support whoem I won't say you r name so you don't get bombarded with emails
//Note the feature Tech Support showed me on how to set the default timeframe of the indicator to the chart Timeframe, but also allow you to choose a different timeframe.
//By the way I fully disclose that I completely STOLE the Dots at the MAcd Cross from "TheLark"

strategy("MACD Strategy", overlay=false)
// study(title="CM_MacD_Ult_MTF", shorttitle="CM_Ult_MacD_MTF")
source = close
useCurrentRes = input(true, title="Use Current Chart Resolution?")
resCustom = input(title="Use Different Timeframe? Uncheck Box Above", defval="60")
smd = input(true, title="Show MacD & Signal Line? Also Turn Off Dots Below")
sd = input(true, title="Show Dots When MacD Crosses Signal Line?")
sh = input(true, title="Show Histogram?")
macd_colorChange = input(true,title="Change MacD Line Color-Signal Line Cross?")
hist_colorChange = input(true,title="MacD Histogram 4 Colors?")

res = useCurrentRes ? timeframe.period : resCustom

fastLength = input(12, minval=1), slowLength=input(26,minval=1)
signalLength=input(9,minval=1)

fastMA = ema(source, fastLength)
slowMA = ema(source, slowLength)

macd = fastMA - slowMA
signal = sma(macd, signalLength)
hist = macd - signal

outMacD = request.security(syminfo.tickerid, res, macd)
outSignal = request.security(syminfo.tickerid, res, signal)
outHist = request.security(syminfo.tickerid, res, hist)

histA_IsUp = outHist > outHist[1] and outHist > 0
histA_IsDown = outHist < outHist[1] and outHist > 0
histB_IsDown = outHist < outHist[1] and outHist <= 0
histB_IsUp = outHist > outHist[1] and outHist <= 0

//MacD Color Definitions
macd_IsAbove = outMacD >= outSignal
macd_IsBelow = outMacD < outSignal



// strategy.entry("Long", strategy.long, 1, when = shouldPlaceLong) 
       
// strategy.close("Long", shouldExitLong)
    

// strategy.entry("Short", strategy.short, 1, when = shouldPlaceShort) 
       
// strategy.close("Short", shouldExitShort)
    
    
isWithinZeroMacd = outHist < 30 and outHist > -30 

delta = hist
// shouldExitShort = false//crossover(delta, 0)    
// shouldExitLong = false//crossunder(delta, 0)

// if(crossover(delta, 0))// and not isWithinZeroMacd)
//     strategy.entry("Long", strategy.long, comment="Long")

// if (crossunder(delta, 0))// and not isWithinZeroMacd)
//     strategy.entry("Short", strategy.short, comment="Short")
    
shouldPlaceLong = crossover(delta, 0)
    
strategy.entry("Long", strategy.long, 1, when = shouldPlaceLong) 

shouldExitLong = not histA_IsUp and histA_IsDown

shouldExitShort = not histA_IsUp and not histA_IsDown and not histB_IsDown and histB_IsUp

shouldPlaceShort = crossunder(delta, 0)
strategy.entry("Short", strategy.short, 1, when = shouldPlaceShort) 
       
// plot_color = gray
plot_color = if(hist_colorChange)
	if(histA_IsUp)
	    aqua
	else
		if(histA_IsDown)
			//need to sell
// 			if(not isWithinZeroMacd)
// 			shouldExitLong = true
			    //   strategy.entry("Short", strategy.short, comment="Short")
			
			blue
		else
			if(histB_IsDown)
				red 
			else
				if(histB_IsUp)
					//need to buy
				// 	if(not isWithinZeroMacd)
				// 	shouldExitShort = true
					   // strategy.entry("Long", strategy.long, comment="Long")
					    
					    
					maroon
				else
					yellow
else
	gray


// plot_color = hist_colorChange ? histA_IsUp ? aqua : histA_IsDown ? blue : histB_IsDown ? red : histB_IsUp ? maroon :yellow :gray
macd_color = macd_colorChange ? macd_IsAbove ? lime : red : red
signal_color = macd_colorChange ? macd_IsAbove ? orange : orange : lime

circleYPosition = outSignal

plot(smd and outMacD ? outMacD : na, title="MACD", color=macd_color, linewidth=4)
plot(smd and outSignal ? outSignal : na, title="Signal Line", color=signal_color, style=line ,linewidth=2)
plot(sh and outHist ? outHist : na, title="Histogram", color=plot_color, style=histogram, linewidth=4)
plot(sd and cross(outMacD, outSignal) ? circleYPosition : na, title="Cross", style=circles, linewidth=4, color=macd_color)

// plot( isWithinZeroMacd ? outHist : na, title="CheckSmallHistBars", style=circles, linewidth=4, color=black)

hline(0, '0 Line',  linewidth=2, color=white)




strategy.close("Short", shouldExitShort)
strategy.close("Long", shouldExitLong)

// fastLength = input(12)
// slowlength = input(26)
// MACDLength = input(9)

// MACD = ema(close, fastLength) - ema(close, slowlength)
// aMACD = ema(MACD, MACDLength)
// delta = MACD - aMACD


// if (crossover(delta, 0))
   // strategy.entry("MacdLE", strategy.long, comment="MacdLE")

//if last two macd bars are higher than current, close long position

// if (crossunder(delta, 0))
   // strategy.entry("MacdSE", strategy.short, comment="MacdSE")

//if last two macd bars are higher than current, close long position

// plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)

Lebih banyak