
ডায়নামিক ব্রেকিং মাস্টার চ্যানেল কৌশল একটি স্বনির্ধারিত ট্রেডিং সিস্টেম যা প্রতিরোধের বিরতির উপর ভিত্তি করে সমর্থন করে এবং বাজারের মূল সমর্থন এবং প্রতিরোধের স্থানগুলিকে গতিশীলভাবে চিহ্নিত করে সম্ভাব্য মুনাফা অর্জনের সুযোগকে ক্যাপচার করে। এই কৌশলটির মূল অংশটি হ’ল একটি গতিশীল চ্যানেল তৈরি করা যা বাজারের অবস্থার সাথে স্বয়ংক্রিয়ভাবে সামঞ্জস্য করতে সক্ষম, রিয়েল-টাইমে দামের চলাচল অনুসরণ করে এবং মূল অঞ্চলগুলির মধ্যে বিরতির সময় ট্রেডিং সিগন্যাল দেয়। কৌশলটি সমর্থন এবং প্রতিরোধের অঞ্চলগুলি সনাক্ত করতে এবং এই অঞ্চলগুলির শক্তি এবং প্রভাবের ভিত্তিতে ট্রেডিং সিদ্ধান্তগুলি তৈরি করতে টার্নপয়েন্ট অ্যালগরিদম ব্যবহার করে।
এই কৌশলটি প্রচুর পরিমাণে কাস্টমাইজযোগ্য প্যারামিটার সরবরাহ করে, যার মধ্যে রয়েছে টার্নপয়েন্টের সময়কাল, ডেটা উত্সের পছন্দ, চ্যানেলের প্রস্থের সীমাবদ্ধতা, ন্যূনতম টার্নপয়েন্টের তীব্রতার প্রয়োজনীয়তা এবং সমর্থন / প্রতিরোধের অঞ্চলের প্রদর্শনের সংখ্যা, যা ব্যবসায়ীদের বিভিন্ন বাজার পরিস্থিতি এবং ব্যক্তিগত পছন্দ অনুসারে নমনীয়ভাবে সামঞ্জস্য করতে দেয়। এছাড়াও, কৌশলটি চলমান গড়ের একীকরণকে সমর্থন করে, যা ট্রেডিং সিদ্ধান্ত নেওয়ার জন্য অতিরিক্ত প্রযুক্তিগত বিশ্লেষণের দৃষ্টিকোণ সরবরাহ করে।
ট্রেডিং লজিকের উপর ভিত্তি করে, যখন দাম প্রতিরোধের অঞ্চলটি অতিক্রম করে তখন সিস্টেমটি একটি কেনার সংকেত ট্রিগার করে; যখন দাম সমর্থন অঞ্চলটি অতিক্রম করে তখন সিস্টেমটি বিক্রয় সংকেত ট্রিগার করে। বাস্তব ট্রেডিং পরিবেশের আরও কাছাকাছি থাকার জন্য কৌশলটি 0.1% কমিশন খরচ গণনা অন্তর্ভুক্ত করে।
ডায়নামিক ব্রেকিং মাস্টার চ্যানেল কৌশলটির মূল নীতিটি বাজারের কাঠামোর মধ্যে সমর্থন এবং প্রতিরোধের অবস্থানগুলি সনাক্ত এবং বিরতি দেওয়া। এর প্রযুক্তিগত বাস্তবায়ন মূলত নিম্নলিখিত কয়েকটি মূল পদক্ষেপ নিয়ে গঠিতঃ
টার্নিং পয়েন্ট সনাক্তকরণপাইন স্ক্রিপ্ট ব্যবহার করেঃpivothighএবংpivotlowফাংশনটি মূল্যের চার্টের উচ্চ এবং নিম্ন পয়েন্টগুলি সনাক্ত করতে ব্যবহৃত হয়, যা সম্ভাব্য সমর্থন এবং প্রতিরোধের পয়েন্ট হিসাবে বিবেচিত হয়। ব্যবহারকারীরা “উচ্চ/নিম্ন” বা “বন্ধ/উন্মুক্ত” ডেটা উত্স ব্যবহার করে এই টার্নপয়েন্টগুলি নির্ধারণ করতে পারেন।
গতিশীল চ্যানেল গণনা: সিস্টেমটি সনাক্ত করা টার্নিং পয়েন্টের উপর ভিত্তি করে গতিশীল সমর্থন প্রতিরোধের চ্যানেল তৈরি করে।my_channelফাংশন, কৌশলটি প্রতিটি বাঁক পয়েন্টের চারপাশের অঞ্চল গণনা করে এবং তার শক্তির উপর ভিত্তি করে একটি চ্যানেলের উপরের (ceiling) এবং নীচের (floor) সীমা নির্ধারণ করে। চ্যানেলের প্রস্থের উপর নির্ভর করেmymaxwidthপ্যারামিটারের সীমাবদ্ধতা, যা সাম্প্রতিক 300 টি স্ক্র্যাপের মূল্যের উপর ভিত্তি করে গণনা করা হয়।
আঞ্চলিক শক্তির মূল্যায়নকৌশলটি কেবলমাত্র টার্নপয়েন্টগুলিকেই বিবেচনা করে না, তবে প্রতিটি সমর্থন / প্রতিরোধের অঞ্চলের শক্তিও মূল্যায়ন করে। শক্তির স্কোর দুটি কারণের উপর ভিত্তি করে তৈরি করা হয়ঃ এই অঞ্চলে টার্নপয়েন্টের সংখ্যা (প্রতিটি টার্নপয়েন্টের জন্য 20 পয়েন্টের প্রাথমিক শক্তি) এবং এই অঞ্চলে দামের ক্রিয়াকলাপের ঘনত্ব (প্রতিটি স্পর্শের জন্য 1 পয়েন্ট যোগ করা হয়) ।
আঞ্চলিক বাছাই এবং বাছাই: সিস্টেম ফিল্টারিং এর তীব্রতা ব্যবহারকারীর সেট থ্রেশহোল্ডের চেয়ে বেশি ((mystrength * 20) এর অঞ্চল, এবং উচ্চ থেকে নিম্ন তীব্রতা অনুসারে সাজানো হয়েছে।mymaxzones) এর সমর্থনকারী প্রতিরোধের অঞ্চল।
ব্রেকথ্রুকৌশলঃ বর্তমান ক্লোজিং মূল্যের সাথে পূর্ববর্তী স্তম্ভের অবস্থানের তুলনা করে সাপোর্ট/রেসট্যান্স অঞ্চলের পরিবর্তনের মাধ্যমে একটি ব্রেকআউট সনাক্ত করা হয়। যখন দাম অঞ্চলের অভ্যন্তর থেকে অঞ্চলের বাইরের দিকে চলে যায় এবং অঞ্চলের উপরের সীমানা ((রেসট্যান্স ব্রেকআউট) বা নীচের সীমানা ((সমর্থন ব্রেকআউট) অতিক্রম করে, তখন সিস্টেমটি কার্যকর ব্রেকআউট হিসাবে চিহ্নিত হয়।
ট্রেডিং সংকেত উৎপন্ন: প্রতিরোধের বিরতি সনাক্ত করার সময় একাধিক সংকেত ট্রিগার করুন ((“ResBreak”), সমর্থন বিরতি সনাক্ত করার সময় ফাঁকা সংকেত ট্রিগার করুন ((“SupBreak”) ।
নমনীয়তাডায়নামিক ব্রেক মাস্টার চ্যানেল কৌশলটির সবচেয়ে বড় সুবিধা হ’ল এটির অভিযোজনযোগ্যতা। ডায়নামিকভাবে সমর্থনকারী প্রতিরোধের অঞ্চলগুলি সনাক্ত এবং আপডেট করার মাধ্যমে, কৌশলটি বিভিন্ন বাজার পরিবেশ এবং মূল্যের ওঠানামা প্যাটার্নের সাথে খাপ খাইয়ে নিতে সক্ষম হয়, স্ট্যাটিক সমর্থনকারী প্রতিরোধের লাইনগুলির সম্ভাব্য পিছিয়ে পড়া সমস্যাগুলি এড়ানো যায়।
মাল্টি-ডাইমেনশনাল স্টেইনটেন্স অ্যাসেসমেন্টকৌশলঃ টার্নিং পয়েন্টের সংখ্যা এবং মূল্যের ক্রিয়াকলাপের ফ্রিকোয়েন্সি বিবেচনা করে সমর্থন ও প্রতিরোধের অঞ্চলের একটি বহুমাত্রিক শক্তির মূল্যায়ন করা, এই পদ্ধতিটি বাজারে সত্যিকারের গুরুত্বপূর্ণ গুরুত্বপূর্ণ অঞ্চলগুলিকে আরও সুনির্দিষ্টভাবে সনাক্ত করতে এবং ভুয়া ব্রেকথ্রুগুলির সম্ভাবনা হ্রাস করতে পারে।
উচ্চ স্বনির্ধারিত নমনীয়তা: কৌশলটি টার্নপয়েন্ট চক্র, তীব্রতা থ্রেশহোল্ড, চ্যানেল প্রস্থ ইত্যাদির মতো প্যারামিটার সেট করার জন্য প্রচুর বিকল্প সরবরাহ করে, যা ব্যবসায়ীদের বিভিন্ন ট্রেডিং জাত, সময়কাল এবং ব্যক্তিগত ঝুঁকির পছন্দ অনুসারে সূক্ষ্ম সমন্বয় করতে দেয়।
দৃশ্যমানতা ভালোকৌশলঃ সমর্থন, প্রতিরোধ এবং ব্রেকিং পয়েন্টগুলি চার্টে দৃশ্যমানভাবে প্রদর্শিত হয়, বিভিন্ন রঙগুলি বিভিন্ন ধরণের অঞ্চলকে প্রতিনিধিত্ব করে (প্রতিরোধ, সমর্থন বা মধ্যবর্তী অঞ্চল) যা ব্যবসায়ীদের বাজারের কাঠামো এবং সম্ভাব্য ব্যবসায়ের সুযোগগুলি আরও স্বজ্ঞাতভাবে বুঝতে সহায়তা করে।
সমন্বিত চলমান গড়: কৌশলটি দুটি ভিন্ন প্যারামিটারের চলমান গড় যোগ করার অনুমতি দেয় ((SMA বা EMA বিকল্প), ট্রেডিং সিদ্ধান্তের জন্য অতিরিক্ত প্রবণতা বিশ্লেষণের দৃষ্টিকোণ প্রদান করে, বিশেষ করে যারা একাধিক প্রযুক্তিগত সূচকগুলির সাথে ট্রেডিংয়ের অভ্যাস করে তাদের জন্য উপযুক্ত।
লেনদেনের খরচ বিবেচনাকৌশলটি ট্রেডিং কমিশন (০.১%) এর হিসাবের সাথে অন্তর্ভুক্ত করা হয়েছে, যা ট্রেডিং পরিবেশের সাথে সম্পর্কিত এবং ট্রেডারদের আরও বাস্তবসম্মত প্রত্যাশা পরিচালনা করতে সহায়তা করে।
সমাধান
সমাধান: নির্দিষ্ট ট্রেডিং প্রজাতি এবং সময়কালের জন্য সর্বোত্তম প্যারামিটার সমন্বয় খুঁজে বের করার জন্য, রিয়েল-টাইম ট্রেডিংয়ের আগে পর্যাপ্ত প্যারামিটার অপ্টিমাইজেশন এবং পুনরাবৃত্তি করার পরামর্শ দেওয়া হয়।
সমাধান: বাজার পরিবেশে সনাক্তকরণ ব্যবস্থা যুক্ত করা যেতে পারে, বিভিন্ন বাজার অবস্থার উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে কৌশলগত প্যারামিটারগুলি সামঞ্জস্য করতে বা লেনদেন স্থগিত করতে পারে।
সমাধান: স্টপ স্ট্র্যাটেজি যোগ করার পরামর্শ দেওয়া হয়, যেমন প্রতিরোধের অঞ্চলের সমর্থন ভিত্তিক স্টপ পয়েন্ট সেট করা, অথবা মোবাইল স্টপ মেকানিজম সুরক্ষা ব্যবহার করা।
সমাধান: ঐতিহাসিক তথ্যের পরিসীমা পরিবর্তন করা অথবা অন্যান্য বাজার কাঠামোর পরিবর্তনের জন্য পরীক্ষামূলক পদ্ধতি যোগ করা।
ইন্টিগ্রেটেড ট্রাফিক বিশ্লেষণবর্তমান কৌশলটি কেবলমাত্র মূল্যের তথ্যের উপর ভিত্তি করে সিদ্ধান্ত নেওয়ার জন্য এবং একটি ব্রেকআপ সিগন্যালের নির্ভরযোগ্যতা বাড়ানোর জন্য লেনদেনের পরিমাণ বিশ্লেষণের সমন্বয় করার পরামর্শ দেওয়া হয়। লেনদেনের পরিমাণ সাধারণত সত্যিকারের ব্রেকআপের সময় উল্লেখযোগ্যভাবে বৃদ্ধি পায়, এই বৈশিষ্ট্যটি অনেকগুলি মিথ্যা ব্রেকআপ সংকেতগুলিকে ফিল্টার করতে সহায়তা করে। লেনদেনের পরিমাণ হ্রাসের শর্ত যুক্ত করে এটি বাস্তবায়ন করা যেতে পারে, কেবলমাত্র যখন ব্রেকআপটি যথেষ্ট পরিমাণে ব্রেকআপের সাথে থাকে তখনই একটি লেনদেনের সংকেত ট্রিগার করা যায়।
ডায়নামিক স্টপ লস মেকানিজমকৌশলটিতে একটি বুদ্ধিমান স্টপ সিস্টেম যুক্ত করুন, যেমন এটিআর ভিত্তিক স্টপ দূরত্ব সেট করা, বা পার্শ্ববর্তী সমর্থন প্রতিরোধের অঞ্চলগুলিকে স্টপ রেফারেন্স পয়েন্ট হিসাবে ব্যবহার করা। এটি কেবলমাত্র একক লেনদেনের ঝুঁকি নিয়ন্ত্রণ করতে পারে না, তবে বাজার অস্থিরতার ভিত্তিতে স্বয়ংক্রিয়ভাবে ঝুঁকির প্রান্তটি সামঞ্জস্য করতে পারে।
ট্রেন্ড ফিল্টার যোগ করুন: প্রবণতা সনাক্তকরণ ব্যবস্থা চালু করা হয়েছে, যা শক্তিশালী প্রবণতা দিকের ট্রেডিংয়ের অনুমতি দেয় এবং প্রবণতা বিপরীত দিকের বিরতি সংকেত সম্পর্কে আরও সতর্ক থাকে। এটি দীর্ঘমেয়াদী চলমান গড়ের স্লাইডিং বিশ্লেষণ করে বা এডিএক্স (অর্থাত্ গড় দিকের সূচক) এর মতো প্রবণতা শক্তির সূচক ব্যবহার করে এটি করা যেতে পারে।
সময় ফিল্টার যোগ করুনকিছু নির্দিষ্ট সময়ের মধ্যে (যেমন বাজার খোলার আগে বা বন্ধ হওয়ার আগে) ব্রেকআপগুলি আরও অবিশ্বস্ত হতে পারে। সময় ফিল্টারিং বৈশিষ্ট্য যুক্ত করা, পরিসংখ্যানগতভাবে অনুকূল সময়ের মধ্যে লেনদেন এড়ানো, সামগ্রিক বিজয় হার বাড়িয়ে তুলতে পারে।
জোনাল স্ট্রেংথ অ্যালগরিদম অপ্টিমাইজ করা: বর্তমান দৃঢ়তা মূল্যায়ন অ্যালগরিদমগুলি আরও উন্নত করা যেতে পারে, যেমন যে কোনও বয়সের বয়সের বয়স বিবেচনা করা (যেমন, নতুন বিন্দুগুলি আরও বেশি প্রাসঙ্গিক হতে পারে) বা অঞ্চল পুনরাবৃত্তির পরীক্ষার সংখ্যা (যেমন, একাধিকবার পরীক্ষা করা হয়েছে কিন্তু যে অঞ্চলটি ভেঙে যায়নি সেগুলি সম্ভবত উচ্চতর হতে পারে) ।
পজিশন ম্যানেজমেন্ট লজিক যোগ করুন: আঞ্চলিক শক্তি, বাজার অস্থিরতা বা অন্যান্য ঝুঁকির কারণগুলির উপর ভিত্তি করে পজিশনের আকারের গতিশীল সমন্বয়, উচ্চ আত্মবিশ্বাসের ক্ষেত্রে পজিশন বৃদ্ধি, উচ্চ ঝুঁকির ক্ষেত্রে খোলার হ্রাস।
অভিযোজিত পরামিতি প্রয়োগ করুন: গুরুত্বপূর্ণ পরামিতিগুলি (যেমন টার্নপয়েন্টের সময়কাল, চ্যানেলের প্রস্থ ইত্যাদি) স্ব-অনুকূলিতকরণের জন্য ডিজাইন করা হয়েছে, যা বাজারের অস্থিরতা বা অন্যান্য অবস্থার উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে সামঞ্জস্য করতে পারে, যা মানুষের জন্য পরামিতি নির্বাচনের স্বতন্ত্রতা হ্রাস করে।
ডায়নামিক ব্রেকিং মাস্টার চ্যানেল কৌশল একটি প্রযুক্তিগতভাবে উন্নত, অত্যন্ত নমনীয় ট্রেডিং সিস্টেম, যার মূল সুবিধা হল বাজারের মূল প্রতিরোধের অঞ্চলের গতিশীলভাবে সনাক্ত এবং মূল্যায়ন করা এবং এই অঞ্চলে বিরতি দেওয়ার সময় সম্ভাব্য ব্যবসায়ের সুযোগগুলি ধরা। সুনির্দিষ্টভাবে ডিজাইন করা টার্নপয়েন্ট সনাক্তকরণ অ্যালগরিদম এবং অঞ্চল শক্তির মূল্যায়ন প্রক্রিয়া দ্বারা, কৌশলটি বিভিন্ন বাজার পরিবেশের সাথে খাপ খাইয়ে নিতে সক্ষম, যা তুলনামূলকভাবে নির্ভরযোগ্য প্রবেশের সংকেত সরবরাহ করে।
কৌশলটির কাস্টমাইজযোগ্যতা এর আরেকটি বড় বৈশিষ্ট্য, যার সমৃদ্ধ প্যারামিটার বিকল্পগুলি ব্যবসায়ীদের ব্যক্তিগত পছন্দ এবং ট্রেডিং জাতের বৈশিষ্ট্য অনুসারে সূক্ষ্ম সমন্বয় করতে দেয়। তদতিরিক্ত, কৌশলটির ভিজ্যুয়ালাইজেশন খুব স্বজ্ঞাত, প্রতিরোধের অঞ্চল এবং ব্রেকপয়েন্টের স্পষ্ট চিহ্নিতকরণ ব্যবসায়ীদের বাজারের কাঠামো এবং ট্রেডিং লজিককে আরও ভালভাবে বুঝতে সহায়তা করে।
যাইহোক, এই কৌশলটির কিছু সীমাবদ্ধতা রয়েছে, যেমন ভুয়া বিরতির ঝুঁকি এবং বিল্ট-ইন স্টপ মেশিনের অভাব। কৌশলটির কার্যকারিতা আরও বাড়ানোর জন্য, এটি প্রস্তাবিত যে উন্নত দিকগুলি যেমন ট্র্যাফিক বিশ্লেষণের সংহতকরণ, বুদ্ধিমান স্টপ সিস্টেম যুক্ত করা, ট্রেন্ড ফিল্টার প্রবর্তন এবং আঞ্চলিক শক্তির অ্যালগরিদমের অপ্টিমাইজেশন বিবেচনা করা উচিত। এই অপ্টিমাইজেশনগুলি কৌশলটির নির্ভরযোগ্যতা এবং মুনাফার স্থায়িত্ব বাড়াতে সহায়তা করবে।
বাস্তবে, ব্যবসায়ীরা তাদের নিজস্ব ঝুঁকি সহনশীলতা এবং বাজারের অভিজ্ঞতার সাথে মিলিত হওয়া উচিত, পর্যাপ্ত প্রতিক্রিয়া এবং ট্রেডিং মডেলিংয়ের মাধ্যমে কৌশলগত প্যারামিটারগুলির সাথে পরিচিত এবং অনুকূলিতকরণ করা উচিত, অন্ধভাবে সংকেত ট্রেডিংয়ের অনুসরণ করা এড়ানো উচিত। একই সাথে, এই কৌশলটি একটি সম্পূর্ণ ট্রেডিং সিস্টেমের অংশ হিসাবে ব্যবহার করা উচিত, অন্যান্য বিশ্লেষণ সরঞ্জাম এবং ঝুঁকি পরিচালনার নিয়মের সাথে মিলিত হয়ে আরও আদর্শ ট্রেডিং ফলাফল অর্জন করা সম্ভব।
/*backtest
start: 2024-09-19 00:00:00
end: 2025-03-01 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © tradingbauhaus
//@version=6
strategy("Dynamic Breakout Master by tradingbauhaus ", overlay=true, max_bars_back=501, commission_type=strategy.commission.percent, commission_value=0.1)
// My Custom Inputs
myperiod = input.int(10, "Pivot Period", minval=4, maxval=30, group="Settings", tooltip="Bars on each side for pivots")
mysource = input.string("High/Low", "Data Source", options=["High/Low", "Close/Open"], group="Settings", tooltip="Where I grab pivots from")
mychannelwidth = input.int(5, "Max Channel Width %", minval=1, maxval=8, group="Settings", tooltip="Percentage based on 300 bars")
mystrength = input.int(1, "Min Strength", minval=1, group="Settings", tooltip="Min pivots per channel")
mymaxzones = input.int(6, "Max S/R Zones", minval=1, maxval=10, group="Settings", tooltip="Max S/R zones to show") - 1
mylookback = input.int(290, "Lookback Period", minval=100, maxval=400, group="Settings", tooltip="Bars back to check pivots")
myrescolor = input.color(color.new(color.red, 75), "Resistance Tone", group="Colors")
mysupcolor = input.color(color.new(color.blue, 75), "Support Tone", group="Colors")
myincolor = input.color(color.new(color.gray, 75), "In-Channel Tone", group="Colors")
myshowpivots = input.bool(false, "Show Pivots", group="Extras")
myshowbreaks = input.bool(false, "Show Breaks", group="Extras")
myma1_on = input.bool(false, "MA1 On", group="Extras")
myma1_len = input.int(50, "MA1 Length", minval=1, group="Extras")
myma1_type = input.string("SMA", "MA1 Type", options=["SMA", "EMA"], group="Extras")
myma2_on = input.bool(false, "MA2 On", group="Extras")
myma2_len = input.int(200, "MA2 Length", minval=1, group="Extras")
myma2_type = input.string("SMA", "MA2 Type", options=["SMA", "EMA"], group="Extras")
// Define commission as a constant (for display purposes, since strategy() already uses it)
mycommission = 0.1 // Matches commission_value in strategy(); adjust here if needed
// Calculate my moving averages
myma1 = myma1_on ? myma1_type == "SMA" ? ta.sma(close, myma1_len) : ta.ema(close, myma1_len) : na
myma2 = myma2_on ? myma2_type == "SMA" ? ta.sma(close, myma2_len) : ta.ema(close, myma2_len) : na
plot(myma1, color=not na(myma1) ? color.blue : na)
plot(myma2, color=not na(myma2) ? color.red : na)
// My custom data sources
float myhigh = mysource == "High/Low" ? high : math.max(close, open)
float mylow = mysource == "High/Low" ? low : math.min(close, open)
float mypeak = ta.pivothigh(myhigh, myperiod, myperiod)
float myvalley = ta.pivotlow(mylow, myperiod, myperiod)
// Draw pivots if I want
plotshape(not na(mypeak) and myshowpivots, text="P", style=shape.labeldown, color=na, textcolor=color.new(color.red, 0), location=location.abovebar, offset=-myperiod)
plotshape(not na(myvalley) and myshowpivots, text="V", style=shape.labelup, color=na, textcolor=color.new(color.blue, 0), location=location.belowbar, offset=-myperiod)
// Calculate max channel width
mytop = ta.highest(300)
mybottom = ta.lowest(300)
mymaxwidth = (mytop - mybottom) * mychannelwidth / 100
// Store my pivots with flair
var float[] myvalues = array.new_float(0)
var float[] mypositions = array.new_float(0)
if not na(mypeak) or not na(myvalley)
array.unshift(myvalues, not na(mypeak) ? mypeak : myvalley)
array.unshift(mypositions, bar_index)
for x = array.size(myvalues) - 1 to 0
if bar_index - array.get(mypositions, x) > mylookback
array.pop(myvalues)
array.pop(mypositions)
continue
break
// My channel-making function
my_channel(ind) =>
float base = array.get(myvalues, ind)
float ceiling = base
float floor = base
int strength = 0
for y = 0 to array.size(myvalues) - 1
float level = array.get(myvalues, y)
float gap = level <= ceiling ? ceiling - level : level - floor
if gap <= mymaxwidth
if level <= ceiling
floor := math.min(floor, level)
else
ceiling := math.max(ceiling, level)
strength += 20
[ceiling, floor, strength]
// My S/R zones and swap function
var float[] sr_zones = array.new_float(20, 0)
myswap(x, y) =>
temp = array.get(sr_zones, y * 2)
array.set(sr_zones, y * 2, array.get(sr_zones, x * 2))
array.set(sr_zones, x * 2, temp)
temp := array.get(sr_zones, y * 2 + 1)
array.set(sr_zones, y * 2 + 1, array.get(sr_zones, x * 2 + 1))
array.set(sr_zones, x * 2 + 1, temp)
// Main logic with my twist
if not na(mypeak) or not na(myvalley)
float[] levels = array.new_float(0)
float[] power = array.new_float(10, 0)
for x = 0 to array.size(myvalues) - 1
[c, f, s] = my_channel(x)
array.push(levels, s)
array.push(levels, c)
array.push(levels, f)
for x = 0 to array.size(myvalues) - 1
highlvl = array.get(levels, x * 3 + 1)
lowlvl = array.get(levels, x * 3 + 2)
boost = 0
for y = 0 to mylookback
if high[y] <= highlvl and high[y] >= lowlvl or low[y] <= highlvl and low[y] >= lowlvl
boost += 1
array.set(levels, x * 3, array.get(levels, x * 3) + boost)
array.fill(sr_zones, 0)
counter = 0
for x = 0 to array.size(myvalues) - 1
maxpower = -1.
maxspot = -1
for y = 0 to array.size(myvalues) - 1
if array.get(levels, y * 3) > maxpower and array.get(levels, y * 3) >= mystrength * 20
maxpower := array.get(levels, y * 3)
maxspot := y
if maxspot >= 0
top = array.get(levels, maxspot * 3 + 1)
bottom = array.get(levels, maxspot * 3 + 2)
array.set(sr_zones, counter * 2, top)
array.set(sr_zones, counter * 2 + 1, bottom)
array.set(power, counter, array.get(levels, maxspot * 3))
for y = 0 to array.size(myvalues) - 1
if array.get(levels, y * 3 + 1) <= top and array.get(levels, y * 3 + 1) >= bottom or array.get(levels, y * 3 + 2) <= top and array.get(levels, y * 3 + 2) >= bottom
array.set(levels, y * 3, -1)
counter += 1
if counter >= 10
break
for x = 0 to 8
for y = x + 1 to 9
if array.get(power, y) > array.get(power, x)
temp = array.get(power, y)
array.set(power, y, array.get(power, x))
myswap(x, y)
// My level and color functions
mylevel(ind) =>
float result = na
if ind < array.size(sr_zones) and array.get(sr_zones, ind) != 0
result := array.get(sr_zones, ind)
result
mycolor(ind) =>
color shade = na
if ind < array.size(sr_zones) and array.get(sr_zones, ind) != 0
shade := array.get(sr_zones, ind) > close and array.get(sr_zones, ind + 1) > close ? myrescolor : array.get(sr_zones, ind) < close and array.get(sr_zones, ind + 1) < close ? mysupcolor : myincolor
shade
// Detect breaks
resistancebroken = false
supportbroken = false
outofzone = true
for x = 0 to math.min(9, mymaxzones)
if close <= array.get(sr_zones, x * 2) and close >= array.get(sr_zones, x * 2 + 1)
outofzone := false
if outofzone
for x = 0 to math.min(9, mymaxzones)
if close[1] <= array.get(sr_zones, x * 2) and close > array.get(sr_zones, x * 2)
resistancebroken := true
if close[1] >= array.get(sr_zones, x * 2 + 1) and close < array.get(sr_zones, x * 2 + 1)
supportbroken := true
// Alerts and shapes
alertcondition(resistancebroken, title="ResBreak", message="Resistance shattered!")
alertcondition(supportbroken, title="SupBreak", message="Support cracked!")
plotshape(myshowbreaks and resistancebroken, style=shape.triangleup, location=location.belowbar, color=color.new(color.blue, 0), size=size.tiny)
plotshape(myshowbreaks and supportbroken, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.tiny)
// Strategy with commissions factored in
if resistancebroken
strategy.entry("ResBreak", strategy.long)
if supportbroken
strategy.entry("SupBreak", strategy.short)