বহু-স্তরের মূল্য কাঠামো সনাক্তকরণ এবং ন্যায্য মূল্য ব্যবধান পরিমাণগত ট্রেডিং সিস্টেম

CHoCH FVG Pivot Points Risk-Reward Ratio Price Structure SWING POINTS Quantitative Trading
সৃষ্টির তারিখ: 2025-06-03 10:50:29 অবশেষে সংশোধন করুন: 2025-06-03 10:50:29
অনুলিপি: 0 ক্লিকের সংখ্যা: 347
2
ফোকাস
319
অনুসারী

বহু-স্তরের মূল্য কাঠামো সনাক্তকরণ এবং ন্যায্য মূল্য ব্যবধান পরিমাণগত ট্রেডিং সিস্টেম বহু-স্তরের মূল্য কাঠামো সনাক্তকরণ এবং ন্যায্য মূল্য ব্যবধান পরিমাণগত ট্রেডিং সিস্টেম

ওভারভিউ

মাল্টি-লেভেল প্রাইস স্ট্রাকচার আইডেন্টিফিকেশন অ্যান্ড ফেয়ার ভ্যালু গ্যাপ কোয়ান্টিফাইড ট্রেডিং সিস্টেম হল একটি প্রাইস অ্যাকশন ভিত্তিক স্বয়ংক্রিয় ট্রেডিং কৌশল যা দুটি মূল ট্রেডিং ধারণার সমন্বয় করেঃ পরিবর্তন বৈশিষ্ট্য (CHoCH, Change of Character) এবং ফেয়ার ভ্যালু গ্যাপ (FVG, Fair Value Gap) । এই কৌশলটি বাজারের কাঠামোগত পরিবর্তনের পয়েন্ট এবং ভারসাম্যহীন অঞ্চলগুলি সনাক্ত করে উচ্চ-সম্ভাব্যতার ব্যবসায়ের সুযোগগুলিকে ক্যাপচার করে, যখন দামগুলি ফেয়ার ভ্যালু গ্যাপে ফিরে যায় তখন প্রবেশ করে, সঠিক প্রবেশ এবং প্রস্থান নিয়ন্ত্রণের জন্য। এই সিস্টেমাইজড পদ্ধতিটি ব্যবসায়ীদেরকে বাজারকে উদ্দেশ্যমূলকভাবে বিশ্লেষণ করতে, আবেগকে সরিয়ে ফেলতে এবং সুস্পষ্ট ঝুঁকি পরিচালনার নিয়মের সাথে সক্ষম করে।

কৌশল নীতি

কোয়ান্টাম ট্রেডিং সিস্টেমটি নিম্নলিখিত মূল নীতিগুলির উপর ভিত্তি করে কাজ করেঃ

  1. মূল্য কাঠামোর পরিচয়Pivot Points প্রযুক্তির মাধ্যমে বাজারের উচ্চ ও নিম্ন স্তরগুলি চিহ্নিত করা হয়, যা বাজারের কাঠামোর একটি গুরুত্বপূর্ণ অংশ। সিস্টেমটি প্যারামিটারাইজড দোলন দৈর্ঘ্য ব্যবহার করে (ডিফল্ট 5 টি চক্র) এই মূল পয়েন্টগুলি নির্ধারণ করতে।

  2. পরিবর্তনের বৈশিষ্ট্য (CHoCH) সনাক্তকরণ:

    • মাল্টি-হেড CHoCH: দামগুলি নিম্ন নিম্নতম গঠনের পরে পূর্ববর্তী সুইং উচ্চতা অতিক্রম করে
    • খালি মাথা CHoCH: দাম উচ্চ উচ্চতা গঠনের পরে পূর্ববর্তী অস্থির নিম্ন স্তরকে ভেঙে দেয় সিস্টেমটি CHoCH গঠনের সময়সীমার জন্য ন্যূনতম দূরত্বের প্রয়োজনীয়তা পূরণ করার জন্য অনুরোধ করে (ডিফল্ট 10 টি চক্র) অবৈধ সংকেতগুলি ফিল্টার করতে।
  3. ন্যায্য মূল্য ফাঁক (FVG) সনাক্তকরণ:

    • একাধিক FVG: বর্তমান চক্রের নিম্নতম উচ্চতা পূর্ববর্তী দুইটি চক্রের উচ্চতার চেয়ে বেশি
    • শূন্য FVG: বর্তমান শূন্যের উচ্চতা পূর্ববর্তী দুইটি শূন্যের নিচে সিস্টেমটি সর্বনিম্ন FVG আকারের থ্রেশহোল্ড সেট করেছে (ডিফল্ট 2 পয়েন্ট) যা নিশ্চিত করে যে শুধুমাত্র অর্থপূর্ণ মূল্য ভারসাম্যহীনতা ধরা পড়ে।
  4. ইনপুট যুক্তি:

    • মাল্টি টার্ম এন্ট্রিঃ মাল্টি টার্ম CHoCH নিশ্চিত হওয়ার পরে, মাল্টি টার্ম FVG অঞ্চলে মূল্য প্রত্যাহারের জন্য অপেক্ষা করুন
    • উড়োজাহাজে প্রবেশঃ উড়োজাহাজে প্রবেশের পর, উড়োজাহাজে প্রবেশের জন্য অপেক্ষা করুন এফভিজি অঞ্চলের মধ্যবর্তী স্থানে প্রবেশের মূল্য নির্ধারণ করা হয়েছে, যা একটি সুষম প্রবেশ মূল্য প্রদান করে।
  5. ঝুঁকি ব্যবস্থাপনা:

    • স্টপ লস সেট করুন নিকটতম দোলন নিম্ন (মাল্টি হেড) বা দোলন উচ্চ (খালি হেড)
    • রিস্ক রিটার্ন রেট (ডিফল্ট ২.০) বা ফিক্সড টার্গেট পয়েন্টের উপর ভিত্তি করে থামানো
    • বিকল্প পজিশন অটো-অ্যাডজাস্টমেন্ট ফাংশন, অ্যাকাউন্টের ঝুঁকি শতাংশ এবং স্টপ লস দূরত্বের উপর ভিত্তি করে পজিশন আকার গণনা করে

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

কোডের গভীর বিশ্লেষণের পরে, এই কৌশলটির নিম্নলিখিত উল্লেখযোগ্য সুবিধাগুলি রয়েছেঃ

  1. কাঠামোগত বাজার বিশ্লেষণ: কৌশলটি মূল্যের কাঠামোর পরিবর্তন এবং বাজারের ভারসাম্যহীনতার নীতির উপর ভিত্তি করে তৈরি করা হয়েছে, কেবলমাত্র সূচকের ক্রস নয়, যা এটিকে বাজারের টার্নপয়েন্ট সনাক্তকরণের ক্ষেত্রে অনন্য সুবিধা দেয়।

  2. সঠিক প্রবেশের সময়: CHoCH-এর পর FVG গঠনের অপেক্ষায় থাকার মাধ্যমে, কৌশলটি সুবিধাজনক মূল্যের স্তরে প্রবেশ করতে সক্ষম হয়, উচ্চ-নিচে-নিচে-নিচে অনুসরণ করা এড়াতে এবং প্রবেশের মান উন্নত করতে পারে।

  3. স্বনির্ধারিত ঝুঁকি ব্যবস্থাপনাকৌশলঃ স্টপ পজিশনের স্বয়ংক্রিয় সমন্বয় করা হয় প্রকৃত বাজার কাঠামোর উপর ভিত্তি করে, নির্দিষ্ট পয়েন্ট ব্যবহার করার পরিবর্তে, এই পদ্ধতিটি বাজারের প্রকৃত ওঠানামা বৈশিষ্ট্যগুলির সাথে আরও সঙ্গতিপূর্ণ।

  4. লেনদেনের উপাদানগুলি দৃশ্যমান করুন: কৌশলগুলি CHoCH ট্যাগ, FVG বক্স, ওল্টপয়েন্ট এবং ট্রেডিং লাইন সহ সম্পূর্ণ দৃশ্যমানতা সরবরাহ করে, যা ব্যবসায়ীদের বাজারের কাঠামো এবং কৌশলগত যুক্তিগুলিকে সহজেই বুঝতে দেয়।

  5. নমনীয় পজিশন ব্যবস্থাপনা: স্বয়ংক্রিয়ভাবে ঝুঁকি শতাংশের মাধ্যমে পজিশনের আকার সামঞ্জস্য করুন, যা অ্যাকাউন্টের তহবিল রক্ষা করে এবং স্বয়ংক্রিয়ভাবে ঝুঁকির প্রান্তিককরণকে অস্থিরতার উপর ভিত্তি করে সামঞ্জস্য করে।

  6. পারফরম্যান্স অপ্টিমাইজেশান ডিজাইন: কোডটিতে পুরানো এফভিজি বাক্সগুলি পরিষ্কার করার প্রক্রিয়া রয়েছে যাতে দীর্ঘ সময় ধরে চলার সময় সিস্টেমের কার্যকারিতা হ্রাস না হয়।

  7. সমন্বিত কর্মক্ষমতা পর্যবেক্ষণকৌশলঃ কৌশলটি কৌশলগত কার্যকারিতা মূল্যায়ন করতে ব্যবসায়ীদের সহায়তা করার জন্য কৌশলগত স্থিতি, বিজয়ী হার এবং মুনাফা ফ্যাক্টরগুলির মতো মূল সূচক সহ একটি রিয়েল-টাইম পারফরম্যান্স টেবিল সরবরাহ করে।

কৌশলগত ঝুঁকি

যদিও এই কৌশলটি যুক্তিসঙ্গতভাবে পরিকল্পিত, তবে এর কিছু সম্ভাব্য ঝুঁকি এবং সীমাবদ্ধতা রয়েছেঃ

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

  2. ফাঁক ঝুঁকি: অস্থির বাজার বা রাতারাতি লেনদেনের ক্ষেত্রে, দামগুলি স্টপ পজিশন ছাড়িয়ে যেতে পারে, যার ফলে প্রত্যাশিত ক্ষতির চেয়ে বেশি ক্ষতি হয়। গ্যারান্টিযুক্ত স্টপ অর্ডার ব্যবহার করার পরামর্শ দেওয়া হয় (যদি সম্ভব হয়) বা পজিশন আকার হ্রাস করা হয়।

  3. পরামিতি সংবেদনশীলতাকৌশলগত কার্যকারিতা অত্যন্ত নির্ভরশীল প্যারামিটার সেটিং যেমন দোলন দৈর্ঘ্য, ন্যূনতম CHoCH দূরত্ব এবং FVG আকারের উপর। বিভিন্ন বাজার এবং টাইম ফ্রেমগুলির জন্য বিভিন্ন প্যারামিটার সমন্বয় প্রয়োজন হতে পারে, তাই একটি বিস্তৃত প্রতিক্রিয়া অপ্টিমাইজেশনের পরামর্শ দেওয়া হয়।

  4. বাজার পরিবেশ নির্ভরতা: এই কৌশলটি ট্রেন্ডিং মার্কেটে ভাল কাজ করে, এবং ট্রেন্ডিং মার্কেটে প্রায়শই ভুল সংকেত হতে পারে। ট্রেন্ডিং ফিল্টার বা বাজার অবস্থা সনাক্তকরণ ব্যবস্থা যুক্ত করার বিষয়ে বিবেচনা করুন।

  5. গণনাগত জটিলতানীতিমালাঃ একাধিক অ্যারে এবং শর্তাধীন পরীক্ষা ব্যবহার করে, এটি নিম্ন কনফিগারেশনযুক্ত ডিভাইসে পারফরম্যান্স সমস্যার কারণ হতে পারে। যদিও কোডটি একটি পরিস্কারকরণ ব্যবস্থা অন্তর্ভুক্ত করেছে, তবে দীর্ঘমেয়াদী চলমানের জন্য রিসোর্স খরচ সম্পর্কে সতর্কতা অবলম্বন করা উচিত।

  6. অব্যবস্থাপনা: বর্তমান কৌশলটি বিভিন্ন বাজারের অবস্থার অধীনে অবস্থার আকারের গতিশীল সমন্বয়কে বিবেচনা করে না, যা অব্যাহত প্রতিকূল পরিবেশে বৃহত্তর প্রত্যাহারের দিকে পরিচালিত করতে পারে। অ্যাকাউন্ট প্রত্যাহারের সীমাবদ্ধতা এবং ধাপে ধাপে পজিশন হ্রাস করার পদ্ধতি বাস্তবায়নের পরামর্শ দেওয়া হয়েছে।

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

কোড বিশ্লেষণের উপর ভিত্তি করে, নিম্নলিখিত অপ্টিমাইজেশান দিকগুলি প্রস্তাব করা হয়েছেঃ

  1. মাল্টি টাইম ফ্রেম নিশ্চিতকরণ: উচ্চতর সময় ফ্রেমের বাজারের কাঠামোগত বিশ্লেষণ প্রবর্তন করুন, কেবলমাত্র প্রধান প্রবণতার দিকনির্দেশে লেনদেন করুন। উদাহরণস্বরূপ, একটি সূর্যমুখী প্রবণতা ফিল্টার যুক্ত করা যেতে পারে, কেবলমাত্র সূর্যমুখী প্রবণতার দিকনির্দেশের সাথে সামঞ্জস্য থাকলে লেনদেন সম্পাদন করুন।

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

  3. ভর্তি অপ্টিমাইজেশান:

    • ব্যাটেল এন্ট্রি কৌশল বাস্তবায়ন করুন, যেমন এফভিজি অঞ্চলে বিভিন্ন স্তরে একাধিক এন্ট্রি পয়েন্ট স্থাপন করা
    • অতিরিক্ত প্রবেশাধিকার নিশ্চিতকরণ যোগ করুন, যেমন লেনদেনের পরিমাণ বা গতিশীলতার সূচক নিশ্চিতকরণ
  4. ঝুঁকি ব্যবস্থাপনা:

    • স্টপ ট্র্যাকিং ফাংশন বাস্তবায়ন, ট্রেডিং মুনাফা হিসাবে স্বয়ংক্রিয়ভাবে স্টপ অবস্থান সামঞ্জস্য
    • একটি নির্দিষ্ট মুনাফা স্তর পূরণ করার পরে পজিশনের কিছু অংশ নিষ্পত্তি করার জন্য একটি আংশিক মুনাফা সুবিধা যোগ করা
    • সর্বাধিক প্রত্যাহারের সীমাবদ্ধতা প্রবর্তন করে, যখন অ্যাকাউন্ট প্রত্যাহারের মূল্য হ্রাস পায় তখন স্বয়ংক্রিয়ভাবে অবস্থানের আকার হ্রাস করে বা লেনদেন স্থগিত করে
  5. বাজারের অবস্থা:

    • বাজারের অবস্থা সনাক্তকরণ যোগ করুন (ট্রেন্ডিং / সমন্বয় / উচ্চতর অস্থিরতা) এবং বিভিন্ন অবস্থার উপর ভিত্তি করে কৌশলগত প্যারামিটারগুলি সামঞ্জস্য করুন
    • কম বা এড়ানো ট্রেডিং
    • হঠাৎ করে অস্থিরতা বাড়ার সময় আরো সংরক্ষণশীল পজিশন স্কেল গ্রহণ করুন
  6. মেশিন লার্নিং: মেশিন লার্নিং অ্যালগরিদমগুলি ইতিহাসের CHoCH এবং FVG প্যাটার্নগুলি বিশ্লেষণ করার জন্য প্রবর্তন করা হয়েছে, যা সফলতার জন্য উচ্চতর প্যাটার্ন বৈশিষ্ট্যগুলি সনাক্ত করে এবং সেই অনুযায়ী প্রবেশের সিদ্ধান্তের ওজনকে সামঞ্জস্য করে।

  7. সময় ফিল্টার করুন: ট্রেডিং টাইম ফিল্টার যুক্ত করুন, বড় সংবাদ বিজ্ঞপ্তি এবং বাজার খোলার / বন্ধের সময় উচ্চ অস্থিরতা এড়িয়ে চলুন, এবং ভাল তরলতার সাথে ট্রেডিং সময়গুলিতে ফোকাস করুন।

সারসংক্ষেপ

মাল্টি-লেভেল প্রাইস স্ট্রাকচার আইডেন্টিফিকেশন অ্যান্ড ফেয়ার ভ্যালু গ্যাপ কোয়ান্টিফাইড ট্রেডিং সিস্টেম একটি সম্পূর্ণ ট্রেডিং সমাধান যা উন্নত মূল্য আচরণ তত্ত্বের সাথে মিলিত। এটি বাজারের কাঠামোর পরিবর্তনগুলি (CHoCH) এবং মূল্যের ভারসাম্যহীন অঞ্চলগুলি (FVG) সনাক্ত করে, আদর্শ মূল্যের স্তরে প্রবেশ করে এবং ব্যবস্থামূলক ঝুঁকি ব্যবস্থাপনার পদ্ধতি ব্যবহার করে ট্রেডিং মূলধন রক্ষা করে।

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

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

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

কৌশল সোর্স কোড
/*backtest
start: 2024-06-03 00:00:00
end: 2025-06-02 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("ICT CHoCH & FVG Strategy - NQ1!", overlay=true, pyramiding=0, calc_on_every_tick=false, calc_on_order_fills=false, max_boxes_count=500, max_lines_count=100, max_labels_count=100)

// ============================================================================
// INPUT PARAMETERS
// ============================================================================

// Strategy Settings
riskRewardRatio = input.float(2.0, title="Risk:Reward Ratio", minval=0.5, maxval=10.0, group="Strategy Settings")
fixedTarget = input.int(40, title="Fixed Target (Ticks)", minval=5, maxval=200, group="Strategy Settings")
useRRTarget = input.bool(true, title="Use Risk:Reward Target", tooltip="If false, uses fixed target", group="Strategy Settings")
riskPercent = input.float(2.0, title="Risk % of Account", minval=0.1, maxval=10.0, group="Strategy Settings")
useAutoSize = input.bool(false, title="Auto Size Positions", tooltip="Size based on risk % and stop distance", group="Strategy Settings")

// Visual Settings
showCHoCH = input.bool(true, title="Show CHoCH Labels", group="Visual Settings")
showFVG = input.bool(true, title="Show FVG Boxes", group="Visual Settings")
showSwings = input.bool(true, title="Show Swing Points", group="Visual Settings")
showTradeLines = input.bool(true, title="Show Entry/SL/TP Lines", group="Visual Settings")

// CHoCH Detection Settings
swingLength = input.int(5, title="Swing Detection Length", minval=2, maxval=20, group="CHoCH Settings")
minCHoCHDistance = input.int(10, title="Min CHoCH Distance (bars)", minval=5, maxval=50, group="CHoCH Settings")

// FVG Settings
minFVGSize = input.float(2.0, title="Min FVG Size (ticks)", minval=0.25, maxval=10.0, group="FVG Settings")
maxFVGAge = input.int(50, title="Max FVG Age (bars)", minval=10, maxval=200, group="FVG Settings")

// ============================================================================
// VARIABLES AND ARRAYS
// ============================================================================

// Swing point detection
var float lastSwingHigh = na
var float lastSwingLow = na
var int lastSwingHighBar = na
var int lastSwingLowBar = na

// CHoCH tracking
var bool bullishCHoCH = false
var bool bearishCHoCH = false
var float chochLevel = na
var int chochBar = na
var bool waitingForFVG = false

// FVG tracking
var array<box> bullishFVGs = array.new<box>()
var array<box> bearishFVGs = array.new<box>()
var float activeFVGTop = na
var float activeFVGBottom = na
var bool lookingForEntry = false

// Trade management
var float stopLossLevel = na
var float takeProfitLevel = na
var bool inPosition = false

// ============================================================================
// HELPER FUNCTIONS
// ============================================================================

// Convert ticks to price for NQ
ticksToPrice(ticks) => ticks * 0.25

// Calculate position size based on risk
calcPositionSize(stopDistance) =>
    if useAutoSize and strategy.equity > 0
        accountValue = strategy.equity
        riskAmount = accountValue * (riskPercent / 100)
        stopDistancePrice = stopDistance * syminfo.mintick
        math.max(1, math.floor(riskAmount / stopDistancePrice))
    else
        1

// ============================================================================
// SWING POINT DETECTION
// ============================================================================

// Detect swing highs and lows
swingHigh = ta.pivothigh(high, swingLength, swingLength)
swingLow = ta.pivotlow(low, swingLength, swingLength)

// Update swing points
if not na(swingHigh)
    lastSwingHigh := swingHigh
    lastSwingHighBar := bar_index - swingLength
    if showSwings
        label.new(bar_index - swingLength, swingHigh, "SH", style=label.style_triangledown, color=color.red, size=size.tiny)

if not na(swingLow)
    lastSwingLow := swingLow
    lastSwingLowBar := bar_index - swingLength
    if showSwings
        label.new(bar_index - swingLength, swingLow, "SL", style=label.style_triangleup, color=color.green, size=size.tiny)

// ============================================================================
// CHoCH DETECTION
// ============================================================================

// Check for bullish CHoCH (break above prior swing high after making lower low)
bullishCHoCHCondition = not na(lastSwingHigh) and not na(lastSwingLow) and 
                       high > lastSwingHigh and 
                       lastSwingLow < lastSwingHigh and
                       bar_index - lastSwingHighBar > minCHoCHDistance and
                       strategy.position_size == 0

// Check for bearish CHoCH (break below prior swing low after making higher high)
bearishCHoCHCondition = not na(lastSwingHigh) and not na(lastSwingLow) and 
                       low < lastSwingLow and 
                       lastSwingHigh > lastSwingLow and
                       bar_index - lastSwingLowBar > minCHoCHDistance and
                       strategy.position_size == 0

// Process CHoCH signals
if bullishCHoCHCondition and not bullishCHoCH
    bullishCHoCH := true
    bearishCHoCH := false
    chochLevel := lastSwingHigh
    chochBar := bar_index
    waitingForFVG := true
    lookingForEntry := false
    


if bearishCHoCHCondition and not bearishCHoCH
    bearishCHoCH := true
    bullishCHoCH := false
    chochLevel := lastSwingLow
    chochBar := bar_index
    waitingForFVG := true
    lookingForEntry := false
    


// ============================================================================
// FVG DETECTION
// ============================================================================

// Check for FVG formation (3-candle pattern)
if bar_index >= 2
    // Bullish FVG: low[0] > high[2]
    bullishFVG = low[0] > high[2] and (low[0] - high[2]) >= ticksToPrice(minFVGSize)
    
    // Bearish FVG: high[0] < low[2]  
    bearishFVG = high[0] < low[2] and (low[2] - high[0]) >= ticksToPrice(minFVGSize)
    
    // Process bullish FVG after bullish CHoCH
    if bullishFVG and bullishCHoCH and waitingForFVG and bar_index > chochBar
        fvgTop = low[0]
        fvgBottom = high[2]
        

        
        // Set active FVG for entry
        activeFVGTop := fvgTop
        activeFVGBottom := fvgBottom
        waitingForFVG := false
        lookingForEntry := true
    
    // Process bearish FVG after bearish CHoCH
    if bearishFVG and bearishCHoCH and waitingForFVG and bar_index > chochBar
        fvgTop = low[2]
        fvgBottom = high[0]
        

        
        // Set active FVG for entry
        activeFVGTop := fvgTop
        activeFVGBottom := fvgBottom
        waitingForFVG := false
        lookingForEntry := true

// ============================================================================
// ENTRY LOGIC
// ============================================================================

// Long entry: price touches bullish FVG after bullish CHoCH
longCondition = lookingForEntry and bullishCHoCH and 
               not na(activeFVGTop) and not na(activeFVGBottom) and
               low <= activeFVGTop and high >= activeFVGBottom and
               strategy.position_size == 0

// Short entry: price touches bearish FVG after bearish CHoCH  
shortCondition = lookingForEntry and bearishCHoCH and  not na(activeFVGTop) and not na(activeFVGBottom) and low <= activeFVGTop and high >= activeFVGBottom and  strategy.position_size == 0

// Process long entries
if longCondition
    var float entryPrice = na
    var float stopLoss = na
    var float takeProfit = na
    
    entryPrice := math.avg(activeFVGTop, activeFVGBottom)
    stopLoss := lastSwingLow
    stopDistance = entryPrice - stopLoss
    
    if useRRTarget
        takeProfit := entryPrice + (stopDistance * riskRewardRatio)
    else
        takeProfit := entryPrice + ticksToPrice(fixedTarget)
    
    // Calculate position size
    qty = calcPositionSize(stopDistance / syminfo.mintick)
    
    // Enter trade
    strategy.entry("Long", strategy.long, qty=qty)
    strategy.exit("Long Exit", "Long", stop=stopLoss, limit=takeProfit)
    
    // Update tracking
    stopLossLevel := stopLoss
    takeProfitLevel := takeProfit
    inPosition := true
    lookingForEntry := false
    
    // Reset CHoCH state
    bullishCHoCH := false
    activeFVGTop := na
    activeFVGBottom := na
    


// Process short entries
if shortCondition
    var float entryPrice = na
    var float stopLoss = na
    var float takeProfit = na
    
    entryPrice := math.avg(activeFVGTop, activeFVGBottom)
    stopLoss := lastSwingHigh
    stopDistance = stopLoss - entryPrice
    
    if useRRTarget
        takeProfit := entryPrice - (stopDistance * riskRewardRatio)
    else
        takeProfit := entryPrice - ticksToPrice(fixedTarget)
    
    // Calculate position size
    qty = calcPositionSize(stopDistance / syminfo.mintick)
    
    // Enter trade
    strategy.entry("Short", strategy.short, qty=qty)
    strategy.exit("Short Exit", "Short", stop=stopLoss, limit=takeProfit)
    
    // Update tracking
    stopLossLevel := stopLoss
    takeProfitLevel := takeProfit
    inPosition := true
    lookingForEntry := false
    
    // Reset CHoCH state
    bearishCHoCH := false
    activeFVGTop := na
    activeFVGBottom := na
    

// ============================================================================
// POSITION MANAGEMENT
// ============================================================================

// Reset position state when trade is closed
if inPosition and strategy.position_size == 0
    inPosition := false
    stopLossLevel := na
    takeProfitLevel := na

// ============================================================================
// VISUAL SIGNALS
// ============================================================================

// Plot entry signals
plotshape(longCondition, title="Long Entry", location=location.belowbar, color=color.green, 
          style=shape.triangleup, size=size.normal)

plotshape(shortCondition, title="Short Entry", location=location.abovebar, color=color.red, 
          style=shape.triangledown, size=size.normal)

// Plot active stop loss and take profit levels
plot(inPosition ? stopLossLevel : na, title="Stop Loss", color=color.red, linewidth=2, style=plot.style_linebr)
plot(inPosition ? takeProfitLevel : na, title="Take Profit", color=color.green, linewidth=2, style=plot.style_linebr)

// ============================================================================
// CLEANUP
// ============================================================================

// Clean up old FVG boxes (helps with performance)
if bar_index % 100 == 0
    while array.size(bullishFVGs) > 20
        box.delete(array.shift(bullishFVGs))
    while array.size(bearishFVGs) > 20
        box.delete(array.shift(bearishFVGs))

// ============================================================================
// ALERTS
// ============================================================================

// Alert conditions
alertcondition(longCondition, title="Long Entry Signal", message="ICT Strategy: Long entry at FVG - SL: {{strategy.position_avg_price}}")
alertcondition(shortCondition, title="Short Entry Signal", message="ICT Strategy: Short entry at FVG - SL: {{strategy.position_avg_price}}")