গতিশীল মূল্য পরিসর ব্রেকআউট-পুলব্যাক-রিভার্সাল মাল্টি-স্ট্র্যাটেজি ট্রেডিং সিস্টেম

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 মিনিটের কে লাইনের উপর ভিত্তি করে তৈরি করা হয়। এই কৌশলটি তিনটি পৃথক প্রবেশের মোডকে একীভূত করেঃ ব্রেক-ইন, ট্র্যাপ-ইন এবং রিভার্স-ইন, এবং এফএক্সের মূল্যের ফাঁক (এফভিজি) এবং দামের অঞ্চলটি ভেঙে যাওয়ার মডেলগুলি সনাক্ত করে। কৌশলটি মার্কিন স্টক মার্কেটের খোলার পরে প্রথম ঘন্টা (৩০ঃ৯-১০ঃ৩০ ইএসটি) এর উচ্চ অস্থিরতার সময়কে মনোনিবেশ করে, ১ মিনিটের চার্টে লেনদ সম্পাদন করে এবং স্ট্র্যাপ লস পরিচালনার চেয়ে স্থির 2: 1 ঝুঁকি রিটার্ন ব্যবহার করে। এই কৌশলটি সংক্ষিপ্ত, জটিল সূচক বা উচ্চতর সময়কালীন চক্রের উপর ভিত্তি করে, কোনও পক্ষপাতহীনতা ছাড়াই একটি সংক্ষিপ্ত দিনের

কৌশল নীতি

এই কৌশলটির মূল নীতিটি মূলত প্রাথমিক ব্যাপ্তি তৈরির পরে মূল্যের আচরণের প্যাটার্নের উপর ভিত্তি করে তৈরি করা হয়েছে, যা তিনটি ধাপে কাজ করেঃ

  1. সকাল ৯.৩০:

    • প্রথম 5 মিনিট অপেক্ষা করুন খোলার পরে K লাইন ((9:30-9:35) বন্ধ করুন
    • K-রেখার সর্বোচ্চ এবং সর্বনিম্ন পয়েন্টগুলিকে ট্রেডিং ব্যাপ্তি হিসাবে চিহ্নিত করুন
    • 1 মিনিটের চার্টে স্যুইচ করুন এবং প্রকৃত লেনদেন করুন
  2. প্রবেশের পয়েন্ট খুঁজুন (শুধুমাত্র লেনদেন শুরু হওয়ার এক ঘন্টা পর): এই কৌশলটিতে তিনটি ভিন্ন প্রবেশের সুযোগ রয়েছেঃ

    • ব্রেক এন্ট্রি:

      • Fair Value Gap (FVG) শর্ত পূরণ করতে হবে
      • FVG এর যেকোন K-লাইন বন্ধের মূল্যের ব্রেকআউট
      • FVG সংজ্ঞায়িত করা হয়েছে তিনটি K লাইন গঠিত উড়ন্ত প্যাটার্ন (উইক-গ্যাপ)
    • ট্র্যাপ এন্ট্রি:

      • দাম প্রথম স্থানান্তরিত হয়
      • এবং তারপরে, আপনি একটি বিন্দুতে ফিরে যান।
      • অবশেষে, আবারও বন্ধ হল।
    • বিপরীত প্রবেশ:

      • এক দিকের বিপর্যয়ের পরে দাম
      • বিপরীত দিকের এফভিজি ফিরে এল
  3. লেনদেন ব্যবস্থাপনা:

    • স্টপ লস সেটিং:
      • ব্রেকআউট/ট্র্যাপ কৌশলঃ সর্বনিম্ন/সর্বোচ্চ পয়েন্টের প্রথম বন্ধের সাথে K-লাইন ব্যবহার করে
      • বিপরীত কৌশলঃ FVG মোডে প্রথম K লাইনের সর্বনিম্ন / সর্বোচ্চ পয়েন্ট ব্যবহার করুন
    • স্টপ সেটিং:
      • সবসময় ২ঃ১ এর রিস্ক-রিটার্ন অনুপাত ব্যবহার করুন
      • \(100 ঝুঁকি \)200 লাভ

কৌশল কোডটি একটি সম্পূর্ণ লজিকাল ফ্রেমওয়ার্ক বাস্তবায়ন করে, যার মধ্যে রয়েছে স্বয়ংক্রিয়ভাবে ট্রেডিং ব্যাপ্তি সনাক্ত করা, বিভিন্ন প্রবেশের শর্তগুলি সনাক্ত করা, স্টপ-ড্রপ স্তর সেট করা এবং যথাযথ অবস্থানের আকার গণনা করা। সিস্টেমটিতে একটি সময় ফিল্টারও রয়েছে যা নিশ্চিত করে যে কেবলমাত্র নির্দিষ্ট সময়ের মধ্যে বাণিজ্য করা হয় এবং বিভিন্ন প্রবেশের কৌশলগুলিকে নির্বাচনীভাবে সক্ষম বা অক্ষম করা যায়।

কৌশলগত সুবিধা

  1. সংক্ষিপ্ত এবং সুস্পষ্ট নিয়ম: কৌশলগত নিয়মগুলি স্পষ্ট এবং স্বজ্ঞাত, বিষয়গত বিচার ছাড়াই, ট্রেডিং সিদ্ধান্তের উপর আবেগের প্রভাব হ্রাস করে। কোডের মধ্যে শর্তযুক্ত যুক্তি এবং স্থিতি ট্র্যাকিং নিয়মগুলির কঠোর প্রয়োগ নিশ্চিত করে।

  2. ভর্তির বিভিন্ন পদ্ধতির নমনীয়তা: তিনটি ভিন্ন এন্ট্রি কৌশল প্রদান করে (বিভিন্ন বাজার পরিবেশের সাথে ব্যবসায়ীদের মানিয়ে নিতে সক্ষম করে) ।enableBreakenableTrapএবংenableReversalপ্যারামিটার এই নমনীয়তা প্রদান করে।

  3. উচ্চ সম্ভাব্যতার সময়গুলিতে ফোকাস করুনকৌশলঃ শুধুমাত্র প্রথম ঘন্টার মধ্যে ট্রেড করুন, এই সময়ের মধ্যে সাধারণত বিদ্যমান উচ্চতর অস্থিরতা এবং তরলতা ব্যবহার করে।inWindowশর্তাবলী শুধুমাত্র ০৯ঃ৩০ থেকে ০১ঃ৩০ এর মধ্যে লেনদেন নিশ্চিত করে।

  4. কঠোর ঝুঁকি ব্যবস্থাপনা: স্থির 2: 1 ঝুঁকি-ফেরত অনুপাত এবং নির্দিষ্ট মূল্যের ক্রিয়াকলাপের উপর ভিত্তি করে স্টপ লস সেটিং, প্রতিটি লেনদেনের জন্য স্পষ্ট ঝুঁকি নিয়ন্ত্রণ সরবরাহ করে।riskPctপ্যারামিটারটি ব্যবহারকারীদের তাদের ঝুঁকি পছন্দ অনুসারে প্রতিটি লেনদেনের ঝুঁকির শতাংশকে সামঞ্জস্য করতে দেয়।

  5. কোন জটিল সূচক প্রয়োজনএই কৌশলটি জটিল প্রযুক্তিগত সূচকগুলির উপর নির্ভর করে না, বরং এটি খাঁটি মূল্যের আচরণ এবং কাঠামোর উপর ভিত্তি করে তৈরি করা হয়, যা অতিরিক্ত ফিটনেসের ঝুঁকি হ্রাস করে।

  6. মৌসুমী এড়ানোকোডটিতে একটি ছুটির কালো তালিকা রয়েছে (১৫ ডিসেম্বর থেকে ১৫ জানুয়ারি) যাতে বাজারের অস্থিরতা বা কম তরলতা এড়ানো যায়।

  7. নমনীয় পজিশন ব্যবস্থাপনা: সিস্টেমটি বিভিন্ন তহবিল পরিচালনার প্রয়োজনের জন্য ঝুঁকির শতাংশ বা নির্দিষ্ট সংখ্যক চুক্তির উপর ভিত্তি করে দুটি পজিশন পরিচালনার পদ্ধতি সরবরাহ করে।

কৌশলগত ঝুঁকি

  1. ভুয়া আক্রমণের ঝুঁকি: বাজারে মিথ্যা ব্রেকআউট হতে পারে, যার ফলে ট্রেডিংয়ের পরে দাম দ্রুত বিপরীত হতে পারে। এই ঝুঁকি কমাতে, কৌশলটি ফাঁদ এবং বিপরীত প্রবেশের মডেলকে একত্রিত করে, তবে সতর্কতার সাথে পর্যবেক্ষণ করা দরকার।

  2. ব্যাপ্তি প্রশস্ততা সমস্যা: যদি প্রথম 5 মিনিটের K-লাইন খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে খোলার পরে।

  3. সময়সীমার সুযোগের খরচতবে, এই সীমাবদ্ধতা একটি শৃঙ্খলা, যা অতিরিক্ত লেনদেন প্রতিরোধ করে।

  4. ফিক্সড রিস্ক-রিটার্ন অনুপাতের সীমাবদ্ধতাযদিও ২ঃ১ এর রিস্ক-রিটার্ন অনুপাত ধারাবাহিকতা প্রদান করে, তবে কিছু বাজার পরিস্থিতিতে এটি সর্বোত্তম বিকল্প নাও হতে পারে। শক্তিশালী প্রবণতা বাজারে, উচ্চতর রিস্ক-রিটার্ন অনুপাত আরও উপযুক্ত হতে পারে।

  5. ছুটির সময় বাজারের অস্বাভাবিকতাযদিও এই কৌশলটি ১৫ ডিসেম্বর থেকে ১৫ জানুয়ারি পর্যন্ত ট্রেডিং এড়িয়ে চলেছে, তবে অন্যান্য ছুটির দিনগুলির আগে বা পরে বাজারের আচরণগুলিও অস্বাভাবিক হতে পারে এবং কৌশলটির কার্যকারিতা প্রভাবিত করতে পারে।

  6. FVG-এর উপর নির্ভরতা: কৌশলটি বিরতি এবং বিপরীত প্রবেশের ক্ষেত্রে এফভিজি মডেলের উপর নির্ভর করে, তবে নির্দিষ্ট বাজারের পরিস্থিতিতে এফভিজিগুলি সহজেই গঠিত বা সনাক্ত করা যায় না।

  7. একক সময়সীমার সীমাবদ্ধতাএক মিনিটের চার্টের উপর সম্পূর্ণ নির্ভরশীলতা বড় সময়ের ফ্রেমের গুরুত্বপূর্ণ বাজার কাঠামোকে উপেক্ষা করতে পারে।

কৌশল অপ্টিমাইজেশনের দিকনির্দেশনা

  1. ব্যাসার্ধ প্রস্থের সাথে মানিয়ে নিন: বাজারের অস্থিরতার গতিশীলতার উপর ভিত্তি করে ব্যাপ্তির প্রশস্ততা সামঞ্জস্য করার কথা বিবেচনা করা যেতে পারে, যেমন উচ্চ অস্থিরতার দিনগুলিতে একটি প্রশস্ত ব্যাপ্তি ব্যবহার করা এবং কম অস্থিরতার দিনগুলিতে একটি সংকীর্ণ ব্যাপ্তি ব্যবহার করা। এটি সাম্প্রতিক গড় প্রকৃত অস্থিরতার ব্যাপ্তি ((এটিআর) বা অনুরূপ সূচক গণনা করে করা যেতে পারে।

  2. সময় উইন্ডো অপ্টিমাইজ করুন৯ঃ৩০-১০ঃ৩০ এর পরিবর্তে বিভিন্ন বাজারের জন্য সর্বোত্তম ট্রেডিং সময় উইন্ডোটি অধ্যয়ন করা যেতে পারে। কিছু বাজার বিভিন্ন সময়ে আরও সুস্পষ্ট ব্রেকআউট প্যাটার্ন প্রদর্শন করতে পারে।

  3. ডায়নামিক রিস্ক রিটার্ন সেটিং: বাজারের অবস্থা এবং অস্থিরতার গতিশীলতার উপর ভিত্তি করে রিস্ক-রিটার্নের অনুপাতটি সামঞ্জস্য করা যেতে পারে, যেমন প্রবণতা শক্তিশালী হলে লক্ষ্যমাত্রা বাড়ানো এবং বাজারের সমন্বয়কালে লক্ষ্যমাত্রা হ্রাস করা।

  4. মার্কেট সেন্টিমেন্ট ইন্টিগ্রেটেড: বাজার প্রশস্ততা সূচক বা অস্থিরতা সূচকগুলিকে ফিল্টার হিসাবে অন্তর্ভুক্ত করার কথা বিবেচনা করা যেতে পারে, বাজার পরিস্থিতি খারাপ হলে লেনদেন এড়ানো যায়।

  5. মাল্টি টাইম ফ্রেম নিশ্চিতকরণ: যদিও এক্সিকিউশন ট্রেড এখনও 1 মিনিটের চার্টে রয়েছে, তবে 15 মিনিটের বা 1 ঘন্টার চার্টে প্রবণতার দিকনির্দেশের সামঞ্জস্য পরীক্ষা করার মতো উচ্চতর সময় ফ্রেমের জন্য নিশ্চিতকরণ শর্ত যুক্ত করা যেতে পারে।

  6. FVG সংজ্ঞা অপ্টিমাইজ করুন: বর্তমান এফভিজি সংজ্ঞাটি তুলনামূলকভাবে সহজ, আরও জটিল বা আরও সুনির্দিষ্ট ভারসাম্যহীন অঞ্চল সংজ্ঞা বিবেচনা করা যেতে পারে, যেমন ছায়াছবির পরিবর্তে শিরোনাম বিবেচনা করা।

  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")