यह रणनीति ट्रेडिंग सिग्नल बनाने के लिए एमएसीडी संकेतक और चलती औसत क्रॉस सिद्धांतों का उपयोग करती है। इसका लाभ यह है कि यह लंबी और छोटी दिशाओं के लिए अलग से एमएसीडी के मापदंडों का अनुकूलन कर सकती है, ताकि मापदंडों को विभिन्न बाजार दिशाओं के लिए इष्टतम रूप से कॉन्फ़िगर किया जा सके।
MACD सूचक की गणना लंबी और छोटी दिशाओं के लिए अलग से की जाती है। लंबी दिशाओं के लिए पैरामीटर का एक सेट और छोटी दिशाओं के लिए पैरामीटर का एक और सेट का उपयोग किया जाता है, जिसे स्वतंत्र रूप से कॉन्फ़िगर किया जा सकता है।
एमएसीडी लाइन और सिग्नल लाइन के क्रॉसओवर से उत्पन्न ट्रेडिंग सिग्नल का न्याय करें। लंबे समय के लिए तेजी से क्रॉसओवर और कम समय के लिए मंदी क्रॉसओवर की तलाश करें।
आप कॉन्फ़िगर कर सकते हैं कि सिग्नल लाइन को भी सिग्नल को ट्रिगर करने के लिए पार करने की आवश्यकता है, ताकि झूठे संकेतों से बचा जा सके।
लंबी या छोटी स्थिति में प्रवेश करने के बाद, यदि रिवर्स क्रॉसओवर होता है तो स्थिति को बंद कर दें।
दो तरफ़ा पैरामीटर अनुकूलनः बाजार की दिशाओं के लिए अनुकूलित रूप से अलग से कॉन्फ़िगर करने के लिए लंबी और छोटी के पैरामीटर को स्वतंत्र रूप से अनुकूलित किया जा सकता है।
विन्यस्त सिग्नल चिकनाईः सिग्नल पैरामीटर झूठे संकेतों को फ़िल्टर करने के लिए सिग्नल लाइन की चिकनाई को नियंत्रित कर सकता है।
कॉन्फ़िगर करने योग्य सिग्नल फ़िल्टरिंगः गलत सिग्नल से बचने के लिए सिग्नल लाइन क्रॉसओवर को ट्रिगर करने की आवश्यकता है या नहीं, इसे कॉन्फ़िगर किया जा सकता है।
ठीक से समायोजित स्थिति नियंत्रणः केवल लंबे या छोटे को अलग से सक्षम किया जा सकता है, या लंबे और छोटे को एक ही समय में किया जा सकता है।
एमएसीडी लेगः एमएसीडी में स्वयं कुछ लेग होता है जो तेजी से उलट पड़ सकता है।
लंबी और छोटी मुद्राओं के बीच स्विच करने का जोखिमः बाजार में तेजी से बदलाव होने पर स्थिति में लगातार बदलाव हो सकता है।
पैरामीटर जोखिमः गलत पैरामीटर कॉन्फ़िगरेशन बाजार की विशेषताओं को पकड़ने में विफल हो सकते हैं।
स्टॉप लॉस सुरक्षा का अभाव: एक बार के नुकसान को नियंत्रित करने के लिए उचित स्टॉप लॉस सेट किया जाना चाहिए।
जोखिम प्रबंधन के तरीके:
बड़े चित्र का आकलन करने के लिए अन्य संकेतकों के साथ संयोजन करें और उच्च और बिक्री निम्न का पीछा करने से बचें।
त्रुटि संकेतों को कम करने के लिए संकेत विलंब और चिकनाई मापदंडों को सेट करें।
विभिन्न चक्रों में बाजार की लय से मेल खाने के लिए बार-बार मापदंडों का परीक्षण और अनुकूलन करना।
एकल हानि को नियंत्रित करने के लिए स्टॉप लॉस और ले लाभ तंत्र स्थापित करें।
इस रणनीति को और अधिक अनुकूलित करने के कुछ तरीके हैंः
विभिन्न चक्रों में बाजार स्थितियों के लिए इष्टतम मापदंडों को खोजने के लिए तेज लाइन और धीमी लाइन लंबाई मापदंडों के विभिन्न संयोजनों का परीक्षण करें।
विभिन्न सिग्नल लाइन मापदंडों का परीक्षण करें। चिकनी सिग्नल लाइनें अधिक शोर को फ़िल्टर कर सकती हैं।
इष्टतम संतुलन खोजने के लिए सिग्नल लाइन क्रॉसओवर फिल्टर को चालू और बंद करने के बीच अंतर का परीक्षण करें।
बैकटेस्ट परिणामों के आधार पर इष्टतम स्टॉप लॉस और ले लाभ अनुपात सेट करें।
यह देखने के लिए कि क्या रणनीति प्रभाव को अधिकतम किया जा सकता है, केवल लंबे या केवल छोटे प्रयास करें।
लंबे और छोटे मापदंडों को अलग से कॉन्फ़िगर करके, यह एमएसीडी डबल ऑप्टिमाइज़ेशन ट्रेडिंग रणनीति विभिन्न बाजार दिशाओं के अनुरूप अनुकूलन का एहसास करती है, और भागीदारी दिशा के स्वतंत्र समायोजन की अनुमति देती है। साथ ही, गलत संकेतों से बचने के लिए सिग्नल फ़िल्टरिंग तंत्र पेश किए जाते हैं। पैरामीटर अनुकूलन और जोखिम प्रबंधन उपायों के माध्यम से, रणनीति प्रभाव में और सुधार किया जा सकता है।
/*backtest start: 2023-01-15 00:00:00 end: 2024-01-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Gentleman-Goat & TradingTools.Software/Optimizer strategy(title="MACD Short/Long Strategy for TradingView Input Optimizer", shorttitle="MACD Short/Long TVIO", initial_capital=1000, default_qty_value=100, default_qty_type=strategy.percent_of_equity) // Get Inputs Long allow_long = input.bool(title="Allow Long", defval=true, group="inputs long") fast_length_long = input.int(title="Fast Length Long", defval=13, group="inputs long") slow_length_long = input.int(title="Slow Length Long", defval=19, group="inputs long") src_long = input.source(title="Source Long", defval=close, group="inputs long") signal_length_long = input.int(title="Signal Smoothing Long", minval = 1, maxval = 50, defval = 9, group="inputs long") sma_source_long = input.string(title="Oscillator MA Type Long", defval="EMA", options=["SMA", "EMA"], group="inputs long") sma_signal_long = input.string(title="Signal Line MA Type Long", defval="EMA", options=["SMA", "EMA"], group="inputs long") cross_point_long = input.int(title="Cross Point Long", defval=0, group="inputs long") cross_delay_macd_long = input.int(title="MacD Cross Delay Long", defval=0, group="inputs long") signal_must_cross_long = input.bool(title="Signal Must Also Cross Long", defval=false, group="inputs long") cross_delay_signal_long = input.int(title="Signal Cross Delay Long", defval=0, group="inputs long") //Get Inputs Short allow_short = input.bool(title="Allow Short", defval=true, group="inputs short") fast_length_short = input.int(title="Fast Length Short", defval=11, group="inputs short") slow_length_short = input.int(title="Slow Length Short", defval=20, group="inputs short") src_short = input.source(title="Source Short", defval=close, group="inputs short") signal_length_short = input.int(title="Signal Smoothing Short", minval = 1, maxval = 50, defval = 9, group="inputs short") sma_source_short = input.string(title="Oscillator MA Type Short", defval="EMA", options=["SMA", "EMA"], group="inputs short") sma_signal_short = input.string(title="Signal Line MA Type Short", defval="EMA", options=["SMA", "EMA"], group="inputs short") cross_point_short = input.int(title="Cross Point Short", defval=0, group="inputs short") cross_delay_macd_short = input.int(title="MacD Cross Delay Short", defval=1, group="inputs short") signal_must_cross_short = input.bool(title="Signal Must Also Cross Short", defval=false, group="inputs short") cross_delay_signal_short = input.int(title="Signal Cross Delay Short", defval=0, group="inputs short") use_stop_loss_long = input.bool(defval=false,title="Use Stop Loss Long", group="Stop/Profit Long") stop_loss_long_percentage = input.float(defval=1,title="Stop Loss % Long",minval=0.0,step=0.1, group="Stop/Profit Long") * .01 use_take_profit_long = input.bool(defval=false,title="Use Take Profit Long", group="Stop/Profit Long") take_profit_long_percentage = input.float(defval=1,title="Take Profit % Long",minval=0.0,step=0.1, group="Stop/Profit Long") * .01 use_stop_loss_short = input.bool(defval=true,title="Use Stop Loss Short", group="Stop/Profit Short") stop_loss_short_percentage = input.float(defval=21,title="Stop Loss % Short",minval=0.0,step=0.1, group="Stop/Profit Short") * .01 use_take_profit_short = input.bool(defval=true,title="Use Take Profit Short", group="Stop/Profit Short") take_profit_short_percentage= input.float(defval=20,title="Take Profit % Short",minval=0.0,step=0.1, group="Stop/Profit Short") * .01 //------------------------------------------------------------------------------ // Plot colors Long col_macd_long = input.color(#2962FF, "MACD Line Long", group="Color Settings", inline="MACD") col_signal_long = input.color(#FF6D00, "Signal Line Long", group="Color Settings", inline="Signal") col_grow_above_long = input.color(#26A69A, "Grow Above Long", group="Histogram Color Settings", inline="Above Long") col_fall_above_long = input.color(#B2DFDB, "Fall Above Long", group="Histogram Color Settings", inline="Above Long") col_grow_below_long = input.color(#FFCDD2, "Grow Below Long", group="Histogram Color Settings", inline="Below Long") col_fall_below_long = input.color(#FF5252, "Fall Below Long", group="Histogram Color Settings", inline="Below Long") // Plot colors Short col_macd_short = input.color(#B03DFF, "MACD Line Short", group="Color Settings", inline="MACD") col_signal_short = input.color(#00FFE8, "Signal Line Short", group="Color Settings", inline="Signal") col_grow_above_short = input.color(#D95965, "Grow Above Short", group="Histogram Color Settings", inline="Above Short") col_fall_above_short = input.color(#4D2024, "Fall Above Short", group="Histogram Color Settings", inline="Above Short") col_grow_below_short = input.color(#00322D, "Grow Below Short", group="Histogram Color Settings", inline="Below Short") col_fall_below_short = input.color(#00ADAD, "Fall Below Short", group="Histogram Color Settings", inline="Below Short") // Calculate Long fast_ma_long = sma_source_long == "SMA" ? ta.sma(src_long, fast_length_long) : ta.ema(src_long, fast_length_long) slow_ma_long = sma_source_long == "SMA" ? ta.sma(src_long, slow_length_long) : ta.ema(src_long, slow_length_long) macd_long = fast_ma_long - slow_ma_long signal_long = sma_signal_long == "SMA" ? ta.sma(macd_long, signal_length_long) : ta.ema(macd_long, signal_length_long) hist_long = macd_long - signal_long // Calculate Short fast_ma_short = sma_source_short == "SMA" ? ta.sma(src_short, fast_length_short) : ta.ema(src_short, fast_length_short) slow_ma_short = sma_source_short == "SMA" ? ta.sma(src_short, slow_length_short) : ta.ema(src_short, slow_length_short) macd_short = fast_ma_short - slow_ma_short signal_short = sma_signal_short == "SMA" ? ta.sma(macd_short, signal_length_short) : ta.ema(macd_short, signal_length_short) hist_short = macd_short - signal_short //Plot Long plot(hist_long, title="Histogram Long", style=plot.style_columns, color=(hist_long>=0 ? (hist_long[1] < hist_long ? col_grow_above_long : col_fall_above_long) : (hist_long[1] < hist_long ? col_grow_below_long : col_fall_below_long))) plot(macd_long, title="MACD Long", color=col_macd_long) plot(signal_long, title="Signal Long", color=col_signal_long) //Plot Short plot(hist_short, title="Histogram Short", style=plot.style_columns, color=(hist_short>=0 ? (hist_short[1] < hist_short ? col_grow_above_short : col_fall_above_short) : (hist_short[1] < hist_short ? col_grow_below_short : col_fall_below_short))) plot(macd_short, title="MACD Short", color=col_macd_short) plot(signal_short, title="Signal Short", color=col_signal_short) var detectedLongCrossOver = false var detectedShortCrossUnder = false if(ta.crossunder(macd_short,cross_point_short)) detectedShortCrossUnder := true if(ta.crossover(macd_short,cross_point_short)) detectedShortCrossUnder := false if(ta.crossover(macd_long,cross_point_long)) detectedLongCrossOver := true if(ta.crossunder(macd_long,cross_point_long)) detectedLongCrossOver := false crossover_signal_long = ta.crossover(signal_long,cross_point_long) crossunder_signal_long = ta.crossunder(signal_long,cross_point_long) crossunder_signal_short = ta.crossunder(signal_short,cross_point_short) crossover_signal_short = ta.crossover(signal_short,cross_point_short) crossover_macd_long = ta.crossover(macd_long,cross_point_long) crossunder_macd_long = ta.crossunder(macd_long,cross_point_long) crossunder_macd_short = ta.crossunder(macd_short,cross_point_short) crossover_macd_short = ta.crossover(macd_short,cross_point_short) inEntry = false //Strategy Entries if (strategy.equity > 0) //This is required for the input optimizer to work since it will fail if the strategy fails to succeed by not having enough equity. if (strategy.position_size <= 0 and allow_long==true and inEntry==false) if(signal_must_cross_long==true) longSignalCondition = detectedLongCrossOver==true and crossover_signal_long[cross_delay_signal_long] strategy.entry(id="long", direction=strategy.long, when=longSignalCondition) if(longSignalCondition) inEntry:=true else longMacDCondition = crossover_macd_long[cross_delay_macd_long] strategy.entry(id="long", direction=strategy.long, when=longMacDCondition) if(longMacDCondition) inEntry:=true if (strategy.position_size >= 0 and allow_short==true and inEntry==false) if(signal_must_cross_short==true) shortSignalCondition = detectedShortCrossUnder and crossunder_signal_short[cross_delay_signal_short] strategy.entry(id="short", direction=strategy.short, when=shortSignalCondition) if(shortSignalCondition) inEntry:=true else shortMacDCondition = crossunder_macd_short[cross_delay_macd_short] strategy.entry(id="short", direction=strategy.short, when=shortMacDCondition) if(shortMacDCondition) inEntry:=true if(strategy.position_size > 0 and allow_long==true and allow_short==false) if(signal_must_cross_long==true) strategy.close(id="long", when=detectedLongCrossOver==false and crossunder_signal_long) else strategy.close(id="long", when=crossunder_macd_long) if(strategy.position_size < 0 and allow_short==true and allow_long==false) if(signal_must_cross_short==true) strategy.close(id="short", when=detectedShortCrossUnder==false and crossover_signal_short) else strategy.close(id="short", when=crossover_macd_short) stop_loss_value_long = strategy.position_avg_price*(1 - stop_loss_long_percentage) take_profit_value_long = strategy.position_avg_price*(1 + take_profit_long_percentage) stop_loss_value_short = strategy.position_avg_price*(1 + stop_loss_short_percentage) take_profit_value_short = strategy.position_avg_price*(1 - take_profit_short_percentage) if(strategy.position_size>0) //Long positions only strategy.exit(id="TP/SL Long",from_entry="long", limit=use_take_profit_long ? take_profit_value_long : na, stop=use_stop_loss_long ? stop_loss_value_long : na) if(strategy.position_size<0) //Short positions only strategy.exit(id="TP/SL Short",from_entry="short", limit=use_take_profit_short ? take_profit_value_short : na, stop=use_stop_loss_short ? stop_loss_value_short : na)