
La estrategia utiliza el gráfico de bandas de Nadezhda-Watson para suavizar el precio y calcular el alza y bajada en función del precio después de la suavización. Luego, utiliza los indicadores ADX y DI para determinar la fuerza y dirección de la tendencia, el indicador RSI para confirmar la dinámica de la tendencia y, al mismo tiempo, para identificar posibles rupturas a través de la subida y bajada del precio. Finalmente, combina múltiples señales como tendencia, ruptura y dinámica para ejecutar la operación y utiliza un stop loss dinámico para administrar el riesgo.
La estrategia utiliza el gráfico de banda de Nadaraya-Watson para suavizar los precios, combinando indicadores de tendencia como el ADX, el DI y el indicador de energía RSI, así como múltiples señales como los puntos de ruptura de los precios, para construir un sistema de negociación más completo. La gestión de stop loss dinámica puede adaptarse a los cambios en el mercado y controlar el riesgo hasta cierto punto.
/*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")