यह रणनीति एक रणनीति में एहल्स एलिगेंट ऑसिलेटर, एहल्स डेसाइक्लर, एहल्स इंस्टैंट ट्रेंडलाइन और एहल्स स्पीयरमैन रैंक सहसंबंध गुणांक को जोड़ती है, एक मात्रात्मक ट्रेडिंग रणनीति बनाती है जो पूरी तरह से रुझानों, दोलन, गति और मूल्य और मात्रा विशेषताओं को पकड़ती है। रणनीति का नाम
यह रणनीति न्याय के लिए चार प्रमुख संकेतकों का उपयोग करती है।
सबसे पहले, Ehlers Elegant Oscillator, जहां एक घातीय चलती औसत द्वारा चिकनी मूल रेखा और संकेत रेखा के बीच का अंतर वर्तमान प्रवृत्ति की दिशा और ताकत निर्धारित कर सकता है। दूसरा, Ehlers Decycler, जो प्रभावी रूप से चक्र के निचले बिंदुओं की पहचान कर सकता है और निर्धारित कर सकता है कि क्या प्रमुख प्रवृत्ति उलट रही है। इसके बाद, Ehlers Instantaneous Trendline अल्पकालिक प्रवृत्ति दिशाओं का न्याय करने के लिए तेजी से चलती औसत को ट्रैक करता है। अंत में, Ehlers Spearman रैंक सहसंबंध गुणांक मूल्य-मात्रा संबंध का न्याय करता है, जो प्रभावी रूप से झूठे ब्रेकआउट को फ़िल्टर कर सकता है।
विशेष रूप से, रणनीति के लिए प्रवेश की चार शर्तें हैंः सुरुचिपूर्ण ऑसिलेटर सिग्नल लाइन और डेसाइक्लर सिग्नल लाइन एक साथ 0 से ऊपर टूटती है; मूल लाइन डेसाइक्लर लाइन से ऊपर टूटती है; मूल लाइन बढ़ती तत्काल प्रवृत्ति रेखा से अधिक होती है; और एक सकारात्मक स्पीयरमैन रैंक सहसंबंध गुणांक।
बाहर निकलने की शर्तें बहुत सरल हैंः जब मूल रेखा तत्काल ट्रेंडलाइन से नीचे गिरती है तो बाहर निकलना।
छोटी शर्तें लंबी शर्तों के समान हैं, केवल उल्टा।
इस रणनीति का सबसे बड़ा लाभ संकेतकों के उचित संयोजन में निहित है, जो प्रत्येक संकेतकों की ताकत का प्रभावी ढंग से लाभ उठा सकते हैं, परस्पर सत्यापित कर सकते हैं, झूठी सकारात्मकता से बच सकते हैं, बहुत अधिक शोर को फ़िल्टर कर सकते हैं और अधिक विश्वसनीय संकेत उत्पन्न कर सकते हैं।
विशेष रूप से, सुरुचिपूर्ण थरथरानवाला प्रवृत्ति की दिशा और शक्ति का न्याय कर सकता है, Decycler चक्र मोड़ बिंदुओं का न्याय कर सकता है, तत्काल प्रवृत्ति रेखा अल्पकालिक प्रवृत्तियों का न्याय कर सकती है, और स्पीयरमैन रैंक मूल्य-मात्रा संबंध का न्याय कर सकता है। चार का संयोजन व्यापक रूप से प्रवृत्ति, चक्र, गति और मूल्य-मात्रा के संदर्भ में बाजार विशेषताओं का न्याय कर सकता है, इस प्रकार अत्यधिक विश्वसनीय व्यापार संकेतों का उत्पादन कर सकता है।
इसके अतिरिक्त, केवल मध्यम अवधि की कीमतों को संदर्भ के रूप में रखते हुए, रणनीति अल्पकालिक बाजार शोर से हस्तक्षेप से बचती है और अनावश्यक रिवर्स ट्रेडों को कम करती है। इसके अलावा, दुर्लभ संकेतों और सरल निकास नियमों के साथ, व्यापार आवृत्ति को काफी कम किया जा सकता है, ओवर-ट्रेडिंग समस्याओं से बचने के लिए।
इस रणनीति का सबसे बड़ा जोखिम एक स्टॉप लॉस तंत्र की कमी है। हिंसक बाजार आंदोलनों की स्थिति में, समय पर नुकसान को रोकने में असमर्थता से अधिक नुकसान हो सकता है। इसमें अतिरिक्त फ़िल्टर भी नहीं हैं जैसे कि डोनचियन चैनल और ऊर्जा संकेतक जो कुछ हद तक झूठे सकारात्मक ट्रेडों का कारण बन सकते हैं।
इन जोखिमों को कम करने के लिए, एक सुरक्षात्मक स्टॉप लॉस सेट किया जा सकता है ताकि नुकसान कुछ स्तरों से अधिक होने पर नुकसान को स्वचालित रूप से रोक दिया जा सके। इसके अलावा, झूठे ब्रेकआउट के जोखिमों से बचने के लिए माध्यमिक पुष्टि के लिए एमएसीडी जैसे संकेतक जोड़े जा सकते हैं।
इस रणनीति को निम्नलिखित पहलुओं में अनुकूलित किया जा सकता हैः
जोखिम प्रबंधन स्टॉप लॉस तंत्र जोड़ें। उचित स्टॉप लॉस स्तर निर्धारित करने के लिए अधिकतम ऐतिहासिक ड्रॉडाउन की गणना करें।
अधिक फ़िल्टर जोड़ें. झूठे संकेतों को और कम करने के लिए अधिक फ़िल्टरिंग के लिए MACD, बोलिंगर बैंड जैसे संकेतक जोड़ें.
अधिक समय सीमाओं को शामिल करें. वर्तमान में पैरामीटर का केवल एक सेट उपयोग किया जाता है. स्थिरता में सुधार के लिए बहु-समय सीमा सत्यापन के लिए अधिक समय सीमाओं को जोड़ा जा सकता है.
गतिशील रूप से मापदंडों को समायोजित करें। अनुकूलन क्षमता में सुधार के लिए बदलती बाजार स्थितियों के आधार पर गतिशील रूप से सूचक मापदंडों को समायोजित करने के लिए मापदंड अनुकूलन में जोड़ें।
क्रॉस-एसेट आर्बिट्रेज. जोखिमों को बेहतर ढंग से नियंत्रित करने के लिए आर्बिट्रेज के अवसरों की तलाश करने के लिए विभिन्न परिसंपत्तियों पर रणनीति लागू करें।
यह रणनीति चतुराई से 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')