यह रणनीति एमएसीडी संकेतक की तेज रेखा और धीमी रेखा के क्रॉसओवर की तुलना करके खरीद और बिक्री संकेत उत्पन्न करती है। जब एक खरीद संकेत उत्पन्न होता है, तो यह खाता इक्विटी के एक निश्चित प्रतिशत के साथ एक स्थिति खोल देगा। अतिरिक्त पदों को तब विशिष्ट रिट्रेसमेंट बिंदुओं पर जोड़ा जाएगा। जब पदों का संचित लाभ कॉन्फ़िगर किए गए लाभ बिंदु तक पहुंच जाता है, तो सभी पद बंद हो जाएंगे। बिक्री संकेतों के लिए तर्क खरीद संकेतों के समान है।
इस रणनीति का मूल तर्क प्रवृत्ति निर्धारित करने के लिए एमएसीडी फास्ट लाइन और स्लो लाइन के क्रॉसओवर की तुलना करना है। एमएसीडी मूविंग एवरेज के बीच का अंतर है, अल्पकालिक और दीर्घकालिक मूविंग एवरेज के बीच के अंतर की गणना करके, यह बाजार की प्रवृत्ति और गति का न्याय करता है। फास्ट लाइन और स्लो लाइन के बीच क्रॉसओवर को गोल्डन क्रॉस और डेथ क्रॉस माना जाता है।
जब फास्ट लाइन स्लो लाइन के ऊपर से गुजरती है, तो एक गोल्डन क्रॉस उत्पन्न होता है, जो यह दर्शाता है कि बाजार ऊपर की ओर प्रवृत्ति में है, और रणनीति लंबी स्थिति खोलेगी। जब फास्ट लाइन स्लो लाइन के नीचे से गुजरती है, तो एक मौत क्रॉस उत्पन्न होती है, जो एक नीचे की ओर प्रवृत्ति को दर्शाता है, और रणनीति छोटी स्थिति खोलेगी।
ट्रेडों को खोलने के बाद, रणनीति विशिष्ट रिट्रेसमेंट बिंदुओं पर मौजूदा लंबी या छोटी पदों को जोड़ देगी। यह मार्टिंगेल सिद्धांत के माध्यम से लाभ क्षमता को बढ़ा सकता है। जब संचित लाभ कॉन्फ़िगर किए गए लाभ लेने के बिंदु तक पहुंच जाता है, तो रणनीति सभी पदों को बंद कर देगी।
इस रणनीति के निम्नलिखित फायदे हैंः
बाजार के रुझान को निर्धारित करने के लिए एमएसीडी सूचक का प्रयोग करता है, जो एक क्लासिक और विश्वसनीय तकनीकी विश्लेषण सूचक है।
बैचों में पदों को खोलने का दृष्टिकोण अपनाता है, जो एक ही व्यापार के जोखिम को नियंत्रित कर सकता है।
पदों को जोड़ने से मार्टिंगेल सिद्धांत के माध्यम से लाभ की संभावना बढ़ सकती है।
घाटे को सीमित करने के लिए लाभ लेने के बिंदु को कॉन्फ़िगर करना।
इस रणनीति में कुछ जोखिम भी हैं:
एमएसीडी संकेतक बाजार की गति का सही ढंग से पूर्वानुमान नहीं कर सकता है, झूठे संकेत हो सकते हैं।
पूर्ण स्थिति जोड़ने के साथ पुनरावृत्ति का विस्तार होने का जोखिम है। प्रत्येक जोड़ी गई स्थिति के प्रतिशत को उचित रूप से समायोजित कर सकते हैं।
लाभ लेने का बिंदु बहुत कम सेट करने से लाभ की संभावना सीमित हो सकती है। विभिन्न उत्पादों के लिए समायोजित किया जा सकता है।
खाते की सीमाओं से अधिक होने से बचने के लिए प्रति उत्पाद पदों को खोलने के लिए पूंजी का उचित प्रतिशत विन्यस्त करने की आवश्यकता है।
इस रणनीति को निम्नलिखित पहलुओं में अनुकूलित किया जा सकता हैः
एमएसीडी मापदंडों का परीक्षण करें, मापदंडों को ढूंढें जो विशिष्ट ट्रेडिंग उत्पादों के लिए बेहतर फिट हों।
प्रत्येक जोड़े गए पद के लिए धन प्रतिशत और पुनरावृत्ति प्रतिशत का अनुकूलन करें, इष्टतम पैरामीटर संयोजन खोजें।
इष्टतम स्तर निर्धारित करने के लिए क्रमशः दीर्घकालिक और अल्पकालिक लाभ बिंदुओं का परीक्षण करें।
खाते की मार्जिन क्षमता का आकलन करें, प्रति उत्पाद उचित अधिकतम स्थिति सीमा निर्धारित करें।
स्टॉप लॉस लॉजिक जोड़ें. जब बाजार में भारी बदलाव होता है तो स्टॉप लॉस प्रभावी रूप से नुकसान को नियंत्रित कर सकता है.
संक्षेप में, यह एक विशिष्ट प्रवृत्ति अनुसरण रणनीति है। यह बाजार की प्रवृत्ति दिशा निर्धारित करने के लिए एमएसीडी संकेतक का उपयोग करता है, प्रवृत्ति का पालन करने के लिए बैचों में पदों को जोड़ने का दृष्टिकोण लेता है, और संचित लाभ एक निश्चित स्तर तक पहुंचने पर लाभ लेता है। यह सरल और व्यावहारिक रणनीति लागू करना आसान है और मात्रात्मक व्यापार के शुरुआती लोगों के लिए उपयुक्त है। मापदंडों का अनुकूलन और जोखिम नियंत्रण तर्क का विस्तार करके, रणनीति अधिक मजबूत हो सकती है।
/*backtest start: 2023-11-26 00:00:00 end: 2023-12-26 00:00:00 period: 1h 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/ // © TradingSoft_tech //@version=5 strategy("MAPM-V1", overlay=true, default_qty_value=10, max_bars_back=5000,default_qty_type = strategy.percent_of_equity, commission_value=0.1, initial_capital = 100, pyramiding=6, currency=currency.USD) ///////// Options SignalFast = input.int(300, step=10) SignalSlow = input.int(600, step=10) StepAddPurchases = input.float(2.5, step=0.1) VolumePurchases = input.int(6,step=1) Buy = input(true) Sell = input(true) longProfitPerc = input.float(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=1) * 0.01 shortProfitPerc = input.float(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=1) * 0.01 Martingale = input.float(1.6, minval = 1, step = 0.1) VolumeDepo = input.int(100, step=1) PercentOfDepo = input.float(10, step=1) Close = (close) EnterVolume = VolumeDepo*PercentOfDepo*0.01/Close ///////// Calculation indicator fastAverage = ta.ema(close, 8) slowAverage = ta.ema(close, 49) macd = fastAverage - slowAverage macdSignalF = ta.ema(macd,SignalFast) macdSignalS = ta.ema(macd,SignalSlow) // Test Start startYear = input(2005, "Test Start Year") startMonth = input(1, "Test Start Month") startDay = input(1, "Test Start Day") startTest = timestamp(startYear,startMonth,startDay,0,0) //Test End endYear = input(2050, "Test End Year") endMonth = input(12, "Test End Month") endDay = input(30, "Test End Day") endTest = timestamp(endYear,endMonth,endDay,23,59) timeRange = time > startTest and time < endTest ? true : false ///////// Plot Data //plot(macd, style = plot.style_histogram) //plot(macdSignalF*10000, style = plot.style_line, color=color.red) //plot(macdSignalS*10000, style = plot.style_line, color=color.blue) //plot(fastAverage, style = plot.style_line, color=color.red) //plot(slowAverage, style = plot.style_line, color=color.blue) ///////// Calculation of the updated value var x = 0.0 if strategy.opentrades>strategy.opentrades[1] x := x + 1 else if strategy.opentrades==0 x := 0 y = x+1 ///////// Calculation of reference price data entryPrice = strategy.opentrades==0? 0 : strategy.opentrades.entry_price(0) limitLong = strategy.position_avg_price * (1 + longProfitPerc) limitShort = strategy.position_avg_price * (1 - shortProfitPerc) SteplimitLong = entryPrice[0]*(1-StepAddPurchases*y/100) SteplimitShort = entryPrice[0]*(1+StepAddPurchases*y/100) ///////// Conditions for a long bool EntryLong = ta.crossover(macdSignalF, macdSignalS) and Buy and strategy.opentrades==0 and strategy.position_size==0 bool PurchasesLong = Buy and strategy.opentrades==x and strategy.position_size>0 and x<=VolumePurchases bool CancelPurchasesLong = strategy.position_size==0 and strategy.opentrades==0 bool TPLong = strategy.position_size>0 and strategy.opentrades!=0 ///////// Entry Long + add.purchases + cancel purchases + Take profit Long switch EntryLong => strategy.entry("Entry Long", strategy.long, qty = EnterVolume) PurchasesLong => strategy.entry("PurchasesLong", strategy.long, qty = EnterVolume*math.pow(Martingale,y), limit = SteplimitLong) CancelPurchasesLong => strategy.cancel("PurchasesLong") switch TPLong => strategy.exit("TPLong", qty_percent = 100, limit = limitLong) ///////// Conditions for a Short bool EntryShort = ta.crossunder(macdSignalF, macdSignalS) and Sell and strategy.opentrades==0 and strategy.position_size==0 bool PurchasesShort = Sell and strategy.opentrades==x and strategy.position_size<0 and x<=VolumePurchases bool CancelPurchasesShort = strategy.position_size==0 and strategy.opentrades==0 bool TPShort = strategy.position_size<0 and strategy.opentrades!=0 ///////// Entry Short + add.purchases + cancel purchases + Take profit Short switch EntryShort => strategy.entry("Entry Short", strategy.short, qty = EnterVolume) PurchasesShort => strategy.entry("PurchasesShort", strategy.short, qty = EnterVolume*math.pow(Martingale,y), limit = SteplimitShort) CancelPurchasesShort => strategy.cancel("PurchasesShort") switch TPShort => strategy.exit("TPShort", qty_percent = 100, limit = limitShort) /////////Calculation of conditions and reference data for level drawing InTradeLong = strategy.position_size<0 InTradeShort = strategy.position_size>0 PickInLong = strategy.opentrades.entry_price(0)*(1-StepAddPurchases*y/100) PickInShort = strategy.opentrades.entry_price(0)*(1+StepAddPurchases*y/100) /////////Displaying the level of Take Profit plot(InTradeLong ? na : limitLong, color=color.new(#00d146, 0), style=plot.style_linebr, linewidth=1) plot(InTradeShort ? na : limitShort, color=color.new(#00d146, 0), style=plot.style_linebr, linewidth=1) /////////Displaying the level of add.purchases plot(InTradeLong ? na : PickInLong, color=color.white, style=plot.style_linebr, linewidth=1) plot(InTradeShort ? na : PickInShort, color=color.white, style=plot.style_linebr, linewidth=1)