
एक एकल-समान रेखा के साथ व्यापार करना बंद करो। यह रणनीति 25/50/100 तीन ईएमए के साथ एक पूर्ण प्रवृत्ति पहचान प्रणाली का निर्माण करती है, जिसमें ईएमए को क्रमबद्ध रूप से व्यवस्थित और एक साथ झुकाव की आवश्यकता होती है, साथ ही 0.10 गुना एटीआर की न्यूनतम अंतराल की आवश्यकता होती है। आंकड़ों से पता चलता है कि यह ट्रिपल फ़िल्टरिंग तंत्र अस्थिर बाजारों के झूठे ब्रेक को प्रभावी रूप से रोकता है, केवल वास्तविक प्रवृत्ति के दौरान काम करता है।
कुंजी एक “स्वच्छ ईएमए अनुक्रम” में हैः 25> 50> 100 और सभी ऊपर झुकाव के साथ, 25 < 50 < 100 और सभी नीचे झुकाव के साथ खाली सिर। अंतराल फ़िल्टर सुनिश्चित करता है कि प्रवृत्ति पर्याप्त मजबूत है और एक समान रूप से चिपकने वाली स्थिति के तहत अमान्य संकेतों से बचा जाता है।
इस रणनीति के केंद्र में एक वापसी जांच तंत्र है। मल्टीहेड वापसी की आवश्यकता होती है कि कीमत 25 या 50 ईएमए को छूती है लेकिन 100 ईएमए से ऊपर रहती है, और एक खाली वापसी की आवश्यकता होती है कि कीमत 25 या 50 ईएमए को छूती है लेकिन 100 ईएमए से नीचे रहती है। यह डिजाइन पारंपरिक “बंद समर्थन और फिर से खरीद” की तुलना में अधिक सटीक है।
15 चक्रों के लिए एक वापसी खिड़की की स्थापना उचित है। रीट्रेसिंग डेटा से पता चलता है कि एक वास्तविक प्रवृत्ति वापसी आमतौर पर 10-15 चक्रों के भीतर पूरा हो जाती है, और इस समय खिड़की से अधिक की वापसी का मतलब है कि प्रवृत्ति में बदलाव हो सकता है। एक बार ओवरटाइम या कीमत 100 ईएमए को तोड़ती है, रणनीति को तुरंत सशस्त्र स्थिति को रद्द करना चाहिए।
प्रवेश ट्रिगर की शर्तें बेहद सख्त हैं: पुष्टि के बाद, पूरे के लाइनों को ((ओपन, हाई, लोअर, क्लोज) को 25 ईएमए के सही पक्ष पर पूरी तरह से स्थित होना चाहिए। यह डिजाइन झूठे ब्रेकडाउन और डिस्क में शोर से बचाता है, यह सुनिश्चित करता है कि केवल वास्तविक रिवर्स की पुष्टि के बाद प्रवेश किया जाए।
मल्टी हेड एंट्री की आवश्यकताएंः ओपनिंग> 25EMA, मिनिमम> 25EMA, क्लोजिंग> 25EMA। खाली हेड एंट्री की आवश्यकताएंः ओपनिंग <25EMA, मैक्सिमम <25EMA, क्लोजिंग <25EMA। “पूरी के-लाइन पुष्टिकरण” की इस विधि से प्रवेश की गुणवत्ता में उल्लेखनीय सुधार हुआ है और अमान्य लेनदेन कम हो गए हैं।
रणनीति डिफ़ॉल्ट 10% स्थिति सेट मध्यम है, पर्याप्त रिटर्न प्राप्त करने और एकल जोखिम को नियंत्रित करने के लिए। 0.05% की प्रसंस्करण शुल्क वास्तविक व्यापार लागत के करीब सेट की गई है, और परिणामों को वापस लेने का अधिक संदर्भ मूल्य है। मल्टी-फ्लोट द्वि-दिशात्मक व्यापार का समर्थन करता है, विभिन्न बाजार स्थितियों के अनुकूल एक-तरफा संचालन का विकल्प भी है।
महत्वपूर्ण अनुस्मारक: रणनीति में केवल प्रवेश तर्क शामिल है, कोई रोकथाम रोकथाम सेट नहीं है। जब लैंडस्केप का उपयोग किया जाता है, तो सख्त जोखिम प्रबंधन के साथ काम करना चाहिए, 2-3 गुना एटीआर का रोकथाम और 1.5-2 गुना जोखिम रिटर्न अनुपात का रोकथाम सेट करने की सिफारिश की जाती है।
रणनीति स्पष्ट रूप से ट्रेंडिंग बाजारों में अच्छा प्रदर्शन करती है, विशेष रूप से एकतरफा रुझानों में वापसी के लिए उपयुक्त है। लेकिन क्षैतिज उतार-चढ़ाव वाले बाजारों में, ईएमए क्रमबद्ध शर्तों को पूरा करना मुश्किल है और व्यापार के अवसर अपेक्षाकृत कम हैं। यह वास्तव में रणनीति का एक फायदा है, जो प्रतिकूल परिस्थितियों में अत्यधिक व्यापार से बचा जाता है।
जोखिम टिपः ऐतिहासिक पुनरावृत्ति भविष्य के लाभ का प्रतिनिधित्व नहीं करती है, रणनीति में लगातार नुकसान का जोखिम है। अस्थिर बाजार में लंबे समय तक कोई संकेत नहीं हो सकता है, उचित बाजार की स्थिति की प्रतीक्षा करने के लिए धैर्य की आवश्यकता होती है। इसका उपयोग करने से पहले पर्याप्त एनालॉग ट्रेडिंग सत्यापन की सिफारिश की जाती है।
/*backtest
start: 2025-01-01 00:00:00
end: 2025-09-27 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Bybit","currency":"ETH_USDT","balance":500000}]
*/
//@version=6
strategy("Clean 25/50/100 EMA Pullback Scalper — Entries Only (Side Select)",
overlay=true, calc_on_every_tick=true, calc_on_order_fills=true,
initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.05,
pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// === Side selector ===
side = input.string("Both", "Trade Side", options=["Both", "Long Only", "Short Only"])
longsEnabled = side == "Both" or side == "Long Only"
shortsEnabled = side == "Both" or side == "Short Only"
// === Inputs ===
lenFast = input.int(25, "Fast EMA (pullback)", minval=1)
lenMid = input.int(50, "Mid EMA (filter)", minval=1)
lenSlow = input.int(100, "Slow EMA (safety)", minval=1)
useSlope = input.bool(true, "Require EMAs sloping same way?")
useSpread = input.bool(true, "Require clean spacing (min spread)?")
spreadPct = input.float(0.10, "Min spread vs ATR (0.10 = 0.10×ATR)", step=0.01, minval=0.0)
pullLookback = input.int(15, "Max bars after pullback", minval=1, maxval=100)
showSignals = input.bool(true, "Show entry markers?")
// === Series ===
ema25 = ta.ema(close, lenFast)
ema50 = ta.ema(close, lenMid)
ema100 = ta.ema(close, lenSlow)
atr = ta.atr(14)
// === Trend & spacing ===
isUpStack = ema25 > ema50 and ema50 > ema100
isDownStack = ema25 < ema50 and ema50 < ema100
slopeUp = ema25 > ema25[1] and ema50 > ema50[1] and ema100 > ema100[1]
slopeDown = ema25 < ema25[1] and ema50 < ema50[1] and ema100 < ema100[1]
minGap = atr * spreadPct
spreadUpOK = (ema25 - ema50) > minGap and (ema50 - ema100) > minGap
spreadDownOK = (ema100 - ema50) > minGap and (ema50 - ema25) > minGap
trendLongOK = isUpStack and (useSlope ? slopeUp : true) and (useSpread ? spreadUpOK : true)
trendShortOK = isDownStack and (useSlope ? slopeDown : true) and (useSpread ? spreadDownOK : true)
// === Pullback detection state ===
var bool pullArmedLong = false
var bool pullArmedShort = false
var int pullBarIdxLong = na
var int pullBarIdxShort = na
var float pullMinLong = na
var float pullMaxShort = na
// Long pullback state
if trendLongOK
touched25 = low <= ema25
touched50 = low <= ema50
stayedAbove100 = low > ema100
if (touched25 or touched50) and stayedAbove100
pullArmedLong := true
pullBarIdxLong := bar_index
pullMinLong := na(pullMinLong) ? low : math.min(pullMinLong, low)
else if pullArmedLong
pullMinLong := na(pullMinLong) ? low : math.min(pullMinLong, low)
if low <= ema100 or (bar_index - pullBarIdxLong > pullLookback)
pullArmedLong := false
pullMinLong := na
else
pullArmedLong := false
pullMinLong := na
// Short pullback state
if trendShortOK
touched25s = high >= ema25
touched50s = high >= ema50
stayedBelow100 = high < ema100
if (touched25s or touched50s) and stayedBelow100
pullArmedShort := true
pullBarIdxShort := bar_index
pullMaxShort := na(pullMaxShort) ? high : math.max(pullMaxShort, high)
else if pullArmedShort
pullMaxShort := na(pullMaxShort) ? high : math.max(pullMaxShort, high)
if high >= ema100 or (bar_index - pullBarIdxShort > pullLookback)
pullArmedShort := false
pullMaxShort := na
else
pullArmedShort := false
pullMaxShort := na
// === Entry triggers (confirmed bar & whole candle outside 25 EMA) ===
longEntryRaw = pullArmedLong and barstate.isconfirmed and (open > ema25 and low > ema25 and close > ema25) and (na(pullMinLong) or pullMinLong > ema100)
shortEntryRaw = pullArmedShort and barstate.isconfirmed and (open < ema25 and high < ema25 and close < ema25) and (na(pullMaxShort) or pullMaxShort < ema100)
longEntry = longsEnabled and longEntryRaw
shortEntry = shortsEnabled and shortEntryRaw
// Disarm after trigger
if longEntry
pullArmedLong := false
pullMinLong := na
if shortEntry
pullArmedShort := false
pullMaxShort := na
// === Orders (entries only; no TP/SL) ===
if longEntry and strategy.position_size <= 0
strategy.entry("Long", strategy.long)
if shortEntry and strategy.position_size >= 0
strategy.entry("Short", strategy.short)
// === Plots & visuals ===
plot(ema25, "EMA 25", color=color.new(color.teal, 0))
plot(ema50, "EMA 50", color=color.new(color.orange, 0))
plot(ema100, "EMA 100", color=color.new(color.purple, 0))
bgcolor(trendLongOK ? color.new(color.green, 92) : na)
bgcolor(trendShortOK ? color.new(color.red, 92) : na)
if showSignals and longEntry
label.new(bar_index, low, "▲ BUY\nFull candle above 25 EMA", style=label.style_label_up, textcolor=color.white, color=color.new(color.green, 0))
if showSignals and shortEntry
label.new(bar_index, high, "▼ SELL\nFull candle below 25 EMA", style=label.style_label_down, textcolor=color.white, color=color.new(color.red, 0))