
La stratégie de suivi des tendances de Haiken Ashe est un système de négociation intégré qui combine les avantages du graphique de Haiken Ashe, de l’indicateur de super-trend et du filtre ADX pour identifier les mouvements de tendance forts et gérer efficacement les fonds. La stratégie se concentre sur la capture de la dynamique dans les tendances établies, tout en utilisant un mécanisme de stop-loss à trois niveaux pour protéger les fonds et verrouiller les bénéfices.
La stratégie de suivi des tendances de Haykanush est basée sur la synergie de trois indicateurs techniques clés:
Une analyse de la carte d’Achille HaikenLa stratégie s’intéresse particulièrement aux “ entités ” Haiken et Akihito qui n’ont pratiquement pas de ligne d’ombre supérieure ou inférieure. Ces lignes indiquent que le prix se déplace de manière décisive dans une seule direction, avec peu ou pas de rebond, suggérant une dynamique forte et une continuation de la tendance. Les lignes vertes sans ligne d’ombre inférieure sont considérées comme des signaux multiples, et les lignes rouges sans ligne d’ombre supérieure sont considérées comme des signaux vides.
Filtrage des indicateurs de tendance à la hausse: Le système utilise l’indicateur de super-tendance (facteur par défaut: 3.0, cycle ATR: 10) pour confirmer la direction de la tendance potentielle. Le signal d’entrée doit être conforme à la direction de la super-tendance, ce qui augmente la fiabilité du signal et réduit les erreurs de transaction.
Filtre ADX (optionnel): L’indice directionnel moyen est utilisé pour évaluer la force d’une tendance, la négociation n’étant déclenchée que lorsque l’ADX dépasse une barre spécifiée (par défaut: 25), ce qui aide à filtrer les signaux de bruit dans les marchés oscillatrices ou transversaux.
Le système de négociation a des règles d’entrée et de sortie claires:
La stratégie est surtout caractérisée par son système innovant de trois niveaux de stop-loss:
Gestion des risques à plusieurs niveauxLe plus grand avantage de la stratégie est que le système de stop loss à trois niveaux offre une protection complète des fonds, adaptée à différentes conditions de marché et à différents scénarios de risque.
Très adaptable: Tous les composants ((Supertrends, ADX) peuvent être activés/désactivés en fonction des différentes conditions du marché, et les paramètres peuvent être ajustés, ce qui donne une grande flexibilité à la stratégie.
Une forte capacité à saisir les tendancesLa stratégie permet d’identifier efficacement les mouvements de tendances fortes en combinant les signaux visuels clairs de Haiken et Achim, la confirmation de supertrends et l’évaluation de la force de la tendance de l’ADX.
Une réponse visuelle claireLa stratégie affiche le statut de la position, le prix d’entrée et le niveau de stop-loss actuel sur le graphique, permettant aux traders de comprendre et de suivre intuitivement la performance de la stratégie.
Gestion intégrée des fondsLa stratégie utilise une méthode de gestion des positions basée sur le pourcentage des droits et intérêts (par défaut: 3%) qui assure la cohérence des marges de risque avec les variations de la taille du compte.
Un système complet de négociation: Fournir un processus de négociation complet, du signal d’entrée aux règles de sortie, sans décision ou indicateur supplémentaire.
Risques de sur-optimisation: la stratégie contient plusieurs paramètres ajustables, ce qui peut entraîner des problèmes de correspondance de la courbe, c’est-à-dire que la stratégie fonctionne bien sur les données historiques, mais ne fonctionne pas bien dans les transactions en temps réel. La solution consiste à utiliser des données historiques suffisamment longues pour faire des retouches et à tester la robustesse de la stratégie dans différentes conditions de marché.
Risque d’inversion de tendanceBien qu’elle dispose d’un mécanisme de stop-loss à plusieurs niveaux, la stratégie peut faire face à des retraits importants en cas de revers soudain d’une tendance forte. Des fluctuations extrêmes soudaines du marché peuvent entraîner l’échec d’un stop-loss en temps opportun, entraînant des pertes supérieures aux attentes. La solution consiste à envisager d’augmenter les filtres de volatilité ou d’imposer des règles de gestion des risques plus strictes.
Paramètre SensibilitéLes paramètres peuvent avoir des conséquences très différentes, en particulier le facteur de super-tendance et les seuils de l’ADX. Cela nécessite que les traders comprennent en profondeur l’impact de chaque paramètre et trouvent un point d’équilibre adapté à un environnement de marché particulier.
La faible volatilité ne fonctionne pas bien: Dans les marchés à faible volatilité ou horizontaux, la stratégie peut générer plusieurs signaux erronés, entraînant des transactions “sillons”. La solution est de suspendre les transactions dans de tels environnements ou d’ajouter des filtres supplémentaires pour les environnements de marché.
Risques liés à la gestion des fonds: La gestion de positions à pourcentage fixe peut ne pas convenir à tous les environnements de marché et peut nécessiter une réduction de la taille des positions pour contrôler le risque dans des marchés très volatils.
Accroître les mécanismes d’adaptation à la volatilité: Les stratégies actuelles peuvent être optimisées davantage en introduisant des filtres de volatilité, tels que des indicateurs de volatilité historique (HV) ou de volatilité implicite (IV), afin d’ajuster automatiquement les paramètres dans différents environnements de marché. Cela permettra aux stratégies de maintenir une performance stable pendant les périodes de forte et de faible volatilité.
Filtre intégréConsidérez d’ajouter un filtre basé sur le temps pour éviter de négocier pendant les périodes de temps connues pour être moins volatiles ou moins tendances. Ceci est particulièrement utile pour le commerce de variétés spécifiques, car différentes variétés présentent des caractéristiques comportementales différentes à différentes périodes de la journée.
L’optimisation de l’apprentissage automatiqueIl est possible d’utiliser des techniques d’apprentissage automatique pour identifier les meilleures combinaisons de paramètres, plutôt que de s’appuyer sur des paramètres statiques. Cela permet d’analyser les modèles dans les données historiques pour prédire quels paramètres peuvent fonctionner le mieux dans des conditions futures de marché spécifiques.
Ajout de filtres sur les marchés concernés: pour renforcer les signaux d’entrée en observant le comportement des marchés ou des indices concernés, par exemple en tenant compte des tendances globales du marché ou de la faiblesse des marchés concernés lors de la négociation d’une variété particulière.
Optimisation des mécanismes de couvertureLe système actuel de trois niveaux de stop-loss peut être optimisé, par exemple en ajustant le pourcentage de stop-loss de l’assurance en fonction de la dynamique de la volatilité, ou en utilisant des niveaux de support/résistance pour définir précisément le point de stop-loss oscillant, plutôt qu’un simple point de retour.
Analyse intégrée du volume des transactions: Ajout d’un filtre de volume de transaction au cours de la confirmation du signal pour s’assurer que le mouvement des prix est suffisamment soutenu par le volume de transaction, ce qui améliore la fiabilité du signal.
La stratégie de suivi des tendances de Haiken Ashe est un système de négociation complexe et complet qui se concentre sur la capture d’opportunités dynamiques dans les tendances fortes grâce à une combinaison unique de graphiques de Haiken Ashe, d’indicateurs de super-tendance et de filtres ADX. Son système de stop-loss à trois niveaux offre une gestion complète des risques, tandis que ses paramètres personnalisables lui permettent de s’adapter à diverses conditions de marché.
Les principaux avantages de cette stratégie résident dans ses signaux visuels clairs, sa forte capacité à identifier les tendances et son mécanisme complet de protection des fonds. Cependant, les traders doivent être conscients des défis liés à l’optimisation des paramètres et des limitations potentielles dans un environnement à faible volatilité.
La stratégie peut être renforcée en termes de stabilité et d’adaptabilité en mettant en œuvre des directions d’optimisation recommandées, telles que l’ajout d’un mécanisme d’adaptation à la volatilité, l’intégration de filtres temporels et l’analyse des volumes de transactions. En fin de compte, la stratégie de suivi des tendances de Heikenbach représente une approche équilibrée, combinant les signaux clairs de l’analyse technique et les principes de gestion du risque systématique, offrant un outil précieux aux traders qui suivent les tendances.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-04-12 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("Heiken Ashi Supertrend ADX - Strategy", overlay=true, initial_capital=1000, commission_type=strategy.commission.percent, commission_value=0, calc_on_every_tick=true, process_orders_on_close=false, default_qty_type=strategy.percent_of_equity, default_qty_value=3)
// Supertrend Settings
useSupertrend = input.bool(true, "Use Supertrend for Entries", group="Supertrend Settings")
atrPeriod = input.int(10, "ATR Period", minval=1, group="Supertrend Settings")
factor = input.float(3.0, "Supertrend Factor", minval=0.5, step=0.1, group="Supertrend Settings")
// ADX Filter Settings
useAdxFilter = input.bool(false, "Use ADX Filter", group="ADX Filter")
adxPeriod = input.int(14, "ADX Period", minval=1, group="ADX Filter")
adxThreshold = input.float(25, "ADX Threshold", minval=0, group="ADX Filter")
// Stop Loss Options
useSwingStop = input.bool(false, "Use Swing Point Stop", group="Stop Loss Options")
swingLookback = input.int(3, "Swing Lookback Periods", minval=1, maxval=20, group="Stop Loss Options")
useSafetyNetStop = input.bool(true, "Use Insurance Stop", group="Stop Loss Options")
safetyNetPercent = input.float(5.0, "Insurance Stop Loss Percent", minval=0.1, step=0.1, group="Stop Loss Options")
// Trailing Stop Loss Settings
useTrailingStop = input.bool(true, "Use ATR Trailing Stop", group="Stop Loss Options")
trailAtrMultiplier = input.float(2.0, "Trailing Stop ATR Multiplier", minval=0.1, step=0.1, group="Stop Loss Options")
// Get HA data for signals
ha_security = ticker.heikinashi(syminfo.tickerid)
[o, h, l, c] = request.security(ha_security, timeframe.period, [open, high, low, close])
// Get real price data
real_open = open
real_high = high
real_low = low
real_close = close
// Calculate Supertrend using built-in function with real price data
[supertrend, direction] = ta.supertrend(factor, atrPeriod)
supertrend := barstate.isfirst ? na : supertrend
// Determine if we're in an uptrend or downtrend based on Supertrend
isUptrend = direction < 0 // In TradingView, negative direction means uptrend
isDowntrend = direction > 0 // In TradingView, positive direction means downtrend
// Calculate ATR for visualization
atrValue = ta.atr(atrPeriod)
// Calculate ADX and Trade Logic
[diplus, diminus, adx] = ta.dmi(adxPeriod, adxPeriod)
int trade = 0
if trade == 0 and diplus > diminus
trade := 1
else if trade == 0 and diminus > diplus
trade := -1
else if trade == 1 and diminus > diplus
trade := -1
else if trade == -1 and diplus > diminus
trade := 1
else
trade := trade[1]
// Combine with ADX Threshold
isAdxBullish = diplus > diminus and adx > adxThreshold
isAdxBearish = diminus > diplus and adx > adxThreshold
// Debug ADX Values (only if needed for development)
// plot(adx, "ADX", color=color.orange, linewidth=1)
// plot(diplus, "DI+", color=color.green, linewidth=1)
// plot(diminus, "DI-", color=color.red, linewidth=1)
// hline(adxThreshold, "ADX Threshold", color=color.gray, linestyle=hline.style_dashed)
// Check for wicks on the current candle
threshold = syminfo.mintick * 0.1
noBottomWick = math.abs(math.min(o, c) - l) <= threshold
noTopWick = math.abs(h - math.max(o, c)) <= threshold
// Identify candle color and signal conditions
isGreenCandle = c > o
isRedCandle = c < o
// KEY INTEGRATION: Color the real bars based on HA trend
bullishColor = color.green // Green for long/bullish
bearishColor = color.purple // Purple for short/bearish
barcolor(isGreenCandle ? bullishColor : bearishColor)
// Signal conditions for both entry and exit
longCondition = (isGreenCandle and noBottomWick and barstate.isconfirmed) and (not useSupertrend or isUptrend) and (not useAdxFilter or isAdxBullish)
shortCondition = (isRedCandle and noTopWick and barstate.isconfirmed) and (not useSupertrend or isDowntrend) and (not useAdxFilter or isAdxBearish)
exitLongCondition = isRedCandle and noTopWick and barstate.isconfirmed
exitShortCondition = isGreenCandle and noBottomWick and barstate.isconfirmed
// Calculate swing points based on real candles (not HA)
swingLow = ta.lowest(real_low, swingLookback)
swingHigh = ta.highest(real_high, swingLookback)
// Position tracking
var int position = 0 // 0 = no position, 1 = long, -1 = short
var float entryPrice = na
var float trailStopLevel = na // For ATR trailing stop
var float swingStopLevel = na // For swing point stop
var float safetyNetStopLevel = na // For safety net stop
var float highestSinceEntry = na // For tracking highest price since entry (for long positions)
var float lowestSinceEntry = na // For tracking lowest price since entry (for short positions)
// Alert variables
var bool longAlert = false
var bool shortAlert = false
var bool exitLongAlert = false
var bool exitShortAlert = false
// Reset alerts each bar
longAlert := false
shortAlert := false
exitLongAlert := false
exitShortAlert := false
// Handle entries and exits
if longCondition and (position <= 0)
if position < 0
exitShortAlert := true
strategy.close("Short", comment="Exit Short")
position := 0
longAlert := true
strategy.entry("Long", strategy.long, comment="Enter Long")
position := 1
entryPrice := real_close
highestSinceEntry := real_close
lowestSinceEntry := na
// Initialize trailing stops
if useTrailingStop
trailStopLevel := real_close - (atrValue * trailAtrMultiplier)
// Initialize swing point stop
if useSwingStop
swingStopLevel := swingLow
// Initialize safety net stop
if useSafetyNetStop
safetyNetStopLevel := real_close * (1 - safetyNetPercent / 100)
if shortCondition and (position >= 0)
if position > 0
exitLongAlert := true
strategy.close("Long", comment="Exit Long")
position := 0
shortAlert := true
strategy.entry("Short", strategy.short, comment="Enter Short")
position := -1
entryPrice := real_close
highestSinceEntry := na
lowestSinceEntry := real_close
// Initialize trailing stops
if useTrailingStop
trailStopLevel := real_close + (atrValue * trailAtrMultiplier)
// Initialize swing point stop
if useSwingStop
swingStopLevel := swingHigh
// Initialize safety net stop
if useSafetyNetStop
safetyNetStopLevel := real_close * (1 + safetyNetPercent / 100)
if position > 0 and exitLongCondition
exitLongAlert := true
strategy.close("Long", comment="Exit Long Signal")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
highestSinceEntry := na
if position < 0 and exitShortCondition
exitShortAlert := true
strategy.close("Short", comment="Exit Short Signal")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
lowestSinceEntry := na
// Check for swing point stop hit
if useSwingStop and position != 0 and not na(swingStopLevel)
// For long positions, check if price drops below the swing low
if position > 0 and real_low <= swingStopLevel
strategy.close("Long", comment="Swing Point Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
highestSinceEntry := na
// For short positions, check if price rises above the swing high
else if position < 0 and real_high >= swingStopLevel
strategy.close("Short", comment="Swing Point Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
lowestSinceEntry := na
// Check for safety net stop loss hit
if useSafetyNetStop and position != 0 and not na(safetyNetStopLevel)
// For long positions, check if price drops below the safety net level
if position > 0 and real_low <= safetyNetStopLevel
strategy.close("Long", comment="Safety Net Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
highestSinceEntry := na
// For short positions, check if price rises above the safety net level
else if position < 0 and real_high >= safetyNetStopLevel
strategy.close("Short", comment="Safety Net Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
lowestSinceEntry := na
// Track highest/lowest prices for trailing stop calculation
if position > 0 and not na(highestSinceEntry)
highestSinceEntry := math.max(highestSinceEntry, real_high)
if position < 0 and not na(lowestSinceEntry)
lowestSinceEntry := math.min(lowestSinceEntry, real_low)
// Update and check trailing stop (ATR-based)
if useTrailingStop and position != 0 and not na(trailStopLevel)
// Update trailing stop level for long positions
if position > 0
// Calculate new potential trailing stop level
trailStopNew = real_close - (atrValue * trailAtrMultiplier)
// Only move the stop up, never down
if trailStopNew > trailStopLevel
trailStopLevel := trailStopNew
// Check if price hit stop
if real_low <= trailStopLevel
strategy.close("Long", comment="ATR Trailing Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
highestSinceEntry := na
// Update trailing stop level for short positions
else if position < 0
// Calculate new potential trailing stop level
trailStopNew = real_close + (atrValue * trailAtrMultiplier)
// Only move the stop down, never up
if trailStopNew < trailStopLevel
trailStopLevel := trailStopNew
// Check if price hit stop
if real_high >= trailStopLevel
strategy.close("Short", comment="ATR Trailing Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
lowestSinceEntry := na
// Plot stop loss levels
plot(useTrailingStop and position != 0 ? trailStopLevel : na, "ATR Trailing Stop", color=color.yellow, style=plot.style_linebr, linewidth=1)
plot(useSwingStop and position != 0 ? swingStopLevel : na, "Swing Point Stop", color=color.red, style=plot.style_circles, linewidth=2)
plot(useSafetyNetStop and position != 0 ? safetyNetStopLevel : na, "Insurance Stop", color=color.yellow, style=plot.style_circles, linewidth=1)
// Visual signals for chart (just entry/exit markers, no ADX labels)
plotshape(longAlert, title="Long Entry", location=location.abovebar, color=bullishColor, style=shape.triangleup, size=size.small)
plotshape(shortAlert, title="Short Entry", location=location.belowbar, color=bearishColor, style=shape.triangledown, size=size.small)
plotshape(exitLongAlert, title="Long Exit Signal", location=location.abovebar, color=bullishColor, style=shape.xcross, size=size.small)
plotshape(exitShortAlert, title="Short Exit Signal", location=location.belowbar, color=bearishColor, style=shape.xcross, size=size.small)
// Supertrend visualization
bodyMiddlePlot = plot((real_open + real_close) / 2, "Body Middle", display=display.none)
upTrend = plot(useSupertrend and isUptrend ? supertrend : na, "Up Trend", color=bullishColor, style=plot.style_linebr, linewidth=1)
downTrend = plot(useSupertrend and isDowntrend ? supertrend : na, "Down Trend", color=bearishColor, style=plot.style_linebr, linewidth=1)
fill(upTrend, bodyMiddlePlot, color=useSupertrend ? color.new(bullishColor, 85) : na, title="Uptrend Background")
fill(downTrend, bodyMiddlePlot, color=useSupertrend ? color.new(bearishColor, 85) : na, title="Downtrend Background")
// Position background
bgcolor(position == 1 ? color.new(bullishColor, 85) : position == -1 ? color.new(bearishColor, 85) : na, title="Position Background")
// Position label
var label positionLabel = na
label.delete(positionLabel)
if barstate.islast
positionText = position == 1 ? "LONG" : position == -1 ? "SHORT" : "FLAT"
entryInfo = not na(entryPrice) ? "\nEntry: " + str.tostring(entryPrice, "#.00000") : ""
atrStopInfo = useTrailingStop and not na(trailStopLevel) ? "\nATR Stop: " + str.tostring(trailStopLevel, "#.00000") + " (" + str.tostring(trailAtrMultiplier, "#.0") + "x ATR)" : ""
swingStopInfo = useSwingStop and not na(swingStopLevel) ? "\nSwing Stop: " + str.tostring(swingStopLevel, "#.00000") + " (" + str.tostring(swingLookback) + " bars)" : ""
safetyNetInfo = useSafetyNetStop and not na(safetyNetStopLevel) ? "\nInsurance Stop: " + str.tostring(safetyNetStopLevel, "#.00000") + " (" + str.tostring(safetyNetPercent, "#.0") + "%)" : ""
supertrendInfo = useSupertrend ? "\nSupertrend: " + (isUptrend ? "UPTREND" : "DOWNTREND") : ""
positionColor = position == 1 ? bullishColor : position == -1 ? bearishColor : color.gray
positionLabel := label.new(bar_index, high, positionText + entryInfo + atrStopInfo + swingStopInfo + safetyNetInfo + supertrendInfo, color=positionColor, style=label.style_label_down, textcolor=color.white)