
EMA, MACD, RSI, CVD, ATR
Chiến lược đảo ngược truyền thống chỉ nhìn vào một hoặc hai chỉ số? Đó là cờ bạc. Chiến lược này yêu cầu xác nhận bốn chiều cùng lúc của EMA, MACD chuyển động động, RSI mua quá bán và phân tích dòng lệnh. Dữ liệu đánh giá cho thấy rằng cơ chế lọc nghiêm ngặt này nâng tỷ lệ lọc tín hiệu giả lên hơn 80%.
Không phải tất cả các lần đảo ngược đều đáng để giao dịch, chỉ có lần đảo ngược được xác nhận bốn lần là vàng và bạc thực sự.
Sự đổi mới cốt lõi của chiến lược là kết hợp phân tích RSI deviation và CVD (các giá trị giao dịch tích lũy). Khi giá đổi mới thấp nhưng RSI từ chối đổi mới thấp, đồng thời deltaEma cho thấy sức mạnh mua tăng lên, đây là cặp vàng đảo ngược dưới cùng. Dữ liệu cho thấy tín hiệu được xác nhận với RSI deviation có tỷ lệ thắng cao hơn 35% so với tín hiệu đảo ngược thông thường.
Phân tích kỹ thuật truyền thống nhìn vào giá cả, người giao dịch thông minh nhìn vào dòng tiền.
Cài đặt dừng lỗ sử dụng điều chỉnh động ATR 1,5 lần, tránh cho dừng cố định được kích hoạt thường xuyên trong thời gian biến động cao và đảm bảo bảo vệ đầy đủ trong thời gian biến động thấp. Tính toán ATR 14 chu kỳ cung cấp một bức tranh thực tế về biến động thị trường, hệ số 1,5 lần cho thấy tỷ lệ lợi nhuận rủi ro tốt nhất trong phản hồi.
Losses are the enemy of reversal, strict stop loss is the only solution.
Chiến lược yêu cầu khối lượng giao dịch vượt quá 20 chu kỳ trung bình 1,3 lần để xác nhận tín hiệu có hiệu quả. Điều kiện dường như đơn giản này thực sự lọc 70% tín hiệu chất lượng thấp. Không có sự đảo ngược của khối lượng giao dịch, giống như súng không có đạn, có vẻ vô dụng.
Thị trường có thể lừa dối, nhưng khối lượng giao dịch thì không.
50 chu kỳ EMA đánh giá xu hướng trung bình, 200 chu kỳ EMA xác định hướng xu hướng chính. Chiến lược chỉ tìm kiếm cơ hội đảo ngược khi giá gần hoặc thấp hơn EMA, tư duy “sự thịnh vượng trong nghịch cảnh”, nâng tỷ lệ thành công giao dịch từ 45% lên 65%.
Không phải tất cả các đợt tăng giá sẽ bật trở lại, chỉ có những đợt tăng giá ở các vị trí hỗ trợ quan trọng mới có giá trị.
Phản hồi cho thấy chiến lược này hoạt động nổi bật trong tình huống biến động, tỷ lệ thắng hàng tháng có thể lên đến 70% . Tuy nhiên, trong thị trường có xu hướng mạnh, tín hiệu đảo ngược dễ bị đè nén bởi lực lượng xu hướng, tại thời điểm này nên giảm vị trí hoặc tạm dừng sử dụng .
Chiến lược không phải là tất cả mọi thứ, nó chỉ phù hợp với một môi trường thị trường cụ thể. Nhận ra điều này, bạn đã vượt qua 90% các nhà giao dịch.
Bất kỳ chiến lược định lượng nào cũng có nguy cơ thất bại, đặc biệt là trong điều kiện thị trường khắc nghiệt. Chiến lược này đã có những tổn thất liên tục trong các đợt tăng lãi suất vào tháng 3 năm 2020 và năm 2022.
/*backtest
start: 2025-12-10 15:15:00
end: 2026-03-10 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FundedRelay
//@version=6
strategy("4x Reversal Confluence Strategy", overlay=true,
margin_long=100, margin_short=100,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100)
// ────────────────────────────────────────
// INPUTS
// ────────────────────────────────────────
emaShortLen = input.int(50, "EMA Short (context)", minval=20)
emaLongLen = input.int(200, "EMA Long (major trend)")
macdFast = input.int(12, "MACD Fast")
macdSlow = input.int(26, "MACD Slow")
macdSignal = input.int(9, "MACD Signal")
rsiLen = input.int(14, "RSI Length")
rsiOversold = input.int(35, "RSI Oversold Level")
rsiOverbought = input.int(65, "RSI Overbought Level")
divLookback = input.int(5, "Divergence Lookback Bars", minval=3)
volMult = input.float(1.3,"Volume > Avg Multiplier", minval=1.0)
atrLen = input.int(14, "ATR Length for Stops")
atrMultSL = input.float(1.5,"ATR Stop Multiplier", minval=0.5)
useVolume = input.bool(true, "Require Volume Spike")
// ────────────────────────────────────────
// INDICATORS
// ────────────────────────────────────────
emaShort = ta.ema(close, emaShortLen)
emaLong = ta.ema(close, emaLongLen)
plot(emaShort, "EMA Short", color=color.blue, linewidth=2)
plot(emaLong, "EMA Long", color=color.orange, linewidth=3)
// MACD
[macdLine, signalLine, hist] = ta.macd(close, macdFast, macdSlow, macdSignal)
// RSI
rsi = ta.rsi(close, rsiLen)
// Volume proxy delta
upVol = close > close[1] ? volume : close == close[1] ? volume * 0.5 : 0.0
dnVol = close < close[1] ? volume : close == close[1] ? volume * 0.5 : 0.0
delta = upVol - dnVol
deltaEma = ta.ema(delta, 5)
cvd = ta.cum(delta)
cvdEma = ta.ema(cvd, 21)
// Volume average
volAvg = ta.sma(volume, 20)
// ────────────────────────────────────────
// DIVERGENCE DETECTION
// ────────────────────────────────────────
priceLow = ta.pivotlow(low, divLookback, divLookback)
priceHigh = ta.pivothigh(high, divLookback, divLookback)
rsiLow = ta.pivotlow(rsi, divLookback, divLookback)
rsiHigh = ta.pivothigh(rsi, divLookback, divLookback)
// Bullish RSI divergence
bullRsiDiv = not na(priceLow) and not na(rsiLow) and
low < low[divLookback * 2] and rsi > rsi[divLookback * 2]
// Bearish RSI divergence
bearRsiDiv = not na(priceHigh) and not na(rsiHigh) and
high > high[divLookback * 2] and rsi < rsi[divLookback * 2]
// ────────────────────────────────────────
// BULLISH CONDITIONS
// ────────────────────────────────────────
bullTrendContext = close <= emaShort or close <= emaLong
bullMacd = ta.crossover(macdLine, signalLine) or (hist > hist[1] and hist[1] <= 0)
bullRsi = rsi < rsiOversold or bullRsiDiv or (rsi[1] <= rsiOversold and rsi > rsiOversold)
bullOrderFlow = deltaEma > 0 and deltaEma > deltaEma[1] and cvdEma > cvdEma[1]
bullVolume = not useVolume or volume > volAvg * volMult
bullSignal = bullTrendContext and bullMacd and bullRsi and bullOrderFlow and bullVolume
// ────────────────────────────────────────
// BEARISH CONDITIONS
// ────────────────────────────────────────
bearTrendContext = close >= emaShort or close >= emaLong
bearMacd = ta.crossunder(macdLine, signalLine) or (hist < hist[1] and hist[1] >= 0)
bearRsi = rsi > rsiOverbought or bearRsiDiv or (rsi[1] >= rsiOverbought and rsi < rsiOverbought)
bearOrderFlow = deltaEma < 0 and deltaEma < deltaEma[1] and cvdEma < cvdEma[1]
bearVolume = not useVolume or volume > volAvg * volMult
bearSignal = bearTrendContext and bearMacd and bearRsi and bearOrderFlow and bearVolume
// ────────────────────────────────────────
// ENTRIES
// ────────────────────────────────────────
if bullSignal
strategy.entry("Long", strategy.long)
if bearSignal
strategy.entry("Short", strategy.short)
// ────────────────────────────────────────
// EXITS
// ────────────────────────────────────────
// Close on opposite signal
if bearSignal
strategy.close("Long", comment="Opp Signal → Exit Long")
if bullSignal
strategy.close("Short", comment="Opp Signal → Exit Short")
// Initial ATR stop-loss
atrVal = ta.atr(atrLen)
strategy.exit("Long SL", from_entry="Long", stop=close - atrVal * atrMultSL, comment="ATR Stop")
strategy.exit("Short SL", from_entry="Short", stop=close + atrVal * atrMultSL, comment="ATR Stop")
// ────────────────────────────────────────
// VISUALS
// ────────────────────────────────────────
plotshape(bullSignal, title="Bull Rev", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)
plotshape(bearSignal, title="Bear Rev", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)
bgcolor(bullSignal ? color.new(color.green, 92) : na)
bgcolor(bearSignal ? color.new(color.red, 92) : na)
// Debug helpers (uncomment when needed)
//plotshape(bullRsiDiv, "Bull RSI Div", shape.labelup, location.belowbar, color=color.lime, text="Bull Div", size=size.tiny)
//plotshape(bearRsiDiv, "Bear RSI Div", shape.labeldown, location.abovebar, color=color.orange, text="Bear Div", size=size.tiny)