এই কৌশলটি এহেলার্স ইলেগ্যান্ট দোলক, এহেলার্স ডিসাইক্লার, এহেলার্স তাত্ক্ষণিক ট্রেন্ডলাইন এবং এহেলার্স স্পিয়ারম্যান র্যাঙ্ক ক্যারেলেশন সহগকে এক কৌশলতে একত্রিত করে, একটি পরিমাণগত ট্রেডিং কৌশল গঠন করে যা প্রবণতা, দোলন, গতি এবং মূল্য এবং ভলিউম বৈশিষ্ট্যগুলি সম্পূর্ণরূপে ক্যাপচার করে। কৌশলটির নাম
এই কৌশলটি বিচার করার জন্য চারটি মূল সূচক ব্যবহার করে।
প্রথমত, এহেলার্স ইলেগ্যান্ট দোলক, যেখানে মূল লাইন এবং সিগন্যাল লাইনের মধ্যে পার্থক্য একটি এক্সপোনেনশিয়াল চলমান গড় দ্বারা মসৃণ করা বর্তমান প্রবণতা দিক এবং শক্তি নির্ধারণ করতে পারে। দ্বিতীয়ত, এহেলার্স ডিসাইক্লার, যা কার্যকরভাবে চক্রের নিম্ন পয়েন্টগুলি সনাক্ত করতে পারে এবং প্রধান প্রবণতা বিপরীত হয় কিনা তা নির্ধারণ করতে পারে। পরবর্তী, এহেলার্স তাত্ক্ষণিক ট্রেন্ডলাইন স্বল্পমেয়াদী প্রবণতা দিকগুলি বিচার করার জন্য দ্রুত চলমান গড়গুলি ট্র্যাক করে। অবশেষে, এহেলার্স স্পিয়ারম্যান র্যাঙ্ক ক্যারেলেশন সহগামী মূল্য-ভলিউম সম্পর্ককে বিচার করে, যা কার্যকরভাবে মিথ্যা ব্রেকআউটগুলি ফিল্টার করতে পারে।
বিশেষ করে, কৌশলটির জন্য চারটি প্রবেশের শর্ত হলঃ ইলেগ্যান্ট অস্সিলেটর সিগন্যাল লাইন এবং ডিসাইক্লার সিগন্যাল লাইন একযোগে 0 এর উপরে ভাঙবে; মূল লাইনটি ডিসাইক্লার লাইনের উপরে ভাঙবে; মূল লাইনটি উঠতি তাত্ক্ষণিক ট্রেন্ডলাইনের চেয়ে বেশি হবে; এবং একটি ইতিবাচক স্পিয়ারম্যান র্যাঙ্ক ক্যারেলেশন কোয়ালিফায়ার।
প্রস্থান শর্তগুলি অনেক সহজঃ যখন মূল লাইনটি তাত্ক্ষণিক ট্রেন্ড লাইনের নীচে পড়ে তখন প্রস্থান করা।
সংক্ষিপ্ত শর্তগুলি দীর্ঘ শর্তগুলির অনুরূপ, শুধুমাত্র বিপরীত।
এই কৌশলটির সবচেয়ে বড় সুবিধা হ'ল সূচকগুলির যথাযথ সংমিশ্রণ, যা কার্যকরভাবে প্রতিটি সূচকের শক্তিকে কাজে লাগাতে পারে, একে অপরকে যাচাই করতে পারে, মিথ্যা ইতিবাচকতা এড়াতে পারে, প্রচুর শব্দ ফিল্টার করতে পারে এবং আরও নির্ভরযোগ্য সংকেত তৈরি করতে পারে।
বিশেষত, মার্জিত দোলক প্রবণতা দিক এবং শক্তি বিচার করতে পারে, ডিসাইক্লার চক্রের বাঁক পয়েন্ট বিচার করতে পারে, তাত্ক্ষণিক ট্রেন্ডলাইন স্বল্পমেয়াদী প্রবণতা বিচার করতে পারে এবং স্পিয়ারম্যান র্যাঙ্ক মূল্য-ভলিউম সম্পর্ক বিচার করতে পারে। চারটির সংমিশ্রণটি প্রবণতা, চক্র, গতি এবং মূল্য-ভলিউমের দিক থেকে বাজারের বৈশিষ্ট্যগুলি ব্যাপকভাবে বিচার করতে পারে, যার ফলে অত্যন্ত নির্ভরযোগ্য ট্রেডিং সংকেত উত্পাদন করে।
উপরন্তু, শুধুমাত্র মাঝারি মেয়াদী মূল্যের রেফারেন্স হিসাবে, কৌশলটি স্বল্পমেয়াদী বাজার গোলমাল থেকে হস্তক্ষেপ এড়ায় এবং অপ্রয়োজনীয় বিপরীত ট্রেড হ্রাস করে। এছাড়াও, বিরল সংকেত এবং সহজ প্রস্থান নিয়মগুলির সাথে, ট্রেডিং ফ্রিকোয়েন্সি ব্যাপকভাবে হ্রাস করা যেতে পারে, অত্যধিক ট্রেডিং সমস্যা এড়ানো।
এই কৌশলটির সবচেয়ে বড় ঝুঁকি হ'ল স্টপ লস প্রক্রিয়াটির অভাব। হিংসাত্মক বাজারের আন্দোলনের ক্ষেত্রে, সময়মতো ক্ষতি বন্ধ করতে অক্ষমতা আরও বেশি ক্ষতির দিকে পরিচালিত করতে পারে। এটিতে ডনচিয়ান চ্যানেল এবং শক্তি সূচকগুলির মতো অতিরিক্ত ফিল্টারগুলির অভাব রয়েছে যা কিছু পরিমাণে মিথ্যা ইতিবাচক ব্যবসায়ের দিকে পরিচালিত করতে পারে।
এই ঝুঁকিগুলি হ্রাস করার জন্য, ক্ষতিগুলি নির্দিষ্ট স্তর অতিক্রম করার সময় স্বয়ংক্রিয়ভাবে ক্ষতি বন্ধ করতে একটি প্রতিরক্ষামূলক স্টপ লস সেট করা যেতে পারে। এছাড়াও, মিথ্যা ব্রেকআউট থেকে ঝুঁকি এড়ানোর জন্য মাধ্যমিক নিশ্চিতকরণের জন্য এমএসিডি এর মতো সূচক যুক্ত করা যেতে পারে।
কৌশলটি নিম্নলিখিত দিকগুলিতে অপ্টিমাইজ করা যেতে পারেঃ
একটি ঝুঁকি ব্যবস্থাপনা স্টপ লস প্রক্রিয়া যোগ করুন। উপযুক্ত স্টপ লস স্তর সেট করার জন্য সর্বোচ্চ ঐতিহাসিক ড্রাউনডাউন গণনা করুন।
আরও ফিল্টার যোগ করুন। আরও ফিল্টারিংয়ের জন্য MACD, Bollinger Bands এর মত সূচক যোগ করুন যাতে মিথ্যা সংকেত আরও কম হয়।
আরো টাইমফ্রেম অন্তর্ভুক্ত করুন। বর্তমানে শুধুমাত্র একটি সেট প্যারামিটার ব্যবহার করা হয়। স্থিতিশীলতা উন্নত করার জন্য মাল্টি-টাইমফ্রেম যাচাইয়ের জন্য আরো টাইমফ্রেম যোগ করা যেতে পারে।
গতিশীলভাবে পরামিতিগুলি সামঞ্জস্য করুন। অভিযোজনযোগ্যতা উন্নত করার জন্য বাজারের পরিবর্তিত অবস্থার উপর ভিত্তি করে গতিশীলভাবে সূচক পরামিতিগুলি সামঞ্জস্য করতে প্যারামিটার অপ্টিমাইজেশন যুক্ত করুন।
ক্রস-অ্যাসেট আরবিট্রেজঃ ঝুঁকি নিয়ন্ত্রণের জন্য আরবিট্রেজের সুযোগ খুঁজতে বিভিন্ন সম্পদের উপর কৌশল প্রয়োগ করুন।
এই কৌশলটি চতুরভাবে 4 টি প্রধান এহেলার্স সূচককে একত্রিত করে একটি কৌশল গঠন করে যা প্রবণতা, চক্র, গতি এবং মূল্য-ভলিউমকে সমস্ত দিক থেকে বিচার করে। এটিতে দুর্দান্ত গোলমাল ফিল্টারিং ক্ষমতা রয়েছে এবং উচ্চ মানের সংকেত তৈরি করতে পারে। তবে স্টপ লস এবং সহায়ক সূচক ফিল্টারিংয়ের অভাব এটিকে কিছু ঝুঁকির মুখোমুখি করে। স্টপ লস, ফিল্টার, আরও সময়সীমা ইত্যাদি যুক্ত করে এটি উচ্চতর স্থিতিশীলতা এবং নির্ভরযোগ্যতার জন্য কার্যকরভাবে অনুকূলিত করা যেতে পারে।
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 2h basePeriod: 15m 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/ // © simwai //@version=5 strategy('Ehlers Elegant Oscillator + Ehlers Decycler + Ehlers Instantaneous + Ehlers Spearman Rank', 'Ehlers Combo', overlay=true, margin_long=100, margin_short=100) // -- Inputs -- inp = input(title='Source', defval=close) res = input.timeframe(title='Resolution', defval='') bar = input(title='Allow Bar Color Change?', defval=true) src = inp length = input.int(title='Length', defval=20, minval=2, maxval=300) rmsLength = input.int(title='Rms Length', defval=50, minval=2) decyclerLength = length // -- Calculation -- // Ehlers Elegant Oscillator a1 = math.exp(-1.414 * math.pi / length) b1 = 2 * a1 * math.cos(1.414 * math.pi / length) c2 = b1 c3 = -a1 * a1 c1 = 1 - c2 - c3 deriv = src - nz(src[2]) rms = math.avg(math.pow(deriv, 2), rmsLength) rms := rms != 0 ? math.sqrt(rms) : 0 nDeriv = rms != 0 ? deriv / rms : 0 iFish = nDeriv != 0 ? (math.exp(2 * nDeriv) - 1) / (math.exp(2 * nDeriv) + 1) : 0 ss = 0.0 ss := bar_index < 3 ? 0 : (c1 * ((iFish + nz(iFish[1])) / 2)) + (c2 * nz(ss[1])) + (c3 * nz(ss[2])) ssSig = ta.wma(ss, length) slo = ss - ssSig sig = slo > 0 ? slo > nz(slo[1]) ? 2 : 1 : slo < 0 ? slo < nz(slo[1]) ? -2 : -1 : 0 eoColor = sig > 1 ? color.green : sig > 0 ? color.lime : sig < -1 ? color.maroon : sig < 0 ? color.red : color.black hline(0) plot(ssSig, title='EO', color=eoColor, linewidth=2) // Ehlers Decycler pi = 2 * math.asin(1) twoPiPrd = 2 * pi / decyclerLength alpha = (math.cos(twoPiPrd) + math.sin(twoPiPrd) - 1) / math.cos(twoPiPrd) dec = 0.0 dec := ((alpha / 2) * (src + nz(src[1]))) + ((1 - alpha) * nz(dec[1])) decyclerSig = src > dec ? 1 : src < dec ? -1 : 0 decColor = decyclerSig > 0 ? color.green : decyclerSig < 0 ? color.red : color.black plot(dec, title='Decycler', color=decColor, linewidth=2) // Ehlers Instantaneous Trendline getItrend(src, alpha) => Price = src Smooth = 0.0 ITrend = 0.0 Trigger = 0.0 ITrend := (alpha - alpha * alpha / 4) * Price + .5 * alpha * alpha * Price[1] - (alpha - .75 * alpha * alpha) * Price[2] + 2 * (1 - alpha) * nz(ITrend[1]) - (1 - alpha) * (1 - alpha) * nz(ITrend[2]) if(bar_index < 7) ITrend := (Price + 2 * Price[1] + Price[2]) / 4 Trigger := 2 * ITrend - ITrend[2] [ITrend, Trigger] itrendAlpha = 2 / (length + 1) / 2 [iT, Tr] = getItrend(src, itrendAlpha) iTColor = Tr > iT ? color.aqua : color.maroon plot(iT, 'Instantaneous Trend', iTColor, 2) // Ehlers Spearman Rank priceArray = array.new_float(300, 0.0) rank = array.new_float(300, 0.0) for i = 1 to length array.set(priceArray, i, nz(src[i - 1])) array.set(rank, i, i) for i = 1 to length count = length + 1 - i for j = 1 to length - count if array.get(priceArray, j + 1) < array.get(priceArray, j) tempPrice = array.get(priceArray, j) tempRank = array.get(rank, j) array.set(priceArray, j, array.get(priceArray, j + 1)) array.set(rank, j, array.get(rank, j + 1)) array.set(priceArray, j + 1, tempPrice) array.set(rank, j + 1, tempRank) sum = 0.0 for i = 1 to length sum := sum + math.pow(i - array.get(rank, i), 2) signal = 2 * (0.5 - (1 - ((6 * sum) / (length * (math.pow(length, 2) - 1))))) spearmanSlo = signal - nz(signal[1]) spearmanSig = spearmanSlo > 0 or signal > 0 ? spearmanSlo > nz(spearmanSlo[1]) ? 2 : 1 : spearmanSlo < 0 or signal < 0 ? spearmanSlo < nz(spearmanSlo[1]) ? -2 : -1 : 0 // -- Signals -- bool enterLong = ta.crossover(sig, 0) and ta.crossover(decyclerSig, 0) and ta.crossover(src, dec) and (src > iT) and iT[1] < iT and spearmanSig > 0 bool enterShort = ta.crossunder(sig, 0) and ta.crossunder(decyclerSig, 0) and ta.crossunder(src, dec) and (src < iT) and iT[1] > iT and spearmanSig < 0 bool exitLong = ta.crossunder(src[100], iT) bool exitShort = ta.crossover(src[100], iT) barcolor(bar and strategy.position_size > 0 ? color.green : bar and strategy.position_size < 0 ? color.red : color.gray) // -- Long Exits -- strategy.close('long', when=exitLong and strategy.position_size > 0, comment='EXIT_LONG') // -- Short Exits -- strategy.close('short', when=exitShort and strategy.position_size < 0, comment='EXIT_SHORT') bool isStrategyEntryEnabled = true // -- Long Entries -- if (isStrategyEntryEnabled) strategy.entry('long', strategy.long, when=enterLong, comment='ENTER_LONG') else strategy.order('long', strategy.long, when=enterLong, comment='ENTER_LONG') // -- Short Entries -- if (isStrategyEntryEnabled) strategy.entry('short', strategy.short, when=enterShort, comment='ENTER_SHORT') else strategy.order('short', strategy.short, when=enterShort, comment='ENTER_SHORT')