
Chiến lược này là một hệ thống giao dịch đảo ngược xu hướng dựa trên số lượng động lực trụ MACD. Nó nắm bắt các tín hiệu đảo ngược thị trường bằng cách phân tích mối quan hệ giữa sự thay đổi hình dạng K và sự thay đổi động lực của biểu đồ trụ MACD. Ý tưởng cốt lõi của chiến lược là giao dịch đảo ngược khi thị trường có dấu hiệu giảm động lực, do đó sắp xếp trước khi xu hướng sắp đảo ngược.
Chiến lược này có 2 hướng giao dịch: giao dịch short và giao dịch long: Điều kiện làm trống: Khi có đường dương lớn hơn ((giá đóng cửa cao hơn giá mở cửa), và thực thể của nó lớn hơn đường K trước đó, và đồ thị hình trụ MACD có xu hướng giảm 3 chu kỳ liên tiếp, cho thấy động lực lên đang suy yếu, hệ thống phát ra tín hiệu làm trống. Làm nhiều điều kiện: Khi có đường âm lớn ((giá đóng cửa thấp hơn giá mở cửa), và thực thể của nó lớn hơn đường K trước đó, và khi biểu đồ trụ MACD có xu hướng tăng 3 chu kỳ liên tiếp, cho thấy chuyển động giảm dần, hệ thống phát ra nhiều tín hiệu. Quản lý vị trí sử dụng cơ chế thanh toán tín hiệu đối thủ, tức là thanh toán vị trí hiện tại khi có tín hiệu giao dịch theo hướng ngược. Chiến lược không thiết lập dừng lỗ và dừng, hoàn toàn dựa vào tín hiệu để quản lý vị trí.
Chiến lược này được sử dụng để nắm bắt cơ hội đảo ngược thị trường bằng cách kết hợp hình dạng đường K và biến động động lượng động cơ MACD, có tính năng đơn giản và rõ ràng về tín hiệu. Mặc dù có một số rủi ro, nhưng bằng các biện pháp tối ưu hóa và quản lý rủi ro hợp lý, có thể nâng cao đáng kể sự ổn định và khả năng lợi nhuận của chiến lược. Chiến lược này đặc biệt phù hợp với môi trường thị trường có xu hướng rõ ràng và có thể là một phần quan trọng của hệ thống giao dịch.
/*backtest
start: 2024-11-10 00:00:00
end: 2025-02-19 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("MACD Momentum Reversal Strategy", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// === MACD Calculation ===
fastLength = input.int(12, "MACD Fast Length")
slowLength = input.int(26, "MACD Slow Length")
signalLength = input.int(9, "MACD Signal Length")
[macdLine, signalLine, histLine] = ta.macd(close, fastLength, slowLength, signalLength)
// === Candle Properties ===
bodySize = math.abs(close - open)
prevBodySize = math.abs(close[1] - open[1])
candleBigger = bodySize > prevBodySize
bullishCandle = close > open
bearishCandle = close < open
// === MACD Momentum Conditions ===
// For bullish candles: if the MACD histogram (normally positive) is decreasing over the last 3 bars,
// then the bullish momentum is fading – a potential short signal.
macdLossBullish = (histLine[2] > histLine[1]) and (histLine[1] > histLine[0])
// For bearish candles: if the MACD histogram (normally negative) is increasing (moving closer to zero)
// over the last 3 bars, then the bearish momentum is fading – a potential long signal.
macdLossBearish = (histLine[2] < histLine[1]) and (histLine[1] < histLine[0])
// === Entry Conditions ===
// Short entry: Occurs when the current candle is bullish and larger than the previous candle,
// while the MACD histogram shows fading bullish momentum.
enterShort = bullishCandle and candleBigger and macdLossBullish
// Long entry: Occurs when the current candle is bearish and larger than the previous candle,
// while the MACD histogram shows fading bearish momentum.
enterLong = bearishCandle and candleBigger and macdLossBearish
// === Plot the MACD Histogram for Reference ===
plot(histLine, title="MACD Histogram", color=color.blue, style=plot.style_histogram)
// === Strategy Execution ===
// Enter positions based on conditions. There is no stop loss or take profit defined;
// positions remain open until an opposite signal occurs.
if (enterShort)
strategy.entry("Short", strategy.short)
if (enterLong)
strategy.entry("Long", strategy.long)
// Exit conditions: close an existing position when the opposite signal appears.
if (strategy.position_size > 0 and enterShort)
strategy.close("Long")
if (strategy.position_size < 0 and enterLong)
strategy.close("Short")