রিয়েল-টাইম সোনার পরিবর্তন সনাক্তকরণ এবং ঝুঁকি ব্যবস্থাপনা কৌশলগুলির জন্য একাধিক প্রযুক্তিগত সূচক

MA EMA ATR STC HEIKIN ASHI CHANDELIER EXIT supertrend RMA VWMA WMA HMA
সৃষ্টির তারিখ: 2025-03-05 10:35:15 অবশেষে সংশোধন করুন: 2025-03-05 10:35:15
অনুলিপি: 4 ক্লিকের সংখ্যা: 548
2
ফোকাস
319
অনুসারী

রিয়েল-টাইম সোনার পরিবর্তন সনাক্তকরণ এবং ঝুঁকি ব্যবস্থাপনা কৌশলগুলির জন্য একাধিক প্রযুক্তিগত সূচক রিয়েল-টাইম সোনার পরিবর্তন সনাক্তকরণ এবং ঝুঁকি ব্যবস্থাপনা কৌশলগুলির জন্য একাধিক প্রযুক্তিগত সূচক

কৌশল ওভারভিউ

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

কৌশল নীতি

এই কৌশলটি একাধিক স্তরের সিগন্যাল নিশ্চিতকরণ সিস্টেমের উপর ভিত্তি করে তৈরি করা হয়েছে, যার মূল যুক্তি হলঃ

  1. প্রধান সূচক সংকেত উৎপন্নকৌশলটি চ্যান্ডেলিয়ার প্রস্থানকে নেতৃত্ব দেয়। এটি একটি প্রবণতা-ট্র্যাকিং সূচক যা এটিআর (গড় সত্যিকারের পরিসীমা) এর গুণকে স্টপ-ওভার পজিশনের জন্য ব্যবহার করে এবং মাল্টি-হেড এবং ফাঁকা-হেড সংকেত তৈরি করে।

  2. ফিল্টারিং নিশ্চিত করুন: কৌশলটি ব্যবসায়ীদেরকে একাধিক নিশ্চিতকরণ সূচক নির্বাচন করতে দেয়ঃ

    • ইএমএ ফিল্টারঃ দামগুলি নির্দিষ্ট ইএমএ লাইনের উপরে (মাল্টি হেড) বা নীচে (খালি হেড) হতে হবে
    • সুপারট্রেন্ড (SuperTrend): প্রচলিত সংকেতের সাথে সামঞ্জস্যপূর্ণ হওয়া প্রয়োজন
    • শেফ ট্রেন্ডস চক্র (এসটিসি): উপরের সীমানা (মাল্টি হেড) বা নীচের সীমানা (খালি হেড) এর চেয়ে বেশি প্রয়োজন
  3. সিগন্যাল মেয়াদোত্তীর্ণ প্রক্রিয়া: কৌশলটি সিগন্যাল মেয়াদোত্তীর্ণ ফাংশন বাস্তবায়ন করে, যা সিগন্যালের কার্যকরী কিলোগ্রামের সংখ্যা সেট করে, যা পুরানো সিগন্যালের উপর লেনদেন প্রতিরোধ করে।

  4. লেনদেন কার্যকর করার লজিক: যখন সমস্ত নির্বাচিত শর্ত পূরণ করা হয়, কৌশলটি একটি প্রবেশের সংকেত উত্পন্ন করে এবং স্বয়ংক্রিয়ভাবে একটি নির্দিষ্ট সংখ্যক পয়েন্টের স্টপ লস সেট করে।

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

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

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

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

  2. নমনীয় সূচক প্যাকেজ: ব্যবহারকারীরা বিভিন্ন নিশ্চিতকরণ সূচকগুলি সক্ষম বা নিষ্ক্রিয় করতে পারেন এবং বিভিন্ন বাজারের অবস্থার উপর ভিত্তি করে কৌশলগুলি কাস্টমাইজ করতে পারেন।

  3. সঠিক ঝুঁকি ব্যবস্থাপনা: কৌশলটি ব্যবহারকারীদের নির্দিষ্ট স্টপ-অফ-লস পয়েন্ট সেট করার অনুমতি দেয়, যা প্রতিটি লেনদেনের ঝুঁকি-ফেরতের অনুপাতকে সঠিকভাবে নিয়ন্ত্রণ করতে সহায়তা করে।

  4. সিগন্যাল মেয়াদোত্তীর্ণ নিয়ন্ত্রণসিগন্যালের মেয়াদ শেষ হওয়ার পর ট্রেডিং এড়ানোর কৌশলঃ সিগন্যালের মেয়াদ শেষ হওয়ার পর ট্রেডিং এড়ানোর কৌশল।

  5. অত্যন্ত দৃশ্যমান লেনদেনের ইন্টারফেস: ট্রেডিং ডেক্সটপটি সমস্ত সূচকের অবস্থা প্রদর্শন করে, যা ব্যবসায়ীদের দ্রুত বাজার অবস্থার মূল্যায়ন করতে সহায়তা করে।

  6. স্বর্ণের বাজারের জন্য অপ্টিমাইজেশন: কৌশলটি স্বর্ণের বাজারের বৈশিষ্ট্যগুলির জন্য প্যারামিটার অপ্টিমাইজ করা হয়েছে, বিশেষত পয়েন্ট মান রূপান্তরকে বিবেচনা করে ((1 পয়েন্ট = 0.1 ডলার)) ।

  7. উচ্চ ফ্রিকোয়েন্সি ট্রেডিং অভিযোজনযোগ্যতা১ মিনিটের সময়কালের চক্রটি কৌশলটিকে স্বল্পমেয়াদী মূল্যের ওঠানামা ধরতে সক্ষম করে, যা intraday ব্যবসায়ীদের জন্য উপযুক্ত।

কৌশলগত ঝুঁকি

  1. অতিরিক্ত লেনদেনের ঝুঁকি: মিনিট চক্রটি অতিরিক্ত লেনদেনের সংকেত তৈরি করতে পারে, যার ফলে লেনদেনের ব্যয় বৃদ্ধি পায় এবং অতিরিক্ত লেনদেন হয়। সমাধানটি হল নিশ্চিতকরণ সূচকগুলির সংখ্যা সামঞ্জস্য করা বা সংকেত ফিল্টারিং শর্ত বাড়ানো।

  2. বাজারের শব্দনিম্ন সময়ের চক্রগুলি বাজারের গোলমালের দ্বারা বিভ্রান্ত হতে পারে এবং মিথ্যা সংকেত তৈরি করতে পারে। উচ্চ অস্থিরতার সময়কালে সতর্কতার সাথে ব্যবহার করার পরামর্শ দেওয়া হয়, বা দীর্ঘ সময়ের সাথে মিলিত প্রবণতা নিশ্চিত করা হয়।

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

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

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

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

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

  1. বৈচিত্র্যের মূল সূচকবর্তমানে, এই কৌশলটি কেবলমাত্র রফতানির উত্থানকে প্রাধান্য দেয়, তবে বিভিন্ন বাজার পরিস্থিতির সাথে খাপ খাইয়ে নেওয়ার জন্য বিভিন্ন প্রাধান্য সূচক বিকল্প যেমন ব্রিনব্যান্ড, এমএসিডি বা অ্যাডাপ্টিভ মুভিং এভারেজকে সমর্থন করে।

  2. ডায়নামিক স্টপ লসস্থির পয়েন্ট স্টপ লসকে ATR-ভিত্তিক গতিশীল স্টপ লস-এ রূপান্তরিত করা হয়েছে, যা বাজারের অস্থিরতার পরিবর্তনের সাথে আরও ভালভাবে খাপ খাইয়ে নিতে পারে। উদাহরণস্বরূপ, এটি ব্যবহার করা যেতে পারেsl_value = atr(14) * 1.5স্থির পয়েন্টের পরিবর্তে।

  3. সময় ফিল্টার ইন্টিগ্রেশনট্রেডিংয়ের সময় ফিল্টার যুক্ত করুন, কম তরলতার সময় বা গুরুত্বপূর্ণ প্রেস রিলিজের সময় এড়িয়ে চলুন, যা স্লাইড পয়েন্ট এবং অপ্রত্যাশিত মূল্যের ওঠানামা ঝুঁকি হ্রাস করতে পারে।

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

  5. মেশিন লার্নিং অপ্টিমাইজেশন: মেশিন লার্নিং অ্যালগরিদম প্রবর্তন করা হয়েছে যা সাম্প্রতিক বাজার কর্মক্ষমতা অনুযায়ী কৌশলগত প্যারামিটারগুলিকে সামঞ্জস্য করে।

  6. ব্যাটেলিং পদ্ধতি: একক এন্ট্রি-এক্সট্রি পয়েন্টের সময় ঝুঁকি কমানোর জন্য ব্যাচ ইন-এন্ড-এক্সট্রি প্রক্রিয়া বাস্তবায়ন করুন, উদাহরণস্বরূপ, তিনটি ভাণ্ডার এবং তিনটি ভাণ্ডার।

  7. বহু-সময়-প্রান্তিক নিশ্চিতকরণ: উচ্চতর সময়ের চক্রের প্রবণতা নিশ্চিতকরণ, শুধুমাত্র উচ্চ সময়ের চক্রের প্রবণতা দিকের অবস্থান খুলুন, বিপরীত ট্রেডিং ঝুঁকি কমাতে।

  8. সূচকের প্রাসঙ্গিকতা বিশ্লেষণ: নির্বাচিত সূচকগুলির মধ্যে সংশ্লিষ্টতা বিশ্লেষণ করুন, নিশ্চিতকরণ হিসাবে উচ্চ সংশ্লিষ্ট সূচকগুলি ব্যবহার করা এড়িয়ে চলুন, যা ভুয়া চিত্রের একাধিক নিশ্চিতকরণের কারণ হতে পারে।

সারসংক্ষেপ

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

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

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

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

//@version=5
strategy("1 Min Gold Heikin Ashi Strategy", overlay=true, max_bars_back=500)

// Adjustable TP & SL in Pips
tp_pips = input.int(50, title="Take Profit (Pips)")
sl_pips = input.int(30, title="Stop Loss (Pips)")

// Convert pips to price value for XAUUSD (1 pip = 0.1 in Gold)
tp_value = tp_pips * 0.1
sl_value = sl_pips * 0.1

// Fixed components
justcontinue = bool(true)

ma(_source, _length, _type) => 
    switch _type
        "SMA"  => ta.sma (_source, _length)
        "EMA"  => ta.ema (_source, _length)
        "RMA"  => ta.rma (_source, _length)
        "WMA"  => ta.wma (_source, _length)
        "VWMA" => ta.vwma(_source, _length)

alarm(_osc, _message) => 
    alert(syminfo.ticker + ' ' + _osc + ' : ' + _message + ', price (' + str.tostring(close, format.mintick) + ')')

// Conditional Sampling EMA Function 
Cond_EMA(x, cond, n) =>
    var val = array.new_float(0)
    var ema_val = array.new_float(1)
    if cond
        array.push(val, x)
        if array.size(val) > 1
            array.remove(val, 0)
        if na(array.get(ema_val, 0))
            array.fill(ema_val, array.get(val, 0))
        array.set(ema_val, 0, (array.get(val, 0) - array.get(ema_val, 0)) * (2 / (n + 1)) + array.get(ema_val, 0))
    EMA = array.get(ema_val, 0)
    EMA

// Conditional Sampling SMA Function
Cond_SMA(x, cond, n) =>
    var vals = array.new_float(0)
    if cond
        array.push(vals, x)
        if array.size(vals) > n
            array.remove(vals, 0)
    SMA = array.avg(vals)
    SMA

// Standard Deviation Function
Stdev(x, n) =>
    math.sqrt(Cond_SMA(math.pow(x, 2), 1, n) - math.pow(Cond_SMA(x, 1, n), 2))

// Range Size Function
rng_size(x, scale, qty, n) =>
    ATR = Cond_EMA(ta.tr(true), 1, n)
    AC = Cond_EMA(math.abs(x - x[1]), 1, n)
    SD = Stdev(x, n)
    rng_size = scale == 'Pips' ? qty * 0.0001 : scale == 'Points' ? qty * syminfo.pointvalue : scale == '% of Price' ? close * qty / 100 : scale == 'ATR' ? qty * ATR : scale == 'Average Change' ? qty * AC : scale == 'Standard Deviation' ? qty * SD : scale == 'Ticks' ? qty * syminfo.mintick : qty
    rng_size

// Two Type Range Filter Function
rng_filt(h, l, rng_, n, type, smooth, sn, av_rf, av_n) =>
    rng_smooth = Cond_EMA(rng_, 1, sn)
    r = smooth ? rng_smooth : rng_
    var rfilt = array.new_float(2, (h + l) / 2)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if type == 'Type 1'
        if h - r > array.get(rfilt, 1)
            array.set(rfilt, 0, h - r)
        if l + r < array.get(rfilt, 1)
            array.set(rfilt, 0, l + r)
    if type == 'Type 2'
        if h >= array.get(rfilt, 1) + r
            array.set(rfilt, 0, array.get(rfilt, 1) + math.floor(math.abs(h - array.get(rfilt, 1)) / r) * r)
        if l <= array.get(rfilt, 1) - r
            array.set(rfilt, 0, array.get(rfilt, 1) - math.floor(math.abs(l - array.get(rfilt, 1)) / r) * r)
    rng_filt1 = array.get(rfilt, 0)
    hi_band1 = rng_filt1 + r
    lo_band1 = rng_filt1 - r
    rng_filt2 = Cond_EMA(rng_filt1, rng_filt1 != rng_filt1[1], av_n)
    hi_band2 = Cond_EMA(hi_band1, rng_filt1 != rng_filt1[1], av_n)
    lo_band2 = Cond_EMA(lo_band1, rng_filt1 != rng_filt1[1], av_n)
    rng_filt = av_rf ? rng_filt2 : rng_filt1
    hi_band = av_rf ? hi_band2 : hi_band1
    lo_band = av_rf ? lo_band2 : lo_band1
    [hi_band, lo_band, rng_filt]

// Moving Average Function
ma_function(source, length, type) =>
    if type == 'RMA'
        ta.rma(source, length)
    else if type == 'SMA'
        ta.sma(source, length)
    else if type == 'EMA'
        ta.ema(source, length)
    else if type == 'WMA'
        ta.wma(source, length)
    else if type == 'HMA'
        if (length < 2)
            ta.hma(source, 2)
        else
            ta.hma(source, length)
    else 
        ta.vwma(source, length)

// Get Table Size
table_size(s) => 
    switch s
        "Auto"   => size.auto   
        "Huge"   => size.huge   
        "Large"  => size.large  
        "Normal" => size.normal 
        "Small"  => size.small
        => size.tiny

// Confirmation Setup
confirmation_counter = array.new_string(0)
confirmation_val = array.new_string(0)
confirmation_val_short = array.new_string(0)

pushConfirmation(respect, label, longCondition, shortCondition) =>
    if respect
        array.push(confirmation_counter, label)
        array.push(confirmation_val, longCondition ? "✔️" : "❌")
        array.push(confirmation_val_short, shortCondition ? "✔️" : "❌")

leadinglongcond = bool(na)
leadingshortcond = bool(na)
longCond = bool(na)
shortCond = bool(na)
longCondition = bool(na)
shortCondition = bool(na)

// Indicator Setup Inputs
setup_group = "████████ Indicator Setup ████████"
signalexpiry = input.int(defval=3, title='Signal Expiry Candle Count', group=setup_group, inline='expiry', tooltip="Number of candles to wait for all indicators to confirm a signal. Default is 3.")
alternatesignal = input.bool(true, "Alternate Signal", group=setup_group, inline='alternate')
showsignal = input.bool(true, "Show Long/Short Signal", group=setup_group, inline='showsignal', tooltip="Option to turn on/off the Long/Short signal shown on the chart.")
showdashboard = input.bool(true, "Show Dashboard", group=setup_group, inline='dashboard')

string i_tab1Ypos = input.string('bottom', 'Dashboard Position', group=setup_group, inline='dashboard2', options=['top', 'middle', 'bottom'])
string i_tab1Xpos = input.string('right', '', inline='dashboard2', group=setup_group, options=['left', 'center', 'right'])
in_dashboardtab_size = input.string(title="Dashboard Size", defval="Normal", options=["Auto", "Huge", "Large", "Normal", "Small", "Tiny"], group=setup_group, inline="dashboard3")

// Confirmation Indicator Settings
confirmation_group = "████████ Confirmation Indicators (filter) ████████"
respectce = input.bool(false, "Chandelier Exit", group=confirmation_group, inline='ce')
respectema = input.bool(false, "EMA Filter", group=confirmation_group, inline='respectema')
respectemaperiod = input.int(defval=200, minval=1, title='', group=confirmation_group, inline='respectema', tooltip="EMA filter for confirmation.")
respectst = input.bool(false, "SuperTrend", group=confirmation_group, inline='st')
respectstc = input.bool(false, "Schaff Trend Cycle (STC)", group=confirmation_group, inline='stc')

// Switchboard Indicators
switchboard_group = "████ Switch Board (Turn On/Off Overlay Indicators) ████"
switch_ema = input.bool(false, "EMA", group=switchboard_group, inline='Switch1')
switch_supertrend = input.bool(false, "Supertrend", group=switchboard_group, inline='Switch2')
switch_stc = input.bool(false, "STC", group=switchboard_group, inline='Switch3')

// ----------------------------------------
// 4. Indicator Code

// Chandelier Exit
////////////////////////////////////////////////
////// Chandelier Exit
///////////////////////////////////////////////
ChandelierE = "██████████ Chandelier Exit ██████████"
ce_length = input.int(title='ATR Period', defval=22, group=ChandelierE)
ce_mult = input.float(title='ATR Multiplier', step=0.1, defval=3.0, group=ChandelierE)
showLabels = input.bool(title='Show Buy/Sell Labels?', defval=true, group=ChandelierE)
useClose = input.bool(title='Use Close Price for Extremums?', defval=true, group=ChandelierE)
highlightState = input.bool(title='Highlight State?', defval=true, group=ChandelierE)

ce_atr = ce_mult * ta.atr(ce_length)
longStop = (useClose ? ta.highest(close, ce_length) : ta.highest(ce_length)) - ce_atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? math.max(longStop, longStopPrev) : longStop

shortStop = (useClose ? ta.lowest(close, ce_length) : ta.lowest(ce_length)) + ce_atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop

var int dir = 1
dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir

ce_long = dir == 1 
ce_short = dir == -1

// EMA Filter
////////////////////////////////////////////////////////////////////////////
//////////// EMA Filter
////////////////////////////////////////////////////////////////////////////
respectemavalue = ta.ema(close, respectemaperiod)
isaboverespectema = close > respectemavalue
isbelowrespectema = close < respectemavalue

// SuperTrend Calculation
////////////////////////////////
///// SuperTrend
//////////////////////////////
sp_group = "██████████ SuperTrend ██████████"
Periods = input.int(title='ATR Period', defval=10, group=sp_group)
stsrc = input.source(hl2, title='Source', group=sp_group)
Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=3.0, group=sp_group)
changeATR = input.bool(title='Change ATR Calculation Method?', defval=true, group=sp_group)

statr2 = ta.sma(ta.tr, Periods)
statr = changeATR ? ta.atr(Periods) : statr2
stup = stsrc - Multiplier * statr
up1 = nz(stup[1], stup)
stup := close[1] > up1 ? math.max(stup, up1) : stup
dn = stsrc + Multiplier * statr
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn
sttrend = 1
sttrend := nz(sttrend[1], sttrend)
sttrend := sttrend == -1 and close > dn1 ? 1 : sttrend == 1 and close < up1 ? -1 : sttrend
stbuySignal = sttrend == 1 and sttrend[1] == -1
stsellSignal = sttrend == -1 and sttrend[1] == 1

isstup = bool(na)
isstdown = bool(na)
isstup := sttrend == 1
isstdown := sttrend != 1

// Schaff Trend Cycle (STC)
/////////////////////////
/// STC overlay signal
/////////////////////////
stc_group = "██████████ Schaff Trend Cycle (STC) ██████████"
fastLength = input.int(title='MACD Fast Length', defval=23, group=stc_group)
slowLength = input.int(title='MACD Slow Length', defval=50, group=stc_group)
cycleLength = input.int(title='Cycle Length', defval=10, group=stc_group)
d1Length = input.int(title='1st %D Length', defval=3, group=stc_group)
d2Length = input.int(title='2nd %D Length', defval=3, group=stc_group)
srcstc = input.source(title='Source', defval=close, group=stc_group)
upper = input.int(title='Upper Band', defval=75, group=stc_group)
lower = input.int(title='Lower Band', defval=25, group=stc_group)
v_show_last  = input.int(2000, "Plotting Length", group=stc_group)

macd = ta.ema(srcstc, fastLength) - ta.ema(srcstc, slowLength)
k = nz(fixnan(ta.stoch(macd, macd, macd, cycleLength)))
d = ta.ema(k, d1Length)
kd = nz(fixnan(ta.stoch(d, d, d, cycleLength)))
stc = ta.ema(kd, d2Length)
stc := math.max(math.min(stc, 100), 0)

stcColor1 = stc > stc[1] ? color.green : color.red
stcColor2 = stc > upper ? color.green : stc <= lower ? color.red : color.orange

upperCrossover = ta.crossover(stc, upper)
upperCrossunder = ta.crossunder(stc, upper)
lowerCrossover = ta.crossover(stc, lower)
lowerCrossunder = ta.crossunder(stc, lower)
stcup = stc >= upper
stcdown = stc <= lower

// ----------------------------------------
// 5. Switchboard Code

// Additional code for EMA from Switchboard
/////////////////////////////////////////////////////////////////////////
// EMA Selection
/////////////////////////////////////////////////////////////////////////
ma_group= "██████████ MAs Line ██████████"

len1bool = input.bool(true, '', group=ma_group, inline='len1')
len1 = input.int(5, title='MA 1', group=ma_group, inline='len1')
string ma_1_type = input.string(defval='EMA', title='Type', options=['RMA', 'SMA', 'EMA', 'WMA', 'HMA', 'VWMA'], inline='len1', group=ma_group)
color ma_1_colour = input.color(color.rgb(254, 234, 74, 0), '', inline='len1', group=ma_group)

len2bool = input.bool(true, '', group=ma_group, inline='len2')
len2 = input.int(13, minval=1, title='MA 2', group=ma_group, inline='len2')
string ma_2_type = input.string(defval='EMA', title='Type', options=['RMA', 'SMA', 'EMA', 'WMA', 'HMA', 'VWMA'], inline='len2', group=ma_group)
color ma_2_colour = input.color(color.rgb(253, 84, 87, 0), '', inline='len2', group=ma_group)

len3bool = input.bool(false, '', group=ma_group, inline='len3')
len3 = input.int(20, minval=1, title='MA 3', group=ma_group, inline='len3')
string ma_3_type = input.string(defval='EMA', title='Type', options=['RMA', 'SMA', 'EMA', 'WMA', 'HMA', 'VWMA'], inline='len3', group=ma_group)
color ma_3_colour = input.color(color.new(color.aqua, 0), '', inline='len3', group=ma_group)

len4bool = input.bool(true, '', group=ma_group, inline='len4')
len4 = input.int(50, minval=1, title='MA 4', group=ma_group, inline='len4')
string ma_4_type = input.string(defval='EMA', title='Type', options=['RMA', 'SMA', 'EMA', 'WMA', 'HMA', 'VWMA'], inline='len4', group=ma_group)
color ma_4_colour = input.color(color.new(color.blue, 0), '', inline='len4', group=ma_group)

len5bool = input.bool(true, '', group=ma_group, inline='len5')
len5 = input.int(200, minval=1, title='MA 5', group=ma_group, inline='len5')
string ma_5_type = input.string(defval='EMA', title='Type', options=['RMA', 'SMA', 'EMA', 'WMA', 'HMA', 'VWMA'], inline='len5', group=ma_group)
color ma_5_colour = input.color(color.new(color.white, 0), '', inline='len5', group=ma_group)

// Request Security for MA calculations
ema1 = request.security(syminfo.tickerid, timeframe.period, ma_function(close, len1, ma_1_type))
ema2 = request.security(syminfo.tickerid, timeframe.period, ma_function(close, len2, ma_2_type))
ema3 = request.security(syminfo.tickerid, timeframe.period, ma_function(close, len3, ma_3_type))
ema4 = request.security(syminfo.tickerid, timeframe.period, ma_function(close, len4, ma_4_type))
ema5 = request.security(syminfo.tickerid, timeframe.period, ma_function(close, len5, ma_5_type))

// Plot the Moving Averages
plot(len1bool and switch_ema ? ema1 : na, color=ma_1_colour, linewidth=2, title='MA 1')
plot(len2bool and switch_ema ? ema2 : na, color=ma_2_colour, linewidth=2, title='MA 2')
plot(len3bool and switch_ema ? ema3 : na, color=ma_3_colour, linewidth=2, title='MA 3')
plot(len4bool and switch_ema ? ema4 : na, color=ma_4_colour, linewidth=2, title='MA 4')
plot(len5bool and switch_ema ? ema5 : na, color=ma_5_colour, linewidth=2, title='MA 5')

// Additional code for SuperTrend from switchboard
///////////////////////////////////////////////////
// SuperTrend - Switchboard
///////////////////////////////////////////////////
upPlot = plot(sttrend == 1 and switch_supertrend ? stup : na, title='Up Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.green, 0))
plotshape(stbuySignal and switch_supertrend ? stup : na, title='UpTrend Begins', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0))

dnPlot = plot(sttrend != 1 and switch_supertrend ? dn : na, title='Down Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.red, 0))
plotshape(stsellSignal and switch_supertrend ? dn : na, title='DownTrend Begins', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))

// Additional code for Schaff Trend Cycle (STC) from switchboard
/////////////////////////////////////////////
// Schaff Trend Cycle (STC) - Switchboard
/////////////////////////////////////////////
plotshape(stcdown and switch_stc ? true : na, style=shape.circle, location=location.top, show_last=v_show_last, color=color.new(color.red, 0), title='STC Sell')
plotshape(stcup and switch_stc ? true : na, style=shape.circle, location=location.top, show_last=v_show_last, color=color.new(color.green, 0), title='STC Buy')

// ----------------------------------------
// 6. Declare and Initialize 'leadingindicator'
leadingindicator = input.string(title="Leading Indicator", defval="Chandelier Exit",
  options=["Chandelier Exit"], group="████████ Main Indicator (signal) ████████")

// 6. Leading Indicator Logic
if leadingindicator == 'Chandelier Exit'
    leadinglongcond := ce_long
    leadingshortcond := ce_short

// ----------------------------------------
// 7. Confirmation Indicator Logic
longCond := leadinglongcond
shortCond := leadingshortcond

longCond := longCond  and   (respectce ? ce_long : justcontinue)
shortCond := shortCond and   (respectce ? ce_short : justcontinue)

longCond := longCond  and   (respectema ? isaboverespectema : justcontinue)
shortCond := shortCond and   (respectema ? isbelowrespectema : justcontinue)

longCond := longCond  and   (respectst ? isstup : justcontinue)
shortCond := shortCond and   (respectst ? isstdown : justcontinue)

longCond := longCond  and   (respectstc ? stcup : justcontinue)


// ----------------------------------------
// 7. Confirmation Indicator Logic

longCond := leadinglongcond
shortCond := leadingshortcond

longCond := longCond  and   (respectce ? ce_long : justcontinue)
shortCond := shortCond and   (respectce ? ce_short : justcontinue)

longCond := longCond  and   (respectema ? isaboverespectema : justcontinue)
shortCond := shortCond and   (respectema ? isbelowrespectema : justcontinue)

longCond := longCond  and   (respectst ? isstup : justcontinue)
shortCond := shortCond and   (respectst ? isstdown : justcontinue)

longCond := longCond  and   (respectstc ? stcup : justcontinue)
shortCond := shortCond and   (respectstc ? stcdown : justcontinue)

// ----------------------------------------
// 8. Function to Update Dashboard Label

pushConfirmation(respectce, "Chandelier Exit", ce_long, ce_short)
pushConfirmation(respectema, "EMA", isaboverespectema, isbelowrespectema)
pushConfirmation(respectst, "SuperTrend", isstup, isstdown)
pushConfirmation(respectstc, "Schaff Trend Cycle", stcup, stcdown)

// ----------------------------------------
// 9. Final Part (Dashboard Table and Signal Plotting)

leadingstatus = leadinglongcond ? "✔️" : "❌"
leadingstatus_short = leadingshortcond ? "✔️" : "❌"

rowcount = int(na)
if array.size(confirmation_counter) == 0
    rowcount := 5
else
    rowcount := array.size(confirmation_counter) + 4

// Signal Expiry Logic
var int leadinglong_count = 0
var int leadinglong_count2 = 0
var int leadingshort_count = 0
var int leadingshort_count2 = 0

if leadinglongcond
    leadinglong_count := leadinglong_count + 1
    leadinglong_count2 := leadinglong_count

for i = 1 to 100
    if leadinglongcond[i]
        leadinglong_count := leadinglong_count + 1
        leadinglong_count2 := leadinglong_count
    else
        leadinglong_count := 0
        break

if leadingshortcond
    leadingshort_count := leadingshort_count + 1
    leadingshort_count2 := leadingshort_count

for i = 1 to 100
    if leadingshortcond[i]
        leadingshort_count := leadingshort_count + 1
        leadingshort_count2 := leadingshort_count
    else
        leadingshort_count := 0
        break

// Expiry Condition
CondIni = 0

// If expiry option is used
longcond_withexpiry = longCond and leadinglong_count2 <= signalexpiry
shortcond_withexpiry = shortCond and leadingshort_count2 <= signalexpiry

// Without expiry
longCondition := longcond_withexpiry and CondIni[1] == -1
shortCondition := shortcond_withexpiry and CondIni[1] == 1

if alternatesignal
    longCondition := longcond_withexpiry and CondIni[1] == -1  
    shortCondition := shortcond_withexpiry and CondIni[1] == 1 
else
    longCondition := longcond_withexpiry  
    shortCondition := shortcond_withexpiry 

CondIni := longcond_withexpiry ? 1 : shortcond_withexpiry ? -1 : CondIni[1]

// Check if expiry count is crossed
is_expiry_count_crossed_long = leadinglong_count2 >= signalexpiry 
is_expiry_count_crossed_short = leadingshort_count2 >= signalexpiry 

// Plot signals on chart
plotshape(showsignal ? (longCondition[1] ? false : longCondition) : na, title='Buy Signal', text='long', textcolor=color.new(color.white, 0), style=shape.labelup, size=size.tiny, location=location.belowbar, color=color.new(color.green, 0))
plotshape(showsignal ? (shortCondition[1] ? false : shortCondition) : na, title='Sell Signal', text='short', textcolor=color.new(color.white, 0), style=shape.labeldown, size=size.tiny, location=location.abovebar, color=color.new(color.red, 0))

// Alerts
alertcondition(longCondition, title='Buy Alert', message='BUY')
alertcondition(shortCondition, title='Sell Alert', message='SELL')
alertcondition(longCondition or shortCondition, title='Buy or Sell Alert', message="Buy or Sell Alert")

/// ----------------------------------------
// 10. Strategy Execution - Entries & Exits

// Use already declared TP & SL values (from the start of the script)

// Long Entry Conditions
if longCondition
    strategy.entry("Long", strategy.long)
    strategy.exit("TakeProfit_Long", from_entry="Long", limit=close + tp_value, stop=close - sl_value)

// Short Entry Conditions
if shortCondition
    strategy.entry("Short", strategy.short)
    strategy.exit("TakeProfit_Short", from_entry="Short", limit=close - tp_value, stop=close + sl_value)