
EMA, MACD, RSI, CVD, ATR
Strategi pembalikan tradisional hanya melihat satu atau dua petunjuk? Itu adalah pertaruhan. Strategi ini memerlukan latar belakang trend EMA, penukaran dinamik MACD, RSI overbought dan oversold, dan analisis aliran pesanan untuk mengesahkan empat dimensi sekaligus, sebelum berani membuka kedudukan. Data retrospeksi menunjukkan bahawa mekanisme penyaringan yang ketat ini meningkatkan kadar penyaringan isyarat palsu hingga lebih dari 80%.
Bukan setiap putaran bernilai perdagangan, hanya putaran yang disahkan empat kali adalah emas dan perak sejati.
Inovasi teras strategi adalah menggabungkan analisis RSI deviasi dan CVD (Cumulative Volume Difference). Apabila harga berinovasi rendah tetapi RSI menolak untuk berinovasi rendah, dan deltaEma menunjukkan peningkatan daya beli, ini adalah pasangan emas yang berbalik di bawah. Data menunjukkan bahawa kemenangan isyarat dengan pengesahan RSI deviasi adalah 35% lebih tinggi daripada isyarat berbalik biasa.
Analisis teknikal tradisional melihat harga, pedagang bijak melihat aliran wang.
Tetapan stop loss menggunakan penyesuaian dinamik ATR 1.5 kali ganda, untuk mengelakkan stop loss tetap yang sering dicetuskan pada masa turun naik yang tinggi, dan memastikan perlindungan yang mencukupi pada masa turun naik yang rendah. Pengiraan ATR 14 kitaran memberikan imej sebenar turun naik pasaran, dengan faktor 1.5 kali ganda menunjukkan nisbah risiko-keuntungan terbaik dalam pengulangan.
Kerosakan berterusan adalah musuh sebenar strategi pembalikan, dan satu-satunya penyelesaian adalah dengan menghentikan kerugian secara ketat.
Strategi ini memerlukan 1.3 kali ganda jumlah lalu lintas melebihi nilai purata 20 kitaran untuk mengesahkan isyarat berkesan. Syarat yang nampaknya mudah ini sebenarnya menapis 70% isyarat berkualiti rendah. Tanpa pembalikan gabungan jumlah lalu lintas, seperti senjata tanpa peluru, nampaknya tidak berdaya.
Pasaran boleh menipu, tetapi jumlah transaksi tidak.
50 kitaran EMA menilai trend pertengahan, 200 kitaran EMA menentukan arah trend utama. Strategi hanya mencari peluang untuk membalikkan apabila harga mendekati atau di bawah EMA, pemikiran “sukses dalam kemerosotan”, meningkatkan kadar kejayaan perdagangan dari 45% hingga 65%.
Tidak semua kejatuhan akan berpatah balik, hanya kejatuhan pada kedudukan sokongan utama yang perlu dicatatkan.
Retrospektif menunjukkan bahawa strategi ini berfungsi dengan baik dalam keadaan goyah, dengan kadar kemenangan bulanan melebihi 70%. Tetapi dalam pasaran yang kuat, isyarat pembalikan mudah ditekan oleh kekuatan trend, dan pada masa ini anda harus menurunkan kedudukan atau menangguhkan penggunaan.
Tidak ada strategi yang universal, hanya strategi yang sesuai dengan keadaan pasaran tertentu. Dengan mengiktiraf ini, anda melebihi 90% peniaga.
Mana-mana strategi kuantitatif mempunyai risiko kegagalan, terutamanya dalam keadaan pasaran yang melampau. Strategi ini mengalami kerugian berturut-turut dalam tempoh kenaikan kadar pada bulan Mac 2020 dan 2022. Dianjurkan untuk melaksanakan pengurusan wang yang ketat, dengan risiko tunggal tidak melebihi 2% dari akaun, dan menilai keberkesanan strategi secara berkala.
/*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)