Stratégie de cible à plusieurs niveaux et de stop loss suiveur

HEIKIN ASHI HA TARGET ZONE Trailing Stop PYRAMIDING BREAK-EVEN risk management
Date de création: 2025-03-31 16:20:21 Dernière modification: 2025-03-31 16:20:21
Copier: 1 Nombre de clics: 309
2
Suivre
319
Abonnés

Stratégie de cible à plusieurs niveaux et de stop loss suiveur Stratégie de cible à plusieurs niveaux et de stop loss suiveur

Aperçu

La stratégie de cibles à plusieurs niveaux et d’arrêt de suivi est un système de suivi des tendances basé sur le modèle de graphique de Hines-Ansi, conçu pour capturer la dynamique du marché et protéger les bénéfices. La stratégie permet une entrée initiale et une entrée secondaire (en position pyramidale), avec un objectif de profit et un arrêt de perte indépendants pour chaque entrée.

Principe de stratégie

La stratégie fonctionne sur plusieurs principes clés:

  1. Signaux de carte de la Haine: Utilisez un graphique de Haines-Ansi pour filtrer le bruit du marché et identifier les tendances. Un signal à tête multiple est déclenché lorsque le prix de clôture actuel de l’HA est supérieur au prix d’ouverture de l’HA et supérieur au prix de clôture précédent de l’HA. Un signal à tête vide est le contraire.

  2. Système d’entrée à deux niveaux:

    • Première entrée: définir des objectifs et des niveaux de stop-loss prédéfinis en fonction du signal initial HA
    • Deuxième entrée: une entrée supplémentaire est autorisée si le marché continue à montrer des signaux favorables HA après la réalisation du premier objectif
  3. Dépassement de la protection contre les pertesLorsque le premier objectif est atteint, la stratégie déplace automatiquement le niveau de stop loss vers le prix d’entrée (le point d’équilibre gagnant-perdant) pour s’assurer qu’il n’y a pas de pertes.

  4. Le concept de zone cible: lorsque le prix est proche du niveau cible (à l’intérieur d’une baisse prédéfinie), la stratégie lance une “zone cible”, augmentant le niveau cible pour capturer plus de bénéfices potentiels

  5. Le mécanisme d’arrêt des pertes:

    • Suivi de l’entrée initiale: après avoir atteint l’objectif initial, le point d’arrêt suit le déplacement du prix le plus élevé/le plus bas, en gardant une distance fixe
    • Suivi d’entrée secondaire: paramètres de suivi et de stop-loss distincts pour la partie de mise en place
  6. Suivi du statutStratégie: maintien de plusieurs variables pour suivre la direction de la transaction, le pic de prix, l’atteinte du premier objectif et la présence dans la zone cible

Avantages stratégiques

  1. Une gestion complète des risquesLa stratégie offre une gestion des risques à plusieurs niveaux, protégeant les capitaux contre les baisses massives, en prévoyant des arrêts de perte, des protections contre les pertes et des arrêts de perte.

  2. Une pyramide de gains: en permettant une deuxième entrée, la stratégie permet d’augmenter la position dans une tendance confirmée et d’augmenter le potentiel de profit, sans augmenter le risque global car la première transaction est déjà verrouillée au point d’équilibre des pertes et des pertes.

  3. Capture dynamique des bénéfices: Les zones cibles et les fonctions d’augmentation des cibles permettent à la stratégie d’étendre automatiquement les objectifs de profit dans des marchés forts, plutôt que de sortir prématurément d’une forte tendance.

  4. Hauteur personnalisable: La stratégie offre un large éventail de paramètres qui permettent aux traders de s’adapter en fonction des conditions du marché, des caractéristiques de la variété de transactions et des préférences de risque personnelles.

  5. Automatisation de l’exécution: Une fois que les paramètres sont définis, la stratégie effectue tous les ajustements d’entrée, de sortie et de stop-loss, éliminant ainsi l’impact du trading émotionnel.

  6. Commentaires visuels: La stratégie contient des composants visuels clairs qui affichent les niveaux cibles, les niveaux de stop loss et les indicateurs de l’état actuel, permettant aux traders de surveiller facilement l’avancement des transactions.

Risque stratégique

  1. Paramètre SensibilitéLa performance d’une stratégie est fortement dépendante de la configuration des paramètres. Des paramètres de cibles ou de stop-loss inappropriés peuvent conduire à une sortie prématurée d’une bonne transaction ou à un risque de baisse excessif. Ce risque peut être atténué par un retour sur l’historique et l’optimisation de paramètres spécifiques au marché.

  2. Risque de glissement: En particulier pendant l’exécution d’un stop-loss de suivi, des lacunes de marché ou une liquidité insuffisante peuvent entraîner des écarts entre le prix d’exécution réel et le niveau de stop-loss idéal. Le risque peut être réduit en considérant l’ajout d’une réserve de glissement ou en utilisant des paramètres de suivi plus conservateurs.

  3. Retour sur le sur-investissement: L’activation de la deuxième entrée peut entraîner une survente des transactions dans des marchés instables. La mise en œuvre de conditions de filtrage supplémentaires ou de restrictions de temps de deuxième entrée peut réduire ce type de situation.

  4. Risque de basculement des marchés: Bien que la stratégie fonctionne bien dans un marché en tendance, elle peut être moins efficace dans un marché en période de turbulence ou de tournage soudain. La combinaison de la stratégie avec un filtre d’état du marché peut améliorer l’efficacité globale.

  5. Densité de calcul: Stratégie de suivi de plusieurs variables et états pouvant entraîner des retards d’exécution sur certaines plateformes. L’optimisation du code et la simplification de certains calculs peuvent améliorer les performances.

Orientation de l’optimisation de la stratégie

  1. Ajouter un filtre de tendance: L’intégration d’indicateurs de tendance (tels que les moyennes mobiles, l’ADX ou les indicateurs de force de tendance) peut améliorer la qualité d’entrée, en négociant uniquement dans la direction de la tendance confirmée. Cela réduira les signaux erronés dans les marchés surchargés.

  2. Introduire une condition de filtrage temporel: Ajout d’une fenêtre de temps ou d’une période de refroidissement pour les doubles entrées, afin d’éviter les transactions excessives ou les entrées et sorties fréquentes d’une même tendance sur une courte période.

  3. Adaptation à la volatilité: en ajustant dynamiquement les paramètres d’objectifs et de stop loss en fonction de la volatilité du marché (comme l’ATR), la stratégie peut s’adapter à différentes conditions du marché. Cela permettra aux niveaux de stop loss et d’objectifs de mieux correspondre aux caractéristiques du marché actuel.

  4. Amélioration de la logique de Haines-Anse: Les jugements actuels sur les HA sont relativement simples et permettent d’améliorer la qualité du signal en tenant compte de la morphologie de la pluralité des HA ou des indicateurs de dynamique des HA.

  5. Ajout d’un blocage partiel des bénéfices: Mise en place d’une fonction de verrouillage des bénéfices par tranches, permettant de liquider une partie de la position à un niveau de profit spécifique, tout en laissant le reste continuer à fonctionner, ce qui équilibre la protection des bénéfices et la maximisation des bénéfices potentiels.

  6. Optimiser la logique de la zone cibleIl est possible d’envisager des algorithmes d’ajustement des objectifs dynamiques basés sur la volatilité du marché ou sur les tendances des prix récents, afin de mieux s’adapter aux changements de conditions du marché.

Résumer

La stratégie d’objectifs à plusieurs niveaux et de stop-loss est un système de négociation complet qui combine l’identification de tendances en Hines, la gestion dynamique des objectifs, les opportunités d’entrée secondaire et le contrôle des risques à plusieurs niveaux. Les principaux avantages de la stratégie résident dans ses mécanismes flexibles d’expansion des bénéfices et son cadre rigoureux de gestion des risques, qui la rendent adaptée pour capturer des mouvements significatifs sur des marchés tendanciels.

Bien que cette stratégie offre un cadre robuste, son efficacité dépend toujours de l’ajustement approprié des paramètres et des conditions du marché. La stratégie peut être renforcée encore par l’ajout de filtres d’état du marché, de mécanismes d’ajustement de la volatilité et d’une logique de confirmation d’entrée plus complexe.

Code source de la stratégie
/*backtest
start: 2024-03-31 00:00:00
end: 2025-03-29 08:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("Algo Trading v1 | SUNNY GUHA By OIESU", overlay=true, margin_long=100, margin_short=100, pyramiding=100)

// ———— USER INPUTS ———— //
// First Entry Settings
float initialTarget  = input.float(10000, "First Entry: Target ($)", minval=1, tooltip="First target level")
float initialStopLoss = input.float(3000, "First Entry: Stop Loss ($)", minval=1, tooltip="Initial stop loss distance")
bool  useTrailFirst = input.bool(true, "First Entry: Enable Trail", tooltip="Enable trailing features after first target hit")
float profitTrailStepFirst = input.float(1500, "First Entry: Trail Amount ($)", minval=1, tooltip="Trail amount after first target hit")
bool  useTargetZoneFirst = input.bool(true, "First Entry: Enable Target Zone", tooltip="Enable target zone feature")
float targetZoneThresholdFirst = input.float(1000, "First Entry: Target Zone Threshold ($)", minval=1, tooltip="Distance to activate target zone")
float targetIncreaseStepFirst = input.float(2000, "First Entry: Target Increase ($)", minval=1, tooltip="Amount to increase target")

// Second Entry Settings
bool  enableSecondEntries = input.bool(true, "Enable Second Entries", tooltip="Allow re-entries after first target hit")
float secondTarget = input.float(5000, "Second Entry: Target ($)", minval=1, tooltip="Target for second entries")
float secondStopLoss = input.float(2000, "Second Entry: Stop Loss ($)", minval=1, tooltip="Stop loss for second entries")
bool  useTrailSecond = input.bool(true, "Second Entry: Enable Trail", tooltip="Enable trailing for second entries")
float profitTrailStepSecond = input.float(1500, "Second Entry: Trail Amount ($)", minval=1, tooltip="Trail amount for second entries")
bool  useTargetZoneSecond = input.bool(true, "Second Entry: Enable Target Zone", tooltip="Enable target zone")
float targetZoneThresholdSecond = input.float(1000, "Second Entry: Target Zone Threshold ($)", minval=1)
float targetIncreaseStepSecond = input.float(2000, "Second Entry: Target Increase ($)", minval=1)

// ———— HEIKIN-ASHI CALCULATIONS ———— //
var float haOpen   = na
var float haClose  = na
var float haHigh   = na
var float haLow    = na

haClose := (open + high + low + close)/4
haOpen  := na(haOpen[1]) ? (open + close)/2 : (haOpen[1] + haClose[1])/2
haHigh  := math.max(high, math.max(haOpen, haClose))
haLow   := math.min(low, math.min(haOpen, haClose))

// ———— TRACKING VARIABLES ———— //
var float highestPrice     = na  // Tracks highest price for long positions
var float lowestPrice      = na  // Tracks lowest price for short positions
var float basePrice        = na  // Entry price for position
var float targetLevel      = na  // Current target level
var float stopLevel        = na  // Current stop level
var bool  firstTargetHit   = false  // Indicates if first target was hit
var string tradeDirection  = "none"  // Current trade direction
var bool   isSecondEntry   = false   // Tracks if current position is a second entry
var bool   inTargetZone    = false   // Tracks if price is in target zone

// ———— SIGNAL DETECTION ———— //
bullish = haClose > haOpen and haClose > haClose[1]
bearish = haClose < haOpen and haClose < haClose[1]

// Entry conditions - only allow second entries if enabled and after first target hit
longCondition  = bullish and (tradeDirection != "long" or (enableSecondEntries and firstTargetHit))
shortCondition = bearish and (tradeDirection != "short" or (enableSecondEntries and firstTargetHit))

// Position Management - Long Positions
if strategy.position_size > 0
    highestPrice := math.max(high, nz(highestPrice, high))

    if isSecondEntry
        // Second Entry Management
        inTargetZone := useTargetZoneSecond and high >= targetLevel - targetZoneThresholdSecond

        if inTargetZone and useTargetZoneSecond
            targetLevel := targetLevel + targetIncreaseStepSecond

        if useTrailSecond
            stopLevel := math.max(stopLevel, highestPrice - profitTrailStepSecond)

        if low <= stopLevel
            strategy.close_all("Second Entry Stop")
            basePrice := na
            targetLevel := na
            stopLevel := na
            highestPrice := na
            lowestPrice := na
            firstTargetHit := false
            isSecondEntry := false
            inTargetZone := false
            tradeDirection := "none"
    else
        // First Entry Management - improved profit locking
        if not firstTargetHit and high >= basePrice + initialTarget
            // First target hit - ALWAYS lock profit at break-even
            firstTargetHit := true
            stopLevel := basePrice  // Move stop to break-even
            targetLevel := useTrailFirst ? high + targetIncreaseStepFirst : basePrice + initialTarget
        else if firstTargetHit
            // Only modify target if trailing is enabled
            if useTrailFirst
                inTargetZone := useTargetZoneFirst and high >= targetLevel - targetZoneThresholdFirst
                if inTargetZone and useTargetZoneFirst
                    targetLevel := targetLevel + targetIncreaseStepFirst
                // Trail stop-loss but never below break-even
                stopLevel := math.max(basePrice, highestPrice - profitTrailStepFirst)
        else
            // Before first target hit
            targetLevel := basePrice + initialTarget
            stopLevel := basePrice - initialStopLoss

        // Exit on stop hit - this could only be at break-even or better after first target
        if low <= stopLevel
            strategy.close_all("First Entry Stop")
            basePrice := na
            targetLevel := na
            stopLevel := na
            highestPrice := na
            lowestPrice := na
            firstTargetHit := false
            isSecondEntry := false
            inTargetZone := false
            tradeDirection := "none"

// Position Management - Short Positions
if strategy.position_size < 0
    lowestPrice := math.min(low, nz(lowestPrice, low))

    if isSecondEntry
        // Second Entry Management
        inTargetZone := useTargetZoneSecond and low <= targetLevel + targetZoneThresholdSecond

        if inTargetZone and useTargetZoneSecond
            targetLevel := targetLevel - targetIncreaseStepSecond

        if useTrailSecond
            stopLevel := math.min(stopLevel, lowestPrice + profitTrailStepSecond)

        if high >= stopLevel
            strategy.close_all("Second Entry Stop")
            basePrice := na
            targetLevel := na
            stopLevel := na
            highestPrice := na
            lowestPrice := na
            firstTargetHit := false
            isSecondEntry := false
            inTargetZone := false
            tradeDirection := "none"
    else
        // First Entry Management - improved profit locking
        if not firstTargetHit and low <= basePrice - initialTarget
            // First target hit - ALWAYS lock profit at break-even
            firstTargetHit := true
            stopLevel := basePrice  // Move stop to break-even
            targetLevel := useTrailFirst ? low - targetIncreaseStepFirst : basePrice - initialTarget
        else if firstTargetHit
            // Only modify target if trailing is enabled
            if useTrailFirst
                inTargetZone := useTargetZoneFirst and low <= targetLevel + targetZoneThresholdFirst
                if inTargetZone and useTargetZoneFirst
                    targetLevel := targetLevel - targetIncreaseStepFirst
                // Trail stop-loss but never above break-even
                stopLevel := math.min(basePrice, lowestPrice + profitTrailStepFirst)
        else
            // Before first target hit
            targetLevel := basePrice - initialTarget
            stopLevel := basePrice + initialStopLoss

        // Exit on stop hit - this could only be at break-even or better after first target
        if high >= stopLevel
            strategy.close_all("First Entry Stop")
            basePrice := na
            targetLevel := na
            stopLevel := na
            highestPrice := na
            lowestPrice := na
            firstTargetHit := false
            isSecondEntry := false
            inTargetZone := false
            tradeDirection := "none"

// New Position Entry
if strategy.position_size == 0
    if longCondition
        tradeDirection := "long"
        basePrice := close
        targetLevel := basePrice + (firstTargetHit ? secondTarget : initialTarget)
        stopLevel := basePrice - (firstTargetHit ? secondStopLoss : initialStopLoss)
        highestPrice := high
        isSecondEntry := firstTargetHit
        strategy.entry("Long", strategy.long)
    else if shortCondition
        tradeDirection := "short"
        basePrice := close
        targetLevel := basePrice - (firstTargetHit ? secondTarget : initialTarget)
        stopLevel := basePrice + (firstTargetHit ? secondStopLoss : initialStopLoss)
        lowestPrice := low
        isSecondEntry := firstTargetHit
        strategy.entry("Short", strategy.short)

// ———— VISUALIZATION ———— //
// Entry signals
plotshape(longCondition and (strategy.position_size == 0),     title="Buy", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)

plotshape(shortCondition and (strategy.position_size == 0),     title="Sell", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)

// Target and stop levels with clearer colors
plot(targetLevel, title="Target Level", color=color.orange, linewidth=2)
plot(stopLevel, title="Stop Level", color=color.red, linewidth=2)

// Break-even level - shown prominently after first target hit
plot(strategy.position_size != 0 and firstTargetHit ? basePrice : na,     title="Break-Even Level", color=color.green, linewidth=2, style=plot.style_linebr)

// Debug plots for state tracking
plotchar(firstTargetHit, title="First Target Hit", char="T", location=location.top, color=color.yellow, size=size.tiny)
plotchar(isSecondEntry, title="Second Entry", char="2", location=location.top, color=color.white, size=size.tiny)
plotchar(useTrailFirst and firstTargetHit, title="Trail Active", char="→", location=location.top, color=color.blue, size=size.tiny)
plotchar(inTargetZone, title="Target Zone", char="Z", location=location.top, color=color.fuchsia, size=size.tiny)