Chiến lược giao dịch song hướng dựa trên chỉ báo MACD


Ngày tạo: 2023-12-07 17:11:52 sửa đổi lần cuối: 2023-12-07 17:11:52
sao chép: 0 Số nhấp chuột: 829
1
tập trung vào
1619
Người theo dõi

Chiến lược giao dịch song hướng dựa trên chỉ báo MACD

Tổng quan

Chiến lược này thực hiện một chiến lược giao dịch hai chiều dựa trên chỉ số MACD. Nó có thể làm nhiều và ngắn khi giao vàng và giao chết trên chỉ số MACD, và kết hợp với các chỉ số khác để lọc một số tín hiệu.

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

Chiến lược này chủ yếu sử dụng chỉ số MACD để thực hiện giao dịch hai chiều. Cụ thể, nó sẽ tính toán đường trung bình di chuyển nhanh, đường trung bình di chuyển chậm và đường tín hiệu MACD.

Để lọc một số tín hiệu vô hiệu, chiến lược này cũng đặt một phạm vi ± 30 làm bộ lọc, chỉ kích hoạt tín hiệu giao dịch khi đường cột MACD vượt quá phạm vi này. Ngoài ra, hướng của đường cột MACD cũng sẽ được xác định khi cân bằng, chỉ khi hướng của hai cột liên tiếp thay đổi.

Lợi thế chiến lược

  • Sử dụng chỉ số MACD làm tín hiệu giao dịch chính, chỉ số này nhạy cảm hơn với các hoạt động trên thị trường chứng khoán hai chiều
  • Thêm bộ lọc để lọc một số tín hiệu vô hiệu
  • Sử dụng logic cân bằng theo định hướng của hai cột liên tiếp, có thể tránh phá vỡ giả đến một mức độ nào đó

Rủi ro chiến lược

  • Chỉ số MACD dễ tạo ra các tín hiệu giao dịch thường xuyên, có thể dẫn đến tần suất giao dịch quá cao
  • Chiến lược chỉ số đơn, tín hiệu chậm có thể gây thiệt hại
  • Logic cân bằng của định hướng đường trụ không đủ nghiêm ngặt, có thể có nguy cơ mất tín hiệu

Hướng tối ưu hóa chiến lược

  • Có thể xem xét kết hợp với các chỉ số khác để xác nhận tín hiệu, chẳng hạn như chỉ số KDJ, chỉ số Brin, v.v.
  • Các chỉ số khác có thể được nghiên cứu để thay thế MACD, chẳng hạn như KD
  • Có thể tối ưu hóa logic thanh toán, thiết lập dừng lỗ và dừng để kiểm soát tổn thất đơn lẻ

Tóm tắt

Chiến lược này nói chung là một chiến lược giao dịch hai chiều cơ bản có thể sử dụng được. Nó sử dụng lợi thế của chỉ số MACD và đồng thời thêm một số bộ lọc để kiểm soát chất lượng tín hiệu. Tuy nhiên, chỉ số MACD cũng có một số vấn đề, cần được thử nghiệm và tối ưu hóa thêm trong môi trường thực để làm cho chiến lược trở nên đáng tin cậy hơn.

]

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