Diese Strategie verwendet den Nadaraya-Watson-Umschlag, um die Preisdaten zu glätten und die oberen und unteren Bands auf der Grundlage des glätteten Preises zu berechnen. Anschließend werden die ADX- und DI-Indikatoren verwendet, um die Trendstärke und -richtung zu bestimmen, und der RSI-Indikator, um die Trenddynamik zu bestätigen. Potenzielle Ausbrüche werden identifiziert, wenn der Preis über oder unter die Umschlagbänder geht. Schließlich werden Trades basierend auf den kombinierten Signalen von Trend, Ausbruch und Dynamik ausgeführt, während dynamischer Stop-Loss zum Risikomanagement verwendet wird.
Diese Strategie kombiniert den Nadaraya-Watson-Umschlag für die Preisschleifung mit Trendindikatoren wie ADX und DI, dem RSI-Impulsindikator und Preis-Breakout-Punkten, um ein umfassendes Handelssystem zu schaffen.
/*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")