বহুমাত্রিক অভিযোজিত চলমান গড় ম্যাট্রিক্স এবং ATR গতিশীল নির্ভুলতা ট্রেডিং কৌশল

MA ATR HMA TEMA DEMA VWMA ZLEMA ALMA KAMA EMA SMA WMA
সৃষ্টির তারিখ: 2025-04-16 15:50:36 অবশেষে সংশোধন করুন: 2025-04-16 15:50:36
অনুলিপি: 0 ক্লিকের সংখ্যা: 412
2
ফোকাস
319
অনুসারী

বহুমাত্রিক অভিযোজিত চলমান গড় ম্যাট্রিক্স এবং ATR গতিশীল নির্ভুলতা ট্রেডিং কৌশল বহুমাত্রিক অভিযোজিত চলমান গড় ম্যাট্রিক্স এবং ATR গতিশীল নির্ভুলতা ট্রেডিং কৌশল

ওভারভিউ

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

কৌশল নীতি

এই কৌশলটির মূল নীতিটি কয়েকটি মূল উপাদানগুলির সমন্বয়মূলক কাজের উপর ভিত্তি করে তৈরি হয়েছেঃ

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

  2. ATR-ভিত্তিক ঝুঁকি ব্যবস্থাপনা: এটিআর সূচকগুলিকে ব্যবহার করে বাজারের অস্থিরতা পরিমাপ করার কৌশল এবং এটি বিভিন্ন ক্ষেত্রে প্রয়োগ করাঃ

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

  4. লেনদেনের পরিমাণ এবং সময় উইন্ডো যাচাইকরণ

  5. সিগন্যাল জেনারেশন লজিক

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

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

কোডটি বিশ্লেষণ করলে নিম্নলিখিত উল্লেখযোগ্য সুবিধাগুলি দেখা যায়ঃ

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

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

  3. একাধিক স্তর সংকেত ফিল্টার

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

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

কৌশলগত ঝুঁকি

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

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

  2. দ্রুত বিপর্যয়ের ঝুঁকি: এটিআর ডায়নামিক স্টপ ব্যবহার করা সত্ত্বেও, যখন বাজার হঠাৎ উল্টে যায় (যেমন একটি বড় সংবাদ প্রকাশের পরে), দামগুলি স্টপটি ট্রিগার হওয়ার আগে আকাশ ছোঁয়াতে পারে, যা প্রত্যাশিত ক্ষতির চেয়ে বেশি ক্ষতি করে। অতিরিক্ত রাতের ঝুঁকি নিয়ন্ত্রণ বা উচ্চতর অস্থিরতার ঘটনাগুলির আগে ট্রেডিং স্থগিত করার পরামর্শ দেওয়া হয়েছে।

  3. সংকেত বিলম্ব: সমস্ত মুভিং এভারেজ প্রাকৃতিকভাবে পিছিয়ে থাকে। এমনকি এইচএমএ বা জেডএলইএমএর মতো নিম্ন-বিলম্বিত রূপগুলিও দ্রুত বাজারে আদর্শ প্রবেশের পয়েন্টটি মিস করতে পারে। বিদ্যমান সংকেত সিস্টেমের পরিপূরক হিসাবে গতিশীলতা বা মূল্য ক্রিয়াকলাপের সূচকগুলিকে একত্রিত করার বিষয়টি বিবেচনা করা যেতে পারে।

  4. ভলিউম নির্ভরতাকৌশলঃ ট্র্যাফিকের উত্থানের সময় কৌশলটি সংকেত দেয়, তবে নির্দিষ্ট বাজার বা সময়কালে ট্র্যাফিক বিভ্রান্তিকর হতে পারে। ট্র্যাফিক ফিল্টারটি প্রয়োজন হলে সামঞ্জস্য করা উচিত বা নির্দিষ্ট বাজার অবস্থার অধীনে এই বৈশিষ্ট্যটি নিষ্ক্রিয় করার বিষয়ে বিবেচনা করা উচিত।

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

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

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

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

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

  3. উন্নতির প্রবণতা সনাক্তকরণপ্রচলিত ১৫ মিনিটের ট্রেন্ড ফিল্টার ছাড়াও, আরো জটিল ট্রেন্ড সনাক্তকরণ অ্যালগরিদম যেমন হর্স্ট ইনডেক্স বা ডাইরেকশনাল মুভমেন্ট ইনডেক্স (ডিএমআই) অন্তর্ভুক্ত করা যেতে পারে যাতে ট্রেন্ডের শক্তি এবং ধারাবাহিকতা আরও সঠিকভাবে নির্ধারণ করা যায়।

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

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

  6. সংশ্লিষ্ট বাজার ফিল্টার: সংশ্লিষ্ট বাজার পর্যবেক্ষণের মাধ্যমে সংকেতের গুণমান বাড়ানো (যেমন স্টক সূচক ট্রেডিংয়ের সময় ভিআইএক্সের দিকে নজর দেওয়া) বা ক্রস-অ্যাসেট সম্পর্কিততা। যখন সংশ্লিষ্ট বাজারগুলি একক দিকনির্দেশমূলক চলাচল দেখায়, তখন ব্যবসায়ের বিশ্বাসযোগ্যতা বাড়ানো যায়।

সারসংক্ষেপ

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

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

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

কৌশল সোর্স কোড
/*backtest
start: 2024-04-16 00:00:00
end: 2025-04-15 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Dskyz (DAFE) MAtrix with ATR-Powered Precision", 
     overlay=true, 
     default_qty_type=strategy.fixed, 
     initial_capital=1000000, 
     commission_value=0, 
     slippage=1, 
     pyramiding=10)

// ==================================================================
// USER-DEFINED FUNCTIONS
// ==================================================================

// Hull Moving Average (HMA)
hma(src, len) =>
    halfLen = math.round(len * 0.5)
    sqrtLen = math.round(math.sqrt(len))
    wmaf = ta.wma(src, halfLen)
    wmaFull = ta.wma(src, len)
    ta.wma(2 * wmaf - wmaFull, sqrtLen)

// Triple Exponential Moving Average (TEMA)
tema(src, len) =>
    ema1 = ta.ema(src, len)
    ema2 = ta.ema(ema1, len)
    ema3 = ta.ema(ema2, len)
    3 * (ema1 - ema2) + ema3

// Double Exponential Moving Average (DEMA)
dema(src, len) =>
    ema1 = ta.ema(src, len)
    ema2 = ta.ema(ema1, len)
    2 * ema1 - ema2

// VWMA - Volume Weighted Moving Average
vwma(src, len) =>
    ta.vwma(src, len)

// ZLEMA - Zero Lag EMA
zlema(src, len) =>
    lag = math.floor((len - 1) / 2)
    ta.ema(2 * src - src[lag], len)

// ALMA - Arnaud Legoux Moving Average
alma(src, len, offset=0.85, sigma=6) =>
    ta.alma(src, len, offset, sigma)

// Custom Kaufman Adaptive Moving Average (KAMA)
kama(src, len) =>
    fastSC = 2.0 / (2 + 1)
    slowSC = 2.0 / (30 + 1)
    change = math.abs(src - src[len])
    volatility = 0.0
    for i = 0 to len - 1
        volatility += math.abs(src - src[i])
    er = volatility != 0 ? change / volatility : 0.0
    sc = math.pow(er * (fastSC - slowSC) + slowSC, 2)
    var float kama_val = na
    kama_val := na(kama_val) ? ta.sma(src, len) : kama_val + sc * (src - kama_val)
    kama_val

// ==================================================================
// INPUTS
// ==================================================================

fastLength   = input.int(9, "[MA] Fast MA Length", minval=1)
slowLength   = input.int(19, "[MA] Slow MA Length", minval=1)
fastMAType   = input.string("SMA", "Fast MA Type", options=["SMA", "EMA", "SMMA", "HMA", "TEMA", "WMA", "VWMA", "ZLEMA", "ALMA", "KAMA", "DEMA"])
slowMAType   = input.string("SMA", "Slow MA Type", options=["SMA", "EMA", "SMMA", "HMA", "TEMA", "WMA", "VWMA", "ZLEMA", "ALMA", "KAMA", "DEMA"])

atrPeriod           = input.int(14, "ATR Period", minval=1)
atrMultiplier       = input.float(1.5, "ATR Multiplier for Filter", minval=0.1, step=0.1)
useTrendFilter      = input.bool(true, "[Filter Settings] Use 15m Trend Filter")
minVolume           = input.int(10, "Minimum Volume", minval=1)
volatilityThreshold = input.float(1.0, "Volatility Threshold (%)", minval=0.1, step=0.1) / 100
tradingStartHour    = input.int(9, "Trading Start Hour (24h)", minval=0, maxval=23)
tradingEndHour      = input.int(16, "Trading End Hour (24h)", minval=0, maxval=23)
trailOffset         = input.float(0.5, "[Exit Settings] Trailing Stop Offset ATR Multiplier", minval=0.01, step=0.01)
profitTargetATRMult = input.float(1.2, "Profit Target ATR Multiplier", minval=0.1, step=0.1)
fixedStopMultiplier = input.float(1.3, "Fixed Stop Multiplier", minval=0.5, step=0.1)
fixedQuantity       = input.int(2, "Trade Quantity", minval=1)

resetDashboard      = input.bool(false, "Reset Dashboard Stats")

// ==================================================================
// CALCULATIONS
// ==================================================================

volumeOk    = volume >= minVolume
currentHour = hour(time)
timeWindow  = currentHour >= tradingStartHour and currentHour <= tradingEndHour
volumeSpike = volume > 1.2 * ta.sma(volume, 10)

// ATR Calculation
atr          = ta.atr(atrPeriod)
volatility   = nz(atr / close, 0)
volatilityOk = volatility <= volatilityThreshold

// ==================================================================
// MOVING AVERAGES CALCULATIONS
// ==================================================================

var float fastMA = na
var float slowMA = na

// Fast MA Logic
if fastMAType == "SMA"
    fastMA := ta.sma(close, fastLength)
else if fastMAType == "EMA"
    fastMA := ta.ema(close, fastLength)
else if fastMAType == "SMMA"
    fastMA := ta.rma(close, fastLength)
else if fastMAType == "HMA"
    fastMA := hma(close, fastLength)
else if fastMAType == "TEMA"
    fastMA := tema(close, fastLength)
else if fastMAType == "WMA"
    fastMA := ta.wma(close, fastLength)
else if fastMAType == "VWMA"
    fastMA := vwma(close, fastLength)
else if fastMAType == "ZLEMA"
    fastMA := zlema(close, fastLength)
else if fastMAType == "ALMA"
    fastMA := alma(close, fastLength)
else if fastMAType == "KAMA"
    fastMA := kama(close, fastLength)
else if fastMAType == "DEMA"
    fastMA := dema(close, fastLength)

// Slow MA Logic
if slowMAType == "SMA"
    slowMA := ta.sma(close, slowLength)
else if slowMAType == "EMA"
    slowMA := ta.ema(close, slowLength)
else if slowMAType == "SMMA"
    slowMA := ta.rma(close, slowLength)
else if slowMAType == "HMA"
    slowMA := hma(close, slowLength)
else if slowMAType == "TEMA"
    slowMA := tema(close, slowLength)
else if slowMAType == "WMA"
    slowMA := ta.wma(close, slowLength)
else if slowMAType == "VWMA"
    slowMA := vwma(close, slowLength)
else if slowMAType == "ZLEMA"
    slowMA := zlema(close, slowLength)
else if slowMAType == "ALMA"
    slowMA := alma(close, slowLength)
else if slowMAType == "KAMA"
    slowMA := kama(close, slowLength)
else if slowMAType == "DEMA"
    slowMA := dema(close, slowLength)

// ==================================================================
// TREND FILTER & SIGNAL LOGIC
// ==================================================================

// Retrieve 15-minute MAs for trend filtering
[fastMA15m, slowMA15m] = request.security(syminfo.tickerid, "15", [ta.sma(close, fastLength), ta.sma(close, slowLength)])
trend15m    = fastMA15m > slowMA15m ? 1 : fastMA15m < slowMA15m ? -1 : 0
trendLongOk = not useTrendFilter or trend15m >= 0
trendShortOk= not useTrendFilter or trend15m <= 0

// ATR-based Price Filter
atrFilterLong  = close > slowMA + atr * atrMultiplier
atrFilterShort = close < slowMA - atr * atrMultiplier

// Signal Logic: MA alignment + filters
maAbove       = close > fastMA and fastMA > slowMA
maBelow       = close < fastMA and fastMA < slowMA
longCondition = maAbove and trendLongOk and atrFilterLong and volumeOk and volumeSpike and timeWindow and volatilityOk
shortCondition= maBelow and trendShortOk and atrFilterShort and volumeOk and volumeSpike and timeWindow and volatilityOk

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

if strategy.position_size == 0 and longCondition
    strategy.entry("Long", strategy.long, qty=fixedQuantity)
if strategy.position_size == 0 and shortCondition
    strategy.entry("Short", strategy.short, qty=fixedQuantity)

// ==================================================================
// EXIT LOGIC
// ==================================================================
if strategy.position_size > 0
    strategy.exit("Long Exit", "Long",
         stop  = strategy.position_avg_price - atr * fixedStopMultiplier,
         limit = strategy.position_avg_price + atr * profitTargetATRMult,
         trail_offset = atr * trailOffset,
         trail_points = atr * trailOffset)
if strategy.position_size < 0
    strategy.exit("Short Exit", "Short",
         stop  = strategy.position_avg_price + atr * fixedStopMultiplier,
         limit = strategy.position_avg_price - atr * profitTargetATRMult,
         trail_offset = atr * trailOffset,
         trail_points = atr * trailOffset)

// ==================================================================
// VISUALS: PLOT MAs
// ==================================================================

plot(fastMA, color=color.blue, linewidth=2, title="Fast MA")
plot(slowMA, color=color.red, linewidth=2, title="Slow MA")

// ==================================================================
// METRICS CALCULATIONS (for Dashboard)
// ==================================================================

// Additional metrics:
atrPct   = close != 0 ? (atr / close) * 100 : na               // ATR as percentage of Close
maGapPct = (slowMA != 0) ? (math.abs(fastMA - slowMA) / slowMA) * 100 : na  // % difference between MAs

// Open PnL Calculation
currentPnL = strategy.position_size != 0 ? (close - strategy.position_avg_price) * strategy.position_size : 0

// Persistent variable for highest equity (for drawdown calculation)
var float highestEquity = strategy.equity
highestEquity := math.max(highestEquity, strategy.equity)
totalDrawdown = strategy.equity - highestEquity

// Reset dashboard metrics if reset toggle is on.
if resetDashboard
    highestEquity := strategy.equity

// ==================================================================
// DASHBOARD: WATERMARK LOGO (Bottom-Right)
// ==================================================================
var table watermarkTable = table.new(position.bottom_right, 1, 1, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.rgb(0, 50, 137), border_width=1)
if barstate.islast
    table.cell(watermarkTable, 0, 0, "⚡ Dskyz - DAFE Trading Systems", text_color=color.rgb(159, 127, 255, 80), text_size=size.large)

// ==================================================================
// DASHBOARD: METRICS TABLE (Bottom-Left)
// ==================================================================
var table dashboard = table.new(position.middle_right, 2, 12, bgcolor=color.new(#000000, 29), border_color=color.rgb(80, 80, 80), border_width=1)
if barstate.islast
    // Row 0 – Dashboard Title (duplicated in both columns to simulate spanning)
    table.cell(dashboard, 0, 0, "⚡(DAFE) Trading Systems", text_color=color.rgb(135, 135, 135), text_size=size.small)
    
    // Row 1 – Position
    table.cell(dashboard, 0, 1, "Position", text_color=color.gray)
    positionText = strategy.position_size > 0 ? "Long" : strategy.position_size < 0 ? "Short" : "Flat"
    table.cell(dashboard, 1, 1, positionText, text_color=strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : color.blue)
    
    // Row 2 – Current PnL
    table.cell(dashboard, 0, 2, "Current P/L", text_color=color.gray)
    table.cell(dashboard, 1, 2, str.tostring(currentPnL, "#.##"), text_color=(currentPnL > 0 ? color.green : currentPnL < 0 ? color.red : color.gray))
    
    // Row 3 – Equity
    table.cell(dashboard, 0, 3, "Equity", text_color=color.gray)
    table.cell(dashboard, 1, 3, str.tostring(strategy.equity, "#.##"), text_color=color.white)

    // Row 4 – Closed Trades
    table.cell(dashboard, 0, 4, "Closed Trades", text_color=color.gray)
    table.cell(dashboard, 1, 4, str.tostring(strategy.closedtrades), text_color=color.white)

    // Row 5 – Title Step
    table.cell(dashboard, 0, 5, "Metrics", text_color=color.rgb(76, 122, 23))
   
    // Row 6 – Fast MA
    table.cell(dashboard, 0, 6, "Fast MA", text_color=color.gray)
    table.cell(dashboard, 1, 6, str.tostring(fastMA, "#.##"), text_color=color.white)
    
    // Row 7 – Slow MA
    table.cell(dashboard, 0, 7, "Slow MA", text_color=color.gray)
    table.cell(dashboard, 1, 7, str.tostring(slowMA, "#.##"), text_color=color.white)
    
    // Row 8 – ATR (Raw)
    table.cell(dashboard, 0, 8, "ATR", text_color=color.gray)
    table.cell(dashboard, 1, 8, str.tostring(atr, "#.##"), text_color=color.white)
    
    // Row 9 – ATR (%)
    table.cell(dashboard, 0, 9, "ATR (%)", text_color=color.gray)
    table.cell(dashboard, 1, 9, str.tostring(atrPct, "#.##") + "%", text_color=color.white)
    
    // Row 10 – MA Gap (%)
    table.cell(dashboard, 0, 10, "MA Gap (%)", text_color=color.gray)
    table.cell(dashboard, 1, 10, na(maGapPct) ? "N/A" : str.tostring(maGapPct, "#.##") + "%", text_color=color.white)
    
    // Row 11 – Volatility (%)
    table.cell(dashboard, 0, 11, "Volatility (%)", text_color=color.gray)
    table.cell(dashboard, 1, 11, str.tostring(volatility * 100, "#.##") + "%", text_color=color.white)