
VWAP, ADX, EMA, REGIME
इस रणनीति का मूल तर्क सरल और स्पष्ट हैःप्रवृत्ति की पुष्टि के आधार पर, विशेष रूप से VWAP के पास झूठी घुसपैठ की वापसी के लिए निशाना साधना│ ADX 20-35 के दायरे में आग लगाता है, 45 से अधिक सीधे बंद हो जाता है │ क्यों? क्योंकि डेटा हमें बताता है कि ADX बहुत अधिक है, इसका मतलब है कि प्रवृत्ति बहुत गर्म है, और इस तरह के वातावरण में वापसी रणनीति जीतने की दर में गिरावट आती है │
रणनीति के अनुसार, कीमत को वीडब्ल्यूपीएपी में कम से कम दो टिकों को पार करना होगा, और फिर एक मजबूत वापसी करना होगा। यह कोई विज्ञान नहीं है, लेकिन सबसे अच्छा पैरामीटर है जो बहुत सारे रिटर्न्स के आधार पर पाया गया है।2 से कम टिक के माध्यम से अक्सर शोर होता है, 5 से अधिक टिक के माध्यम से आमतौर पर एक वास्तविक प्रवृत्ति उलट होता है。
यहाँ एक महत्वपूर्ण डिजाइन हैः1 घंटे के स्तर पर 20⁄50 ईएमए बड़े रुझानों को निर्धारित करने के लिए जिम्मेदार है, 5 मिनट एडीएक्स सबसे अच्छी प्रवेश खिड़की का चयन करने के लिए जिम्मेदार है☞ क्यों नहीं? क्योंकि सूर्य की रोशनी बहुत धीमी है। ☞ क्यों नहीं 15 मिनट? क्योंकि 15 मिनट में शोर-शराबे की समस्या हो सकती है।
60 मिनट एक मिठाई बिंदु हैः यह अल्पकालिक उतार-चढ़ाव को फ़िल्टर करता है और रुझान परिवर्तन के शुरुआती संकेतों को याद नहीं करता है। जब एक त्वरित रेखा धीमी रेखा को पार करती है और दोनों लाइनें ऊपर की ओर झुकाव करती हैं, तो एक बहुमुखी प्रवृत्ति की पुष्टि होती है।इस दोहरी पुष्टि तंत्र से लगभग 40 प्रतिशत तक झूठे संकेतों में कमी आती है।。
ADX का 20-35 का दायरा सेट करना भी महत्वपूर्ण हैः 20 से नीचे का मतलब है कि बाजार में दिशा की कमी है, 35 से ऊपर का सबसे अच्छा व्यापार क्षेत्र में प्रवेश करना शुरू कर देता है, लेकिन 45 से ऊपर के लिए सावधानी बरतने की आवश्यकता है।ऐतिहासिक आंकड़ों से पता चलता है कि ADX 25-30 के दायरे में है, जब वापस लेने की रणनीति सबसे अधिक सफल होती है。
स्टॉप लॉस ब्रेकडाउन के दूसरे छोर पर स्थित है, जो कि सबसे प्राकृतिक जोखिम सीमा है।अगर कीमतें समर्थन को तोड़ती हैं या प्रतिरोध को तोड़ने में विफल रहती हैं, तो हमारा निर्णय गलत है और हमें तुरंत स्वीकार करना होगा。
लक्ष्य 1R और 2R के क्लासिक कॉन्फ़िगरेशन को अपनाने के लिए निर्धारित किया गया थाः 1R पर 50% पदों को छोड़ दिया गया था, और शेष 50% 2R पर कब्जा कर लिया गया था। ऐसा क्यों?लगभग 60% सफल लेनदेन 1R तक पहुँचते हैं, लेकिन केवल 35% 2R तक पहुँचते हैं│ इस तरह के अलग-अलग पदों पर जाने से बुनियादी आय की गारंटी मिलती है और बड़े पैमाने पर लाभ के लिए जगह भी मिलती है │
इस जोखिम-लाभ अनुपात डिजाइन को कम मत समझो। 1,000 सिमुलेशन ट्रेडों में, जोखिम प्रबंधन प्रणाली सकारात्मक लाभ प्राप्त करने में सक्षम है, भले ही जीत की दर केवल 45% हो।यह जीत की दर नहीं है, यह हार की दर है。
यह स्वीकार किया जाना चाहिए किइस रणनीति ने बाजार में उतार-चढ़ाव के दौरान अच्छा प्रदर्शन नहीं किया।जब ADX लंबे समय तक 20 से नीचे रहता है, तो बाजार में स्पष्ट दिशा की कमी होती है, VWAP के पीछे हटने के संकेतों की विश्वसनीयता में भारी गिरावट आती है। इस समय सबसे अच्छा विकल्प यह है कि जबरदस्ती व्यापार करने के बजाय देखना है।
रणनीति का सबसे अच्छा प्रदर्शन प्रवृत्ति के शुरुआती और प्रवृत्ति के मध्यवर्ती पुनरावृत्ति चरणों में होता है।मजबूत प्रवृत्ति के अंत में ((ADX> 45), लाभ के लिए जगह तेजी से संकुचित हो जाती है, भले ही संकेत सही हो。 यही कारण है कि ADX हार्ड स्टॉप लाइन स्थापित की गई 。
एक और सीमा तरलता की आवश्यकता है। यह रणनीति मुख्यधारा की नस्लों के लिए अधिक उपयुक्त है, जो कम तरलता वाले छोटे लोगों के लिए 2 टिक की पैठ की आवश्यकता को अतिसंवेदनशील बना सकती है।
सबसे अच्छा समय: रुझान स्थापित होने के बाद पहली महत्वपूर्ण गिरावट, ADX 25-35 के बीच है, जो कि व्यापार के साथ मेल खाता है।
समय का उपयोग करने से बचें: महत्वपूर्ण समाचारों के पहले और बाद में, ADX 20 से कम के क्षैतिज अवधि के साथ-साथ ADX 45 से अधिक के रुझान के अंत में।
पैरामीटर को विभिन्न किस्मों के अनुसार बारीकी से समायोजित किया जा सकता हैः उच्च अस्थिरता वाले किस्मों में न्यूनतम प्रवेश को 3-4 टिक तक समायोजित किया जा सकता है, कम अस्थिरता वाले किस्मों में 2 टिक बनाए रखा जा सकता है।लेकिन मुख्य तर्क नहीं बदलेगाः प्रवृत्ति की पुष्टि + वापसी पकड़ + सख्त नियंत्रण。
याद रखें, कोई भी रणनीति सर्वव्यापी नहीं है। यह प्रणाली ट्रेंडिंग बाजारों में उत्कृष्ट प्रदर्शन करती है, लेकिन चॉप्पी बाजारों में लगातार छोटे नुकसान का सामना करती है।कुंजी यह है कि हर दिन सौदेबाजी करने के लिए मजबूर होने के बजाय, सबसे अच्छे अवसर के लिए धैर्य रखें。
जोखिम टिपः ऐतिहासिक प्रतिगमन भविष्य के लाभ का प्रतिनिधित्व नहीं करता है, रणनीति में लगातार नुकसान का जोखिम होता है, जोखिम प्रबंधन को सख्ती से लागू करने की आवश्यकता होती है, और विभिन्न बाजार स्थितियों में प्रदर्शन में महत्वपूर्ण अंतर होता है।
/*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))