Chiến lược theo xu hướng MACD là một chiến lược giao dịch định lượng dựa trên chỉ số MACD. Chiến lược này xác định các tín hiệu chéo vàng và chéo chết của MACD để xác định xu hướng thị trường và theo dõi xu hướng giá.
Logic cốt lõi của Chiến lược theo xu hướng MACD là:
Thông qua cơ chế theo xu hướng này, chiến lược có thể nắm bắt kịp thời các xu hướng thị trường và kiếm lợi nhuận.
Chiến lược theo xu hướng MACD có những lợi thế sau:
Chiến lược theo xu hướng MACD cũng có những rủi ro sau:
Để giải quyết các rủi ro trên, các biện pháp tối ưu hóa sau đây có thể được áp dụng:
Chiến lược theo xu hướng MACD có thể được tối ưu hóa trong các khía cạnh sau:
Tối ưu hóa các thông số chỉ số MACD để giảm tỷ lệ tín hiệu sai. Các thông số chu kỳ khác nhau của MACD có thể được thử nghiệm.
Thêm các chỉ số khác như khối lượng giao dịch để lọc tín hiệu.
Thiết lập cơ chế dừng lỗ theo dõi năng động. Các điểm dừng lỗ có thể được điều chỉnh năng động dựa trên biến động.
Tối ưu hóa logic xác định tín hiệu để mở các vị trí.
Kết hợp các mô hình học máy để lọc tín hiệu. Các mô hình có thể được đào tạo để đánh giá độ tin cậy của tín hiệu.
Nói chung, chiến lược theo xu hướng MACD là một chiến lược định lượng tương đối trưởng thành. Nó sử dụng chỉ số MACD để xác định hướng xu hướng thị trường và kiểm soát rủi ro bằng cơ chế dừng lỗ, có thể theo dõi hiệu quả xu hướng giá. Nhưng chỉ số MACD cũng có một số lỗ hổng, dễ tạo ra tín hiệu sai. Vì vậy, có không gian để tối ưu hóa thêm chiến lược này, chủ yếu về các khía cạnh như tham số chỉ số, cơ chế dừng lỗ, lọc tín hiệu v.v.
/*backtest start: 2023-11-10 00:00:00 end: 2023-12-10 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("MACD Cross Strategy", overlay=true) // Get MACD values [macdLine, signalLine, _] = ta.macd(close, 12, 26, 9) var float entryLongPrice = na var float entryShortPrice = na var float highestLongProfit = 0 var float highestShortProfit = 0 var float highestMACD = 0 var float lowestMACD = 0 var bool haveOpenedLong = false var bool haveOpenedShort = false var float stoploss = 0.04 // To be adjust for different investment var float minProfit = 0.05 // To be adjust for different investment if macdLine > 0 lowestMACD := 0 highestMACD := math.max(highestMACD, macdLine) haveOpenedShort := false else highestMACD := 0 lowestMACD := math.min(lowestMACD, macdLine) haveOpenedLong := false // Enter long position when MACD line crosses above the signal line if ta.crossover(macdLine, signalLine) and macdLine < highestMACD and macdLine > 0 and haveOpenedLong == false strategy.entry("Long", strategy.long) strategy.exit("Exit Long", from_entry = "Long", stop=close*(1 - stoploss)) entryLongPrice := close haveOpenedLong := true if ta.crossunder(macdLine, signalLine) and macdLine > lowestMACD and macdLine < 0 and haveOpenedShort == false strategy.entry("Short", strategy.short) strategy.exit("Exit Short", from_entry = "Short", stop=close*(1 + stoploss)) entryShortPrice := close haveOpenedShort := true // log.info("entryLongPrice:{0}", entryLongPrice) if strategy.position_size > 0 profit = close - entryLongPrice log.info("profit:{0}", profit) if profit > 0 highestLongProfit := math.max(highestLongProfit, profit) if profit / entryLongPrice > minProfit and highestLongProfit * 0.8 > profit strategy.close("Long") highestLongProfit := 0 if strategy.position_size < 0 profit = entryShortPrice - close if profit > 0 highestShortProfit := math.max(highestShortProfit, profit) log.info("highestShortProfit={0}, profit={1}", highestShortProfit, profit) if profit / entryShortPrice > minProfit and highestShortProfit * 0.8 > profit strategy.close("Short") highestShortProfit := 0