यह रणनीति प्रवेश और निकास बिंदुओं को निर्धारित करने के लिए एमएसीडी संकेतक के स्वर्ण क्रॉस और मृत क्रॉस संकेतों, मध्य रेखा के साथ समापन मूल्य के संबंध और मूल्य अस्थिरता विशेषताओं को जोड़ती है। यह जोखिमों को नियंत्रित करते हुए और स्थिर रिटर्न प्राप्त करते हुए अधिक व्यापारिक अवसर प्राप्त करने के लिए पुनः प्रवेश और सुधार प्रवेश तंत्र भी निर्धारित करती है।
यह रणनीति मुख्यतः निम्नलिखित सिद्धांतों पर आधारित हैः
बैल और भालू बाजारों और विशिष्ट प्रवेश बिंदुओं को निर्धारित करने के लिए एमएसीडी फास्ट लाइन और स्लो लाइन गोल्डन क्रॉस और डेड क्रॉस का उपयोग करें।
रुझानों के अंत और निकास बिंदुओं को निर्धारित करने के लिए मध्य रेखा के साथ समापन मूल्य के संबंध का उपयोग करें।
लाभ बढ़ाने के लिए मौजूदा एमएसीडी रुझान समाप्त होने के बाद उसी दिशा में बाजार में पुनः प्रवेश करने के लिए पुनः प्रवेश तंत्र स्थापित करें।
प्रवृत्ति के भीतर आंशिक मूल्य सुधार के दौरान पदों को जोड़ने के लिए सुधार प्रविष्टि तंत्र सेट करें।
गतिशील रूप से ऊपर के आधार पर रुझानों के भीतर लाभ को अधिकतम करने के लिए पदों को समायोजित करें जबकि रुझान समाप्त होने पर जल्दी से बाहर निकलें।
विशेष रूप से, यह रणनीति पहले यह जांचती है कि क्या मैकडी फास्ट और स्लो लाइनों के बीच सोने का क्रॉस या मृत क्रॉस होता है ताकि लंबी या छोटी हो सके। फिर यह जांचती है कि क्या समापन मूल्य ट्रेंड के अंत और बंद पदों को निर्धारित करने के लिए मध्य रेखा को छूता है।
इसके अतिरिक्त, रणनीति में मूल दिशा में पदों को फिर से खोलने के लिए एक पुनः प्रवेश तंत्र है यदि MACD प्रारंभिक प्रवृत्ति समाप्त होने के बाद भी उसी दिशा में संकेत दिखाना जारी रखता है। पूर्ण उल्टा होने से पहले छोटी वापसी के दौरान मामूली रूप से पदों को जोड़ने के लिए एक सुधार प्रवेश तंत्र भी है।
इन सेटिंग्स के माध्यम से, रणनीति गतिशील रूप से पदों को समायोजित कर सकती है, प्रवृत्ति के भीतर जोखिमों को नियंत्रित करते हुए प्रवेश और निकास आवृत्तियों को बढ़ा सकती है, और अधिकतम रिटर्न प्राप्त कर सकती है।
इस बहुसूचक रणनीति के मुख्य लाभ इस प्रकार हैंः
एमएसीडी प्रवेश के लिए रुझानों और उलट बिंदुओं की पहचान करता है।
समापन मूल्य और मध्य रेखा संबंध प्रवृत्ति अंत को सटीक रूप से निर्धारित करता है।
पुनः प्रवेश से पूंजी उपयोग की दक्षता बढ़ जाती है।
सुधार प्रविष्टि समय पर रुझानों को पकड़ने के लिए पदों को जोड़ती है।
नियंत्रित जोखिम के साथ उच्च व्यापार आवृत्ति उच्च लाभ कारक उत्पन्न करती है।
उत्पादों और बाजारों में अनुकूलन के लिए अनुकूलन योग्य मापदंड।
सरल व्यापार के लिए स्पष्ट तर्क और संक्षिप्त कोड।
पर्याप्त बैकटेस्ट डेटा विश्वसनीयता सुनिश्चित करता है।
मुख्य जोखिम हैंः
गलत एमएसीडी संकेतों की संभावना अन्य संकेतकों के साथ सत्यापित की जानी चाहिए।
बहुत तंग स्टॉप को अस्थिर चाल से रोक दिया जा सकता है।
व्यापार की आवृत्ति में वृद्धि के लिए पूंजी उपयोग पर नियंत्रण की आवश्यकता होती है।
सुधार प्रविष्टियों से वापस लेने के दौरान नुकसान हो सकता है।
विभिन्न उत्पादों और बाजारों के लिए अनुकूलन आवश्यक है।
निरंतर बैकटेस्टिंग और अनुकूलन की आवश्यकता होती है।
लाइव ट्रेडिंग के लिए स्लिप लागतों पर विचार करने की आवश्यकता है।
जोखिम प्रबंधन उपायों में घाटे को सीमित करने के लिए स्टॉप का उपयोग करना, पूंजी उपयोग का मूल्यांकन करना, बैकटेस्टिंग के माध्यम से प्रति उत्पाद मापदंडों का अनुकूलन करना, मापदंडों को परिष्कृत करने के लिए बाजार गतिशीलता की निगरानी करना और परीक्षणों में फिसलने के लिए लेखांकन शामिल है।
सुधार के अवसर:
सिग्नल सत्यापित करने के लिए अन्य संकेतक जोड़ें, उदाहरण के लिए KDJ।
अनुकूलित गतिशील स्टॉप लागू करें।
पुनः प्रविष्टि और सुधार प्रविष्टि तर्क का अनुकूलन करें.
प्रत्येक उत्पाद के लिए पैरामीटर अनुकूलन।
प्रविष्टियों के लिए पूंजी उपयोग को अनुकूलित करना।
वापसी प्रविष्टियों से नुकसान से बचने के लिए वॉल्यूम संकेतक शामिल करें।
बाहर निकलने के तंत्र जैसे कि चलती स्टॉप जोड़ें।
स्वचालित ट्रेडिंग बॉट बनाएँ।
वास्तविक दुनिया के कारकों को ध्यान में रखें जैसे कि फिसलन।
ये स्थिरता, अनुकूलन क्षमता, स्वचालन और लाइव प्रदर्शन में और सुधार कर सकते हैं।
यह रणनीति जोखिम को नियंत्रित करते हुए रुझानों को अधिकतम करने के लिए एमएसीडी संकेतों, समापन मूल्य विश्लेषण और कई प्रवेश तंत्रों को एकीकृत करती है। इसमें उच्च पूंजी दक्षता और कार्यान्वयन में आसानी है लेकिन जोखिम नियंत्रण और अनुकूलन की आवश्यकता होती है। स्वचालन इसे एक मजबूत मात्रात्मक व्यापार प्रणाली बना सकता है।
/*backtest start: 2023-09-29 00:00:00 end: 2023-10-29 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/ // © Puckapao //@version=4 // strategy(title="MACD", shorttitle="MACD", overlay=true, initial_capital=10000.00, currency="USD", default_qty_type=strategy.cash, default_qty_value=10000.00) // Getting inputs reenter_delay = input(title="Re-enter Delay", type=input.integer, defval=2) sculp_delay = input(title="Sculp Delay", type=input.integer, defval=4) fast_length = input(title="Fast Length", type=input.integer, defval=12) slow_length = input(title="Slow Length", type=input.integer, defval=26) src = input(title="Source", type=input.source, defval=close) signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9) sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false) sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true) ema_period = input(title="EMA Period", type=input.integer, defval=21) // Get date startDate = input(title="Start Date", type=input.integer, defval=19, minval=1, maxval=31) startMonth = input(title="Start Month", type=input.integer, defval=09, minval=1, maxval=12) startYear = input(title="Start Year", type=input.integer, defval=2017, minval=1800, maxval=2100) endDate = input(title="End Date", type=input.integer, defval=31, minval=1, maxval=31) endMonth = input(title="End Month", type=input.integer, defval=3, minval=1, maxval=12) endYear = input(title="End Year", type=input.integer, defval=2021, minval=1800, maxval=2100) // STEP 2: // Look if the close time of the current bar // falls inside the date range inDateRange = true reenter_cnt = 0 reenter_cnt := nz(reenter_cnt[1]) sculp_cnt = 0 sculp_cnt := nz(sculp_cnt[1]) close_cnt = 0 close_cnt := nz(close_cnt[1]) on_long = false on_long := nz(on_long[1]) on_short = false on_short := nz(on_short[1]) sculp = false reenter = false slowdown = false ema = ema(close, ema_period) // Plot colors col_grow_above = #26A69A col_grow_below = #FFCDD2 col_fall_above = #B2DFDB col_fall_below = #EF5350 col_macd = #0094ff col_signal = #ff6a00 // Calculating fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length) slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length) macd = fast_ma - slow_ma signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length) hist = macd - signal // plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 ) // plot(macd, title="MACD", color=col_macd, transp=0) // plot(signal, title="Signal", color=col_signal, transp=0) cross_up = crossover(macd, signal) cross_down = crossunder(macd, signal) if (inDateRange) over_macd = macd > 0 and signal > 0 ? true : false under_macd = macd < 0 and signal < 0 ? true : false over_water = close > ema ? true : false under_water = close < ema ? true : false slowdown := hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] > hist ? false : true) reenter := hist >= 0 ? (hist[1] < hist ? true : false) : (hist[1] > hist ? true : false) sculp := (hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] < hist ? true : false)) if(reenter == true) if(reenter_cnt < reenter_delay) reenter_cnt := reenter_cnt + 1 else if(reenter_cnt > 0) reenter_cnt := reenter_cnt - 1 if(sculp == true) if(sculp_cnt < sculp_delay) sculp_cnt := sculp_cnt + 1 else if(sculp_cnt > 0) sculp_cnt := sculp_cnt - 1 if(slowdown == false) if(close_cnt < 2) close_cnt := close_cnt + 1 else close_cnt := 0 // plotchar(fork_cnt, "fork count", "") // plotchar(spoon_cnt, "spoon count", "") // Entry if (cross_up == true) strategy.entry("long", strategy.long, comment = "long", alert_message = "long") on_long := true on_short := false if (cross_down == true) strategy.entry("short", strategy.short, comment = "short", alert_message = "short") on_short := true on_long := false // Sculp bottom / top if (sculp == true and sculp_cnt >= sculp_delay) if (hist >= 0) strategy.entry("sculp-short", strategy.short, comment = "sculp-short", alert_message = "sculp-short") else strategy.entry("sculp-long", strategy.long, comment = "sculp-long", alert_message = "sculp-long") sculp_cnt := 0 sculp := false // Re-Entry if (reenter == true and reenter_cnt >= reenter_delay) if (hist >= 0) strategy.entry("re-long", strategy.long, comment = "re-long", alert_message = "re-long") else strategy.entry("re-short", strategy.short, comment = "re-short", alert_message = "re-short") reenter_cnt := 0 reenter := false // Close strategy.close("long", when = slowdown, comment = "close long", alert_message = "close long") strategy.close("short", when = slowdown, comment = "close short", alert_message = "close short") strategy.close("re-long", when = slowdown, comment = "close re-long", alert_message = "close re-long") strategy.close("re-short", when = slowdown, comment = "close re-short", alert_message = "close re-short") strategy.close("sculp-long", when = slowdown, comment = "close sculp-long", alert_message = "close sculp-long") strategy.close("sculp-short", when = slowdown, comment = "close sculp-short", alert_message = "close sculp-short") if (slowdown) if (hist >= 0) on_long := false else on_short := false plotchar(slowdown, "close", "") plotchar(reenter, "reenter", "") plotchar(reenter_cnt, "reenter count", "") plotchar(sculp, "sculp", "") plotchar(sculp_cnt, "sculp count", "")