यह रणनीति लंबी और छोटी संकेतों को उत्पन्न करने के लिए मूविंग एवरेज कन्वर्जेंस डिवर्जेंस (MACD) संकेतक का उपयोग करती है और लाभ को कैप्चर करने के लिए गतिशील रूप से बाहर निकलने के बिंदुओं को सेट करके अच्छी प्रवृत्ति स्थितियों में रिवर्स ट्रेड करती है।
इस रणनीति का मूल दीर्घ संकेतों के लिए एमएसीडी स्वर्ण क्रॉस और लघु संकेतों के लिए मृत्यु क्रॉस पर आधारित है। विशेष रूप से, जब एमएसीडी रेखा नीचे से सिग्नल रेखा के ऊपर से गुजरती है, तो एक स्वर्ण क्रॉस एक दीर्घ संकेत के रूप में उत्पन्न होता है; जब एमएसीडी रेखा ऊपर से सिग्नल रेखा के नीचे से गुजरती है, तो एक मृत्यु क्रॉस एक लघु संकेत के रूप में उत्पन्न होती है।
सोने के क्रॉस सिग्नल पर, यदि बंद मूल्य ईएमए से ऊपर है, तो लंबे समय तक जाएं; मृत्यु क्रॉस सिग्नल पर, यदि बंद मूल्य ईएमए से नीचे है, तो शॉर्ट जाएं। यह एक ऊपर की प्रवृत्ति के तहत उलट व्यापार सुनिश्चित करता है।
पदों में प्रवेश करने के बाद, रणनीति गतिशील रूप से बाहर निकलने को नियंत्रित करने के लिए स्टॉप लॉस और लाभ लेने का उपयोग करती है। विशेष रूप से, लंबी पदों के लिए स्टॉप लॉस प्रवेश मूल्य * (1 - अधिकतम ड्रॉडाउन) पर सेट किया जाता है; लाभ लेने के लिए प्रवेश मूल्य * (1 + TARGET_STOP_RATIO * अधिकतम ड्रॉडाउन) पर सेट किया जाता है। इसके विपरीत शॉर्ट पदों के लिए। यहां अधिकतम ड्रॉडाउन को गतिशील रूप से स्विंग लो से बंद होने तक मूल्य में गिरावट के प्रतिशत के रूप में गणना की जाती है; TARGET_STOP_RATIO डिफ़ॉल्ट रूप से 2 है, जिसका अर्थ है 2 का जोखिम / इनाम अनुपात।
इस गतिशील स्टॉप रणनीति का लाभ यह है कि यह बाजार की अस्थिरता के आधार पर स्टॉप लॉस और जोखिम / इनाम अनुपात को समायोजित कर सकता है। यह उच्च अस्थिरता के दौरान एक तंग स्टॉप लॉस के साथ तेजी से बाहर निकलता है जबकि कम अस्थिरता वातावरण के दौरान ढीले स्टॉप के साथ लाभ ट्रैक करता है।
एमएसीडी रिवर्स अवसरों की पहचान करने के लिए एक प्रभावी संकेतक है।
ईएमए फ़िल्टर यह सुनिश्चित करता है कि लंबी ट्रेडें केवल ऊपर की ओर बढ़ने वाले बाजार में ही हों।
गतिशील निकास नियंत्रण प्रणाली जोखिम को प्रभावी ढंग से प्रबंधित करते हुए लाभ को अधिकतम करती है।
तेजी से उपलब्ध गति आवश्यक निगरानी समय को कम करती है, जिससे यह व्यस्त निवेशकों के लिए उपयुक्त हो जाता है।
साइडवेज बाजारों के दौरान एमएसीडी अक्सर उतार-चढ़ाव करता है, जिससे नकली संकेत उत्पन्न होते हैं। यह ईएमए फ़िल्टर जोड़कर हल किया जाता है ताकि काउंटर-ट्रेंड ट्रेडों से बचा जा सके।
अत्यधिक अस्थिरता के कारण डायनामिक स्टॉप बहुत ढीला हो सकता है। चरम बाजार आंदोलनों का सामना करते समय निश्चित जोखिम / लाभ अनुपात पर विचार करें।
प्रति ट्रेड सीमित लाभ मार्जिन के लिए अक्सर ट्रेडिंग की आवश्यकता होती है। निवेशकों को कुछ मनोवैज्ञानिक धीरज और समय प्रतिबद्धता की आवश्यकता होती है। बहुत व्यस्त होने पर उच्च समय सीमाओं पर स्विच कर सकते हैं।
संकेत की गुणवत्ता को अनुकूलित करने के लिए प्रतीक विशेषताओं के आधार पर एमएसीडी मापदंडों को ठीक से समायोजित करें।
इष्टतम को खोजने के लिए प्रवृत्ति फ़िल्टर के रूप में विभिन्न चलती औसत का परीक्षण करें।
बाहर निकलने की रणनीति को अनुकूलित करने के लिए TARGET_STOP_RATIO गणना और अधिकतम निकासी परिभाषा का परीक्षण करें।
सिग्नल की गुणवत्ता में सुधार के लिए वॉल्यूम, अस्थिरता आदि जैसे अन्य कारकों को जोड़ें।
अधिक सुविधाओं को निकालने के लिए मशीन लर्निंग मॉडल का अन्वेषण करें और अधिक स्मार्ट निकास के लिए अनुकूलनशील बहु-कारक मॉडल बनाएं।
इस रणनीति का समग्र रूप से मजबूत व्यावहारिक मूल्य है। एमएसीडी के साथ मुख्य ट्रेडिंग सिग्नल के रूप में, ट्रेंड फिल्टर और गतिशील निकास नियंत्रण के ऐड-ऑन मॉड्यूल एमएसीडी प्रदर्शन में काफी सुधार कर सकते हैं। निकास नियंत्रण रणनीति अनुकूलन के लिए आवश्यक है और यह रणनीति इस क्षेत्र में काफी नया है। आगे के शोध और अनुप्रयोग के लायक है।
/*backtest start: 2022-12-05 00:00:00 end: 2023-12-11 00:00:00 period: 1d basePeriod: 1h 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/ // © maxencetajet //@version=5 strategy("MACD Strategy", overlay=true, initial_capital=1000, slippage=25) src = input(title="Source", defval=close) target_stop_ratio = input.float(title='Risk/Reward', defval=2, minval=0.5, maxval=100) risk = input.float(2, title="Risk per Trade %") riskt = risk / 100 + 1 useDateFilter = input.bool(true, title="Filter Date Range of Backtest", group="Backtest Time Period") backtestStartDate = input(timestamp("5 June 2022"), title="Start Date", group="Backtest Time Period", tooltip="This start date is in the time zone of the exchange " + "where the chart's instrument trades. It doesn't use the time " + "zone of the chart or of your computer.") backtestEndDate = input(timestamp("5 July 2022"), title="End Date", group="Backtest Time Period", tooltip="This end date is in the time zone of the exchange " + "where the chart's instrument trades. It doesn't use the time " + "zone of the chart or of your computer.") inTradeWindow = true emaV = input.int(200, title="Length", group="EMA") swingHighV = input.int(7, title="Swing High", group="number of past candles") swingLowV = input.int(7, title="Swing Low", group="number of past candles") ema = ta.ema(src, emaV) fast_length = input(title="Fast Length", defval=12, group="MACD") slow_length = input(title="Slow Length", defval=26, group="MACD") signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 50, defval = 9, group="MACD") sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD") sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD") fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length) slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length) macd = fast_ma - slow_ma signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length) hist = macd - signal longcondition = close > ema and ta.crossover(macd, signal) and macd < 0 shortcondition = close < ema and ta.crossunder(macd, signal) and macd > 0 float risk_long = na float risk_short = na float stopLoss = na float takeProfit = na float entry_price = na risk_long := risk_long[1] risk_short := risk_short[1] swingHigh = ta.highest(high, swingHighV) swingLow = ta.lowest(low, swingLowV) lotB = (strategy.equity*riskt-strategy.equity)/(close - swingLow) lotS = (strategy.equity*riskt-strategy.equity)/(swingHigh - close) if strategy.position_size == 0 and longcondition and inTradeWindow risk_long := (close - swingLow) / close strategy.entry("long", strategy.long, qty=lotB) if strategy.position_size == 0 and shortcondition and inTradeWindow risk_short := (swingHigh - close) / close strategy.entry("short", strategy.short, qty=lotS) if strategy.position_size > 0 stopLoss := strategy.position_avg_price * (1 - risk_long) takeProfit := strategy.position_avg_price * (1 + target_stop_ratio * risk_long) entry_price := strategy.position_avg_price strategy.exit("long exit", "long", stop = stopLoss, limit = takeProfit) if strategy.position_size < 0 stopLoss := strategy.position_avg_price * (1 + risk_short) takeProfit := strategy.position_avg_price * (1 - target_stop_ratio * risk_short) entry_price := strategy.position_avg_price strategy.exit("short exit", "short", stop = stopLoss, limit = takeProfit) plot(ema, color=color.white, linewidth=2, title="EMA") p_ep = plot(entry_price, color=color.new(color.white, 0), linewidth=2, style=plot.style_linebr, title='entry price') p_sl = plot(stopLoss, color=color.new(color.red, 0), linewidth=2, style=plot.style_linebr, title='stopLoss') p_tp = plot(takeProfit, color=color.new(color.green, 0), linewidth=2, style=plot.style_linebr, title='takeProfit') fill(p_sl, p_ep, color.new(color.red, transp=85)) fill(p_tp, p_ep, color.new(color.green, transp=85))