डबल एक्सपोनेंशियल मूविंग एवरेज ट्रेंड फॉलोइंग स्ट्रैटेजी एक ट्रेंड फॉलोइंग स्ट्रैटेजी है जो एक्सपोनेंशियल मूविंग एवरेज (ईएमए) क्रॉसओवर पर आधारित है। यह तेज ईएमए लाइन और धीमी ईएमए लाइन की गणना करके वर्तमान ट्रेंड की दिशा का न्याय करता है और उनके क्रॉसओवर पर कार्य करता है। जब तेज ईएमए लाइन धीमी ईएमए लाइन के ऊपर से गुजरती है, तो इसे तेजी का संकेत माना जाता है। जब तेज ईएमए लाइन धीमी ईएमए लाइन के नीचे से गुजरती है, तो इसे मंदी का संकेत माना जाता है। पहचान की गई ट्रेंड दिशा के आधार पर, यह रणनीति तदनुसार लंबी या छोटी हो सकती है।
इस रणनीति का मूल तर्क विभिन्न अवधियों की दो ईएमए लाइनों की गणना में निहित है - एक मंदी रेखा के रूप में कार्य करता है और एक तेजी की रेखा के रूप में कार्य करता है। विशेष रूप से, रणनीति तेजी की रेखा के रूप में तालिब संकेतक का उपयोग करके 8-अवधि तेज ईएमए लाइन की गणना करती है। और यह मंदी रेखा के रूप में 21-अवधि धीमी ईएमए लाइन की गणना करती है। फिर यह तेजी से ईएमए लाइन और धीमी ईएमए लाइन के बीच क्रॉसओवर संबंधों का न्याय करती है। जब तेज रेखा धीमी रेखा के ऊपर पार करती है, तो यह लंबे समय तक जाने के लिए एक तेजी से संकेत निर्धारित करती है। जब तेज रेखा धीमी रेखा से नीचे पार करती है, तो यह कम जाने के लिए एक मंदी संकेत निर्धारित करती है।
वास्तविक व्यापार निष्पादन के संदर्भ में, यह रणनीति केवल लंबी, केवल छोटी, या दोनों तरह से जा सकती है जब तेज और धीमी लाइनों के बीच क्रॉसओवर होता है। इसके अलावा, स्टॉप लॉस और टेक प्रॉफिट की कीमतें रणनीति में कॉन्फ़िगर की जाती हैं। पदों को खोलने के बाद, यदि मूल्य प्रतिकूल दिशा में जाता है, तो स्टॉप लॉस को एक्जिट पदों के लिए ट्रिगर किया जाएगा। यदि कीमत अपेक्षित लक्ष्य स्तर तक पहुंच जाती है, तो लाभ प्राप्त करें और पदों को बंद करें।
ड्यूल ईएमए ट्रेंड फॉलोइंग रणनीति का सबसे बड़ा लाभ चलती औसत क्रॉसओवर की शक्तिशाली ट्रेंड पहचान क्षमता में निहित है। ट्रेंड विश्लेषण के लिए एक सामान्य उपकरण के रूप में, ईएमए लाइनें क्रॉसओवर के माध्यम से ट्रेंड शिफ्ट और टर्निंग पॉइंट की पहचान कर सकती हैं, जिससे बाजार के शोर से गुमराह होने से बचा जा सकता है।
इसके अलावा, व्यापार दिशाओं पर लचीली सेटिंग्स रणनीति को एकतरफा रुझानों और दोतरफा उतार-चढ़ाव दोनों के अनुकूल बनाती है, इस प्रकार रणनीति की प्रयोज्यता को बढ़ाती है। कॉन्फ़िगर किए गए स्टॉप लॉस और ले लाभ जोखिम को नियंत्रित करता है और आंशिक लाभ में लॉक करता है।
इस रणनीति का सबसे बड़ा जोखिम सीमा-बंद बाजारों के तहत अक्सर छोटे क्रॉसओवर से ट्रिगर होने वाले झूठे संकेत हैं। इससे अत्यधिक स्थिति खोलने और नुकसान होगा। इससे निपटने के लिए, हम क्रॉसओवर समय और झूठे संकेत की संभावनाओं को कम करने के लिए ईएमए अवधि बढ़ा सकते हैं।
दूसरी ओर, एक बहुत तंग स्टॉप लॉस सेटिंग भी बंद होने की संभावना को बढ़ाता है। इस मामले में, हमें बंद होने के जोखिम को सावधानीपूर्वक संतुलित करते हुए स्टॉप लॉस रेंज का विस्तार करने की आवश्यकता है।
इस रणनीति को निम्नलिखित पहलुओं में और अधिक अनुकूलित किया जा सकता हैः
बाजार की अस्थिरता और बैकटेस्ट के परिणामों के आधार पर ईएमए अवधि पर अनुकूलन योग्य समायोजन, निश्चित अवधि के दौरान ओवरफिट से बचने के लिए।
झूठे संकेतों को फ़िल्टर करने के लिए फ़िल्टर शर्तें जोड़ना, उदाहरण के लिए, नगण्य क्रॉसओवर को फ़िल्टर करने के लिए ट्रेडिंग वॉल्यूम के साथ संयोजन करना; या अनिश्चितता में संकेतों से बचने के लिए MACD और KDJ जैसे अन्य संकेतकों का संयोजन करना।
स्टॉप लॉस और लाभ लेने की रणनीतियों का अनुकूलन करना, उदाहरण के लिए, SL/TP पर गतिशील ट्रैलिंग को प्राप्त करने के लिए ATR को जोड़ना, अत्यधिक तंग SL और समय से पहले TP को रोकना।
विभिन्न होल्डिंग अवधि का परीक्षण करना। बहुत लंबी होल्डिंग अवधि घटनाओं से प्रभावित हो सकती है, जबकि बहुत कम अवधि उच्च व्यापार लागत और फिसलने की लागत का कारण बनती है। इष्टतम होल्डिंग दिनों का पता लगाना रणनीति लाभप्रदता में सुधार कर सकता है।
सामान्य तौर पर, ड्यूल ईएमए ट्रेंड फॉलोइंग रणनीति एक मजबूत और व्यावहारिक ट्रेंड ट्रेडिंग सिस्टम है। यह ईएमए क्रॉसओवर सिस्टम के माध्यम से ट्रेंड दिशाओं को प्रभावी ढंग से पकड़ता है। इस बीच, व्यापार दिशाओं पर लचीली सेटिंग्स इसे अनुकूलन योग्य बनाती हैं; कॉन्फ़िगर किए गए स्टॉप लॉस और लाभ नियंत्रण जोखिम। आगे के अनुकूलन और सुधार के साथ, यह रणनीति मात्रात्मक व्यापार के लिए एक शक्तिशाली उपकरण बन सकती है।
/*backtest start: 2024-01-02 00:00:00 end: 2024-02-01 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © TradersPostInc //@version=5 strategy('TradersPost Example MOMO Strategy', overlay=true, default_qty_value=100, initial_capital=100000, default_qty_type=strategy.percent_of_equity, pyramiding=0) startTime = input(defval = timestamp('01 Jan 2021 00:00 +0000'), title = 'Start Time', group = 'Date Range') endTime = input(defval = timestamp('31 Dec 2023 23:59 +0000'), title = 'End Time', group = 'Date Range') timeCondition = true timeConditionEnd = timeCondition[1] and not timeCondition fastEmaLength = input.int(defval = 8, title = 'Fast EMA Length') slowEmaLength = input.int(defval = 21, title = 'Slow EMA Length') sides = input.string(defval = 'Both', title = 'Sides', options = ['Long', 'Short', 'Both', 'None']) fastEma = ta.ema(close, fastEmaLength) slowEma = ta.ema(close, slowEmaLength) isUptrend = fastEma >= slowEma isDowntrend = fastEma <= slowEma trendChanging = ta.cross(fastEma, slowEma) ema105 = request.security(syminfo.tickerid, '30', ta.ema(close, 105)[1], barmerge.gaps_off, barmerge.lookahead_on) ema205 = request.security(syminfo.tickerid, '30', ta.ema(close, 20)[1], barmerge.gaps_off, barmerge.lookahead_on) plot(ema105, linewidth=4, color=color.new(color.purple, 0), editable=true) plot(ema205, linewidth=2, color=color.new(color.purple, 0), editable=true) aa = plot(fastEma, linewidth=3, color=color.new(color.green, 0), editable=true) bb = plot(slowEma, linewidth=3, color=color.new(color.red, 0), editable=true) fill(aa, bb, color=isUptrend ? color.green : color.red, transp=90) tradersPostBuy = trendChanging and isUptrend and timeCondition tradersPostSell = trendChanging and isDowntrend and timeCondition pips = syminfo.pointvalue / syminfo.mintick percentOrPipsInput = input.string('Percent', title='Percent or Pips', options=['Percent', 'Pips']) stopLossLongInput = input.float(defval=0, step=0.01, title='Stop Loss Long', minval=0) stopLossShortInput = input.float(defval=0, step=0.01, title='Stop Loss Short', minval=0) takeProfitLongInput = input.float(defval=0, step=0.01, title='Target Profit Long', minval=0) takeProfitShortInput = input.float(defval=0, step=0.01, title='Target Profit Short', minval=0) stopLossPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (stopLossLongInput / 100) * pips stopLossPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (stopLossShortInput / 100) * pips takeProfitPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (takeProfitLongInput / 100) * pips takeProfitPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (takeProfitShortInput / 100) * pips takeProfitALong = takeProfitLongInput > 0 ? takeProfitLongInput : na takeProfitBLong = takeProfitPriceLong > 0 ? takeProfitPriceLong : na takeProfitAShort = takeProfitShortInput > 0 ? takeProfitShortInput : na takeProfitBShort = takeProfitPriceShort > 0 ? takeProfitPriceShort : na stopLossALong = stopLossLongInput > 0 ? stopLossLongInput : na stopLossBLong = stopLossPriceLong > 0 ? stopLossPriceLong : na stopLossAShort = stopLossShortInput > 0 ? stopLossShortInput : na stopLossBShort = stopLossPriceShort > 0 ? stopLossPriceShort : na takeProfitLong = percentOrPipsInput == 'Pips' ? takeProfitALong : takeProfitBLong stopLossLong = percentOrPipsInput == 'Pips' ? stopLossALong : stopLossBLong takeProfitShort = percentOrPipsInput == 'Pips' ? takeProfitAShort : takeProfitBShort stopLossShort = percentOrPipsInput == 'Pips' ? stopLossAShort : stopLossBShort buyAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "buy", "price": ' + str.tostring(close) + '}' sellAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "sell", "price": ' + str.tostring(close) + '}' exitLongAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}' exitShortAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}' if (sides != "None") if tradersPostBuy strategy.entry('Long', strategy.long, when = sides != 'Short', alert_message = buyAlertMessage) strategy.close('Short', when = sides == "Short" and timeCondition, alert_message = exitShortAlertMessage) if tradersPostSell strategy.entry('Short', strategy.short, when = sides != 'Long', alert_message = sellAlertMessage) strategy.close('Long', when = sides == 'Long', alert_message = exitLongAlertMessage) exitAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit"}' strategy.exit('Exit Long', from_entry = "Long", profit = takeProfitLong, loss = stopLossLong, alert_message = exitAlertMessage) strategy.exit('Exit Short', from_entry = "Short", profit = takeProfitShort, loss = stopLossShort, alert_message = exitAlertMessage) strategy.close_all(when = timeConditionEnd)