অভিযোজিত উদ্বায়ীতা মাল্টি-ইন্ডিকেটর ট্রেন্ড অনুসরণকারী ট্রেডিং সিস্টেম

ATR SMA RSI DCA 烛台模式 趋势跟踪 波动率适应 多时间周期 止损 止盈
সৃষ্টির তারিখ: 2025-04-11 13:41:56 অবশেষে সংশোধন করুন: 2025-04-11 13:41:56
অনুলিপি: 3 ক্লিকের সংখ্যা: 378
2
ফোকাস
319
অনুসারী

অভিযোজিত উদ্বায়ীতা মাল্টি-ইন্ডিকেটর ট্রেন্ড অনুসরণকারী ট্রেডিং সিস্টেম অভিযোজিত উদ্বায়ীতা মাল্টি-ইন্ডিকেটর ট্রেন্ড অনুসরণকারী ট্রেডিং সিস্টেম

ওভারভিউ

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

কৌশল নীতি

এই কৌশলটি নিম্নলিখিত মূল মডিউলগুলির উপর ভিত্তি করে তৈরি করা হয়েছেঃ

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

  2. RSI গতিশীলতা ফিল্টার: RSI (আপেক্ষিকভাবে দুর্বল সূচক) দ্বারা প্রবেশের সংকেত যাচাই করুন, নিশ্চিত করুন যে ট্রেডিংয়ের দিকটি বাজারের গতিশীলতার সাথে সামঞ্জস্যপূর্ণ। এই বৈশিষ্ট্যটি বিকল্পভাবে চালু বা বন্ধ করা যায় এবং কাস্টম RSI প্যারামিটারগুলিকে সমর্থন করে (যেমন দৈর্ঘ্য 14, ওভারবয় 60, ওভারসেল 40) ।

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

  4. মাল্টিটাইম সাইকেল ট্রেন্ড নিশ্চিত: ট্রেডিং সিগন্যালকে 15 মিনিটের সময়কালের এসএমএ প্রবণতার সাথে ঐচ্ছিকভাবে সারিবদ্ধ করা, ট্রেডিংয়ের মান উন্নত করার জন্য একটি স্তর নিশ্চিতকরণ ব্যবস্থা যুক্ত করা।

  5. ধাপে ধাপে ডিসিএ ব্যবস্থা: প্রবণতার দিকনির্দেশে অনেকগুলি প্রবেশের অনুমতি দেওয়া হয়, সর্বাধিক একটি পূর্বনির্ধারিত সংখ্যক প্রবেশকে সমর্থন করে (যেমন 4 বার), প্রবেশের ব্যবধানটি এটিআর গুণকের উপর ভিত্তি করে সেট করা হয়। এই প্রক্রিয়াটি প্রবণতা বজায় রাখার জন্য গড় ব্যয়কে অনুকূলিত করতে সহায়তা করে।

  6. উচ্চ পর্যায়ের ঝুঁকি ব্যবস্থাপনা

    • প্রারম্ভিক ক্ষতিঃ এটিআর সেটিংয়ের উপর ভিত্তি করে (সাধারণত ২-৩.৫ গুণ), প্রবেশের স্তম্ভের উপর আরও বিস্তৃত স্থির ক্ষতির গুণক প্রয়োগ করুন (যেমন ১.৩) ।
    • ট্র্যাকিং স্টপ লসঃ এটিআর ভিত্তিক বিপর্যয় এবং গুণক ব্যবহার করে, মুনাফা বাড়ার সাথে সাথে গতিশীলভাবে সামঞ্জস্য করে (যেমন, যখন মুনাফা এটিআর ছাড়িয়ে যায়, গুণকটি 0.5 থেকে 0.3 এ নেমে আসে) ।
    • স্টপ টার্গেটঃ প্রবেশ মূল্যের ±ATR-এর নির্দিষ্ট গুণিতক (যেমন 1.2) এ সেট করুন।
    • কুলিং পিরিয়ডঃ ০-৫ মিনিট, যা অতিরিক্ত লেনদেন রোধ করতে পারে।
    • ন্যূনতম পজিশনের সময়ঃ ট্রেডিংয়ের জন্য নির্দিষ্ট সংখ্যক কলাম (যেমন ২-১০) নিশ্চিত করুন।
  7. লেনদেন কার্যকর করার লজিক: সিস্টেমটি চলমান গড় বা ক্র্যাশ মোডের সংকেতকে অগ্রাধিকার দেয় ((ব্যবহারকারীর পছন্দ অনুসারে) এবং ট্র্যাফিক, অস্থিরতা এবং সময় ফিল্টারগুলি প্রয়োগ করে। প্রবেশের গুণমান নিশ্চিত করার জন্য, ট্র্যাফিক পিকের শর্তও বাড়ানো হয়েছে ((ট্র্যাফিক> ১.২*দশম এসএমএ)

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

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

  2. সংকেত মানের ফিল্টারিংমাল্টি-লেয়ার ফিল্টারিং পদ্ধতি (আরএসআই, মাল্টি-টাইম সাইকেল ট্রেন্ড, ট্র্যাডিং ভলিউম এবং অস্থিরতা) কার্যকরভাবে মিথ্যা সংকেত হ্রাস করে এবং লেনদেনের গুণমান উন্নত করে।

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

  4. গতিশীল ঝুঁকি ব্যবস্থাপনা: স্টপ লস পয়েন্ট এবং ট্র্যাকিং স্টপ লস বাজারের ওঠানামা এবং ট্রেডিং মুনাফার গতিশীলতার সাথে সামঞ্জস্য করে, মূলধন রক্ষা করার সময় প্রবণতাটি পর্যাপ্ত স্থান দেয়।

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

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

  7. নিখুঁত প্রবেশ নিয়ন্ত্রণট্রেডিং পিক ফিল্টারগুলি কেবলমাত্র উল্লেখযোগ্য বাজার ক্রিয়াকলাপের সময় প্রবেশের বিষয়টি নিশ্চিত করে এবং শীতল সময় ব্যবস্থা অতিরিক্ত লেনদেনকে বাধা দেয়।

কৌশলগত ঝুঁকি

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

*সমাধান*প্যারামিটার অপ্টিমাইজেশান টেস্টিং এর বিস্তৃত পরিসর, কিন্তু অতিরিক্ত অপ্টিমাইজেশান এড়ানো; কৌশল স্থিতিশীলতা যাচাই করার জন্য ওয়াক-ফরওয়ার্ড টেস্টিং এবং অ্যাসাম্পল টেস্টিং ব্যবহার করা।

  1. বাজার পরিবর্তনের ঝুঁকি: যখন বাজার প্যাটার্ন দ্রুত পরিবর্তিত হয় (যেমন ট্রেন্ড থেকে অস্থিরতার দিকে), কৌশলটি নতুন পরিস্থিতির সাথে খাপ খাইয়ে নেওয়ার আগে ক্রমাগত ক্ষতির কারণ হতে পারে।

সমাধান: মার্কেট স্ট্যাটাস আইডেন্টিফিকেশন মেকানিজম যুক্ত করার বিষয়টি বিবেচনা করুন, বিভিন্ন মার্কেট সেটিংসে বিভিন্ন প্যারামিটার সেট ব্যবহার করুন; দৈনিক সর্বোচ্চ ক্ষতি বা ধারাবাহিক ক্ষতির পরে ট্রেডিং স্থগিত করার মতো সামগ্রিক ঝুঁকি সীমাবদ্ধতা প্রয়োগ করুন।

  1. স্লাইড পয়েন্ট এবং তরলতা সমস্যা: উচ্চ ফ্রিকোয়েন্সির লেনদেন এবং বাজারের উচ্চ অস্থিরতা স্লাইড পয়েন্ট বৃদ্ধি এবং তরলতা হ্রাসের ঝুঁকির সম্মুখীন হতে পারে।

সমাধান: প্রকৃত স্লাইড পয়েন্ট এবং কমিশন অনুমানগুলি পুনরায় মূল্যায়নে অন্তর্ভুক্ত করুন; কম তরলতার সময় ট্রেডিং এড়িয়ে চলুন; বাজার মূল্যের পরিবর্তে সীমিত মূল্যের তালিকা ব্যবহার করার কথা বিবেচনা করুন।

  1. সিস্টেমের জটিলতাএর ফলে কৌশলটি আরও জটিল হয়ে যায় এবং এটি বোঝা এবং বজায় রাখা কঠিন হয়ে পড়ে।

*সমাধান*নীতিমালা দ্বারা প্রদত্ত ডিবাগিং সরঞ্জাম ব্যবহার করে প্রতিটি কম্পোনেন্টের পারফরম্যান্সকে ঘনিষ্ঠভাবে পর্যবেক্ষণ করুন; ভাল কোড টীকা বজায় রাখুন; প্রতিটি কম্পোনেন্টের স্বতন্ত্র কার্যকারিতা বিবেচনা করে মডিউল টেস্টিং।

  1. অতিরিক্ত লেনদেনের ঝুঁকিডিসিএ ব্যবস্থা এবং ঘন ঘন সংকেত প্রজন্মের ফলে অতিরিক্ত লেনদেন হতে পারে এবং লেনদেনের খরচ বাড়তে পারে।

সমাধান: সঠিকভাবে শীতল সময় এবং ন্যূনতম হোল্ডিং সময় সেট করুন; ট্রেডিং খরচ কঠোরভাবে পুনর্বিবেচনার মধ্যে বিবেচনা করুন; নিয়মিত পর্যালোচনা এবং প্রবেশের মানদণ্ডের অপ্টিমাইজ করুন।

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

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

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

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

  4. সমন্বিত বিকল্প সূচক: অন্যান্য প্রযুক্তিগত সূচক যেমন বোলিংগার ব্যান্ড, MACD বা Ichimoku ক্লাউড গ্রাফের কার্যকারিতা পরীক্ষা করা, যা বিদ্যমান সিস্টেমের পরিপূরক বা বিকল্প হিসাবে। বিভিন্ন সূচক নির্দিষ্ট বাজারের অবস্থার অধীনে আরও সঠিক সংকেত সরবরাহ করতে পারে।

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

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

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

সারসংক্ষেপ

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

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

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

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

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

//@version=6
strategy('Dskyz Adaptive Futures Elite (DAFE) - Updated', 
         overlay=true, 
         default_qty_type=strategy.fixed, 
         initial_capital=1000000, 
         commission_value=0, 
         slippage=1, 
         pyramiding=10)

// === INPUTS ===

// Moving Average Settings
fastLength       = input.int(9, '[MA] Fast MA Length', minval=1)
slowLength       = input.int(19, '[MA] Slow MA Length', minval=1)

// RSI Settings
useRSI           = input.bool(false, '[RSI Settings] Use RSI Filter')
rsiLength        = input.int(14, 'RSI Length', minval=1)
rsiOverbought    = input.int(60, 'RSI Overbought', minval=50, maxval=100)
rsiOversold      = input.int(40, 'RSI Oversold', minval=0, maxval=50)
rsiLookback      = input.int(1, 'RSI Lookback', minval=1)

// Pattern Settings
usePatterns      = input.bool(true, '[Pattern Settings] Use Candlestick Patterns')
patternLookback  = input.int(19, 'Pattern Lookback Bars', minval=1)

// Filter Settings
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)

// DCA Settings
useDCA           = input.bool(false, '[DCA Settings] Use DCA')
maxTotalEntries  = input.int(4, 'Max Total Entries per Direction', minval=1)
dcaMultiplier    = input.float(1.0, 'DCA ATR Multiplier', minval=0.1, step=0.1)

// Signal Settings
signalPriority   = input.string('MA', '[Signal Settings] Signal Priority', options=['Pattern', 'MA'])
minBarsBetweenSignals = input.int(5, 'Min Bars Between Signals', minval=1)
plotMode         = input.string('Potential Signals', 'Plot Mode', options=['Potential Signals', 'Actual Entries'])

// Exit Settings
trailOffset      = input.float(0.5, '[Exit Settings] Trailing Stop Offset ATR Multiplier', minval=0.01, step=0.01)
trailPointsMult  = input.float(0.5, 'Trailing Stop Points ATR Multiplier', minval=0.01, step=0.01)
profitTargetATRMult = input.float(1.2, 'Profit Target ATR Multiplier', minval=0.1, step=0.1)  // Profit target factor
fixedStopMultiplier  = input.float(1.3, 'Fixed Stop Multiplier', minval=0.5, step=0.1)    // Fixed stop multiplier

// General Settings
debugLogging     = input.bool(true, '[General Settings] Enable Debug Logging')
fixedQuantity    = input.int(2, 'Trade Quantity', minval=1)
cooldownMinutes  = input.int(0, 'Cooldown Minutes', minval=0)

// ATR Settings – Use Dynamic ATR or fixed value
useDynamicATR    = input.bool(true, title="Use Dynamic ATR")
userATRPeriod    = input.int(7, title="ATR Period (if not using dynamic)", minval=1)
defaultATR       = timeframe.isminutes and timeframe.multiplier <= 2 ? 5 :
                   timeframe.isminutes and timeframe.multiplier <= 5 ? 7 : 10
atrPeriod        = useDynamicATR ? defaultATR : userATRPeriod

// === TRADE TRACKING VARIABLES ===
var int lastSignalBar   = 0
var int lastSignalType  = 0         // 1 for long, -1 for short
var int entryBarIndex   = 0
var bool inLongTrade    = false
var bool inShortTrade   = false

// DCA Tracking Variables
var int longEntryCount  = 0
var int shortEntryCount = 0
var float longInitialEntryPrice = na
var float shortInitialEntryPrice = na
var float longEntryATR  = na
var float shortEntryATR = na
var float long_stop_price = na
var float short_stop_price = na

// Signal Plotting Variables
var int lastLongPlotBar = 0
var int lastShortPlotBar = 0

// === CALCULATIONS ===

// Volume and Time Filters
volumeOk    = volume >= minVolume
currentHour = hour(time)
timeWindow  = currentHour >= tradingStartHour and currentHour <= tradingEndHour

// Additional Entry Filter: Volume Spike Condition
volumeSpike = volume > 1.2 * ta.sma(volume, 10)

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

// Adaptive MA Lengths
fastLengthAdaptive = math.round(fastLength / (1 + volatility))
slowLengthAdaptive = math.round(slowLength / (1 + volatility))
fastLengthSafe     = math.max(1, not na(atr) ? fastLengthAdaptive : fastLength)
slowLengthSafe     = math.max(1, not na(atr) ? slowLengthAdaptive : slowLength)
fastMA             = ta.sma(close, fastLengthSafe)
slowMA             = ta.sma(close, slowLengthSafe)

// RSI Calculation
rsi               = ta.rsi(close, rsiLength)
rsiCrossover      = ta.crossover(rsi, rsiOversold)
rsiCrossunder     = ta.crossunder(rsi, rsiOverbought)
rsiLongOk         = not useRSI or (rsiCrossover and rsi[rsiLookback] < 70)
rsiShortOk        = not useRSI or (rsiCrossunder and rsi[rsiLookback] > 30)

// 15m Trend Filter
[fastMA15m, slowMA15m] = request.security(syminfo.tickerid, '15', [ta.sma(close, fastLength), ta.sma(close, slowLength)])
trend15m = fastMA15m > slowMA15m ? 1 : fastMA15m < slowMA15m ? -1 : 0

// Candlestick Patterns
isBullishEngulfing() =>
    close[1] < open[1] and close > open and open < close[1] and close > open[1] and (close - open) > (open[1] - close[1]) * 0.8

isBearishEngulfing() =>
    close[1] > open[1] and close < open and open > close[1] and close < open[1] and (open - close) > (close[1] - open[1]) * 0.8

// Pattern Strength Calculation
patternStrength(isBull) =>
    bull = isBull ? 1 : 0
    bear = isBull ? 0 : 1
    volumeStrength = volume > ta.sma(volume, 10) ? 1 : 0
    rangeStrength  = (high - low) > ta.sma(high - low, 10) ? 1 : 0
    strength = bull * (volumeStrength + rangeStrength) - bear * (volumeStrength + rangeStrength)
    strength

bullStrength = patternStrength(true)
bearStrength = patternStrength(false)

// Detect Patterns
bullishEngulfingOccurred = ta.barssince(isBullishEngulfing()) <= patternLookback and bullStrength >= 1
bearishEngulfingOccurred = ta.barssince(isBearishEngulfing()) <= patternLookback and bearStrength <= -1
patternConflict          = bullishEngulfingOccurred and bearishEngulfingOccurred

// MA Conditions with Trend & RSI Filters
maAbove      = close > fastMA and fastMA > slowMA and close > close[1]
maBelow      = close < fastMA and fastMA < slowMA and close < close[1]
trendLongOk  = not useTrendFilter or trend15m >= 0
trendShortOk = not useTrendFilter or trend15m <= 0

// Signal Priority Logic
bullPattern  = usePatterns and bullishEngulfingOccurred
bearPattern  = usePatterns and bearishEngulfingOccurred
bullMA       = maAbove and trendLongOk and rsiLongOk
bearMA       = maBelow and trendShortOk and rsiShortOk

longCondition  = false
shortCondition = false

if signalPriority == 'Pattern'
    longCondition  := bullPattern or (not bearPattern and bullMA)
    shortCondition := bearPattern or (not bullPattern and bearMA)
else
    longCondition  := bullMA or (not bearMA and bullPattern)
    shortCondition := bearMA or (not bullMA and bearPattern)

// Apply Filters and require volume spike for quality entries
longCondition  := longCondition and volumeOk and volumeSpike and timeWindow and volatilityOk and not patternConflict
shortCondition := shortCondition and volumeOk and volumeSpike and timeWindow and volatilityOk and not patternConflict

// Update Trade Status
if strategy.position_size > 0
    inLongTrade := true
    inShortTrade := false
else if strategy.position_size < 0
    inShortTrade := true
    inLongTrade := false
else
    inLongTrade := false
    inShortTrade := false

// Entry Checks
canTrade      = strategy.position_size == 0
validQuantity = fixedQuantity > 0
quantity      = fixedQuantity

// Prevent Multiple Alerts Per Bar
var bool alertSent = false
if barstate.isnew
    alertSent := false

// Cooldown Logic
var float lastExitTime = na
if strategy.position_size == 0 and strategy.position_size[1] != 0
    lastExitTime := time
canEnter = na(lastExitTime) or ((time - lastExitTime) / 60000 >= cooldownMinutes)

// === ENTRY LOGIC ===
if canTrade and validQuantity and not alertSent and canEnter and barstate.isconfirmed
    if longCondition and not shortCondition and (lastSignalBar != bar_index or lastSignalType != 1)
        strategy.entry('Long', strategy.long, qty=quantity)
        longInitialEntryPrice := close
        longEntryATR         := atr
        longEntryCount       := 1
        alert('Enter Long', alert.freq_once_per_bar)
        alertSent            := true
        lastSignalBar        := bar_index
        lastSignalType       := 1
        entryBarIndex        := bar_index

    else if shortCondition and not longCondition and (lastSignalBar != bar_index or lastSignalType != -1)
        strategy.entry('Short', strategy.short, qty=quantity)
        shortInitialEntryPrice := close
        shortEntryATR          := atr
        shortEntryCount        := 1
        alert('Enter Short', alert.freq_once_per_bar)
        alertSent             := true
        lastSignalBar         := bar_index
        lastSignalType        := -1
        entryBarIndex         := bar_index


// === DCA LOGIC (IF ENABLED) ===
if useDCA
    if strategy.position_size > 0 and longEntryCount < maxTotalEntries and bullMA and rsi < 70
        nextDCALevel = longInitialEntryPrice - longEntryCount * longEntryATR * dcaMultiplier
        if close <= nextDCALevel
            strategy.entry('Long DCA ' + str.tostring(longEntryCount), strategy.long, qty=quantity)
            longEntryCount := longEntryCount + 1
    if strategy.position_size < 0 and shortEntryCount < maxTotalEntries and bearMA and rsi > 30
        nextDCALevel = shortInitialEntryPrice + shortEntryATR * shortEntryCount * dcaMultiplier
        if close >= nextDCALevel
            strategy.entry('Short DCA ' + str.tostring(shortEntryCount), strategy.short, qty=quantity)
            shortEntryCount := shortEntryCount + 1

// === RESET DCA VARIABLES ON EXIT ===
if strategy.position_size == 0 and strategy.position_size[1] != 0
    longEntryCount := 0
    shortEntryCount := 0
    longInitialEntryPrice := na
    shortInitialEntryPrice := na
    longEntryATR := na
    shortEntryATR := na

// === FIXED STOP-LOSS CALCULATION (WIDER INITIAL STOP) ===
long_stop_price  := strategy.position_avg_price - atr * fixedStopMultiplier
short_stop_price := strategy.position_avg_price + atr * fixedStopMultiplier

// === ADJUST TRAILING POINTS BASED ON PROFIT ===
profitLong  = strategy.position_size > 0 ? close - strategy.position_avg_price : 0
profitShort = strategy.position_size < 0 ? strategy.position_avg_price - close : 0
trailPointsMultAdjusted       = profitLong > atr ? 0.3 : profitLong > atr * 0.66 ? 0.4 : trailPointsMult      // For long positions
trailPointsMultAdjustedShort  = profitShort > atr ? 0.3 : profitShort > atr * 0.66 ? 0.4 : trailPointsMult   // For short positions
trailPointsLong  = atr * trailPointsMultAdjusted
trailPointsShort = atr * trailPointsMultAdjustedShort

// === EXIT LOGIC ===
// On the entry bar, always use the fixed stop; thereafter, use a combination of fixed stop, trailing stop, and a profit target.
// Profit Target: For longs, exit at avg_entry + atr * profitTargetATRMult; for shorts, exit at avg_entry - atr * profitTargetATRMult.
if strategy.position_size > 0
    if bar_index == entryBarIndex
        if debugLogging
            log.info("Long exit on entry bar: fixed stop applied. Price=" + str.tostring(close))
        strategy.exit('Long Exit', 'Long', stop=long_stop_price)
    else
        if debugLogging
            log.info("Long Trade: profit=" + str.tostring(profitLong) + ", ATR=" + str.tostring(atr))
        strategy.exit('Long Exit', 'Long', 
             stop=long_stop_price, 
             limit = strategy.position_avg_price + atr * profitTargetATRMult,
             trail_points=trailPointsLong, 
             trail_offset=atr * trailOffset)
            
if strategy.position_size < 0
    if bar_index == entryBarIndex
        if debugLogging
            log.info("Short exit on entry bar: fixed stop applied. Price=" + str.tostring(close))
        strategy.exit('Short Exit', 'Short', stop=short_stop_price)
    else
        if debugLogging
            log.info("Short Trade: profit=" + str.tostring(profitShort) + ", ATR=" + str.tostring(atr))
        strategy.exit('Short Exit', 'Short', 
             stop=short_stop_price, 
             limit = strategy.position_avg_price - atr * profitTargetATRMult,
             trail_points=trailPointsShort, 
             trail_offset=atr * trailOffset)

// === FORCE CLOSE ON LAST BAR (OPTIONAL) ===
if barstate.islast
    if strategy.position_size > 0
        strategy.close('Long', comment='Forced Exit')
    if strategy.position_size < 0
        strategy.close('Short', comment='Forced Exit')

// === SIGNAL PLOTTING LOGIC ===
plotLongSignal  = longCondition and canTrade and (bar_index - lastLongPlotBar >= minBarsBetweenSignals or lastLongPlotBar == 0)
plotShortSignal = shortCondition and canTrade and (bar_index - lastShortPlotBar >= minBarsBetweenSignals or lastShortPlotBar == 0)

if plotLongSignal
    lastLongPlotBar := bar_index
if plotShortSignal
    lastShortPlotBar := bar_index

// Define plotting conditions based on plotMode
plotLongShape  = plotMode == 'Potential Signals' ? plotLongSignal : strategy.position_size > 0 and strategy.position_size[1] <= 0
plotShortShape = plotMode == 'Potential Signals' ? plotShortSignal : strategy.position_size < 0 and strategy.position_size[1] >= 0

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

var float longSL  = na
var float shortSL = na
if strategy.position_size > 0
    longSL := math.max(longSL, high - trailPointsLong)
else
    longSL := na
plot(longSL, color=color.green, style=plot.style_stepline, title='Long SL')

if strategy.position_size < 0
    shortSL := math.min(shortSL, low + trailPointsShort)
else
    shortSL := na
plot(shortSL, color=color.red, style=plot.style_stepline, title='Short SL')

bgcolor(timeWindow ? color.new(color.blue, 95) : na, title="Trading Hours Highlight")
if plotLongShape
    label.new(bar_index, low, "Buy", yloc=yloc.belowbar, color=color.green, textcolor=color.white, style=label.style_label_up)
if plotShortShape
    label.new(bar_index, high, "Sell", yloc=yloc.abovebar, color=color.red, textcolor=color.white, style=label.style_label_down)

// === DEBUG TABLE ===
var table debugTable = table.new(position.top_right, 3, 10, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.white, border_width=1)
if barstate.islast
    table.cell(debugTable, 0, 0, 'Signal', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
    table.cell(debugTable, 1, 0, 'Status', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
    table.cell(debugTable, 2, 0, 'Priority', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))

    table.cell(debugTable, 0, 1, 'MA Long', text_color=color.blue)
    table.cell(debugTable, 1, 1, bullMA ? 'Yes' : 'No', text_color=bullMA ? color.green : color.red)
    table.cell(debugTable, 2, 1, signalPriority == 'MA' ? 'High' : 'Low', text_color=color.white)

    table.cell(debugTable, 0, 2, 'MA Short', text_color=color.blue)
    table.cell(debugTable, 1, 2, bearMA ? 'Yes' : 'No', text_color=bearMA ? color.green : color.red)
    table.cell(debugTable, 2, 2, signalPriority == 'MA' ? 'High' : 'Low', text_color=color.white)

    table.cell(debugTable, 0, 3, 'Bull Pattern', text_color=color.blue)
    table.cell(debugTable, 1, 3, bullPattern ? 'Yes' : 'No', text_color=bullPattern ? color.green : color.red)
    table.cell(debugTable, 2, 3, signalPriority == 'Pattern' ? 'High' : 'Low', text_color=color.white)

    table.cell(debugTable, 0, 4, 'Bear Pattern', text_color=color.blue)
    table.cell(debugTable, 1, 4, bearPattern ? 'Yes' : 'No', text_color=bearPattern ? color.green : color.red)
    table.cell(debugTable, 2, 4, signalPriority == 'Pattern' ? 'High' : 'Low', text_color=color.white)

    table.cell(debugTable, 0, 5, 'Filters', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
    table.cell(debugTable, 1, 5, 'Status', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
    table.cell(debugTable, 2, 5, '', text_color=color.white, bgcolor=color.rgb(50, 50, 50))

    table.cell(debugTable, 0, 6, 'Time Window', text_color=color.blue)
    table.cell(debugTable, 1, 6, timeWindow ? 'OK' : 'Closed', text_color=timeWindow ? color.green : color.red)
    table.cell(debugTable, 2, 6, str.tostring(currentHour) + 'h', text_color=color.white)

    table.cell(debugTable, 0, 7, 'Volume', text_color=color.blue)
    table.cell(debugTable, 1, 7, volumeOk ? 'OK' : 'Low', text_color=volumeOk ? color.green : color.red)
    table.cell(debugTable, 2, 7, str.tostring(volume, '#'), text_color=color.white)

    table.cell(debugTable, 0, 8, 'Volatility', text_color=color.blue)
    table.cell(debugTable, 1, 8, volatilityOk ? 'OK' : 'High', text_color=volatilityOk ? color.green : color.red)
    table.cell(debugTable, 2, 8, str.tostring(volatility * 100, '#.##') + '%', text_color=color.white)

    table.cell(debugTable, 0, 9, 'Signals', text_color=color.blue)
    table.cell(debugTable, 1, 9, longCondition and not shortCondition ? 'LONG' : shortCondition and not longCondition ? 'SHORT' : longCondition and shortCondition ? 'CONFLICT' : 'NONE', text_color=longCondition and not shortCondition ? color.green : shortCondition and not longCondition ? color.red : color.yellow)
    table.cell(debugTable, 2, 9, canEnter ? alertSent ? 'Sent' : 'Ready' : 'Cooldown', text_color=canEnter ? alertSent ? color.yellow : color.green : color.gray)

// === PERFORMANCE DASHBOARD ===
var table dashboard = table.new(position.bottom_left, 3, 3, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.white, border_width=1)
if barstate.islast
    table.cell(dashboard, 0, 0, 'Position', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
    table.cell(dashboard, 1, 0, 'P/L', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
    table.cell(dashboard, 2, 0, 'Statistics', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))

    table.cell(dashboard, 0, 1, strategy.position_size > 0 ? 'Long' : strategy.position_size < 0 ? 'Short' : 'Flat', text_color=strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : color.blue)
    table.cell(dashboard, 1, 1, str.tostring(strategy.netprofit, '#.##'), text_color=strategy.netprofit >= 0 ? color.green : color.red)
    table.cell(dashboard, 2, 1, 'Win Rate', text_color=color.white)

    table.cell(dashboard, 0, 2, strategy.position_size != 0 ? 'Bars: ' + str.tostring(bar_index - entryBarIndex) : '', text_color=color.white)
    table.cell(dashboard, 1, 2, strategy.position_size != 0 ? 'Cooldown: ' + str.tostring(cooldownMinutes) + 'm' : '', text_color=color.white)
    table.cell(dashboard, 2, 2, strategy.closedtrades > 0 ? str.tostring(strategy.wintrades / strategy.closedtrades * 100, '#.##') + '%' : 'N/A', text_color=color.white)

// === CHART TITLE ===
var table titleTable = table.new(position.bottom_right, 1, 1, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.rgb(0, 50, 137), border_width=1)
table.cell(titleTable, 0, 0, "Dskyz - DAFE Trading Systems", text_color=color.rgb(159, 127, 255, 80), text_size=size.large)