यह रणनीति ट्रेडिंग के बाद प्रवृत्ति को लागू करने के लिए प्रवृत्ति की दिशा और संभावित उलट बिंदुओं की पहचान करने के लिए मोमबत्ती पैटर्न निर्धारित करने के लिए चलती औसत को जोड़ती है। रणनीति पहले समग्र प्रवृत्ति दिशा का न्याय करने के लिए चलती औसत का उपयोग करती है, और फिर प्रवृत्ति की दिशा के साथ प्रवेश संकेत के रूप में संभावित उलट मोमबत्ती पैटर्न की तलाश करती है।
यह रणनीति मूल्य की प्रवृत्ति निर्धारित करने के लिए 10 दिन के सरल चलती औसत को अपनाती है। जब कीमत चलती औसत से ऊपर होती है, तो इसे अपट्रेंड माना जाता है; जब कीमत चलती औसत से नीचे होती है, तो इसे डाउनट्रेंड माना जाता है।
प्रवृत्ति की दिशा निर्धारित करने के बाद, रणनीति तेजी और मंदी के मोमबत्तियों के पैटर्न की एक श्रृंखला के आधार पर संभावित प्रवृत्ति उलट बिंदुओं का न्याय करेगी। आम तेजी के पैटर्न में मॉर्निंग स्टार, बुलिश एंगुलिंग, थ्री व्हाइट सोल्जर, आदि शामिल हैं; आम मंदी के पैटर्न में इवनिंग स्टार, थ्री ब्लैक क्रोस, आदि शामिल हैं। जब एक अपट्रेंड में एक तेजी का संकेत पहचाना जाता है, तो रणनीति एक खरीद ऑर्डर रखेगी; जब एक मंदी संकेत एक डाउनट्रेंड में पहचाना जाता है, तो रणनीति एक बिक्री ऑर्डर रखेगी।
इसके अतिरिक्त, रणनीति में विशिष्ट प्रवेश मूल्य निर्धारित करने के लिए प्रमुख समर्थन और प्रतिरोध स्तर भी शामिल हैं। उदाहरण के लिए, जब कोई अपट्रेंड में खरीदता है, तो वह पहले समर्थन स्तर को तोड़ने पर खरीदेगा।
इस रणनीति का सबसे बड़ा लाभ यह है कि यह प्रवृत्ति निर्णय और उलट सिग्नल दोनों को जोड़ती है ताकि यह प्रवृत्ति का पालन करने के लिए समय पर प्रवृत्ति मोड़ बिंदुओं को पकड़ सके। सरल चलती औसत रणनीतियों की तुलना में, यह रणनीति लाभप्रदता में काफी सुधार कर सकती है।
इसके अतिरिक्त, कैंडलस्टिक पैटर्न जजमेंट को शामिल करने से अचानक घटनाओं से निपटने की क्षमता भी बढ़ जाती है। जब एक कम संभावना वाली घटना बाजार में झूठे ब्रेकआउट का कारण बनती है, तो कैंडलस्टिक पैटर्न गलत ट्रेडों से बचने के लिए फिल्टर की भूमिका निभा सकता है।
इस रणनीति के मुख्य जोखिम चलती औसत पैरामीटर सेटिंग्स और कैंडलस्टिक पैटर्न निर्णय की सटीकता में निहित हैं। यदि चलती औसत अवधि गलत तरीके से निर्धारित की जाती है, तो इससे गलत प्रवृत्ति निर्धारण होगा; यदि कैंडलस्टिक पैटर्न के निर्णय में त्रुटियां हैं, तो इससे गलत व्यापारिक निर्णय भी होंगे।
इसके अतिरिक्त, रिवर्स कैंडलस्टिक पैटर्न 100% निश्चितता के साथ ट्रेंड रिवर्स की गारंटी नहीं दे सकते हैं, इसलिए रणनीति में अभी भी कुछ जोखिम हैं। जब बाजार बड़े रिवर्स देखता है, तो यह रणनीति के लिए अधिक नुकसान ला सकता है।
इस रणनीति में अभी भी अनुकूलन के लिए काफी जगह है। उदाहरण के लिए, हम चलती औसत के मापदंडों को गतिशील रूप से समायोजित करने और विभिन्न बाजार चरणों में विभिन्न चलती औसत अवधि को अपनाने पर विचार कर सकते हैं। हम निर्णय सटीकता में सुधार के लिए ऐतिहासिक डेटा का उपयोग करके कैंडलस्टिक पैटर्न निर्णय मॉडल को प्रशिक्षित करने के लिए मशीन लर्निंग विधियों को भी पेश कर सकते हैं।
इसके अतिरिक्त, हम रणनीति को अधिक व्यापक और मजबूत बनाने के लिए रुझानों और हॉट एरिया जैसे ट्रेडिंग वॉल्यूम परिवर्तन, अस्थिरता संकेतक आदि का आकलन करने के लिए अधिक कारकों को शामिल करने पर भी विचार कर सकते हैं।
आम तौर पर, यह रणनीति शेयर बाजार में मध्यम अवधि के रुझानों को ट्रैक करने के लिए बहुत उपयुक्त है और अपेक्षाकृत उच्च और स्थिर रिटर्न प्राप्त कर सकती है। यदि आगे अनुकूलित किया जाता है, तो इसमें एक अच्छी तरह से काम करने वाली मात्रात्मक रणनीति बनने की क्षमता है। यदि निवेशक इस रणनीति के उपयोग को समझते हैं, तो वे इसका उपयोग व्यक्तिगत स्टॉक जोखिमों को नियंत्रित करने के लिए दीर्घकालिक होल्डिंग बनाने के लिए भी कर सकते हैं जबकि बेहतर अतिरिक्त रिटर्न प्राप्त कर सकते हैं।
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Trend Following Strategy with Candlestick Patterns", overlay=true) // Moving Average ma_period = input(10, title="Moving Average Period") moving_average = ta.sma(close, ma_period) // Candlestick Patterns // Custom Function abs(x) => x >= 0 ? x : -x // Candlestick Patterns isDoji() => (close - open) <= (high - low) * 0.1 isMarubozuWhite() => close == high and open == low and close > open isHammer() => (high - low) >= 3 * abs(open - close) and (close - low) / (0.001 + high - low) > 0.6 and (open - low) / (0.001 + high - low) > 0.6 isInvertedHammer() => (high - low) >= 3 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6 isLongLowerShadow() => (low - close) > 2 * abs(open - close) and (low - open) / (0.001 + high - low) > 0.6 isUpsideTasukiGap() => close[1] < open[1] and open > close and open > close[1] and close < open[1] isRisingWindow() => high[1] < low and close > open isPiercing() => close[1] < open[1] and close > open and close > ((open + low) / 2) and close < open[1] and open < close[1] isBullishEngulfing() => close[1] < open[1] and close > open and high > high[1] and low < low[1] isTweezerBottom() => low == ta.valuewhen(low == ta.lowest(low, 10), low, 0) and low == ta.valuewhen(low == ta.lowest(low, 20), low, 0) isBullishAbandonedBaby() => close[2] < open[2] and close[1] > open[1] and low[1] > ta.valuewhen(high == ta.highest(high, 2), high, 0) and open > close and close > ta.valuewhen(high == ta.highest(high, 2), high, 0) isMorningStar() => close[2] < open[2] and close[1] < open[1] and close > open[1] and open < close[2] and open > close[1] isMorningDojiStar() => close[2] < open[2] and close[1] < open[1] and isDoji() and close > open[1] and open < close[2] and open > close[1] isDragonflyDoji() => isDoji() and (high - close) / (0.001 + high - low) < 0.1 and (open - low) / (0.001 + high - low) > 0.6 isThreeWhiteSoldiers() => close[2] < open[2] and close[1] < open[1] and close > open and open < close[2] and open < close[1] and close > open[1] isRisingThreeMethods() => close[4] < open[4] and close[1] < open[1] and close > open and open < close[4] and open < close[1] and close > open[1] isMarubozuBlack() => close == low and open == high and open > close isGravestoneDoji() => isDoji() and (close - low) / (0.001 + high - low) < 0.1 and (high - open) / (0.001 + high - low) > 0.6 isHangingMan() => (high - low) >= 4 * abs(open - close) and (open - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6 isLongUpperShadow() => (high - open) > 2 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 isDownsideTasukiGap() => close[1] > open[1] and open < close and open < close[1] and close > open[1] isFallingWindow() => low[1] > high and close < open isDarkCloudCover() => close[1] > open[1] and close < open and close < ((open + high) / 2) and close > open[1] and open > close[1] isBearishEngulfing() => close[1] > open[1] and close < open and high > high[1] and low < low[1] isTweezerTop() => high == ta.valuewhen(high == ta.highest(high, 10), high, 0) and high == ta.valuewhen(high == ta.highest(high, 20), high, 0) isAbandonedBaby() => close[2] > open[2] and close[1] < open[1] and high[1] < ta.valuewhen(low == ta.lowest(low, 2), low, 0) and open < close and close < ta.valuewhen(low == ta.lowest(low, 2), low, 0) isEveningDojiStar() => close[2] > open[2] and close[1] > open[1] and isDoji() and close < open[1] and open > close[2] and open < close[1] isEveningStar() => close[2] > open[2] and close[1] > open[1] and close < open[1] and open > close[2] and open < close[1] isThreeBlackCrows() => close[2] > open[2] and close[1] > open[1] and close < open and open > close[2] and open > close[1] and close < open[1] isFallingThreeMethods() => close[4] > open[4] and close[1] > open isShootingStar() => (high - low) >= 3 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6 doji = isDoji() marubozuWhite = isMarubozuWhite() hammer = isHammer() invertedHammer = isInvertedHammer() longLowerShadow = isLongLowerShadow() upsideTasukiGap = isUpsideTasukiGap() risingWindow = isRisingWindow() piercing = isPiercing() bullishEngulfing = isBullishEngulfing() tweezerBottom = isTweezerBottom() bullishAbandonedBaby = isBullishAbandonedBaby() morningStar = isMorningStar() morningDojiStar = isMorningDojiStar() dragonflyDoji = isDragonflyDoji() threeWhiteSoldiers = isThreeWhiteSoldiers() risingThreeMethods = isRisingThreeMethods() marubozuBlack = isMarubozuBlack() gravestoneDoji = isGravestoneDoji() hangingMan = isHangingMan() longUpperShadow = isLongUpperShadow() downsideTasukiGap = isDownsideTasukiGap() fallingWindow = isFallingWindow() darkCloudCover = isDarkCloudCover() bearishEngulfing = isBearishEngulfing() tweezerTop = isTweezerTop() abandonedBaby = isAbandonedBaby() eveningDojiStar = isEveningDojiStar() eveningStar = isEveningStar() threeBlackCrows = isThreeBlackCrows() fallingThreeMethods = isFallingThreeMethods() shootingStar = isShootingStar() isBullishPattern() => (isMarubozuWhite() or isHammer() or isInvertedHammer() or isDoji() or isMorningStar() or isBullishEngulfing() or isThreeWhiteSoldiers() or isMarubozuBlack() or isHangingMan() or isDownsideTasukiGap() or isDarkCloudCover()) isBearishPattern() => (isMarubozuBlack() or isInvertedHammer() or isLongUpperShadow() or isTweezerTop() or isGravestoneDoji() or isEveningStar() or isBearishEngulfing() or isThreeBlackCrows() or isShootingStar()) isBullishCandle = isBullishPattern() isBearishCandle = isBearishPattern() // Calculate Pivot Points pivotPoint(high, low, close) => (high + low + close) / 3 r1 = pivotPoint(high[1], low[1], close[1]) * 2 - low[1] s1 = pivotPoint(high[1], low[1], close[1]) * 2 - high[1] r2 = pivotPoint(high[1], low[1], close[1]) + (high[1] - low[1]) s2 = pivotPoint(high[1], low[1], close[1]) - (high[1] - low[1]) r3 = high[1] + 2 * (pivotPoint(high[1], low[1], close[1]) - low[1]) s3 = low[1] - 2 * (high[1] - pivotPoint(high[1], low[1], close[1])) // Trend Identification is_uptrend = close > moving_average is_downtrend = close < moving_average // Entry and Exit Conditions with Trend Identification enterLong = is_uptrend and isBullishCandle and close > r1 exitLong = is_uptrend and (bearishEngulfing or doji or close < s1) enterShort = is_downtrend and isBearishCandle and close < s1 exitShort = is_downtrend and (bullishEngulfing or doji or close > r1) // Strategy Execution if enterLong and strategy.position_size == 0 and strategy.position_size[1] == 0 and close > r1 strategy.entry("Buy", strategy.long, qty=1) if exitLong and strategy.position_size > 0 strategy.close("Buy") if enterShort and strategy.position_size == 0 and close < s1 strategy.entry("Sell", strategy.short, qty=1) if exitShort and strategy.position_size < 0 strategy.close("Sell") // Stop-Loss and Trailing Stop-Loss stop_loss_pct = input(2.0, title="Stop Loss Percentage") trailing_stop_loss_pct = input(1.0, title="Trailing Stop Loss Percentage") trailing_stop_loss_active = input(true, title="Trailing Stop Loss Active") // Stop-Loss stop_loss_level = strategy.position_avg_price * (1 - stop_loss_pct / 100) strategy.exit("Stop Loss", "Buy", loss=stop_loss_level) // Trailing Stop-Loss // Plotting Moving Average plot(moving_average, color=color.blue, title="Moving Average", linewidth=2) // Plotting Candlestick Patterns plotshape(isBullishCandle, title="Bullish Candle", location=location.belowbar, color=color.green, style=shape.labelup) plotshape(isBearishCandle, title="Bearish Candle", location=location.abovebar, color=color.red, style=shape.labeldown) // Plotting Support and Resistance Levels //hline(r1, "Resistance Level 1", color=color.red, linestyle=hline.style_dotted) //hline(s1, "Support Level 1", color=color.green, linestyle=hline.style_dotted)