আপেক্ষিক ভলিউম শতাংশ মোমেন্টাম ট্রেডিং কৌশল

RVPR ATR SL/TP MA EMA SMMA WMA JMA T3
সৃষ্টির তারিখ: 2025-07-04 11:27:18 অবশেষে সংশোধন করুন: 2025-07-04 11:27:18
অনুলিপি: 9 ক্লিকের সংখ্যা: 259
2
ফোকাস
319
অনুসারী

আপেক্ষিক ভলিউম শতাংশ মোমেন্টাম ট্রেডিং কৌশল আপেক্ষিক ভলিউম শতাংশ মোমেন্টাম ট্রেডিং কৌশল

ওভারভিউ

আপেক্ষিক লেনদেনের শতকরা গতিশীলতা ট্রেডিং কৌশল হল একটি সমন্বিত ট্রেডিং সিস্টেম যা লেনদেনের গতিশীলতা বিশ্লেষণ, মূল্য আচরণ ফিল্টারিং, বিরতি সনাক্তকরণ এবং গতিশীল স্টপ লস / স্টপ লজিকের সাথে মিলিত। এই কৌশলটির মূলটি হ’ল লেনদেনের লেনদেনের উইলিয়ামস % R-এর মতো সূচক (RVPR) গণনা করে, দ্বি-সমতুল্য ফিল্টার (দ্রুত এবং ধীর চলমান গড়) সহ লেনদেনের সম্প্রসারণ বা সঙ্কুচিত হওয়ার মুহুর্তগুলি সনাক্ত করা। এই কৌশলটি কনফিগারযোগ্য মূল্য আচরণ ফিল্টারগুলির মাধ্যমে আরও সুনির্দিষ্টভাবে মাঠে প্রবেশ করে, বিভিন্ন ধরণের লেনদেনের গ্রাফিক অবস্থার উপর ভিত্তি করে। এই কৌশলটি বিশেষত লেনদেনের লেনদেনের লেনদেনের লেনদেনের লেনদেন এবং লেনদেনের লেনদেনের উপর ভিত্তি করে ঘূর্ণন বা পুনরাবৃত্তির জন্য ট্রেডার

কৌশল নীতি

এই কৌশলটির মূল নীতিটি হ’ল লেনদেনের পরিমাণের ডেটা শতাংশের পরিসরে রূপান্তর করা, উইলিয়ামস %R এর মতো একটি গণনা পদ্ধতি ব্যবহার করে বর্তমান লেনদেনের পরিমাণ এবং এর historicalতিহাসিক পরিসরের মধ্যে সম্পর্ক বিশ্লেষণ করা। কৌশলটি নিম্নলিখিত কয়েকটি মূল উপাদান ব্যবহার করে লেনদেনের সংকেত তৈরি করেঃ

  1. আপেক্ষিক লেনদেনের %R দোলকঃ বর্তমান লেনদেনের পরিমাণকে ঐতিহাসিক লেনদেনের সর্বোচ্চ এবং সর্বনিম্ন স্তরের সাথে তুলনা করে, আপেক্ষিক অবস্থান গণনা করে। এই সূচকটি দামের ক্ষেত্রে উইলিয়ামস %R এর মতো, তবে লেনদেনের পরিমাণের ডেটাতে প্রয়োগ করা হয়।

  2. ডাবল মুভিং এভারেজ ফিল্টারিংঃ কৌশলটি দুটি লেনদেনের গতিশীল গড় ব্যবহার করে (দ্রুত এবং ধীর) এবং একাধিক মসৃণকরণ অ্যালগরিদম (এসএমএ, ইএমএ, জেএমএ, টি 3, সুপার স্মুথার ইত্যাদি) নির্বাচন করা যেতে পারে। লেনদেনের পরিমাণ যখন দ্রুত গড়ের চেয়ে বেশি হয় এবং দ্রুত গড়টি ধীর গড়ের চেয়ে বেশি হয়, তখন লেনদেনের পরিমাণের প্রবণতা বাড়ার ইঙ্গিত দেয়, এটি একটি মাল্টিসিগন্যাল হতে পারে; বিপরীতভাবে।

  3. প্রাইস অ্যাকশন ফিল্টারঃ বিভিন্ন ফ্রেমওয়ার্কের উপর ভিত্তি করে ট্রেডিং সিগন্যালগুলিকে আরও ফিল্টার করুনঃ

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

  5. থামানো এবং থামানো সিস্টেমঃ এটিআর (অর্ধ-সত্যিকারের তরঙ্গদৈর্ঘ্য) ভিত্তিক গতিশীল থামানো / থামানো প্রক্রিয়া, যা থামানো এবং থামানোর দূরত্বকে সামঞ্জস্য করার জন্য গুণিতক কনফিগার করা যায়।

  6. সময় বেরিয়ে যাওয়ারঃ নির্দিষ্ট সংখ্যক ক্যাডের পরে ট্রেড থেকে বেরিয়ে আসার বিকল্প রয়েছে।

মাল্টি-হেড প্রবেশের শর্তগুলি হলঃ দ্রুত চলমান গড়ের চেয়ে বেশি লেনদেনের পরিমাণ, দ্রুত চলমান গড়ের চেয়ে বেশি ধীর চলমান গড়, তুলনামূলক লেনদেনের পরিমাণ% R থ্রেশহোল্ডের চেয়ে বেশি, দামটি মাল্টি-হেড দিকনির্দেশ ফিল্টার দিয়ে যায় এবং সাম্প্রতিক ব্রেকিং উচ্চতার চেয়ে কম পছন্দসই। খালি-হেড প্রবেশের শর্তগুলি বিপরীতভাবে এবং সেট-আউট শর্তে প্যাড-টাইম পজিশন ট্রিগার করে।

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

  1. মাল্টি-ডাইমেনশনাল অ্যানালিসিস: এই কৌশলটি লেনদেনের পরিমাণ, মূল্যের আচরণ এবং স্টপ-অফ/স্টপ-ডায়নামিকের সমন্বয়ে একটি বিস্তৃত বাজার বিশ্লেষণের কাঠামো সরবরাহ করে।

  2. উচ্চতা কাস্টমাইজযোগ্যঃ কৌশলটি বিভিন্ন প্যারামিটার সরবরাহ করে যা ট্রেডিং দিকনির্দেশনা নিয়ন্ত্রণ, বিভিন্ন মূল্য আচরণ ফিল্টারিং মোড, ট্র্যাডিং ভলিউম মুভিং এভারেজ টাইপ পছন্দ ইত্যাদি সহ কাস্টমাইজযোগ্য, যা ব্যবসায়ীদের তাদের নিজস্ব শৈলী এবং বাজারের পছন্দ অনুসারে কাস্টমাইজ করার অনুমতি দেয়।

  3. স্মার্ট এন্ট্রি ফিল্টারিংঃ লেনদেনের গতিশীলতা এবং মূল্যের আচরণ প্যাটার্নের সমন্বয় করে, কৌশলগুলি নিম্নমানের লেনদেনের সংকেতগুলি এড়াতে উচ্চতর সম্ভাব্য লেনদেনের সুযোগগুলি সনাক্ত করতে সক্ষম হয়।

  4. নমনীয় প্রস্থান ব্যবস্থাঃ কৌশলটি সময় এবং মূল্যের উপর ভিত্তি করে প্রস্থান বিকল্পগুলি সরবরাহ করে, যার মধ্যে রয়েছে স্থির বার সংখ্যা প্রস্থান এবং এটিআর-ভিত্তিক গতিশীল স্টপ লস / স্টপ, যা ঝুঁকি ব্যবস্থাপনাকে আরও নমনীয় এবং কার্যকর করে।

  5. বিভিন্ন বাজার পরিবেশে অভিযোজিতঃ বিভিন্ন মূল্য আচরণ প্যাটার্নের মাধ্যমে (সহজ, ফিল্টার, ক্রমবর্ধমান, অভ্যন্তরীণ) কৌশলগুলি প্রবণতা এবং খণ্ড বাজার সহ বিভিন্ন বাজার অবস্থার সাথে খাপ খাইয়ে নিতে পারে।

  6. উচ্চ প্রযুক্তির সূচক সমন্বয়ঃ এই কৌশলটি JMA, T3 এবং Super Smoother এর মতো একাধিক উচ্চতর চলমান গড়ের সমন্বয় করে, যা গোলমাল হ্রাস এবং বাস্তব প্রবণতা ক্যাপচার করার ক্ষেত্রে দুর্দান্ত পারফরম্যান্স করে।

কৌশলগত ঝুঁকি

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

  2. ভুয়া ব্রেকিংয়ের ঝুঁকিঃ লেনদেনের পরিমাণের উত্থান সর্বদা টেকসই দামের গতিপথের সাথে সংযুক্ত থাকে না, কৌশলটি ভুয়া ব্রেকিংয়ের সময় ভুল সংকেত দিতে পারে। অতিরিক্ত নিশ্চিতকরণ সূচক যুক্ত করা বা প্রবেশের বিলম্বের মাধ্যমে এই ঝুঁকিটি হ্রাস করা যেতে পারে।

  3. বাজার পরিবেশের উপর নির্ভরশীলতা: এই কৌশলটি বিভিন্ন বাজার পরিবেশে (যেমন উচ্চ অস্থিরতা বনাম কম অস্থিরতা) সামঞ্জস্যপূর্ণ নাও হতে পারে। এটি বিভিন্ন বাজার অবস্থার অধীনে কৌশলটি পরীক্ষা করার পরামর্শ দেওয়া হয়।

  4. স্টপ ক্ষতির ঝুঁকিঃ এটিআর ভিত্তিক স্টপগুলি হঠাৎ অস্থিরতা বাড়ার সময় ট্রিগার করা যেতে পারে। অস্থিরতা সামঞ্জস্যের জন্য স্টপ ক্ষতির গুণক ব্যবহার করা বা সমালোচনামূলক সমর্থন/প্রতিরোধের জায়গায় স্টপ ক্ষতির সেট করা আরও কার্যকর হতে পারে।

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

  6. হিসাব জটিলতাঃ কৌশলটি একাধিক জটিল চলমান গড় অ্যালগরিদম এবং শর্তের সমন্বয় ব্যবহার করে যা হিসাবের বোঝা বাড়িয়ে দেয় এবং কার্যকরকরণের বিলম্বের কারণ হতে পারে। রিয়েল-টাইম ট্রেডিংয়ের ক্ষেত্রে, কিছু হিসাব-নিবিড় সূচককে সহজ করার প্রয়োজন হতে পারে।

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

  1. ডায়নামিক থ্রেশহোল্ড অ্যাডজাস্টমেন্টঃ বর্তমান কৌশলটি স্থির আপেক্ষিক লেনদেনের% R থ্রেশহোল্ড ব্যবহার করে (২৭), স্বয়ংক্রিয়ভাবে লেনদেনের পরিমাণের সাম্প্রতিক অস্থিরতার উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে লেনদেনের থ্রেশহোল্ডগুলি সামঞ্জস্য করার জন্য বিবেচনা করা যেতে পারে। এটি কৌশলটিকে বিভিন্ন বাজার পরিস্থিতি এবং মৌসুমী পরিবর্তনের সাথে আরও ভালভাবে খাপ খাইয়ে নিতে সক্ষম করবে।

  2. মাল্টি টাইম ফ্রেম নিশ্চিতকরণঃ উচ্চতর টাইম ফ্রেমের নিশ্চিতকরণ সংকেত প্রবর্তন করা, শুধুমাত্র বৃহত্তর প্রবণতা দিকের ট্রেডিং, কৌশলটির বিজয় হার এবং ঝুঁকিপূর্ণ রিটার্ন অনুপাত উন্নত করতে পারে। উদাহরণস্বরূপ, কেবলমাত্র সেই দিনের ডেইলি লাইনের ট্রেন্ডিংয়ের সময় ঘন্টা লাইনের মাল্টি হেড সিগন্যালগুলি কার্যকর করা হয়।

  3. লেনদেনের গুণমান বিশ্লেষণঃ লেনদেনের গুণমানের মূল্যায়ন করার জন্য লেনদেনের গুণমান বা লেনদেনের বন্টন বিশ্লেষণের সাথে লেনদেনের গুণমানের বিশ্লেষণ যুক্ত করা যেতে পারে। এটি লেনদেনের পরিমাণ এবং সম্ভাব্য ক্লান্তির সংকেত নিশ্চিত করার জন্য স্বাস্থ্যকর প্রবণতাকে আলাদা করতে সহায়তা করে।

  4. স্মার্ট স্টপ/স্টপঃ বর্তমান এটিআর ভিত্তিক স্টপ/স্টপকে আরও স্মার্ট সিস্টেমে রূপান্তর করা যেতে পারে, উদাহরণস্বরূপ, মূল সমর্থন/প্রতিরোধের অবস্থানের উপর ভিত্তি করে স্টপ, অথবা অস্থিরতার সাথে সামঞ্জস্যপূর্ণ স্টপ ব্যবহার করে, নিম্ন ওভারপয়েন্টের সময় স্টপকে শক্ত করে এবং উচ্চ ওভারপয়েন্টের সময় স্টপকে প্রশস্ত করে।

  5. বাজার কাঠামোর সাথে সংযুক্ত করুনঃ মূল্য কাঠামোর বিশ্লেষণ (যেমন সমর্থন / প্রতিরোধ, প্রবণতা লাইন, মূল্য চ্যানেল) কৌশলটিতে সংহত করা, প্রবেশের পয়েন্ট এবং প্রস্থান পয়েন্টের গুণমান উন্নত করতে পারে।

  6. ঝুঁকি ব্যবস্থাপনা বৃদ্ধিঃ বর্তমান বাজারের অস্থিরতা এবং সাম্প্রতিক কৌশলগত পারফরম্যান্সের উপর ভিত্তি করে গতিশীল পজিশনের আকারের সমন্বয় সাধন করা, উচ্চ-উইন-রেট পরিবেশে পজিশন বৃদ্ধি করা এবং অনিশ্চয়তার সময় পজিশন হ্রাস করা।

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

সারসংক্ষেপ

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

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

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

কৌশল সোর্স কোড
/*backtest
start: 2024-07-04 00:00:00
end: 2025-07-02 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GabrielAmadeusLau

//@version=6
strategy("Relative Volume Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// === Input: Trade Direction === //
tradeDirection = input.string("Long Only", title="Trade Direction", options=["Long Only", "Short Only", "Both"], group="Strategy Settings")
dirBarModeL     = input.string("Simple", title="Long Directional Bar Mode", options=["Simple", "Filtered", "Aggressive", "Inside", "Filtered & Aggressive", "Filtered & Aggressive & Inside", "Without"], group="Strategy Settings")
dirBarModeS     = input.string("Inside", title="Short Directional Bar Mode", options=["Simple", "Filtered", "Aggressive", "Inside", "Filtered & Aggressive", "Filtered & Aggressive & Inside", "Without"], group="Strategy Settings")
useBreakout  = input.bool(true, "Use Breakout Filter", group="Strategy Settings")
useSLTP = input.bool(false, "Use Stop Loss & Take Profit", group="Strategy Settings")
atrSLMult = input.float(1, "ATR SL Multiplier", step = 0.05, group="Strategy Settings")
atrTPMult = input.float(1.75, "ATR TP Multiplier", step = 0.05, group="Strategy Settings")


// === Input: MA Function Selector === //
// — T3 Moving Average Function —
// src    = input source (e.g. rsi1, close, etc.)
// length = smoothing length (period)
// a      = T3 alpha (commonly between 0.7 and 0.9)
t3(src, length, a) =>
    e1 = ta.ema(src, length)
    e2 = ta.ema(e1, length)
    e3 = ta.ema(e2, length)
    e4 = ta.ema(e3, length)
    e5 = ta.ema(e4, length)
    e6 = ta.ema(e5, length)
    c1 = -a * a * a
    c2 = 3 * a * a + 3 * a * a * a
    c3 = -6 * a * a - 3 * a - 3 * a * a * a
    c4 = 1 + 3 * a + a * a * a + 3 * a * a
    c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3

// == Jurik MA == //
jma(float src, int length, float power, float phase) => 
    phaseRatio = phase < -100 ? 0.5 : phase > 100 ? 2.5 : phase / 100 + 1.5
    beta = 0.45 * (length - 1) / (0.45 * (length - 1) + 2)
    alpha = math.pow(beta, power)
    JMA = 0.0
    e0 = 0.0
    e0 := (1 - alpha) * src + alpha * nz(e0[1])
    e1 = 0.0
    e1 := (src - e0) * (1 - beta) + beta * nz(e1[1])
    e2 = 0.0
    e2 := (e0 + phaseRatio * e1 - nz(JMA[1])) * math.pow(1 - alpha, 2) + math.pow(alpha, 2) * nz(e2[1])
    JMA := e2 + nz(JMA[1])

//===== 2 Pole Super Smoother Filter =====//
superSmoother(float Series, float Period) =>
    var float ALPHA =  math.pi * math.sqrt(2.0) / Period
    var float BETA  =  math.exp(-ALPHA )
    var float COEF2 = -math.pow(BETA, 2)
    var float COEF1 =  math.cos( ALPHA ) * 2.0 * BETA
    var float COEF0 =  1.0 - COEF1 - COEF2
    float sma2   = math.avg(Series, nz(Series[1], Series))
    float smooth = na, smooth := COEF0 *      sma2      +
                                 COEF1 *  nz(smooth[1]) +
                                 COEF2 *  nz(smooth[2])

// === MA Selector === //
ma(source, length, type) =>
    type == "SMA"       ? ta.sma(source, length) :
     type == "EMA"       ? ta.ema(source, length) :
     type == "SMMA (RMA)"? ta.rma(source, length) :
     type == "WMA"       ? ta.wma(source, length) :
     type == "VWMA"      ? ta.vwma(source, length) :
     type == "HMA"       ? ta.hma(source, length) : 
     type == "ALMA"      ? ta.alma(source, length, 0.85, 6) :
     type == "LSMA"      ? ta.linreg(source, length, 0) :
     type == "Optimal MA"? math.avg(ta.alma(source, length, 0.85, 6), ta.rma(source, length), ta.sma(source, length)) :
     type == "JMA"       ? jma(source, length, 2, 50) :        
     type == "Super Smoother" ? superSmoother(source, length) :
     type == "T3"        ? t3(source, length, 0.7) :
                          na

// === Input Parameters === //
rvolRLength       = input.int(112, title="Relative Volume %R Length", minval=1, group="Relative Volume", tooltip="%R used for scaling from 0 to 100, I prefer 73 or 112.")
rvolmaTypeInput   = input.string("Optimal MA" , "Type", options = ["None", "SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA", "HMA", "ALMA", "LSMA", "Optimal MA", "JMA", "Super Smoother", "T3"], group = "Relative Volume")
rvolFastLength    = input.int(7, title="Relative Volume Fast MA", minval=1, group="Relative Volume")
rvolSlowLength    = input.int(161, title="Relative Volume Slow MA", minval=1, group="Relative Volume")
exitBars          = input.int(18, title="Bars Until Exit", group="Strategy Settings", tooltip="Exit trade after N bars")
rvolThreshold = input.int(27, "Minimum Relative Volume %R Threshold", group="Relative Volume")

// === Williams %R for Volume === //
wpr(src, length) =>
    max_ = ta.highest(src, length)
    min_ = ta.lowest(src, length)
    (100 * (src - max_) / (max_ - min_)) * -1

// === Volume MAs === //
rvol      = wpr(volume, rvolRLength)
rvolFast  = ma(volume, rvolFastLength, rvolmaTypeInput)
rvolSlow  = ma(volume, rvolSlowLength, rvolmaTypeInput)

// === Price Action Filters === //
up            = close > open
upRange       = low > low[1] and close > high[1]
upRange_Aggr  = close > close[1] and close > open[1]
insideDayUp   = close < close[1] and close[1] < close[2] and close[2] < close[3] and close[3] < close[4] and close[4] < close[5] //and not (close > close[1])
down          = close < open
downRange     = high < high[1] and close < low[1]
downRange_Aggr= close < close[1] and close < open[1]
insideDayDown = close > close[1] and close[1] > close[2] and close[2] > close[3] and close[3] > close[4] and close[4] > close[5] //and not (close < close[1])
breakoutHigh = ta.highest(high, 5)
breakoutLow  = ta.lowest(low, 5)

// === Mode-Based Filter Logic === //
longBarOK =
     dirBarModeL == "Simple" ? up :
     dirBarModeL == "Filtered"  ? upRange :
     dirBarModeL == "Aggressive"? upRange_Aggr :
     dirBarModeL == "Inside"? insideDayUp : 
     dirBarModeL == "Filtered & Aggressive" ? upRange or upRange_Aggr :
     dirBarModeL == "Filtered & Aggressive & Inside" ? upRange or upRange_Aggr or insideDayUp :
     dirBarModeL == "Without"   ? true : false

shortBarOK =
     dirBarModeS == "Simple" ? down :
     dirBarModeS == "Filtered"  ? downRange :
     dirBarModeS == "Aggressive"? downRange_Aggr :
     dirBarModeS == "Inside"? insideDayDown :
     dirBarModeS == "Filtered & Aggressive"? downRange or downRange_Aggr or insideDayDown :
     dirBarModeS == "Filtered & Aggressive & Inside"? upRange_Aggr or insideDayDown :
     dirBarModeS == "Without"   ? true : false

// === Entry & Exit Logic === //
longCondition  = volume > rvolFast and rvolFast > rvolSlow and longBarOK  and rvol > rvolThreshold and (not useBreakout or close < breakoutHigh)
shortCondition = volume < rvolFast and rvolFast < rvolSlow and shortBarOK and rvol < (100 - rvolThreshold) and (not useBreakout or close > breakoutLow)

exitLongCondition  = strategy.opentrades > 0 and strategy.opentrades.entry_bar_index(0) + exitBars <= bar_index and strategy.opentrades.entry_id(0) == "Long"
exitShortCondition = strategy.opentrades > 0 and strategy.opentrades.entry_bar_index(0) + exitBars <= bar_index and strategy.opentrades.entry_id(0) == "Short"

atr = ta.atr(math.round(math.avg(rvolFastLength, rvolSlowLength)))
longSL = useSLTP ? close - atrSLMult * atr : na
longTP = useSLTP ? close + atrTPMult * atr : na
shortSL = useSLTP ? close + atrSLMult * atr : na
shortTP = useSLTP ? close - atrTPMult * atr : na

// === Strategy Execution === //
if (tradeDirection == "Long Only" or tradeDirection == "Both")
    if (longCondition)
        strategy.entry("Long", strategy.long, stop=longSL, limit=longTP)

if (tradeDirection == "Short Only" or tradeDirection == "Both")
    if (shortCondition)
        strategy.entry("Short", strategy.short, stop=shortSL, limit=shortTP)

if (exitLongCondition)
    strategy.close("Long")

if (exitShortCondition)
    strategy.close("Short")

// === Plotting === //
plot(rvol, title="Relative Volume %R", color=color.orange, style = plot.style_columns, format = format.price)
plot(rvolFast, title="Fast Volume MA", color=color.green, format = format.volume)
plot(rvolSlow, title="Slow Volume MA", color=color.red, format = format.volume)