ডুয়াল টাইম ফ্রেম স্টোকাস্টিক অসিলেটর আরবিট্রেজ ট্রেডিং কৌশল

STOCH KDJ MA RSI VWMA SMA EMA WMA
সৃষ্টির তারিখ: 2025-06-18 13:47:35 অবশেষে সংশোধন করুন: 2025-06-18 13:47:35
অনুলিপি: 0 ক্লিকের সংখ্যা: 318
2
ফোকাস
319
অনুসারী

ডুয়াল টাইম ফ্রেম স্টোকাস্টিক অসিলেটর আরবিট্রেজ ট্রেডিং কৌশল ডুয়াল টাইম ফ্রেম স্টোকাস্টিক অসিলেটর আরবিট্রেজ ট্রেডিং কৌশল

ওভারভিউ

ডাবল-টাইম ফ্রেম এলোমেলো অস্থিরতা সূচক আরবিট ট্রেডিং কৌশল একটি উচ্চ-ফ্রিকোয়েন্সি intraday ট্রেডিং সিস্টেম যা র্যান্ডম অস্থিরতা সূচক (Stochastic Oscillator) এর উপর ভিত্তি করে তৈরি করা হয়, যার মূল কৌশলটি 15 সেকেন্ডের সময় ফ্রেমে ট্রেডিং সংকেত তৈরি এবং নিশ্চিতকরণের জন্য দুটি ভিন্ন প্যারামিটার সেট এলোমেলো অস্থিরতা সূচক ব্যবহার করে। প্রধান লজিকটি সম্ভাব্য প্রবেশের পয়েন্টগুলিকে মূল এলোমেলো সূচকের% কে লাইন এবং% ডি লাইনের ক্রস দ্বারা সনাক্ত করার জন্য, এবং একটি মাল্টি-লেয়ার নিশ্চিতকরণ ব্যবস্থার জন্য একটি ট্রেডিং সিস্টেম তৈরি করার জন্য একটি মার্কেট স্ট্যাটাস ফিল্টার হিসাবে দ্বিতীয় এলোমেলো সূচকের% ডি মানকে উল্লেখ করে, যা চলমান গড় এবং বাজারের সময় ফিল্টারিংয়ের শর্তগুলিকে একত্রিত করে। কৌশলটিতে উচ্চ-নিম্ন প্যাটার্ন সনাক্তকরণ বৈশিষ্ট্য রয়েছে, বুল্ক এবং বিয়ারের

কৌশল নীতি

কৌশলটি দ্বৈত র্যান্ডম কম্পন সূচক সিস্টেম ব্যবহার করে, যথাক্রমে প্রধান সূচক এবং রেফারেন্স সূচক হিসাবে পরিচিতঃ

  1. মূলত এলোমেলো কম্পন সূচক সেটিংঃ

    • সময়সীমাঃ ১৫ সেকেন্ড
    • K লাইন দৈর্ঘ্যঃ 12
    • কে লাইন মসৃণতাঃ 12
    • D লাইন দৈর্ঘ্যঃ 12
  2. রেফারেন্সের জন্য র্যান্ডম কম্পন সূচক সেটিংঃ

    • সময়সীমাঃ ১৫ সেকেন্ড
    • K লাইন দৈর্ঘ্যঃ 12
    • কে লাইন মসৃণতাঃ 15
    • D লাইন দৈর্ঘ্যঃ 30

ইনপুট লজিস্টিকের নকশাটি সূক্ষ্ম, সিগন্যালের বৈধতা নিশ্চিত করার জন্য একাধিক স্তর রয়েছেঃ

  • ভর্তির শর্তাবলীঃ

    • %D লাইনটি %K লাইনের মধ্য দিয়ে অতিক্রম করে এবং
    • রেফারেন্স ইনডেক্স %D এর মান ≥ 50 বা < 20 বা
    • প্রধান সূচক %K রেফারেন্স সূচক %D-এর কাছাকাছি ((0.15 এর মধ্যে পার্থক্য)
    • দামটি মুভিং এভারেজের উপরে রয়েছে (MA ফিল্টার চালু থাকলে)
    • ট্রেডিং সময় অবশ্যই নিয়মিত বাজার সময় (৯ঃ৩০ AM - ৪ঃ০০ PM ET)
  • খালি মাথায় প্রবেশের শর্তঃ

    • %D লাইনটি %K লাইনের নিচে দিয়ে যায়, এবং
    • রেফারেন্স %D এর মধ্যে অবস্থিত, অথবা নির্দিষ্ট নিচে পরিধানের শর্ত পূরণ করে
    • দাম চলমান গড়ের নিচে
    • ট্রেডিং সময়গুলো অবশ্যই বাজারের স্বাভাবিক সময়ের মধ্যে হতে হবে।

সময় এবং প্রযুক্তিগত সংকেতের উপর ভিত্তি করে প্রস্থান লজিকঃ

  • সময় শেষঃ
    • ইস্টার্ন টাইম অনুযায়ী বিকেল ৩ঃ৩০ (বাজারের নিয়মিত সময় শেষ হওয়ার আগে)
  • টেকনিক্যাল অবসান:
    • মাল্টি হেড পজিশনঃ যখন প্রধান সূচক %K নীচে রেফারেন্স সূচক %D
    • খালি মাথা অবস্থানঃ যখন প্রধান সূচক% K উপর রেফারেন্স সূচক% D এবং রেফারেন্স সূচক% D> 20 পরেন

এই কৌশলটি মোড সনাক্তকরণের জন্যও কাজ করেঃ

  • উচ্চতর নিম্ন পয়েন্ট মোডঃ বর্তমান পরা পয়েন্টের% K মান পূর্ববর্তী পরা পয়েন্টের% K মানের চেয়ে বেশি ((প্যাসিভ ক্রমাগত মোড)
  • নিম্ন উচ্চ পয়েন্ট মোডঃ বর্তমান নিম্ন ব্রেকিং পয়েন্টের% K মান পূর্ববর্তী ব্রেকিং পয়েন্টের% K মানের চেয়ে কম ((বিপরীতমুখী ধারাবাহিক মোড)

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

  1. মাল্টি-লেভেল কনফার্মেশন: দুটি ভিন্ন কনফিগারেশনের র্যান্ডম কম্পন সূচক দ্বারা একে অপরকে নিশ্চিত করা, একক সূচক দ্বারা উত্পন্ন মিথ্যা সংকেত হ্রাস করা, সংকেত নির্ভরযোগ্যতা বৃদ্ধি করা।

  2. সঠিক প্রবেশ এবং প্রস্থান নিয়মএই নীতিমালায় স্পষ্টভাবে প্রবেশ এবং প্রস্থান শর্তাদি সংজ্ঞায়িত করা হয়েছে, ট্রেডিং সিদ্ধান্তের বিষয়বস্তু অপসারণ করা হয়েছে এবং সম্পূর্ণ সিস্টেমাইজড ট্রেডিং করা হয়েছে।

  3. আকৃতি সনাক্তকরণ ক্ষমতা: বাজারে ‘উচ্চ-নিম্ন’ এবং ‘নিম্ন-উচ্চ’ চিহ্নিত করতে সক্ষম হওয়া, ট্রেন্ডের পুনরাবৃত্তির সুযোগগুলি ধরার জন্য, যা অনেক সহজ কৌশল দ্বারা সম্ভব নয়।

  4. সময় ফিল্টার

  5. চলমান গড় ফিল্টার করুন: অপশনাল মুভিং এভারেজ ফিল্টারিং ফাংশনটি ট্রেন্ড নিশ্চিতকরণ স্তর যুক্ত করে, যাতে ট্রেডিংয়ের দিকটি সামগ্রিক প্রবণতার সাথে সামঞ্জস্যপূর্ণ থাকে।

  6. দামের পার্থক্য এবং ক্ষমতার পার্থক্যের পরামিতি: এই কৌশলটি মূল্য পরিবর্তনের মাত্রা এবং সূচকের পার্থক্যের পরিসীমা নিয়ন্ত্রণের জন্য একাধিক প্যারামিটার প্রবর্তন করে, যা ক্ষুদ্র ওঠানামা থেকে উৎপন্ন গোলমাল সংকেতকে কার্যকরভাবে ফিল্টার করে।

  7. ডায়নামিক লজিক রূপান্তর: সিস্টেমটি বাজারের অবস্থার উপর ভিত্তি করে গতিশীল সামঞ্জস্য করতে পারে এবং শূন্য থেকে শূন্যে এবং শূন্য থেকে শূন্যে রূপান্তরিত হয়।

  8. একটি পূর্ণাঙ্গ সতর্কতা ব্যবস্থাএই কৌশলটি রিয়েল-টাইম ট্রেডিংয়ের জন্য সতর্কতার একটি সমৃদ্ধ পরিসরকে অন্তর্ভুক্ত করে।

কৌশলগত ঝুঁকি

  1. স্বল্প সময়ের ফ্রেমে উচ্চ-ফ্রিকোয়েন্সি লেনদেনের ঝুঁকিকৌশলগতভাবে ১৫ সেকেন্ডের সময়সীমা ব্যবহার করলে অতিরিক্ত সংকেত তৈরি হতে পারে, যার ফলে লেনদেনের ঘনত্ব বৃদ্ধি পায়, লেনদেনের খরচ বৃদ্ধি পায় এবং বিপুল পরিমাণে মিথ্যা সংকেত তৈরি হতে পারে।

  2. ক্ষতিপূরণের অভাব: কোডে কোন স্পষ্ট স্টপ লস বাস্তবায়ন নেই, প্রবণতা হঠাৎ বিপরীত হলে বড় ক্ষতির ঝুঁকি হতে পারে। ঝুঁকি নিয়ন্ত্রণের অভাব কৌশলটির প্রধান দুর্বলতাগুলির মধ্যে একটি।

  3. পরামিতি সংবেদনশীলতাকৌশলগতভাবে ব্যবহৃত একাধিক সুনির্দিষ্ট প্যারামিটার (যেমন 0.15 এর পার্থক্যের প্রান্তিকতা, 0.1% এর মূল্যের পার্থক্যের সীমা ইত্যাদি) বিভিন্ন বাজারের অবস্থার জন্য খুব সংবেদনশীল হতে পারে এবং প্রায়শই সামঞ্জস্যের প্রয়োজন হয়।

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

  5. তরলতার উপর নির্ভরশীলতা: উচ্চ ফ্রিকোয়েন্সি কৌশলগুলি কম তরল বাজারে স্লাইড পয়েন্টের সমস্যার মুখোমুখি হতে পারে, প্রকৃত কার্যকর মূল্যগুলি সংকেত তৈরির সময় মূল্যের সাথে উল্লেখযোগ্য পার্থক্য থাকতে পারে।

  6. প্রযুক্তিগত সূচক বিলম্বিত: এলোমেলো অস্থিরতা সূচকটি নিজেই কিছুটা পিছিয়ে রয়েছে, বিশেষত দ্রুত পাল্টে যাওয়া বাজারে, যা সময়মতো পাল্টা পয়েন্টগুলি ধরতে পারে না।

  7. অতিরিক্ত ফিট হওয়ার ঝুঁকি: কৌশলগত প্যারামিটারগুলির সূক্ষ্ম সমন্বয়গুলি ঐতিহাসিক তথ্যের সাথে অতিরিক্ত মিলিত হতে পারে এবং ভবিষ্যতের বাজারের পরিবেশে দুর্বলভাবে কাজ করতে পারে।

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

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

  2. পজিশন ম্যানেজমেন্ট: বাজারের অস্থিরতা এবং অ্যাকাউন্টের ঝুঁকি সহনশীলতার উপর ভিত্তি করে ডায়নামিকভাবে ট্রেডিং স্কেলিং, বিভিন্ন সিগন্যালের শক্তির অধীনে বিভিন্ন পজিশন কনফিগারেশন ব্যবহার করে তহবিলের ব্যবহার এবং ঝুঁকি-উপার্জনের অনুপাত অনুকূল করতে।

  3. যোগদান নিশ্চিতকরণ: ট্র্যাফিকের পরিমাপকে সিস্টেমে সংহত করার জন্য, প্রয়োজনীয় প্রবেশের সংকেতগুলিকে পর্যাপ্ত ট্র্যাফিক সমর্থন করতে হবে যাতে কম ট্র্যাফিকের পরিবেশে অবিশ্বস্ত সংকেতগুলি ফিল্টার করা যায়।

  4. মাল্টিমিডিয়েটর ইন্টিগ্রেশনRSI, MACD বা বুলিন ব্যান্ডের মতো অন্যান্য গতিশীলতা এবং প্রবণতা সূচকগুলির সাথে মিলিতভাবে বিবেচনা করুন, যাতে আরও বিস্তৃত বাজার দৃষ্টিভঙ্গি তৈরি করা যায় এবং সিস্টেমের স্থিতিশীলতা বাড়ানো যায়।

  5. অপ্টিমাইজেশান টাইমফ্রেম: বিভিন্ন মৌলিক সময় ফ্রেম পরীক্ষা করা, যেমন 1 মিনিট বা 5 মিনিট, যা শব্দ কমাতে পারে এবং একই সাথে পর্যাপ্ত লেনদেনের সুযোগ বজায় রাখতে পারে, সংকেতের গুণমান এবং সংখ্যার সর্বোত্তম ভারসাম্য খুঁজে পেতে।

  6. পরিসংখ্যান ট্র্যাকিং যোগ করা হয়েছে: সর্বাধিক প্রত্যাহার, শার্প অনুপাত, জয়-ক্ষতি অনুপাত ইত্যাদির মতো আরও বিস্তৃত পরিমাপযোগ্য পারফরম্যান্স সূচক উপলব্ধ করা যাতে কৌশলটির কার্যকারিতা আরও বৈজ্ঞানিকভাবে মূল্যায়ন করা যায়।

  7. স্বনির্ধারিত প্যারামিটার: স্থির প্যারামিটারগুলিকে বাজারের অস্থিরতার উপর ভিত্তি করে অভিযোজিত প্যারামিটারে রূপান্তর করা যাতে কৌশলগুলি বিভিন্ন বাজারের অবস্থার সাথে খাপ খাইয়ে নিতে পারে

  8. বাজার পরিবেশে ফিল্টারিং বাড়ানো: ভিআইএক্স ((অস্থিরতা সূচক) বা অনুরূপ সূচককে বাজার পরিবেশের ফিল্টার শর্ত হিসাবে যুক্ত করুন, উচ্চ অস্থিরতার পরিবেশে কৌশলগত পরামিতিগুলি সামঞ্জস্য করুন বা লেনদেন স্থগিত করুন।

সারসংক্ষেপ

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

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

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

কৌশল সোর্স কোড
/*backtest
start: 2025-01-01 00:00:00
end: 2025-06-17 00:00:00
period: 4h
basePeriod: 4h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("Dual TF Stochastic Strategy", overlay=false)

// Input parameters with updated defaults
primaryLen = input.int(12, "Primary Stoch K Length", minval=1)  // Changed from 14 to 12
primarySmooth = input.int(12, "Primary Stoch K Smoothing", minval=1)  // Changed from 3 to 12
primaryDLen = input.int(12, "Primary Stoch D Length", minval=1)  // Changed from 3 to 12
primaryRes = input.timeframe("15S", "Primary Timeframe")  // Changed from "" to "15S"

refLen = input.int(12, "Reference Stoch K Length", minval=1)  // Changed from 14 to 12
refSmooth = input.int(15, "Reference Stoch K Smoothing", minval=1)  // Changed from 3 to 15
refDLen = input.int(30, "Reference Stoch D Length", minval=1)  // Changed from 3 to 30
refRes = input.timeframe("15S", "Reference Timeframe")  // Changed from "D" to "15S"

tolerance = input.float(0.1, "Ref D Tolerance %", minval=0.1, maxval=10.0, step=0.1)  // Changed from 1.0 to 0.1
maxPriceDiff = input.float(0.1, "Maximum Price % Difference", minval=0.1, maxval=5.0, step=0.1)  // Changed from 1.0 to 0.1
closeKThreshold = input.float(0.7, "Close %K Tolerance %", minval=0.1, maxval=10.0, step=0.1)  // Changed from 5.0 to 0.7
minPriceDiffShort = input.float(0.1, "Min Price % Diff for Close %K Short", minval=0.1, maxval=5.0, step=0.1)  // Changed from 0.5 to 0.1
showLabels = input.bool(true, "Show Crossover/Crossunder Labels")

// Time Filters (America/New_York timezone, UTC-4)
is_premarket = hour(time, "America/New_York") < 9
is_postmarket = hour(time, "America/New_York") >= 16
is_regular_hours = hour(time, "America/New_York") >= 9 and hour(time, "America/New_York") < 16
is_exit_time = hour(time, "America/New_York") >= 15 and minute(time, "America/New_York") >= 30  // 3:30 PM ET

// Moving Average Settings
useMAFilter = input.bool(true, "Use Moving Average Filter")
maLength = input.int(200, "Moving Average Length", minval=1)
maType = input.string("SMA", "Moving Average Type", options=["SMA", "EMA", "WMA", "VWMA"])
maTimeframe = input.timeframe("", "Moving Average Timeframe")

// Stochastic Calculations
primaryHighest = ta.highest(high, primaryLen)
primaryLowest = ta.lowest(low, primaryLen)
primaryK_raw = 100 * (close - primaryLowest) / (primaryHighest - primaryLowest)
primaryK = ta.sma(primaryK_raw, primarySmooth)
primaryD = ta.sma(primaryK, primaryDLen)
[primaryK_tf, primaryD_tf] = request.security(syminfo.tickerid, primaryRes, [primaryK, primaryD])

refHighest = ta.highest(high, refLen)
refLowest = ta.lowest(low, refLen)
refK_raw = 100 * (close - refLowest) / (refHighest - refLowest)
refK = ta.sma(refK_raw, refSmooth)
refD = ta.sma(refK, refDLen)
[refK_tf, refD_tf] = request.security(syminfo.tickerid, refRes, [refK, refD])

// Calculate Moving Average
var float ma = na
if useMAFilter
    if maType == "SMA"
        ma := request.security(syminfo.tickerid, maTimeframe, ta.sma(close, maLength))
    else if maType == "EMA"
        ma := request.security(syminfo.tickerid, maTimeframe, ta.ema(close, maLength))
    else if maType == "WMA"
        ma := request.security(syminfo.tickerid, maTimeframe, ta.wma(close, maLength))
    else if maType == "VWMA"
        ma := request.security(syminfo.tickerid, maTimeframe, ta.vwma(close, maLength))

// Price relative to MA
priceAboveMA = not useMAFilter or close > ma
priceBelowMA = not useMAFilter or close < ma

// Crossover Detection and Tracking
crossOver = ta.crossover(primaryK_tf, primaryD_tf)
crossUnder = ta.crossunder(primaryK_tf, primaryD_tf)

// Separate tracking for crossover and crossunder %K and price
var float lastCrossOverK = na
var float lastCrossOverPrice = na
var float currentCrossOverK = na
var float currentCrossOverPrice = na

var float lastCrossUnderK = na
var float lastCrossUnderPrice = na
var float currentCrossUnderK = na
var float currentCrossUnderPrice = na

// Update crossover tracking variables
if crossOver
    lastCrossOverK := nz(currentCrossOverK, primaryK_tf[1])
    lastCrossOverPrice := nz(currentCrossOverPrice, close[1])
    currentCrossOverK := primaryK_tf
    currentCrossOverPrice := close

// Update crossunder tracking variables
if crossUnder
    lastCrossUnderK := nz(currentCrossUnderK, primaryK_tf[1])
    lastCrossUnderPrice := nz(currentCrossUnderPrice, close[1])
    currentCrossUnderK := primaryK_tf
    currentCrossUnderPrice := close

// Calculate differences separately
crossOverPriceDiffPercent = math.abs((currentCrossOverPrice - lastCrossOverPrice) / lastCrossOverPrice * 100)
crossOverKDiffPercent = math.abs((currentCrossOverK - lastCrossOverK) / lastCrossOverK * 100)
crossUnderPriceDiffPercent = math.abs((currentCrossUnderPrice - lastCrossUnderPrice) / lastCrossUnderPrice * 100)
crossUnderKDiffPercent = math.abs((currentCrossUnderK - lastCrossUnderK) / lastCrossUnderK * 100)

isKCloseCrossUnder = crossUnderKDiffPercent <= closeKThreshold and not na(lastCrossUnderK)

// New condition for long entry based on %K and refD_tf difference
kAndRefDDiffClose = crossOver and math.abs(currentCrossOverK - refD_tf) <= 0.15

// Labels for crossover and crossunder (optional)
if showLabels
    if crossOver
        diffKandRefD = math.abs(currentCrossOverK - refD_tf)
        label.new(bar_index, 50, "CrossOver\nDiff K-RefD: " + str.tostring(diffKandRefD, "#.###"), color=color.green, textcolor=color.black, style=label.style_label_up)
    if crossUnder
        diffKandRefD = math.abs(currentCrossUnderK - refD_tf)
        label.new(bar_index, 50, "CrossUnder\nDiff K-RefD: " + str.tostring(diffKandRefD, "#.###"), color=color.red, textcolor=color.black, style=label.style_label_down)

// Entry Conditions
longKCondition = crossOver and (na(lastCrossOverK) or currentCrossOverK > lastCrossOverK)
shortKCondition = crossUnder and (crossUnderPriceDiffPercent <= maxPriceDiff)
closeKShortCondition = crossUnder and isKCloseCrossUnder and (crossUnderPriceDiffPercent > minPriceDiffShort)
crossUnderBetween50and45 = crossUnder and currentCrossUnderK <= 50 and currentCrossUnderK > 45

// Long to Short if crossunder %K > 80 OR < 60
longToShortCondition = crossUnder and (currentCrossUnderK > 80 or currentCrossUnderK < 60) and strategy.position_size > 0 and is_regular_hours

upperLimit = refD_tf * (1 + tolerance/100)
lowerLimit = refD_tf * (1 - tolerance/100)
withinToleranceLong = primaryK_tf >= lowerLimit and primaryK_tf <= upperLimit
withinToleranceShort = primaryK_tf >= lowerLimit and primaryK_tf <= upperLimit

// Final Entry Conditions with MA filter
longCondition = ((longKCondition and (refD_tf >= 50 or refD_tf < 20)) or kAndRefDDiffClose) and is_regular_hours and not is_exit_time and priceAboveMA
shortCondition = (shortKCondition or (crossUnder and withinToleranceShort and (crossUnderPriceDiffPercent <= maxPriceDiff)) or closeKShortCondition or longToShortCondition or crossUnderBetween50and45) and is_regular_hours and not is_exit_time and priceBelowMA

// Short-to-Long Transition Condition with MA filter
shortToLongCondition = crossOver and currentCrossOverK < 25 and strategy.position_size < 0 and is_regular_hours and not is_exit_time and priceAboveMA

// Tracking for %K crossing under refD_tf
var float lastPrimaryKCrossUnderRefD = na
var float currentPrimaryKCrossUnderRefD = na
var bool isPrimaryKCrossUnderRefD = false

// Check if primary %K crosses under reference %D
isPrimaryKCrossUnderRefD := ta.crossunder(primaryK_tf, refD_tf)

// Update tracking for %K crossing under refD
if isPrimaryKCrossUnderRefD
    lastPrimaryKCrossUnderRefD := currentPrimaryKCrossUnderRefD
    currentPrimaryKCrossUnderRefD := primaryK_tf

// Exit Conditions
if is_exit_time
    strategy.close("Long")
    strategy.close("Short")
else if isPrimaryKCrossUnderRefD and not na(lastPrimaryKCrossUnderRefD) and currentPrimaryKCrossUnderRefD < lastPrimaryKCrossUnderRefD
    strategy.close("Long")
else if (ta.crossunder(primaryK_tf, primaryD_tf) and primaryK_tf < refD_tf and refD_tf < 60)
    strategy.close("Long")

if (ta.crossover(primaryK_tf, primaryD_tf) and primaryK_tf > refD_tf and refD_tf > 20) and not is_exit_time
    strategy.close("Short")

// Track if crossunder happens above 85
var bool crossUnderAbove85 = false

// Detect crossunder above 85
if crossUnder and currentCrossUnderK > 85
    crossUnderAbove85 := true

// Reset condition if %K crosses over %D
if ta.crossover(primaryK_tf, primaryD_tf)
    crossUnderAbove85 := false

// Track previous crossover/crossunder values for Higher Low/Lower High detection
var float prevCrossOverK = na
var float prevCrossUnderK = na

// Update previous values on new crossovers/crossunders
if crossOver
    prevCrossOverK := currentCrossOverK
if crossUnder
    prevCrossUnderK := currentCrossUnderK

// Higher Low and Lower High conditions
higherLowCondition = crossOver and not na(prevCrossOverK) and currentCrossOverK > prevCrossOverK
lowerHighCondition = crossUnder and not na(prevCrossUnderK) and currentCrossUnderK < prevCrossUnderK

// Strategy Entries and Transitions
if longCondition
    strategy.entry("Long", strategy.long)

if shortCondition
    if strategy.position_size > 0  // If in a long position, close it first
        strategy.close("Long")
    strategy.entry("Short", strategy.short)

if shortToLongCondition
    strategy.close("Short")
    if ((longKCondition and (refD_tf >= 50 or refD_tf < 20)) or kAndRefDDiffClose)  // Check full longCondition minus time (already checked)
        strategy.entry("Long", strategy.long)

// Add label for Short to Long Transition
if shortToLongCondition
    label.new(bar_index, na, "T", color=color.green, textcolor=color.white, style=label.style_label_up)

// Add label for Long to Short Transition
if longToShortCondition
    label.new(bar_index, na, "T", color=color.red, textcolor=color.white, style=label.style_label_down)

// Plotting
plot(primaryK_tf, "Primary %K", color=color.white, linewidth=1)
plot(primaryD_tf, "Primary %D", color=color.orange, linewidth=1)
plot(refK_tf, "Reference %K", color=color.navy, linewidth=1)
plot(refD_tf, "Reference %D", color=color.rgb(33, 233, 243), linewidth=2)

// Plot current and last %K only for crossUnder when isKCloseCrossUnder is true and currentCrossUnderK < lastCrossUnderK
plot(crossUnder and isKCloseCrossUnder and currentCrossUnderK < lastCrossUnderK ? currentCrossUnderK : na, "Current CrossUnder %K (Close)", color=color.green, style=plot.style_cross, linewidth=2)
plot(crossUnder and isKCloseCrossUnder and currentCrossUnderK < lastCrossUnderK ? lastCrossUnderK : na, "Last CrossUnder %K (Close)", color=color.red, style=plot.style_cross, linewidth=2)

h0 = hline(85, "Upper Band", color=color.rgb(242, 187, 21))
hline(50, "Middle Band", color=#eaff04)
h1 = hline(20, "Lower Band", color=color.rgb(242, 187, 21))
h2 = hline(40, "Lower Band", color=#787B86)
h3 = hline(60, "Lower Band", color=#787B86)
h = hline(0, "Lower Band", color=#787B86)
h5 = hline(100, "Lower Band", color=#787B86)
fill(h0, h1, color=color.rgb(33, 150, 243, 90), title="Background")
fill(h, h1, color=#1be2781d, title="Background")
fill(h0, h5, color=#e21b742d, title="Background")

// Plot the MA if enabled
plot(useMAFilter ? ma : na, "Moving Average", color=color.yellow, linewidth=2)

// Add plot for visualization (optional)
plot(isPrimaryKCrossUnderRefD ? primaryK_tf : na, "Primary %K CrossUnder RefD", color=color.purple, style=plot.style_cross, linewidth=2)
plot(isPrimaryKCrossUnderRefD and not na(lastPrimaryKCrossUnderRefD) ? lastPrimaryKCrossUnderRefD : na, "Last Primary %K CrossUnder RefD", color=color.fuchsia, style=plot.style_cross, linewidth=2)

// Add new alert conditions
alertcondition(higherLowCondition, title="Stoch Higher Low", message="Stoch Higher Low Pattern Detected")
alertcondition(lowerHighCondition, title="Stoch Lower High", message="Stoch Lower High Pattern Detected")

// Plot markers for Higher Low and Lower High patterns
plot(higherLowCondition ? currentCrossOverK : na, "Higher Low", color=color.green, style=plot.style_cross, linewidth=2)
plot(lowerHighCondition ? currentCrossUnderK : na, "Lower High", color=color.red, style=plot.style_cross, linewidth=2)

// Alert conditions
alertcondition(crossOver, title="Stochastic %K Crossed Over %D", message="Stochastic %K crossed over %D")
alertcondition(crossUnder, title="Stochastic %K Crossed Under %D", message="Stochastic %K crossed under %D")
alertcondition(crossOver and primaryK_tf > 50, title="Stochastic %K Crossed Over %D Above 50", message="Stochastic %K crossed over %D above 50")
alertcondition(crossOver and primaryK_tf > refD_tf, title="Stochastic %K Crossed Over %D Above Reference %D", message="Stochastic %K crossed over %D above Reference %D")
alertcondition(longCondition, title="Long Entry Signal", message="Long entry signal triggered")
alertcondition(shortCondition, title="Short Entry Signal", message="Short entry signal triggered")
alertcondition(shortToLongCondition, title="Short to Long Transition", message="Short to Long transition triggered")
alertcondition(longToShortCondition, title="Long to Short Transition", message="Long to Short transition triggered")
alertcondition(isPrimaryKCrossUnderRefD, title="Primary %K Crossed Under Reference %D", message="Primary %K crossed under Reference %D")
alertcondition(crossOver and primaryK_tf > refD_tf, title="Bullish Crossover Above Ref %D", message="Bull: Dual Stoch")
alertcondition(crossUnder and primaryK_tf < refD_tf, title="Bearish Crossunder Below Ref %D", message="Bear: Dual Stoch")