
VWAP, ADX, EMA, REGIME
Tidak ada lagi pengejaran tanpa pandang bulu. Logik utama strategi ini adalah mudah dan kasar:Pengepungan palsu di sekitar VWAP yang direka khas untuk penembakan, dengan asumsi trend disahkan│ADX menyalakan api apabila berada dalam lingkungan 20-35, dan lebih daripada 45 langsung berhenti.│Kenapa? Kerana data memberitahu kita bahawa terlalu tinggi ADX bermakna trend terlalu panas, dan strategi penarikan balik dalam persekitaran ini menyebabkan kemerosotan dalam kemenangan.│
Strategi ini memerlukan harga untuk menembusi VWAP sekurang-kurangnya 2 tick, dan kemudian menarik balik secara kuat. Ini bukan sains, tetapi berdasarkan parameter optimum yang diperoleh dari banyak pengulangan.Penembusan kurang daripada 2 tick biasanya bunyi bising, penembusan lebih daripada 5 tick biasanya bermakna perubahan trend yang sebenar。
Ini adalah reka bentuk utama:EMA 20⁄50 pada tahap 1 jam bertanggungjawab untuk menilai trend besar, dan ADX 5 minit bertanggungjawab untuk memilih tetingkap masuk terbaik。Kenapa tidak menggunakan cahaya matahari? Kerana cahaya matahari bertindak balas terlalu lambat.。Kenapa tidak menggunakan 15 minit? Kerana 15 minit mudah terganggu oleh kebisingan jangka pendek.。
60 minit adalah titik manis: ia boleh menyaring turun naik jangka pendek dan tidak akan terlepas isyarat awal perubahan trend. Apabila garis cepat melintasi garis perlahan dan kedua-dua garis condong ke atas, trend berganda disahkan.Mekanisme pengesahan dua kali ini dapat mengurangkan isyarat palsu sebanyak 40 peratus.。
Seting ADX antara 20-35 juga penting: di bawah 20 menunjukkan kurangnya arah pasaran, di atas 35 mula memasuki kawasan perdagangan terbaik, tetapi di atas 45 perlu berhati-hati dengan trend overheating.Data sejarah menunjukkan bahawa strategi penarikan balik adalah paling berjaya apabila ADX berada dalam julat 25-30。
Hentikan kerosakan di hujung yang lain, iaitu sempadan risiko yang paling semula jadi.Jika harga jatuh di bawah sokongan atau gagal untuk menembusi rintangan, maka penilaian kita salah dan kita harus segera mengakui bahawa kita salah.。
Sasaran untuk menetapkan konfigurasi klasik 1R dan 2R: 50% kedudukan di 1R dan 50% lagi di 2R. Kenapa ia dibagikan?Kira-kira 60 peratus daripada transaksi yang berjaya mencapai 1R, tetapi hanya 35 peratus yang mencapai 2R│Pengeluaran secara berturutan ini menjamin pendapatan asas dan memberi ruang untuk keuntungan yang besar│
Jangan memandang rendah perbandingan risiko dan ganjaran ini. Dalam 1000 simulasi perdagangan, walaupun kemenangan hanya 45%, sistem pengurusan risiko ini masih dapat mencapai keuntungan positif.Bukan Kadar Kemenangan, Tetapi Nisbah Kerugian。
Saya tidak mahu bercakap tentang masalah ini.Strategi ini tidak berjaya dalam pasaran yang bergolak.Apabila ADX berada di bawah 20 untuk jangka masa yang panjang, pasaran tidak mempunyai arah yang jelas dan kebolehpercayaan isyarat penarikan balik VWAP menurun dengan ketara. Pada masa ini, pilihan terbaik adalah untuk melihat, bukan memaksa perdagangan.
Strategi ini paling berkesan pada permulaan dan pertengahan trend.Pada akhir trend kuat ((ADX>45), walaupun isyarat betul, ruang keuntungan akan dikurangkan dengan cepat│Inilah sebabnya ADX perlu disiapkan dengan sambungan keras.│
Satu lagi batasan adalah keperluan untuk kebolehan bergerak. Strategi ini lebih sesuai untuk varieti utama, dan mungkin terlalu sensitif terhadap keperluan penembusan 2 tick untuk tanda-tanda kecil yang kurang bergerak.
Masa terbaik untuk menggunakannya: Pertarungan penting pertama selepas trend ditubuhkan, ADX berada dalam julat 25-35, dengan jumlah pertukaran yang berpasangan.
Mengelakkan penggunaan masaSebelum dan selepas pengumuman berita penting, ADX berada di bawah paras 20 pada tempoh lebihan, dan ADX berada di atas paras 45 pada akhir trend.
Parameter boleh disesuaikan dengan varieti yang berbeza: varieti dengan kadar turun naik yang tinggi boleh menyesuaikan penembusan minimum menjadi 3-4 tick, varieti dengan kadar turun naik yang rendah dapat mengekalkan 2 tick.Tetapi logik utama tidak berubah: trend yang disahkan + penarikan balik tangkapan + kawalan angin ketat。
Ingatlah bahawa tidak ada satu strategi yang sempurna. Sistem ini berfungsi dengan baik dalam pasaran yang sedang tren, tetapi ia mengalami kerugian kecil dalam pasaran yang terbelah.Kuncinya adalah bersabar menunggu peluang terbaik, dan tidak memaksa untuk berdagang setiap hari.。
Petua risiko: Pemantauan semula sejarah tidak mewakili keuntungan masa depan, strategi berisiko kerugian berterusan, pengurusan risiko yang ketat perlu dilaksanakan, perbezaan prestasi yang ketara dalam keadaan pasaran yang berbeza.
/*backtest
start: 2025-08-13 00:00:00
end: 2025-12-23 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy("GC/MGC VWAP Pullback + ADX Regime (Prop-Safe)",
overlay=true,
pyramiding=0,
calc_on_every_tick=false,
process_orders_on_close=true,
initial_capital=50000)
// ---------- Inputs ----------
groupRegime = "Regime Filter"
adxLen = input.int(14, "ADX Length", group=groupRegime, minval=1)
adxMin = input.float(20.0, "ADX Min (trade allowed)", group=groupRegime, step=0.5)
adxMax = input.float(35.0, "ADX Max (best zone)", group=groupRegime, step=0.5)
adxHardStop = input.float(45.0, "ADX Hard Stop (no new entries above)", group=groupRegime, step=0.5)
groupTrend = "Trend Filter (1H)"
htf = input.timeframe("60", "Trend Timeframe", group=groupTrend)
emaFastLen = input.int(20, "EMA Fast", group=groupTrend, minval=1)
emaSlowLen = input.int(50, "EMA Slow", group=groupTrend, minval=1)
requireSlope = input.bool(true, "Require EMAs sloping", group=groupTrend)
groupSetup = "Setup Logic"
useVwap = input.bool(true, "Use Session VWAP", group=groupSetup)
minWickTicks = input.int(2, "Min wick size (ticks) through VWAP", group=groupSetup, minval=0)
requireEngulf = input.bool(false, "Require strong rejection body (close beyond midpoint)", group=groupSetup)
groupRisk = "Risk / Exits"
useStops = input.bool(true, "Use stop loss + targets", group=groupRisk)
rrTP1 = input.float(1.0, "TP1 (R multiple)", group=groupRisk, step=0.25)
rrTP2 = input.float(2.0, "TP2 (R multiple)", group=groupRisk, step=0.25)
tp1Pct = input.int(50, "TP1 % qty", group=groupRisk, minval=1, maxval=99)
tp2Pct = 100 - tp1Pct
// ---------- Core Calculations ----------
// ADX
[_, __, adx] = ta.dmi(adxLen, adxLen)
// VWAP (session)
vwap = useVwap ? ta.vwap(hlc3) : na
// 1H EMAs for direction
emaFastHTF = request.security(syminfo.tickerid, htf, ta.ema(close, emaFastLen), barmerge.gaps_off, barmerge.lookahead_off)
emaSlowHTF = request.security(syminfo.tickerid, htf, ta.ema(close, emaSlowLen), barmerge.gaps_off, barmerge.lookahead_off)
// Optional slope filter (simple: current > prior for fast/slow in trend direction)
emaFastHTF_prev = request.security(syminfo.tickerid, htf, ta.ema(close, emaFastLen)[1], barmerge.gaps_off, barmerge.lookahead_off)
emaSlowHTF_prev = request.security(syminfo.tickerid, htf, ta.ema(close, emaSlowLen)[1], barmerge.gaps_off, barmerge.lookahead_off)
bullTrend = emaFastHTF > emaSlowHTF and (not requireSlope or (emaFastHTF > emaFastHTF_prev and emaSlowHTF > emaSlowHTF_prev))
bearTrend = emaFastHTF < emaSlowHTF and (not requireSlope or (emaFastHTF < emaFastHTF_prev and emaSlowHTF < emaSlowHTF_prev))
// Regime filter: "best zone" + hard stop
adxTradable = adx >= adxMin and adx <= adxMax
adxTooHot = adx > adxHardStop
// Tick helper
tick = syminfo.mintick
minWick = minWickTicks * tick
// ---------- Rejection Candles at VWAP ----------
hasVwap = useVwap and not na(vwap)
// Bullish rejection definition:
// - price probes at/through VWAP (low <= vwap - minWick)
// - closes back above VWAP
// - preferably bullish candle
bullReject =
hasVwap and
low <= (vwap - minWick) and
close > vwap and
close > open and
(not requireEngulf or close > (high + low) / 2)
// Bearish rejection definition:
// - price probes at/through VWAP (high >= vwap + minWick)
// - closes back below VWAP
// - preferably bearish candle
bearReject =
hasVwap and
high >= (vwap + minWick) and
close < vwap and
close < open and
(not requireEngulf or close < (high + low) / 2)
// We enter on break of the rejection candle high/low (next bar stop order)
// Use prior bar’s rejection signal to avoid repainting.
bullReject_prev = bullReject[1]
bearReject_prev = bearReject[1]
longStopPrice = high[1] + tick
shortStopPrice = low[1] - tick
// Risk distance (R) based on rejection candle extremes
longSL = low[1] - tick
shortSL = high[1] + tick
longRisk = math.max(longStopPrice - longSL, tick)
shortRisk = math.max(shortSL - shortStopPrice, tick)
longTP1 = longStopPrice + (longRisk * rrTP1)
longTP2 = longStopPrice + (longRisk * rrTP2)
shortTP1 = shortStopPrice - (shortRisk * rrTP1)
shortTP2 = shortStopPrice - (shortRisk * rrTP2)
// ---------- Entry Conditions ----------
canEnter = not adxTooHot and adxTradable
longCond = canEnter and bullTrend and bullReject_prev
shortCond = canEnter and bearTrend and bearReject_prev
// ---------- Orders ----------
if (longCond)
strategy.entry("L", strategy.long, stop=longStopPrice)
if (shortCond)
strategy.entry("S", strategy.short, stop=shortStopPrice)
// ---------- Exits ----------
if useStops
// Long exits
strategy.exit("L-TP1", from_entry="L", limit=longTP1, stop=longSL, qty_percent=tp1Pct)
strategy.exit("L-TP2", from_entry="L", limit=longTP2, stop=longSL, qty_percent=tp2Pct)
// Short exits
strategy.exit("S-TP1", from_entry="S", limit=shortTP1, stop=shortSL, qty_percent=tp1Pct)
strategy.exit("S-TP2", from_entry="S", limit=shortTP2, stop=shortSL, qty_percent=tp2Pct)
// ---------- Plots ----------
plot(useVwap ? vwap : na, "VWAP", linewidth=2)
plot(emaFastHTF, "HTF EMA Fast", color=color.new(color.green, 0))
plot(emaSlowHTF, "HTF EMA Slow", color=color.new(color.red, 0))
// Visual markers for rejection candles
plotshape(bullReject, title="Bull Rejection", style=shape.triangleup, location=location.belowbar, size=size.tiny, color=color.new(color.green, 0), text="BR")
plotshape(bearReject, title="Bear Rejection", style=shape.triangledown, location=location.abovebar, size=size.tiny, color=color.new(color.red, 0), text="SR")
// ---- Entry-ready signals (visual) ----
plotshape(longCond, title="LONG READY", style=shape.labelup, location=location.belowbar, text="LONG", color=color.new(color.green, 0), textcolor=color.white, size=size.tiny)
plotshape(shortCond, title="SHORT READY", style=shape.labeldown, location=location.abovebar, text="SHORT", color=color.new(color.red, 0), textcolor=color.white, size=size.tiny)
plot(longCond ? longStopPrice : na, "Long Stop Entry", style=plot.style_linebr, linewidth=2)
plot(shortCond ? shortStopPrice : na, "Short Stop Entry", style=plot.style_linebr, linewidth=2)
// =====================================================
// ADX DISPLAY (for visibility only)
// =====================================================
showADX = input.bool(true, "Show ADX (pane)", group="Signals / Alerts")
adxPlot = showADX ? adx : na
plot(adxPlot, title="ADX (5m)", color=color.new(color.orange, 0), linewidth=2)
// Reference lines
hline(20, "ADX 20", color=color.new(color.green, 60))
hline(35, "ADX 35", color=color.new(color.yellow, 60))
hline(45, "ADX 45", color=color.new(color.red, 60))