
ایک ہی مساوی لائن کے ساتھ تجارت نہ کریں۔ یہ حکمت عملی 25/50/100 کے تین EMAs کے ساتھ ایک مکمل رجحان کی شناخت کا نظام بناتی ہے ، جس میں EMAs کو لازمی طور پر ترتیب سے ترتیب دیا جانا چاہئے اور اسی سمت میں جھکاؤ ، اس کے علاوہ 0.10x ATR کی کم سے کم فاصلہ کی ضرورت ہے۔ اعداد و شمار سے پتہ چلتا ہے کہ یہ ٹرپل فلٹرنگ میکانزم زلزلے کی مارکیٹوں میں جعلی توڑ سے بچنے کے لئے موثر ہے ، اور صرف حقیقی رجحانات کے دوران کام کرتا ہے۔
کلیدی بات یہ ہے کہ “صاف ای ایم اے صف بندی” کی جائے: کثیر سر کے وقت 25> 50> 100 اور تمام اوپر کی طرف ، خالی سر کے وقت 25 < 50 < 100 اور تمام نیچے کی طرف۔ وقفہ فلٹرنگ اس بات کو یقینی بناتی ہے کہ رجحان کافی مضبوط ہے ، اور یکساں طور پر چپکنے والی حالت میں غیر موثر سگنل سے بچتا ہے۔
اس حکمت عملی کا بنیادی مرکز واپسی کا پتہ لگانے کا طریقہ کار ہے۔ کثیر سر واپسی کی ضرورت ہوتی ہے کہ قیمت 25 یا 50 ای ایم اے کو چھوئے لیکن 100 ای ایم اے سے اوپر رہے ، اور خالی سر واپسی کی ضرورت ہوتی ہے کہ قیمت 25 یا 50 ای ایم اے کو چھوئے لیکن 100 ای ایم اے سے نیچے رہے۔ یہ ڈیزائن روایتی “سپورٹ کو توڑنے اور پھر خریدنے” سے زیادہ درست ہے۔
15 سائیکلوں کی واپسی کی ونڈو کا تعین معقول ہے۔ ریٹائرمنٹ کے اعداد و شمار سے پتہ چلتا ہے کہ حقیقی رجحانات کی واپسی عام طور پر 10-15 سائیکلوں میں مکمل ہوتی ہے ، اس وقت کے کھڑکی سے زیادہ کی واپسی کا مطلب یہ ہوتا ہے کہ رجحانات میں تبدیلی آسکتی ہے۔ جب وقت گزر جاتا ہے یا قیمت 100 ای ایم اے کو توڑ دیتی ہے تو ، حکمت عملی کو فوری طور پر ہتھیار ڈالنے سے روک دیا جاتا ہے۔
داخلہ کی شرائط انتہائی سخت ہیں: تصدیق شدہ K لائن بند ہونے کے بعد ، پوری K لائن (اوپن ، ہائی ، لوئر ، بند) کو 25 ای ایم اے کے صحیح طرف بالکل ہونا ضروری ہے۔ یہ ڈیزائن جعلی توڑنے اور ڈسک میں شور کو روکتا ہے ، اس بات کو یقینی بناتا ہے کہ صرف حقیقی الٹ کی تصدیق کے بعد ہی داخلہ ہو۔
کثیر سر داخلہ کی ضروریات: اوپن> 25 ای ایم اے ، کم سے کم> 25 ای ایم اے ، بند> 25 ای ایم اے۔ خالی سر داخلہ کی ضروریات: اوپن <25 ای ایم اے ، زیادہ سے زیادہ <25 ای ایم اے ، بند <25 ای ایم اے۔ اس طرح کے “مکمل K لائن کی تصدیق” کے طریقہ کار سے داخلے کے معیار میں نمایاں اضافہ ہوا ہے اور غیر موثر سودوں میں کمی واقع ہوئی ہے۔
حکمت عملی کی طے شدہ 10٪ پوزیشن کی ترتیب اعتدال پسند ہے ، جس سے کافی منافع حاصل ہوتا ہے اور ایک ہی خطرے پر قابو پایا جاتا ہے۔ 0.05٪ کی فیس کی ترتیب اصل تجارتی لاگت کے قریب ہے ، اور نتائج کی جانچ پڑتال کا حوالہ زیادہ قیمتی ہے۔ کثیر فضائی دو طرفہ تجارت کی حمایت کرتا ہے ، اور مختلف مارکیٹ کے حالات کے مطابق ایک طرفہ آپریشن کا انتخاب بھی کرسکتا ہے۔
اہم نوٹ: حکمت عملی میں صرف داخلے کی منطق شامل ہے ، اس میں اسٹاپ اسٹاپ نقصان کی ترتیب نہیں ہے۔ ریئل ٹائم استعمال کے لئے سخت رسک مینجمنٹ کے ساتھ کام کرنا ضروری ہے ، 2-3 گنا اے ٹی آر کا نقصان اور 1.5-2 گنا رسک ریٹرن کا اسٹاپ تجویز کیا گیا ہے۔
حکمت عملی واضح رجحان مارکیٹوں میں عمدہ کارکردگی کا مظاہرہ کرتی ہے ، خاص طور پر ایک طرفہ رجحانات میں واپسی کی خریداری کے لئے موزوں ہے۔ لیکن افقی اتار چڑھاؤ والی مارکیٹوں میں ، EMA کی درجہ بندی کی شرائط کو پورا کرنا مشکل ہے ، اور تجارت کے مواقع نسبتا. کم ہیں۔ یہ دراصل حکمت عملی کا ایک فائدہ ہے ، جو غیر منفعتی ماحول میں ضرورت سے زیادہ تجارت سے بچتا ہے۔
خطرے سے متعلق اشارہ: تاریخی ریٹرن مستقبل کی آمدنی کی نمائندگی نہیں کرتا ہے۔ حکمت عملی میں مسلسل نقصان کا خطرہ ہے۔ چونکہ چونکانے والی مارکیٹ میں طویل عرصے تک کوئی سگنل نہیں ہوسکتا ہے ، لہذا مناسب مارکیٹ کے ماحول کا انتظار کرنے کے لئے صبر کی ضرورت ہے۔ استعمال کرنے سے پہلے مکمل طور پر تجزیاتی تجارت کی تصدیق کی سفارش کی جاتی ہے۔
/*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))