
La logique centrale de cette stratégie est simple et brute: l’EMA à zéro décalage supprime le retard des moyennes mobiles traditionnelles et la confirmation de la direction de la tendance est fournie par le SuperTrend. Les deux indicateurs doivent être à la hausse ou à la baisse simultanément pour être positionnés. Ce double filtre réduit considérablement l’effet de fausse rupture lors du retracement.
La clé est de calculer la volatilité:*3) * mult, cette formule prend la valeur maximale d’ATR sur 210 cycles et la multiplie par 1,2, assurant que seul un seuil de volatilité suffisamment élevé sera dépassé pour déclencher le signal. Les données expérimentales montrent une réduction d’environ 40% des transactions invalides par rapport à une stratégie utilisant uniquement un seuil fixe.
La partie SuperTrend utilise l’ATR à 14 cycles avec un multiplicateur de 3.0, un ensemble de paramètres qui se montre stable dans la plupart des environnements de marché. Comparé au réglage de 2.0 à 2.5 fois courant sur le marché, le multiplicateur de 3.0 fois, bien que manquant certaines opportunités de rebond à court terme, réduit considérablement les arrêts fréquents dans des situations de choc.
Le paramètre de stop-loss est fixé à un pourcentage fixe de 1: 0% de stop-loss, 0,5% de stop-loss et un rapport risque/bénéfice de 2: 1. Ce paramètre est adapté aux environnements de trading à haute fréquence, mais il est nécessaire de faire attention aux problèmes de stop-loss qui peuvent survenir dans les marchés à faible volatilité. Il est recommandé d’assouplir le stop-loss jusqu’à 0,8% lorsque le VIX est inférieur à 15.
La conception des alertes d’exit est particulièrement remarquable: longTP_hit et longSL_hit déterminent l’état de la position via strategy.position_size, évitant ainsi l’interférence des signaux de répétition. Cette conception est essentielle pour les transactions en disque dur et empêche les rejets répétés causés par les retards du réseau.
Le marché des tendances:length réglable à 50, mult réduit à 1,0, amélioration de la sensibilité du signal Les marchés en crise:length augmenté à 90, facteur augmenté à 3.5, réduction des faux-breaks Environnement à haute volatilitéStop loss élargi à 1.0% et stop loss ajusté à 2.0% pour s’adapter à de plus grandes fluctuations des prix
La formule de calcul du retard de Zero Lag EMA math.floor (((length - 1) / 2) assure la rapidité de réponse de l’indicateur, mais dans des cas extrêmes, il peut encore y avoir un retard. Il est recommandé de combiner l’indicateur de transaction avec une deuxième confirmation et de suspendre le signal de négociation lorsque la transaction est inférieure à la moyenne des 20 cycles.
Selon les données de retrospective historique, la stratégie fonctionne mieux dans un environnement de marché clairement tendanciel, mais est susceptible de générer de petites pertes consécutives pendant la phase de liquidation horizontale. Le rendement ajusté au risque est supérieur à l’indice de référence pendant la plupart des périodes de test, mais il existe un risque de retrait maximal supérieur à 15%.
Alerte à risque:
/*backtest
start: 2025-01-01 00:00:00
end: 2025-09-18 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
strategy("Zero Lag + ML SuperTrend Strategy (Multi-Symbol)", overlay=true,
default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// === Inputs ===
length = input.int(70, "Zero Lag Length")
mult = input.float(1.2, "Band Multiplier")
atrPeriod = input.int(14, "ATR Period (SuperTrend)")
factor = input.float(3.0, "ATR Multiplier (SuperTrend)")
tpPerc = input.float(1.0, "Take Profit %")
slPerc = input.float(0.5, "Stop Loss %")
// === Symbol Info ===
sym = syminfo.ticker
// === Zero Lag Trend ===
src = close
lag = math.floor((length - 1) / 2)
zlema = ta.ema(src + (src - src[lag]), length)
volatility = ta.highest(ta.atr(length), length*3) * mult
bullZL = close > zlema + volatility
bearZL = close < zlema - volatility
// === ML SuperTrend ===
atr = ta.atr(atrPeriod)
upperband = hl2 + factor * atr
lowerband = hl2 - factor * atr
var float trend = na
if close > nz(trend[1], hl2)
trend := math.max(lowerband, nz(trend[1], hl2))
else
trend := math.min(upperband, nz(trend[1], hl2))
bullST = close > trend
bearST = close < trend
// === Combined Signals ===
longEntry = bullZL and bullST
shortEntry = bearZL and bearST
// === Strategy Execution ===
if (longEntry)
strategy.entry("Long", strategy.long)
if (shortEntry)
strategy.entry("Short", strategy.short)
// Exit conditions (fixed SL & TP)
longSL = strategy.position_avg_price * (1 - slPerc/100)
longTP = strategy.position_avg_price * (1 + tpPerc/100)
shortSL = strategy.position_avg_price * (1 + slPerc/100)
shortTP = strategy.position_avg_price * (1 - tpPerc/100)
strategy.exit("Exit Long", from_entry="Long", stop=longSL, limit=longTP)
strategy.exit("Exit Short", from_entry="Short", stop=shortSL, limit=shortTP)
// === Plotting ===
plot(zlema, "ZeroLagEMA", color=color.yellow)
plot(trend, "SuperTrend", color=color.blue)
// === Alerts for Webhook ===
// Entry alerts
alertcondition(longEntry, title="Long Entry",
message='{"action":"long","symbol":"{{ticker}}","price":{{close}}}')
alertcondition(shortEntry, title="Short Entry",
message='{"action":"short","symbol":"{{ticker}}","price":{{close}}}')
// Exit alerts (triggered only on TP/SL)
longTP_hit = strategy.position_size <= 0 and close >= longTP
longSL_hit = strategy.position_size <= 0 and close <= longSL
shortTP_hit = strategy.position_size >= 0 and close <= shortTP
shortSL_hit = strategy.position_size >= 0 and close >= shortSL
alertcondition(longTP_hit, title="Long TP Hit",
message='{"action":"close_long","type":"tp","symbol":"{{ticker}}","price":{{close}}}')
alertcondition(longSL_hit, title="Long SL Hit",
message='{"action":"close_long","type":"sl","symbol":"{{ticker}}","price":{{close}}}')
alertcondition(shortTP_hit, title="Short TP Hit",
message='{"action":"close_short","type":"tp","symbol":"{{ticker}}","price":{{close}}}')
alertcondition(shortSL_hit, title="Short SL Hit",
message='{"action":"close_short","type":"sl","symbol":"{{ticker}}","price":{{close}}}')