Cette stratégie est un système de négociation qui combine la moyenne mobile exponentielle (EMA) et l'indice directionnel moyen (ADX). Elle détermine la direction de la négociation par l'intermédiaire de l'EMA50 et des croisements de prix, utilise l'ADX pour filtrer la force de la tendance et utilise une méthode de stop-loss dynamique basée sur des bougies rentables consécutives. Cette approche permet à la fois de capturer les principales tendances du marché et de sortir en temps opportun lorsque les tendances s'affaiblissent.
La logique de base repose sur les éléments clés suivants:
Il s'agit d'une stratégie de suivi des tendances bien conçue qui capture efficacement les tendances tout en contrôlant les risques en combinant les avantages de l'EMA et de l'ADX. Le mécanisme de stop-loss dynamique est particulièrement innovant, équilibrant efficacement la protection des bénéfices et la capture des tendances. Bien qu'il y ait place à l'optimisation, le cadre global est complet et logiquement solide, ce qui en fait un système de stratégie qui mérite d'être validé dans le trading en direct.
/*backtest start: 2019-12-23 08:00:00 end: 2025-01-04 08:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=6 strategy("Simple EMA 50 Strategy with ADX Filter", overlay=true) // Input parameters emaLength = input.int(50, title="EMA Length") adxThreshold = input.float(20, title="ADX Threshold", minval=0) // Calculate EMA and ADX ema50 = ta.ema(close, emaLength) adxSmoothing = input.int(20, title="ADX Smoothing") [diPlus, diMinus, adx] = ta.dmi(20, adxSmoothing) // Conditions for long and short entries adxCondition = adx > adxThreshold longCondition = adxCondition and close > ema50 // Check if candle closes above EMA shortCondition = adxCondition and close < ema50 // Check if candle closes below EMA // Exit conditions based on 4 consecutive profitable candles var float longSL = na var float shortSL = na var longCandleCounter = 0 var shortCandleCounter = 0 // Increment counters if positions are open and profitable if (strategy.position_size > 0 and close > strategy.position_avg_price) longCandleCounter += 1 if (longCandleCounter >= 4) longSL := na(longSL) ? close : math.max(longSL, close) // Update SL dynamically else longCandleCounter := 0 longSL := na if (strategy.position_size < 0 and close < strategy.position_avg_price) shortCandleCounter += 1 if (shortCandleCounter >= 4) shortSL := na(shortSL) ? close : math.min(shortSL, close) // Update SL dynamically else shortCandleCounter := 0 shortSL := na // Exit based on trailing SL if (strategy.position_size > 0 and not na(longSL) and close < longSL) strategy.close("Buy", comment="Candle-based SL") if (strategy.position_size < 0 and not na(shortSL) and close > shortSL) strategy.close("Sell", comment="Candle-based SL") // Entry logic: Check every candle for new positions if (longCondition) strategy.entry("Buy", strategy.long) if (shortCondition) strategy.entry("Sell", strategy.short) // Plot EMA and ADX for reference plot(ema50, color=color.blue, title="EMA 50") plot(adx, color=color.orange, title="ADX", style=plot.style_stepline, linewidth=1) plot(longSL, color=color.green, title="Long SL", style=plot.style_cross, linewidth=1) plot(shortSL, color=color.red, title="Short SL", style=plot.style_cross, linewidth=1) // Plot signals plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.labelup, title="Buy Signal") plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.labeldown, title="Sell Signal")