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

RSI MA DIVERGENCE DYNAMIC POSITION SIZING TREND FILTERING BOX RANGE
সৃষ্টির তারিখ: 2025-05-15 16:07:47 অবশেষে সংশোধন করুন: 2025-05-15 16:07:47
অনুলিপি: 3 ক্লিকের সংখ্যা: 306
2
ফোকাস
319
অনুসারী

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

ওভারভিউ

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

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

কৌশল নীতি

এই কৌশলটি তিনটি মূল উপাদান নিয়ে কাজ করেঃ

  1. মূল্য পরিসীমা পরীক্ষাকৌশলঃ নির্দিষ্ট সময়ের মধ্যে সর্বোচ্চ এবং সর্বনিম্ন মূল্য গণনা করে মূল্যের ব্যাপ্তি নির্ধারণ করুন। এই মূল্য স্তরগুলি চার্টটিতে উপরের এবং নীচের সীমানা রেখা হিসাবে আঁকা হয়, যা ব্যবসায়ের জন্য একটি দৃশ্যমান মূল্য রেফারেন্স ব্যাপ্তি সরবরাহ করে।

  2. RSI পরীক্ষার থেকে বিচ্ছিন্নকৌশলটি বাজারের গতিশীলতা গণনা করে এবং RSI এবং দামের মধ্যে বিচ্ছিন্নতা সনাক্ত করে। যখন দাম নতুন কম হয় এবং RSI আরও উচ্চতর নিম্ন হয়, তখন একটি মুদ্রাস্ফীতি বিচ্ছিন্নতা তৈরি হয়। যখন দাম নতুন উচ্চ হয় এবং RSI আরও কম উচ্চতা তৈরি করে, তখন একটি মুদ্রাস্ফীতি বিচ্ছিন্নতা তৈরি হয়। কৌশলটি বাম এবং ডান দিকে ফিরে যাওয়ার সময়কাল (leftLookback এবং rightLookback) সেট করে স্থানীয় চূড়ান্ত মানগুলিকে সঠিকভাবে সনাক্ত করতে পারে।

  3. চলমান গড়ের প্রবণতা বিশ্লেষণ: কৌশলটি কাস্টমাইজড টাইম ফ্রেমে একাধিক প্রকারের মুভিং এভারেজ গণনা করে (MA20, MA50, MA100 এবং MA200) এবং এই সমান্তরালগুলির বিন্যাস এবং দামের সমান্তরালের অবস্থান বিশ্লেষণ করে বাজার প্রবণতা নির্ধারণ করে। কৌশলটি কেবলমাত্র নিম্নমুখী প্রবণতার মধ্যে একাধিক সংকেত ট্রিগার করে যাতে ট্রেডিং সামগ্রিক বাজার পরিবেশের সাথে সামঞ্জস্যপূর্ণ থাকে।

লেনদেনের ধারণাগুলি নিম্নরূপঃ

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

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

  1. মাল্টি-ডিমেনশনাল নিশ্চিতকরণ ব্যবস্থা: মূল্যের ব্যাপ্তি ভেঙে, আরএসআই-এর বিপরীত সংকেত এবং চলমান গড়ের প্রবণতা ফিল্টারিংয়ের সাথে একত্রিত হয়ে একটি বহুমাত্রিক লেনদেন নিশ্চিতকরণ ব্যবস্থা তৈরি করা হয়েছে, যা লেনদেনের সংকেতের নির্ভরযোগ্যতা এবং নির্ভুলতা উল্লেখযোগ্যভাবে উন্নত করেছে।

  2. ডায়নামিক পজিশন ব্যবস্থাপনাকৌশলঃ স্থির অবস্থানের বন্টনের পরিবর্তে বাজারের পরিস্থিতি এবং দামের পরিবর্তনের উপর ভিত্তি করে পজিশনের আকারকে গতিশীলভাবে সামঞ্জস্য করে। এটি কৌশলটিকে অনুকূল বাজার পরিস্থিতিতে লাভের সম্ভাবনা সর্বাধিক করতে এবং প্রতিকূল পরিস্থিতিতে ঝুঁকি নিয়ন্ত্রণ করতে সক্ষম করে। সূত্রmath.max(math.min(math.pow((avgPrice - close)* 1000/5,1.1), 100), minEnterPercent)নিশ্চিত করুন যে পজিশনের পরিবর্তনগুলি নমনীয় এবং সীমাবদ্ধ।

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

  4. সঠিক প্রবেশ ও প্রস্থান পয়েন্ট: বিপরীত সিগন্যালের সাথে দামের ব্যাপ্তি ব্রেকআউটগুলি সঠিক প্রবেশ এবং প্রস্থান পয়েন্ট সরবরাহ করে, যা মিথ্যা সংকেতের সম্ভাবনা হ্রাস করে। পিছনের প্যারামিটারগুলি (leftLookback এবং rightLookback) চরম মান সনাক্তকরণের যথার্থতা বাড়ায়।

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

  6. নমনীয় প্যারামিটার কনফিগারেশনবিভিন্ন পরিবর্তনযোগ্য প্যারামিটার কৌশলকে বিভিন্ন বাজার এবং ট্রেডিং স্টাইলের সাথে সামঞ্জস্য করতে সক্ষম করে, যেমন RSI দৈর্ঘ্য, দামের ব্যাপ্তি চক্র এবং বিপরীত রিটার্ন চক্র ইত্যাদি

কৌশলগত ঝুঁকি

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

  2. অতিরিক্ত লেনদেনের ঝুঁকি: গতিশীল পজিশনের সমন্বয়টি অতিরিক্ত লেনদেনের কারণ হতে পারে, লেনদেনের ব্যয় বাড়িয়ে তুলতে পারে। ক্ষুদ্র মূল্যের ওঠানামা ঘন ঘন লেনদেনের সূত্রপাত এড়াতে যুক্তিসঙ্গত ন্যূনতম সমন্বয় থ্রেশহোল্ড (minEnterPercent এবং minExitPercent) সেট করার পরামর্শ দেওয়া হয়।

  3. গড় সময়সীমার ঝুঁকিচলমান গড়ের পিছনে থাকে, বিশেষত দ্রুত চলমান বাজারে। এই ঝুঁকিটি হ্রাস করা যেতে পারে ব্যবহৃত গড়ের ধরন (যেমন এসএমএ থেকে ইএমএতে) বা গড়ের সময়কাল পরিবর্তন করে।

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

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

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

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

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

  3. যোগ করুন লাভ-ক্ষতি ফিল্টার করুন: প্রতিটি লেনদেনের আগে সম্ভাব্য রিস্ক-রিটার্ন অনুপাতের অনুমান করুন এবং কেবলমাত্র ন্যূনতম লাভ-ক্ষতির অনুপাতের মূল্যের লেনদেন করুন, যার ফলে সামগ্রিক কৌশলটির প্রত্যাশিত লাভের অনুকূলকরণ হয়। এটি এটিআর-ভিত্তিক গতিশীল স্টপ লস এবং স্টপ লেভেল সেট করে করা যেতে পারে।

  4. মাল্টিটাইম ফ্রেম বিশ্লেষণের সূচনাউদাহরণস্বরূপ, ট্রেডিং শুধুমাত্র তখনই সম্পাদন করা হয় যখন সূর্যমুখী প্রবণতা বর্তমান ট্রেডিং সময়ের ফ্রেমের প্রবণতার সাথে সামঞ্জস্যপূর্ণ থাকে।

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

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

সারসংক্ষেপ

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

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

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

//@version=6
// Strategy: Box Range with RSI Divergence (Dynamic Adjustment - OKX Signal Format)
// © aws2333
//I'm chinese 
strategy("Kaito  Box with RSI Div(Dynamic Adjustment + MA + Long)", overlay=true,default_qty_type=strategy.percent_of_equity, default_qty_value=10)


rsiOverbought = 80 
rsiOversold = 13   
boxLength = input.int(3, title="Box Length", minval=1) 
rsiLength = input.int(2, title="RSI Length", minval=1) 
divergenceLookback = input.int(2, title="Divergence Lookback Period", minval=1) 
leftLookback = input.int(2, title="Left Lookback", minval=1)  
rightLookback = input.int(2, title="Right Lookback", minval=1) 
var float avgPrice = na       
//var float position_size = 0     

signalToken = input.string("**********", "Signal Token")
enterOrderType = input.string("limit", "Order Type", options=["market", "limit"])
enterOrderPriceOffset = input.float(0.05, "Order Price Offset", minval=0, maxval=100, step=0.01)
enterInvestmentType = input.string("percentage_investment", "Investment Type", options=["margin", "contract", "percentage_balance", "percentage_investment"])
exitOrderType = input.string("limit", "Order Type", options=["market", "limit"])
exitOrderPriceOffset = input.float(0.05, "Order Price Offset", minval=0, maxval=100, step=0.01)
exitInvestmentType = input.string("percentage_position", "Investment Type", options=["percentage_position"])
maxLag = input.float(30, "maxLag")

minEnterPercent = 1.3  
minExitPercent = 0.09  


highestHigh = ta.highest(high, boxLength) 
lowestLow = ta.lowest(low, boxLength)  


plot(highestHigh, title="Upper Box", color=color.new(color.green, 0), linewidth=1, style=plot.style_line)
plot(lowestLow, title="Lower Box", color=color.new(color.red, 0), linewidth=1, style=plot.style_line)


rsi = ta.rsi(low, rsiLength)


isLowestLeft = low < ta.lowest(low[1], leftLookback)  
isLowestRight = low <= ta.lowest(low, rightLookback) 
isLowestClose = isLowestLeft and isLowestRight      

isHighestLeft = low > ta.highest(low[1], leftLookback) 
isHighestRight = low >= ta.highest(low, rightLookback) 
isHighestClose = isHighestLeft and isHighestRight      

lowestClose = ta.lowest(low, divergenceLookback)
lowestRsi = ta.lowest(rsi, divergenceLookback)
highestClose = ta.highest(low, divergenceLookback)
highestRsi = ta.highest(rsi, divergenceLookback)


lowestClosePrev = ta.lowest(low[1], leftLookback)
lowestRsiPrev = ta.lowest(rsi[1], leftLookback)
highestClosePrev = ta.highest(low[1], leftLookback)
highestRsiPrev = ta.highest(rsi[1], leftLookback)



bullishDivergence = isLowestClose and (low < lowestClosePrev) and (rsi > lowestRsiPrev) and (rsi < rsiOversold)
bearishDivergence = isHighestClose and (low > highestClosePrev) and (rsi < highestRsiPrev) and (rsi > rsiOverbought)


ma(source, length, type) =>
    type == "SMA" ? ta.sma(source, length) :type == "EMA" ? ta.ema(source, length) :type == "SMMA (RMA)" ? ta.rma(source, length) :type == "WMA" ? ta.wma(source, length) :type == "VWMA" ? ta.vwma(source, length) :na


custom_timeframe = input.timeframe("3", "Custom time period (leave blank for current period)")


ma_type = input.string("SMA", "Moving average type", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])


ma20_period = input.int(20, "MA20 ", minval=1)
ma50_period = input.int(50, "MA50 ", minval=1)
ma100_period = input.int(100, "MA100 ", minval=1)
ma200_period = input.int(200, "MA200 ", minval=1)


source_close = request.security(syminfo.tickerid, custom_timeframe, close)


ma20 = ma(source_close, ma20_period, ma_type)
ma50 = ma(source_close, ma50_period, ma_type)
ma100 = ma(source_close, ma100_period, ma_type)
ma200 = ma(source_close, ma200_period, ma_type)


up_signal_1 = ma20 > ma200  
up_signal_2 = ma50 > ma200  
up_signal_3 = ma100 > ma200 
up_signal_4 = (high > ma20 and high > ma50 and high > ma100 and high > ma200)
up_trend = (up_signal_1 and up_signal_2 and up_signal_3 and (source_close > ma200)) or up_signal_4 


down_signal_1 = ma20 < ma200  
down_signal_2 = ma50 < ma200  
down_signal_3 = ma100 < ma200 
down_signal_4 = (low < ma20 and low < ma50 and low < ma100 and low < ma200)
down_trend = (down_signal_1 and down_signal_2 and down_signal_3 and (source_close < ma200)) or down_signal_4 




plot(ma20, color=color.yellow, title="MA20")
plot(ma50, color=color.orange, title="MA50")
plot(ma100, color=color.red, title="MA100")
plot(ma200, color=color.maroon, title="MA200")


var float longAddPercent = na 
var float shortAddPercent = na 
roundToFourDecimals(value) => math.round(value * 10000) / 10000

if not na(avgPrice)
    if close < avgPrice
        longAddPercent := roundToFourDecimals(math.max(math.min(math.pow((avgPrice - close)* 1000/5,1.1)  , 100), minEnterPercent)) 
    if close > avgPrice
        longAddPercent := 1
 
    if close == avgPrice
        longAddPercent := 1


if not na(avgPrice)
    if close < avgPrice
        shortAddPercent := 0.01
 
    if close > avgPrice
        shortAddPercent := roundToFourDecimals(math.max(math.min(math.pow((close - avgPrice)*1000,1.1), 100), minExitPercent)) 
    if close == avgPrice
        longAddPercent := 1


longSignal = (close <= lowestLow) and bullishDivergence
shortSignal = (close >= highestHigh) and bearishDivergence
plotLongSignal = down_trend and longSignal and close < avgPrice
plotShortSignal = up_trend and shortSignal and close > avgPrice  

if plotLongSignal
    label.new(bar_index, avgPrice, "average price: " + str.tostring(avgPrice, "#.####"), style=label.style_label_up, color=color.green, textcolor=color.white )
if plotShortSignal
    label.new(bar_index, avgPrice,"average price: " + str.tostring(avgPrice, "#.####"), style=label.style_label_down, color=color.red, textcolor=color.white)




if plotLongSignal
    label.new(
         bar_index, 
         close, 
         "LONG :" + str.tostring(longAddPercent, "#.####") + "%, Close: " + str.tostring(close, "#.####"), 
         style=label.style_label_up, 
         color=color.new(color.green, 80), 
         textcolor=color.white
         )

if plotShortSignal
    label.new(
             bar_index, 
             close, 
             "EXIT LONG :" + str.tostring(shortAddPercent, "#.####") + "%, Close: " + str.tostring(close, "#.####"), 
             style=label.style_label_down, 
             color=color.new(color.red, 80), 
             textcolor=color.white
             )


if longSignal

    avgPrice := na(avgPrice) ? close : (avgPrice + close) / 2 







  
if down_trend and longSignal
     
    strategy.entry("Long",strategy.long,qty=longAddPercent )
    
var float close_size = na

if up_trend and shortSignal 

    if strategy.position_size > 0
        close_size := strategy.position_size * (shortAddPercent/100)  
        strategy.order("Partial Close Long", strategy.short, close_size)