यह रणनीति मूल्य डेटा को चिकना करने और चिकनी कीमत के आधार पर ऊपरी और निचले बैंड की गणना करने के लिए नादाराया-वॉटसन लिफाफे का उपयोग करती है। फिर यह प्रवृत्ति की ताकत और दिशा निर्धारित करने के लिए ADX और DI संकेतकों का उपयोग करता है, और प्रवृत्ति गति की पुष्टि करने के लिए RSI संकेतक का उपयोग करता है। संभावित ब्रेकआउट की पहचान तब की जाती है जब मूल्य लिफाफे के बैंड के ऊपर या नीचे पार करता है। अंत में, यह जोखिम को प्रबंधित करने के लिए गतिशील स्टॉप-लॉस का उपयोग करते हुए, प्रवृत्ति, ब्रेकआउट और गति के संयुक्त संकेतों के आधार पर ट्रेड करता है।
यह रणनीति एक व्यापक ट्रेडिंग प्रणाली बनाने के लिए ADX और DI, आरएसआई गति संकेतक और मूल्य ब्रेकआउट बिंदुओं जैसे प्रवृत्ति संकेतकों के साथ मूल्य चिकनाई के लिए नादाराया-वॉटसन लिफाफे को जोड़ती है। गतिशील स्टॉप-लॉस प्रबंधन बाजार में बदलावों के अनुकूल होने और कुछ हद तक जोखिम को नियंत्रित करने में मदद करता है। हालांकि, व्यावहारिक अनुप्रयोग में, रणनीति की मजबूती और लाभप्रदता में सुधार के लिए प्रवृत्ति पहचान, गतिशील स्टॉप-लॉस और पैरामीटर सेटिंग्स को अनुकूलित करने पर ध्यान दिया जाना चाहिए।
/*backtest start: 2024-04-01 00:00:00 end: 2024-04-18 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Nadaraya-Watson Envelope with Multi-Confirmation and Dynamic Stop-Loss", overlay=true) // Input parameters h = input.float(7.2, "Bandwidth", minval=0) mult = input.float(2.1, minval=0) src = input(close, "Source") // ADX and DI Input Parameters adxLength = input.int(14, "ADX Length") adxThreshold = input.float(25, "ADX Threshold") adxSmoothing = input.int(14, "ADX Smoothing") // Calculate ADX and DI [dmiPlus, dmiMinus, adx] = ta.dmi(adxLength, adxSmoothing) strongTrendUp = dmiPlus > dmiMinus and adx > adxThreshold strongTrendDown = dmiMinus > dmiPlus and adx > adxThreshold // Nadaraya-Watson Envelope Calculation gauss(x, h) => math.exp(-(math.pow(x, 2) / (h * h * 2))) coefs = array.new_float(0) den = 0.0 for i = 0 to 100 w = gauss(i, h) array.push(coefs, w) den := array.sum(coefs) out = 0.0 for i = 0 to 100 out += src[i] * array.get(coefs, i) out /= den mae = ta.sma(math.abs(src - out), 100) * mult upper = ta.sma(out + mae, 10) lower = ta.sma(out - mae, 10) // Confirmations breakoutUp = ta.crossover(src, upper) breakoutDown = ta.crossunder(src, lower) // Original RSI period and thresholds rsiPeriod = input.int(14, "RSI Period") rsi = ta.rsi(src, rsiPeriod) momentumUp = rsi > 70 and adx > adxThreshold momentumDown = rsi < 30 and adx > adxThreshold // // Plot ADX-based Trend Confirmation Lines // if (strongTrendUp) // line.new(bar_index, low, bar_index + 1, low, color=color.new(color.blue, 50), width=2, style=line.style_dashed) // if (strongTrendDown) // line.new(bar_index, high, bar_index + 1, high, color=color.new(color.red, 50), width=2, style=line.style_dashed) // Plot Breakout Confirmation Dots plotshape(series=breakoutUp, style=shape.circle, location=location.abovebar, color=color.blue, size=size.tiny, title="Breakout Up") plotshape(series=breakoutDown, style=shape.circle, location=location.belowbar, color=color.orange, size=size.tiny, title="Breakout Down") // Plot Momentum Confirmation Arrows plotshape(series=momentumUp, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny, title="Momentum Up") plotshape(series=momentumDown, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny, title="Momentum Down") // Strategy Entry and Exit var float stopLossLevel = na var float highestPrice = na potentialBuy = strongTrendUp and breakoutUp potentialSell = strongTrendDown and breakoutDown momentumConfirmUp = potentialBuy and momentumUp momentumConfirmDown = potentialSell and momentumDown if (momentumConfirmUp) strategy.entry("Buy", strategy.long) stopLossLevel := close * 0.90 highestPrice := close if (momentumConfirmDown) strategy.entry("Sell", strategy.short) stopLossLevel := close * 1.10 highestPrice := close if (strategy.position_size > 0) highestPrice := math.max(highestPrice, close) stopLossLevel := math.max(highestPrice * 0.85, close * 0.90) if (strategy.position_size < 0) highestPrice := math.min(highestPrice, close) stopLossLevel := math.min(highestPrice * 1.15, close * 1.10) // Close position if stop loss is hit if (strategy.position_size > 0 and close < stopLossLevel) strategy.close("Buy") if (strategy.position_size < 0 and close > stopLossLevel) strategy.close("Sell")