ڈائنامک پرائس رینج بریک آؤٹ-پل بیک-ریورسل ملٹی اسٹریٹجی ٹریڈنگ سسٹم

FVG 5M 1M R:R RANGE TRADING SCALPING
تخلیق کی تاریخ: 2025-08-22 09:55:06 آخر میں ترمیم کریں: 2025-08-22 09:55:06
کاپی: 0 کلکس کی تعداد: 333
2
پر توجہ دیں
319
پیروکار

ڈائنامک پرائس رینج بریک آؤٹ-پل بیک-ریورسل ملٹی اسٹریٹجی ٹریڈنگ سسٹم ڈائنامک پرائس رینج بریک آؤٹ-پل بیک-ریورسل ملٹی اسٹریٹجی ٹریڈنگ سسٹم

جائزہ

متحرک قیمت کی حد توڑنے - پیچھے ہٹنا - پلٹنا کثیر حکمت عملی تجارتی نظام ایک دن کے اندر اندر تجارتی حکمت عملی ہے جو خاص طور پر مختصر لائن تاجروں کے لئے ڈیزائن کیا گیا ہے ، جس کی بنیاد پر قیمت کی حد ہے جو صبح کے آغاز کے بعد پہلے 5 منٹ کے K لائن میں تشکیل دی جاتی ہے۔ یہ حکمت عملی تین مختلف انٹریوں کے طریقوں کو مربوط کرتی ہے: بریک انٹری ، ٹریپ انٹری اور پلٹنا ، جس میں فاریکس ویلیو گیپ (FVG) اور قیمت کی حد توڑنے کے طریقوں کی نشاندہی کرکے تجارت کی جاتی ہے۔ حکمت عملی امریکی اسٹاک مارکیٹ کے کھلنے کے بعد پہلے گھنٹے میں اعلی اتار چڑھاؤ کے اوقات پر توجہ مرکوز کرتی ہے ((30: 9-10: 30 EST) ، 1 منٹ کے چارٹ پر تجارت انجام دیں ، اور نقصان کو روکنے کی ضرورت سے کہیں زیادہ 2: 1 خطرے کی واپسی کا ایک مقررہ شیڈول اپنائیں۔ یہ حکمت عملی آسان ، پیچیدہ اشارے یا اس سے زیادہ وقت کی مدت پر مبنی ہے ، جس میں ایک دن کے اندر لائن ٹریڈنگ کے لئے کوئی تعصب نہیں ہے۔

حکمت عملی کا اصول

اس حکمت عملی کا بنیادی اصول قیمتوں کے ابتدائی وقفے کے بعد صبح کے وقفے کے بعد طرز عمل پر مبنی ہے ، جس میں تین مراحل ہیں:

  1. 9:30 AM):

    • K لائن {9:30-9:35} بندش کے بعد پہلے 5 منٹ انتظار کریں
    • تجارت کے علاقے کے طور پر اس K لائن کے سب سے زیادہ اور سب سے کم نقطہ پر نشان لگائیں
    • 1 منٹ کے چارٹ پر سوئچ کریں
  2. انٹری پوائنٹ تلاش کریں (صرف ٹریڈنگ کے آغاز کے ایک گھنٹے بعد): اس حکمت عملی کے تحت تین مختلف داخلے دستیاب ہیں:

    • بریک انٹری:

      • فکسڈ ویلیو گیپ (FVG) کی شرائط کو پورا کرنا
      • FVG میں کسی بھی K لائن کی بندش کی قیمتوں میں توڑنے کی حد
      • FVG کی تعریف تین K لائنوں کی تشکیل کے لئے ہوائی اڈے کے انداز کے طور پر کی گئی ہے ((wick-gap)
    • ٹریپ انٹری:

      • قیمتوں نے سب سے پہلے علاقائی حدود کو توڑ دیا
      • اس کے بعد اس کے اندر اندر کی پیمائش
      • آخر میں ، یہ ایک بار پھر بند ہوا۔
    • ریورس انٹری:

      • قیمتوں میں ایک سمت میں ناکامی کے بعد
      • ایف وی جی جو مخالف سمت میں ظاہر ہوتا ہے وہ واپس زون میں آتا ہے
  3. ٹرانزیکشن مینجمنٹ:

    • سٹاپ نقصان کی ترتیبات:
      • توڑنے / ٹریپ حکمت عملی: کم سے کم / سب سے زیادہ نقطہ استعمال کرتے ہوئے K لائن کے باہر پہلی بندش
      • ریورس حکمت عملی: FVG موڈ میں پہلی K لائن کی کم سے کم / زیادہ سے زیادہ
    • اسٹاپ سیٹنگ:
      • ہمیشہ 2 سے 1 کا رسک ٹو ریٹرن ریٹ استعمال کریں
      • \( 100 کا خطرہ \) 200 کا منافع

اسٹریٹجی کوڈ میں ایک مکمل منطقی فریم ورک کا نفاذ کیا گیا ہے ، جس میں خود کار طریقے سے تجارتی حدود کا پتہ لگانا ، مختلف داخلے کی شرائط کی شناخت ، اسٹاپ نقصان کی روک تھام کی سطح کا تعین ، اور پوزیشن کی مناسب مقدار کا حساب کتاب کرنا شامل ہے۔ اس نظام میں وقت کے فلٹر بھی شامل ہیں ، جو اس بات کو یقینی بناتے ہیں کہ صرف ایک مخصوص وقت کے دوران ہی تجارت کی جائے ، اور مختلف داخلے کی حکمت عملیوں کو منتخب طور پر فعال یا غیر فعال کیا جاسکتا ہے۔

اسٹریٹجک فوائد

  1. سادہ اور واضح قواعد: حکمت عملی کے قواعد واضح اور بدیہی ہیں ، جس میں کسی بھی طرح کے موضوعی فیصلے کی ضرورت نہیں ہے ، جس سے تجارتی فیصلوں پر جذبات کا اثر کم ہوجاتا ہے۔ کوڈ میں مشروط منطق اور حیثیت سے باخبر رہنے سے قواعد پر سختی سے عمل درآمد یقینی بنایا جاتا ہے۔

  2. داخلہ کے مختلف طریقوں میں لچک: تین مختلف داخلے کی حکمت عملیوں کی فراہمی (بریک ، ٹریپ اور الٹ) ، جس سے تاجروں کو مختلف مارکیٹ کے حالات کے مطابق ڈھالنے کی اجازت ملتی ہے۔ کوڈ کے ذریعےenableBreakenableTrapاورenableReversalپیرامیٹرز اس لچک کو لاگو کرتی ہیں:

  3. اعلی امکانات پر توجہ مرکوزحکمت عملی: صرف پہلے گھنٹے کے بعد ہی تجارت کریں ، اس وقت کے دوران عام طور پر موجود اعلی اتار چڑھاؤ اور لیکویڈیٹی کا فائدہ اٹھائیں۔ کوڈ کے ذریعےinWindowیہ شرط یقینی بناتی ہے کہ تجارت صرف 9:30 سے 10:30 کے درمیان کی جائے۔

  4. سخت خطرے کا انتظام: فکسڈ 2: 1 رسک ریٹرن ریٹ اور مخصوص قیمت کے عمل پر مبنی اسٹاپ نقصان کی ترتیب ، ہر تجارت پر واضح خطرے کا کنٹرول فراہم کرتی ہے۔riskPctپیرامیٹرز صارف کو اپنے خطرے کی ترجیحات کے مطابق ہر تجارت کے خطرے کے فیصد کو ایڈجسٹ کرنے کی اجازت دیتا ہے۔

  5. پیچیدہ اشارے کی ضرورت نہیںیہ حکمت عملی پیچیدہ تکنیکی اشارے پر انحصار نہیں کرتی بلکہ خالص طور پر قیمتوں کے رویے اور ڈھانچے پر مبنی ہوتی ہے ، جس سے زیادہ فٹ ہونے کا خطرہ کم ہوتا ہے۔

  6. موسمی بچاؤ: کوڈ میں چھٹیوں کی بلیک لسٹ ہے ((15 دسمبر سے 15 جنوری) ، اس وقت سے بچنے کے لئے جب مارکیٹ میں عدم استحکام یا کم لیکویڈیٹی ہوسکتی ہے۔

  7. لچکدار پوزیشن مینجمنٹ: سسٹم خطرے کے فیصد یا معاہدوں کی ایک مقررہ تعداد کی بنیاد پر دو پوزیشن مینجمنٹ کے طریقوں کو پیش کرتا ہے ، جو فنڈ مینجمنٹ کی مختلف ضروریات کے مطابق ہے۔

اسٹریٹجک رسک

  1. جعلی دراندازی کا خطرہاس خطرے کو کم کرنے کے لئے ، اس حکمت عملی میں ٹریپ اور ریورس انٹری ماڈل شامل ہیں ، لیکن اس کی محتاط نگرانی کی ضرورت ہے۔

  2. بینڈوڈتھ مسئلہ: اگر کھلنے کے بعد پہلے 5 منٹ میں K لائن کا فاصلہ بہت وسیع یا بہت تنگ ہو تو اس حکمت عملی کی تاثیر کو متاثر کرسکتا ہے۔ بہت تنگ فاصلہ بار بار ٹرگر سگنل کا سبب بن سکتا ہے ، اور بہت وسیع فاصلہ روکنے کا نقطہ بہت دور ہوسکتا ہے۔

  3. وقت کی پابندی کے مواقع کی لاگتتاہم ، یہ پابندی بھی ایک نظم و ضبط ہے جو ضرورت سے زیادہ تجارت کو روکتی ہے۔

  4. فکسڈ رسک ریٹرن تناسب کی حدود: اگرچہ 2: 1 رسک ریٹرن تناسب مستقل مزاجی فراہم کرتا ہے ، لیکن یہ مارکیٹ کے کچھ حالات میں بہترین انتخاب نہیں ہوسکتا ہے۔ مضبوط رجحانات والی مارکیٹوں میں ، رسک ریٹرن تناسب زیادہ مناسب ہوسکتا ہے۔

  5. چھٹیوں کے دوران غیر معمولی مارکیٹاگرچہ حکمت عملی نے 15 دسمبر سے 15 جنوری کے درمیان تجارت سے گریز کیا ہے ، لیکن تعطیلات سے پہلے اور بعد میں مارکیٹ کے دیگر طرز عمل بھی غیر معمولی ہوسکتے ہیں ، جو حکمت عملی کی کارکردگی کو متاثر کرسکتے ہیں۔

  6. ایف وی جی پر انحصار: حکمت عملی ایف وی جی ماڈل پر انحصار کرتی ہے جس میں توڑنے اور الٹ جانے والے داخلے ہوتے ہیں ، لیکن بعض مارکیٹ کے حالات میں ، ایف وی جی آسانی سے تشکیل یا شناخت نہیں ہوسکتی ہے۔

  7. ایک وقت کے فریم کی حدوداس کے علاوہ ، یہ بھی خیال کیا جاتا ہے کہ اس طرح کی حکمت عملیوں کو مارکیٹ کے اہم ڈھانچے کو نظر انداز کرنے کی ضرورت ہے جو بڑے ٹائم فریموں میں ہیں۔

حکمت عملی کی اصلاح کی سمت

  1. اپنی مرضی کے مطابق بینڈوڈتھ: مارکیٹ میں اتار چڑھاؤ کی متحرکات کے مطابق رینج کی چوڑائی کو ایڈجسٹ کرنے پر غور کیا جاسکتا ہے ، مثال کے طور پر زیادہ اتار چڑھاؤ والے دنوں میں وسیع رینج کا استعمال کریں ، اور کم اتار چڑھاؤ والے دنوں میں تنگ رینج کا استعمال کریں۔ یہ حالیہ اوسط حقیقی اتار چڑھاؤ کی حد ((ATR) یا اسی طرح کے اشارے کا حساب کتاب کرکے کیا جاسکتا ہے۔

  2. وقت کی کھڑکی کو بہتر بنائیں9: 9:30-10: 30 پر فکسڈ ہونے کے بجائے مختلف مارکیٹوں کے لئے زیادہ سے زیادہ ٹریڈنگ کے وقت کی کھڑکیوں کا مطالعہ کیا جاسکتا ہے۔ کچھ مارکیٹیں مختلف اوقات میں زیادہ نمایاں بریک آؤٹ پیٹرن دکھا سکتی ہیں۔

  3. متحرک رسک ریٹرن سیٹنگ: مارکیٹ کے حالات اور اتار چڑھاؤ کی حرکیات کے مطابق رسک ریٹرن کو ایڈجسٹ کیا جاسکتا ہے ، مثال کے طور پر ، جب رجحان مضبوط ہوتا ہے تو ہدف میں اضافہ ہوتا ہے ، اور بازاروں کے اختتام پر ہدف کو کم کیا جاتا ہے۔

  4. مارکیٹ کے جذبات کے انڈیکس: مارکیٹ کی وسعت کے اشارے یا اتار چڑھاؤ کے اشارے کو بطور فلٹر شامل کرنے پر غور کیا جاسکتا ہے ، تاکہ مارکیٹ کے خراب حالات میں تجارت سے گریز کیا جاسکے۔

  5. ملٹی ٹائم فریم تصدیق: اگرچہ عملدرآمد کی تجارت اب بھی 1 منٹ کے چارٹ پر ہے ، لیکن اعلی ٹائم فریموں کی تصدیق کی شرائط شامل کی جاسکتی ہیں ، جیسے 15 منٹ یا 1 گھنٹے کے چارٹ پر رجحان کی سمت کی مستقل مزاجی کی جانچ پڑتال۔

  6. ایف وی جی تعریف کو بہتر بنائیں: موجودہ ایف وی جی کی تعریف نسبتا simple آسان ہے ، اس سے کہیں زیادہ پیچیدہ یا زیادہ درست عدم توازن والے علاقوں کی تعریف پر غور کیا جاسکتا ہے ، جیسے کہ صرف شیڈ لائن کے بجائے جسم پر غور کرنا۔

  7. ٹرانزیکشن کی تصدیق شامل کریں: داخلہ کی شرائط میں حجم کی تصدیق شامل کرنے سے سگنل کی کیفیت میں اضافہ ہوسکتا ہے ، خاص طور پر داخلہ کی خرابی کے لئے۔

  8. نقصانات کو روکنے کے لئے: مارکیٹ میں اتار چڑھاؤ کی رفتار کے مطابق اسٹاپ نقصان کی سطح کو ایڈجسٹ کرنا ، مختلف مارکیٹ کے حالات میں حکمت عملی کی موافقت کو بہتر بناسکتا ہے۔

خلاصہ کریں۔

متحرک قیمت کی حد توڑنے - پیچھے ہٹانے - الٹ پلٹ کرنے والی کثیر حکمت عملی تجارتی نظام ایک منظم ، واضح قواعد والی دن کی تجارت کی حکمت عملی ہے ، جس میں صبح کے کھانے کی قیمت کی حد اور اس کے بعد کے توڑنے ، پھنسنے یا الٹ پلٹ کے نمونوں کی نشاندہی کرکے تجارت کے مواقع تلاش کیے جاتے ہیں۔ اس حکمت عملی کے بنیادی فوائد اس کی سادگی اور متعدد داخلے کے طریقوں کی لچک میں ہیں ، جبکہ سخت وقت کی حد اور خطرے کے انتظام کے اصول تجارت کے نظم و ضبط کو برقرار رکھنے میں معاون ہیں۔

تاہم ، اس حکمت عملی کو جھوٹے توڑنے ، نامناسب حد کی چوڑائی اور قیمت کے مخصوص نمونوں پر انحصار جیسے خطرات کا بھی سامنا کرنا پڑتا ہے۔ اس حکمت عملی کی استحکام اور موافقت کو مزید بہتر بنانے کے لئے اس طرح کے طریقوں کا استعمال کیا جاسکتا ہے جیسے حد بندی کا طریقہ کار ، وقت کی کھڑکیوں کو ایڈجسٹ کرنا ، متحرک طور پر خطرہ کی واپسی کا تناسب اور کثیر وقتی فریم تجزیہ کو ضم کرنا۔

آخر کار ، یہ حکمت عملی مختصر لائن تاجروں کے لئے ایک منظم فریم ورک مہیا کرتی ہے ، خاص طور پر ان سرمایہ کاروں کے لئے جو روزانہ کے کھلنے کے اوقات میں موثر تجارت کی تلاش میں ہیں۔ تمام تجارتی حکمت عملیوں کی طرح ، عملی طور پر لاگو ہونے سے پہلے کافی جانچ پڑتال اور مناسب خطرے کا انتظام کیا جانا چاہئے۔

حکمت عملی کا ماخذ کوڈ
/*backtest
start: 2025-07-22 00:00:00
end: 2025-08-21 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"ETH_USDT","balance":500000}]
*/

//@version=5
strategy("Three-Step 9:30 Range Scalping (Backtest)", overlay=true, calc_on_every_tick=false, process_orders_on_close=true,
     initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=0)

// -------------------- Inputs
enableBreak    = input.bool(true,  "Enable Break Entry")
enableTrap     = input.bool(false, "Enable Trap Entry")
enableReversal = input.bool(true, "Enable Reversal Entry")
rr             = input.float(2.0,  "Take-Profit R Multiple", step=0.25, minval=0.25)
oneTradePerDay = input.bool(false,  "One Trade Per Day")
showRange      = input.bool(true,  "Show 9:30 5m Range")

// Risk management
riskPct        = input.float(1.0,  "Risk % of Equity per Trade", step=0.1, minval=0.1, maxval=100.0)
sizeMode       = input.string("Risk %", "Position Sizing Mode", options=["Risk %", "Fixed contracts"])
fixedContracts = input.int(1, "Fixed Contracts", minval=1)

// Optional: warn if not on 1-minute chart (execution timeframe per PRD)
onOneMinute = timeframe.isminutes and timeframe.multiplier == 1

// -------------------- Time helpers (chart is assumed New York time)
newDay   = ta.change(time("D")) != 0
// Trade the first hour only: 9:30:00 to 10:29:59
inWindow = (hour == 9 and minute >= 30) or (hour == 10 and minute <= 29)
// Holiday blackout window: Do not trade Dec 15 – Jan 15
inBlackout = (month == 12 and dayofmonth >= 15) or (month == 1 and dayofmonth <= 15)

// -------------------- First 5-min range (use the actual 9:30 5m candle via security())
var float rangeHi = na
var float rangeLo = na
var bool  haveRange = false

// -------------------- State for entries
var bool  breakUpFound           = false
var bool  breakDownFound         = false
var float initBreakUpLow         = na    // for Break/Trap long SL
var float initBreakDownHigh      = na    // for Break/Trap short SL
var bool  trapUpRetestedInside   = false
var bool  trapDownRetestedInside = false
var bool  tradedToday            = false

// Reset daily state at midnight (chart timezone)
if newDay
    rangeHi := na
    rangeLo := na
    haveRange := false
    breakUpFound := false
    breakDownFound := false
    initBreakUpLow := na
    initBreakDownHigh := na
    trapUpRetestedInside := false
    trapDownRetestedInside := false
    tradedToday := false

// Pull the 5-minute bar that STARTS at 9:30 (value available on its close at 9:35)
sess0930Hi = request.security(syminfo.tickerid, "5", (hour == 9 and minute == 30) ? high : na, barmerge.gaps_off, barmerge.lookahead_off)
sess0930Lo = request.security(syminfo.tickerid, "5", (hour == 9 and minute == 30) ? low  : na, barmerge.gaps_off, barmerge.lookahead_off)

// Lock the range when the 9:30 5m candle closes (value appears non-na exactly then)
if not haveRange and not na(sess0930Hi) and not na(sess0930Lo)
    rangeHi := sess0930Hi
    rangeLo := sess0930Lo
    haveRange := true
    // reset session-specific flags at start of trading window
    breakUpFound := false
    breakDownFound := false
    initBreakUpLow := na
    initBreakDownHigh := na
    trapUpRetestedInside := false
    trapDownRetestedInside := false
    tradedToday := false

// -------------------- Visuals
plot(showRange and haveRange ? rangeHi : na, "Range High", color=color.new(color.teal, 0), style=plot.style_linebr, linewidth=2)
plot(showRange and haveRange ? rangeLo : na, "Range Low",  color=color.new(color.orange, 0), style=plot.style_linebr, linewidth=2)

plotchar(not onOneMinute, title="Use 1-minute chart", char="⚠", location=location.top, color=color.new(color.red, 0), size=size.tiny)
plotchar(inBlackout, title="Holiday blackout (Dec 15–Jan 15)", char="⛔", location=location.top, color=color.new(color.red, 0), size=size.tiny)

// -------------------- Convenience conditions
closeAbove  = haveRange and close > rangeHi
closeBelow  = haveRange and close < rangeLo
closeInside = haveRange and close <= rangeHi and close >= rangeLo

// Track first body-close outside the range in each direction (initial break-close)
if haveRange and inWindow and not tradedToday
    if not breakUpFound and closeAbove
        breakUpFound := true
        initBreakUpLow := low
        trapUpRetestedInside := false
    if not breakDownFound and closeBelow
        breakDownFound := true
        initBreakDownHigh := high
        trapDownRetestedInside := false

// Trap retest flags (retest back inside after first break)
if haveRange and inWindow and not tradedToday
    if breakUpFound and not trapUpRetestedInside and closeInside
        trapUpRetestedInside := true
    if breakDownFound and not trapDownRetestedInside and closeInside
        trapDownRetestedInside := true

// -------------------- FVG detectors (three-candle imbalance)
// Simple wick-gap definition, preserved through the third candle
// Bullish: gap exists if Candle C low > Candle A high AND Candle B low > Candle A high
// Bearish: gap exists if Candle C high < Candle A low  AND Candle B high < Candle A low
bullFVG = not na(high[2]) and (low[1] > high[2]) and (low > high[2])
bearFVG = not na(low[2])  and (high[1] < low[2])  and (high < low[2])

// -------------------- Entry gating
allowEntry = haveRange and inWindow and not inBlackout and strategy.position_size == 0 and (not oneTradePerDay or not tradedToday)

// Calculate contracts based on selected sizing mode
calcOrderQty(entryPrice, stopPrice) =>
    qty = 0
    if sizeMode == "Fixed contracts"
        qty := fixedContracts
    else
        riskCash = strategy.equity * riskPct / 100.0
        riskPerContract = math.abs(entryPrice - stopPrice) * syminfo.pointvalue
        qty := riskPerContract > 0 ? math.floor(riskCash / riskPerContract) : 0
    qty

// -------------------- BREAK Entries (needs FVG and ANY of the 3 bars closes outside)
if enableBreak and allowEntry
    // Long BREAK
    breakLongOk  = bullFVG and (close > rangeHi or close[1] > rangeHi or close[2] > rangeHi)
    if breakLongOk
        // Stop at the FIRST candle that closed outside among the 3 FVG candles
        float stopL = na
        stopL := close[2] > rangeHi ? low[2] : stopL
        stopL := na(stopL) and close[1] > rangeHi ? low[1] : stopL
        stopL := na(stopL) and close > rangeHi ? low : stopL
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_BREAK", strategy.long, qty=qtyL)
                strategy.exit("LONG_BREAK_TP/SL", from_entry="LONG_BREAK", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // Short BREAK
    breakShortOk = bearFVG and (close < rangeLo or close[1] < rangeLo or close[2] < rangeLo)
    if breakShortOk
        // Stop at the FIRST candle that closed outside among the 3 FVG candles
        float stopS = na
        stopS := close[2] < rangeLo ? high[2] : stopS
        stopS := na(stopS) and close[1] < rangeLo ? high[1] : stopS
        stopS := na(stopS) and close < rangeLo ? high : stopS
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_BREAK", strategy.short, qty=qtyS)
                strategy.exit("SHORT_BREAK_TP/SL", from_entry="SHORT_BREAK", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- TRAP Entries (Break → Retest inside → Reclose outside; FVG not required)
if enableTrap and allowEntry
    // Long TRAP
    if breakUpFound and trapUpRetestedInside and closeAbove
        stopL  = na(initBreakUpLow) ? low : initBreakUpLow
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_TRAP", strategy.long, qty=qtyL)
                strategy.exit("LONG_TRAP_TP/SL", from_entry="LONG_TRAP", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // Short TRAP
    if breakDownFound and trapDownRetestedInside and closeBelow
        stopS  = na(initBreakDownHigh) ? high : initBreakDownHigh
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_TRAP", strategy.short, qty=qtyS)
                strategy.exit("SHORT_TRAP_TP/SL", from_entry="SHORT_TRAP", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- REVERSAL Entries (Failed break + opposite FVG back into range)
if enableReversal and allowEntry
    // After bearish break, bullish FVG back into range → LONG
    if breakDownFound and bullFVG and closeInside
        stopL  = low[2]  // first candle of the FVG
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_REV", strategy.long, qty=qtyL)
                strategy.exit("LONG_REV_TP/SL", from_entry="LONG_REV", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // After bullish break, bearish FVG back into range → SHORT
    if breakUpFound and bearFVG and closeInside
        stopS  = high[2] // first candle of the FVG
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_REV", strategy.short, qty=qtyS)
                strategy.exit("SHORT_REV_TP/SL", from_entry="SHORT_REV", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- Markers
plotshape(enableBreak and (bullFVG and (close > rangeHi or close[1] > rangeHi or close[2] > rangeHi)) and allowEntry,  title="Break Long",  style=shape.triangleup,   color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Break")
plotshape(enableBreak and (bearFVG and (close < rangeLo or close[1] < rangeLo or close[2] < rangeLo)) and allowEntry,  title="Break Short", style=shape.triangledown, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Break")
plotshape(enableTrap  and breakUpFound   and trapUpRetestedInside   and closeAbove and allowEntry,  title="Trap Long",  style=shape.circle, color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Trap")
plotshape(enableTrap  and breakDownFound and trapDownRetestedInside and closeBelow and allowEntry,  title="Trap Short", style=shape.circle, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Trap")
plotshape(enableReversal and breakDownFound and bullFVG and closeInside and allowEntry, title="Reversal Long",  style=shape.diamond, color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Rev")
plotshape(enableReversal and breakUpFound   and bearFVG and closeInside and allowEntry, title="Reversal Short", style=shape.diamond, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Rev")