ডুয়াল মুভিং এভারেজ মোমেন্টাম ট্রেন্ড ফলোয়িং এবং রিভার্সাল ট্রেডিং সিস্টেম

移动平均线 RSI ADX ATR 布林带 MA BB 动量 趋势 波动率
সৃষ্টির তারিখ: 2025-05-26 17:32:14 অবশেষে সংশোধন করুন: 2025-05-26 17:32:14
অনুলিপি: 0 ক্লিকের সংখ্যা: 270
2
ফোকাস
319
অনুসারী

ডুয়াল মুভিং এভারেজ মোমেন্টাম ট্রেন্ড ফলোয়িং এবং রিভার্সাল ট্রেডিং সিস্টেম ডুয়াল মুভিং এভারেজ মোমেন্টাম ট্রেন্ড ফলোয়িং এবং রিভার্সাল ট্রেডিং সিস্টেম

ওভারভিউ

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

কৌশল নীতি

কৌশলটির মূল নীতি হল প্রবণতা সনাক্তকরণ এবং গতিশীলতা নিশ্চিতকরণের উপর ভিত্তি করে দ্বৈত যাচাইকরণ ব্যবস্থাঃ

  1. ট্রেন্ড সনাক্তকরণ: কৌশলটি বাজারের প্রবণতা নির্ধারণের জন্য ১০০ ও ৫০০ পিরিয়ডের চলমান গড় ব্যবহার করে (ইএমএ বা এসএমএ) । যখন এমএ১০০ এমএ৫০০ এর উপরে থাকে, তখন এটি একটি উত্থান হিসাবে বিবেচিত হয়; বিপরীতভাবে এটি একটি পতনশীল প্রবণতা হতে পারে।

  2. ভর্তির শর্তাবলী

    • দাম অবশ্যই MA100 এবং MA500 এর উপরে হতে হবে
    • প্রবণতা ফিল্টার করার বিকল্পঃ MA100 > MA500
    • বিকল্প RSI ফিল্টার শর্তঃ RSI অবশ্যই তার মসৃণ গড়ের চেয়ে বেশি হতে হবে
    • বিকল্প ADX ফিল্টার শর্তঃ ADX অবশ্যই তার মসৃণ গড়ের চেয়ে বেশি হতে হবে যাতে প্রবণতা শক্তিশালী হয়
    • ATR ফিল্টারিং শর্তাবলীঃ এটিআর অবশ্যই তার মসৃণ গড়ের চেয়ে বেশি হতে হবে যাতে পর্যাপ্ত অস্থিরতা নিশ্চিত হয়
  3. খালি মাথায় প্রবেশের শর্ত

    • দাম অবশ্যই MA100 এবং MA500 এর নিচে হতে হবে
    • দাম অবশ্যই ব্রেনেডের নিচে হতে হবে (অতিমাত্রায় বিক্রি হচ্ছে)
    • RSI অবশ্যই সেট থ্রেশহোল্ডের নিচে থাকতে হবে (ডিফল্ট 33, যা oversold নির্দেশ করে)
    • ATR ফিল্টার করার বিকল্প
    • শক্তিশালী উত্থান ব্লকিংঃ যদি এমএ 100 এমএ 500 এর চেয়ে বেশি সেট শতাংশের উপরে থাকে তবে শূন্যে প্রবেশ করবেন না ((একটি শক্তিশালী উত্থান প্রবণতার মধ্যে শূন্যস্থান এড়ানো)
  4. ঝুঁকি ব্যবস্থাপনা এবং প্রস্থান কৌশল

    • মাল্টি-হেড স্টপ লসঃ প্রারম্ভিক মূল্যের নিচে শতাংশ হিসাবে সেট করুন (ডিফল্ট 3%)
    • মাল্টি-হোল্ডার এক্সট্রা আউটঃ দাম এমএ 500 এর নিচে নেমে গেলে
    • খালি মাথা ক্ষতিঃ প্রবেশ মূল্যের উপরে শতাংশ হিসাবে সেট করুন (ডিফল্ট 3%)
    • খালি মাথা স্টপঃ প্রবেশ মূল্যের নিচে শতাংশ হিসাবে সেট করুন (ডিফল্ট 4%)
    • ফান্ড ম্যানেজমেন্টঃ প্রতিটি লেনদেনের জন্য অ্যাকাউন্টের ১০০% ফান্ড ডিফল্টরূপে ব্যবহার করা হয়, যা একটি একক পাইরামিড পজিশনের অনুমতি দেয়

এই নকশাটি কৌশলটিকে ট্রেন্ডিং বাজারে বড় তরঙ্গের সুযোগগুলি ধরতে সক্ষম করে এবং অতিরিক্ত বিক্রয়ের শর্তে বিপরীত বিন্দুগুলি খুঁজে বের করে।

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

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

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

  3. বুদ্ধিমত্তার প্রবণতা বিচার: দ্বৈত সমান্তরাল সিস্টেম (MA100 এবং MA500) ব্যবহার করে প্রবণতা নির্ণয় করা আরও নির্ভরযোগ্য এবং একক সমান্তরাল সিস্টেমের তুলনায় মিথ্যা ব্রেকথ্রুগুলি ফিল্টার করা আরও ভাল।

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

  5. শীর্ষস্থানীয় দেশগুলোর বিরুদ্ধে লড়াইউড়োজাহাজের লেনদেনের জন্য একটি “শক্তিশালী উত্থান ব্লক” ব্যবস্থা রয়েছে, যখন এমএ১০০ এমএ৫০০ এর চেয়ে বেশি সেট শতাংশের চেয়ে বেশি হয়, তখন লোভী করা নিষিদ্ধ, কার্যকরভাবে শক্তিশালী উত্থান পরিস্থিতিতে প্রতিকূলতার ঝুঁকি এড়ানো যায়।

  6. একাধিক নিশ্চিতকরণ ব্যবস্থা: এন্ট্রি সিগন্যালের জন্য একাধিক টেকনিক্যাল ইন্ডিকেটর প্রয়োজন, যা মিথ্যা সিগন্যালের সম্ভাবনা উল্লেখযোগ্যভাবে কমিয়ে দেয় এবং কৌশলটির স্থায়িত্ব বাড়ায়।

  7. নমনীয় খেলার ব্যবস্থাকৌশলঃ মাল্টি হেড এবং খালি হেডের জন্য আলাদা আলাদা প্রস্থান লজিক ডিজাইন করা হয়েছে, মাল্টি হেডটি MA500 এর মাধ্যমে গতিশীল স্টপ হিসাবে কাজ করতে পারে, এবং খালি হেডের স্থির স্টপ-অফ লক্ষ্য রয়েছে, যা বিভিন্ন দিকের ব্যবসায়ের বৈশিষ্ট্য অনুসারে।

কৌশলগত ঝুঁকি

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

  2. পিছিয়ে পড়ার ঝুঁকি: চলমান গড়ের মতো সূচকগুলি মূলত পিছিয়ে পড়া সূচক, তীব্রভাবে ওঠানামা বাজারে সময়মতো পাল্টা পয়েন্টগুলি ধরতে ব্যর্থ হতে পারে, যার ফলে প্রবেশ বা প্রস্থান বিলম্বিত হয়। উচ্চ ওঠানামা বাজারে উপযুক্তভাবে চলমান গড়ের সময়কাল সংক্ষিপ্ত করার বা অন্যান্য নেতৃস্থানীয় সূচক যুক্ত করার পরামর্শ দেওয়া হয়।

  3. প্রবণতা পরিবর্তনের সময় খারাপ পারফরম্যান্স: ঝড়ের বাজার বা প্রবণতা পরিবর্তনের সময়, কৌশলটি ঘন ঘন মিথ্যা সংকেত তৈরি করতে পারে, যার ফলে ক্রমাগত ক্ষতি হয়। সমাধানটি হ’ল বাজার অবস্থা সনাক্তকরণ ব্যবস্থা যুক্ত করা, স্বয়ংক্রিয়ভাবে পজিশন হ্রাস করা বা ট্রেডিং স্থগিত করা যখন ঝড়ের বাজার সনাক্ত করা হয়।

  4. তহবিল ব্যবস্থাপনা ঝুঁকিকৌশলঃ অ্যাকাউন্টের ডিফল্ট 100% তহবিল ব্যবহার করুন, প্লাস একটি একক পাইরামিড বাড়ানোর অনুমতি দিন, প্রতিকূল পরিস্থিতিতে বড় প্রত্যাহারের মুখোমুখি হতে পারে। ব্যক্তিগত ঝুঁকি বহনযোগ্যতার উপর ভিত্তি করে পজিশনের আকার সামঞ্জস্য করার পরামর্শ দেওয়া হয়, পুরো তহবিলের লেনদেন এড়ানো উচিত।

  5. তরলতা ঝুঁকি: কম তরলতা বাজার বা সময়কালে, স্লাইড পয়েন্ট বৃদ্ধি বা প্রত্যাশিত দামের সাথে লেনদেনের অক্ষমতার ঝুঁকি থাকতে পারে। পর্যাপ্ত তরলতার সাথে মূলধারার লেনদেনের জোড়া এবং সময়কালে পরিচালনা করার কৌশলটি সুপারিশ করা হয়েছে।

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

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

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

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

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

  4. মাল্টি টাইম ফ্রেম নিশ্চিতকরণ: বর্তমান কৌশলটি শুধুমাত্র একটি একক সময় ফ্রেমে কাজ করে (৩ ঘন্টা), আপনি উচ্চতর সময় ফ্রেমের ট্রেন্ড নিশ্চিতকরণ যুক্ত করার কথা বিবেচনা করতে পারেন, কেবলমাত্র উচ্চতর সময় ফ্রেমের ট্রেন্ডের দিকনির্দেশের সাথে একমত হলেই প্রবেশ করুন, জয়ী হওয়ার হার বাড়িয়ে তুলুন। উদাহরণস্বরূপ, 3 ঘন্টা চার্টের মাল্টিহেড সংকেতটি কার্যকর করা হয় যখন সূর্যমুখী চার্টের প্রবণতা ঊর্ধ্বমুখী হয়।

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

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

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

সারসংক্ষেপ

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

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

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

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

//@version=6
strategy("Momentum Long + Short Strategy (BTC 3H)", overlay=true,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=100,
     initial_capital=1000,
     commission_type=strategy.commission.percent,
     commission_value=0.1,
     slippage=1,
     pyramiding=1)


// ==============================================================================
// === LONG TRADE SETTINGS
// ==============================================================================
enableLongs     = input.bool(true,  "Enable Long Trades", group="LONG TRADE SETTINGS")
slPercentLong   = input.float(3.0, "Long Stop Loss %", minval=0.1, group="LONG TRADE SETTINGS")

useRSIFilter     = input.bool(false, "Enable RSI Filter", group="LONG FILTER SETTINGS")
useADXFilter     = input.bool(false, "Enable ADX Filter", group="LONG FILTER SETTINGS")
useATRFilter     = input.bool(false, "Enable ATR Filter", group="LONG FILTER SETTINGS")
useTrendFilter   = input.bool(true,  "Require MA100 > MA500", group="LONG FILTER SETTINGS")

smoothType      = input.string("EMA", "Smoothing Type", options=["EMA", "SMA"], group="LONG FILTER SETTINGS")
smoothingLength = input.int(100, "Smoothing Length (for filters)", group="LONG FILTER SETTINGS")

rsiLengthLong   = input.int(14, "RSI Length", group="RSI FILTER")
adxLength       = input.int(14, "ADX Length", group="ADX FILTER")
atrLength       = input.int(14, "ATR Length", group="ATR FILTER")


// ==============================================================================
// === SHORT TRADE SETTINGS
// ==============================================================================
enableShorts         = input.bool(false, "Enable Short Trades", group="SHORT TRADE SETTINGS")
slPercentShort       = input.float(3.0, "Short Stop Loss %", minval=0.1, group="SHORT TRADE SETTINGS")
tpPercentShort       = input.float(4.0, "Short Take Profit %", minval=0.1, group="SHORT TRADE SETTINGS")
rsiLengthShort       = input.int(14, "RSI Length", group="SHORT FILTER SETTINGS")
rsiThresholdShort    = input.float(33, "RSI Threshold", minval=1, maxval=100, group="SHORT FILTER SETTINGS")
bbLength             = input.int(20, "Bollinger Band Length", group="SHORT FILTER SETTINGS")
useATRFilterShort    = input.bool(true, "Enable ATR Filter (Short)", group="SHORT FILTER SETTINGS")
useStrongUptrendBlock = input.bool(true, "Block Shorts if MA100 > MA500 by (%)", group="SHORT FILTER SETTINGS")
shortTrendGapPct     = input.float(2.0, "Threshold (%) for Blocking Shorts", minval=0.1, group="SHORT FILTER SETTINGS")


// ==============================================================================
// === COMMON INDICATORS
// ==============================================================================
ma100 = smoothType == "EMA" ? ta.ema(close, 100) : ta.sma(close, 100)
ma500 = smoothType == "EMA" ? ta.ema(close, 500) : ta.sma(close, 500)
priceAboveMAs = close > ma100 and close > ma500
trendAlignment = not useTrendFilter or ma100 > ma500

plot(ma100, title="MA 100", color=color.orange)
plot(ma500, title="MA 500", color=color.blue)


// ==============================================================================
// === LONG FILTER LOGIC
// ==============================================================================
rsiLong = ta.rsi(close, rsiLengthLong)
rsiSmooth = smoothType == "EMA" ? ta.ema(rsiLong, smoothingLength) : ta.sma(rsiLong, smoothingLength)
rsiPass = not useRSIFilter or rsiLong > rsiSmooth

dmi(len) =>
    up       = ta.change(high)
    down     = -ta.change(low)
    plusDM   = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM  = na(down) ? na : (down > up and down > 0 ? down : 0)
    trur     = ta.rma(ta.tr, len)
    plusDI   = 100 * ta.rma(plusDM, len) / trur
    minusDI  = 100 * ta.rma(minusDM, len) / trur
    dx       = 100 * math.abs(plusDI - minusDI) / (plusDI + minusDI)
    ta.rma(dx, len)

adx = dmi(adxLength)
adxSmooth = smoothType == "EMA" ? ta.ema(adx, smoothingLength) : ta.sma(adx, smoothingLength)
adxPass = not useADXFilter or adx > adxSmooth

atr = ta.atr(atrLength)
atrSmooth = smoothType == "EMA" ? ta.ema(atr, smoothingLength) : ta.sma(atr, smoothingLength)
atrPass = not useATRFilter or atr > atrSmooth


// ==============================================================================
// === SHORT FILTER LOGIC
// ==============================================================================
rsiShort = ta.rsi(close, rsiLengthShort)
bbBasis = ta.sma(close, bbLength)
bbDev   = ta.stdev(close, bbLength)
bbLower = bbBasis - bbDev * 2
priceBelowBB = close < bbLower
priceBelowMAs = close < ma100 and close < ma500
rsiOversold = rsiShort < rsiThresholdShort

atrShort = ta.atr(atrLength)
atrShortSmoothed = smoothType == "EMA" ? ta.ema(atrShort, smoothingLength) : ta.sma(atrShort, smoothingLength)
atrShortPass = not useATRFilterShort or atrShort > atrShortSmoothed

emaGapTooWide = (ma100 - ma500) / ma500 * 100 > shortTrendGapPct
strongUptrendBlock = not useStrongUptrendBlock or not emaGapTooWide


// ==============================================================================
// === ENTRY CONDITIONS
// ==============================================================================
longCondition = enableLongs and priceAboveMAs and trendAlignment and rsiPass and adxPass and atrPass
shortCondition = enableShorts and priceBelowMAs and priceBelowBB and rsiOversold and atrShortPass and strongUptrendBlock

if longCondition
    strategy.entry("Long", strategy.long)

if shortCondition
    strategy.entry("Short", strategy.short)


// ==============================================================================
// === EXIT CONDITIONS
// ==============================================================================
longStop = strategy.position_avg_price * (1 - slPercentLong / 100)
strategy.exit("SL Long", from_entry="Long", stop=longStop)

if strategy.position_size > 0 and close < ma500
    strategy.close("Long", comment="TP Below MA500")

shortStop = strategy.position_avg_price * (1 + slPercentShort / 100)
shortTP   = strategy.position_avg_price * (1 - tpPercentShort / 100)

strategy.exit("SL/TP Short", from_entry="Short", stop=shortStop, limit=shortTP)