
La stratégie utilise le diagramme des bandes de Nadaraya-Watson pour traiter les prix en douceur et calculer la hausse et la baisse en fonction des prix après la levée. Ensuite, l’indicateur ADX et DI est utilisé pour déterminer la force et la direction de la tendance, l’indicateur RSI pour confirmer la dynamique de la tendance, tout en identifiant les points de rupture potentiels par la hausse et la baisse des prix. Enfin, la combinaison de plusieurs signaux tels que la tendance, la rupture et la dynamique est utilisée pour exécuter les transactions et la gestion des risques par des arrêts dynamiques.
La stratégie utilise un graphique à bandes de Nadezhda-Watson pour aplanir les prix, combinant des indicateurs de tendance tels que l’ADX, le DI et l’indicateur de dynamique du RSI, ainsi que des signaux multiples tels que les points de rupture des prix, pour construire un système de négociation plus complet. La gestion dynamique des arrêts de perte peut être adaptée aux changements du marché et contrôler les risques dans une certaine mesure.
/*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")