Stratégie de trading pyramidale dynamique à super tendance sur plusieurs périodes

ATR ST SL
Date de création: 2025-01-06 17:02:35 Dernière modification: 2025-01-06 17:02:35
Copier: 0 Nombre de clics: 460
1
Suivre
1617
Abonnés

Stratégie de trading pyramidale dynamique à super tendance sur plusieurs périodes

Aperçu

Il s’agit d’une stratégie de trading pyramidale basée sur plusieurs indicateurs Supertrend. Il identifie les opportunités de trading à haute probabilité en définissant l’indicateur Supertrend avec trois périodes et multiplicateurs différents. La stratégie adopte une méthode d’ajout de position pyramidale dynamique, autorise jusqu’à trois entrées et combine un stop loss dynamique et des conditions de sortie flexibles pour atteindre la maximisation des bénéfices et le contrôle des risques.

Principe de stratégie

La stratégie utilise l’indicateur Supertrend avec trois paramètres différents : rapide, moyen et lent. Le signal d’entrée est basé sur l’intersection de ces trois indicateurs et la direction de la tendance, en utilisant un style pyramidal à trois couches pour ajouter des positions : la première couche entre sur le marché lorsque l’indicateur rapide est à la baisse, l’indicateur moyen est à la hausse et l’indicateur lent L’indicateur est en baisse ; la deuxième couche entre sur le marché lorsque l’indicateur rapide est en hausse. Entrez sur le marché par une percée lorsque l’indicateur de vitesse moyenne et l’indicateur de vitesse moyenne se déplacent ensemble vers le bas ; le troisième niveau entre sur le marché par une percée lorsque le marché atteint un nouveau sommet. La sortie adopte plusieurs mécanismes tels que le stop loss dynamique, le stop loss à prix moyen et l’inversion de tendance globale.

Avantages stratégiques

  1. Le mécanisme de confirmation multiple améliore la précision des transactions
  2. La pyramide peut augmenter considérablement les profits sur les marchés en tendance
  3. Le mécanisme de stop loss dynamique protège les bénéfices tout en laissant aux tendances une grande marge de développement
  4. Un mécanisme de sortie flexible peut mieux s’adapter aux différents environnements de marché
  5. Utilisez le contrôle de position en pourcentage pour vous adapter à différentes tailles de fonds

Risque stratégique

  1. Des faux signaux peuvent fréquemment se produire sur des marchés volatils
  2. La pyramide peut entraîner des pertes plus importantes lorsque la tendance s’inverse soudainement
  3. Plusieurs indicateurs peuvent entraîner un décalage du signal
  4. L’optimisation des paramètres comporte un risque de surapprentissage Il est recommandé d’utiliser une gestion stricte de l’argent et des tests rétrospectifs pour contrôler ces risques.

Orientation de l’optimisation de la stratégie

  1. Ajoutez un mécanisme de filtrage de l’environnement de marché pour ajuster dynamiquement les paramètres dans différents environnements de volatilité
  2. Optimiser l’intervalle entre l’ajout de positions et la proportion d’allocation de positions
  3. Introduire davantage d’indicateurs techniques pour filtrer les faux signaux
  4. Développer des mécanismes de paramètres adaptatifs pour s’adapter aux changements du marché
  5. Améliorez le mécanisme de sortie, vous pouvez envisager d’ajouter des objectifs de profit et des stops loss temporels

Résumer

Cette stratégie capture les opportunités de tendance grâce à plusieurs indicateurs Supertrend et méthodes d’ajout de pyramide, et contrôle les risques avec un stop-loss dynamique et des mécanismes de sortie flexibles. Bien qu’il existe certaines limites, grâce à une optimisation continue et à un contrôle strict des risques, cette stratégie a une bonne valeur d’application pratique.

Code source de la stratégie
/*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('4Vietnamese 3x Supertrend', overlay=true, max_bars_back=1000, initial_capital = 10000000000, slippage = 2, commission_type = strategy.commission.percent, commission_value = 0.013, default_qty_type=strategy.percent_of_equity, default_qty_value = 33.33, pyramiding = 3, margin_long = 0, margin_short = 0)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Inputs

// Supertrend Settings
STATRLENGTH1 = input.int(10, title='Fast Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT1 = input.float(1, title='Fast Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')
STATRLENGTH2 = input.int(11, title='Medium Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT2 = input.float(2, title='Medium Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')
STATRLENGTH3 = input.int(12, title='Slow Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT3 = input.float(3, title='Slow Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')

isUseHighestOf2RedCandleSetup = input.bool(false, group = "Setup Filters")


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Calculations 
[superTrend1, dir1] = ta.supertrend(STATRMULT1, STATRLENGTH1)
[superTrend2, dir2] = ta.supertrend(STATRMULT2, STATRLENGTH2)
[superTrend3, dir3] = ta.supertrend(STATRMULT3, STATRLENGTH3)

// directionST1 = dir1 == 1 and dir1[1] == 1 ? false : dir1 == -1 and dir1[1] == -1 ? true : false
// directionST2 = dir2 == 1 and dir2[1] == 1 ? false : dir2 == -1 and dir2[1] == -1 ? true : false
// directionST3 = dir3 == 1 and dir3[1] == 1 ? false : dir3 == -1 and dir3[1] == -1 ? true : false


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Calculate highest from supertrend1 uptrend
var float highestGreen = 0
if dir1 < 0 and highestGreen == 0 and (isUseHighestOf2RedCandleSetup ? close < open : true)
    highestGreen := high
if highestGreen > 0 and (isUseHighestOf2RedCandleSetup ? close < open : true)
    if high > highestGreen
        highestGreen := high
if dir1 >= 0
    highestGreen := 0


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Entry SL
var entrySL4Long1 = false
var entrySL4Long2 = false
var entrySL4Long3 = false

isUseEntrySL = input.bool(true, group = "Entry SL Option")
dataToCalculate = input.source(low, group = "Entry SL Option")

if isUseEntrySL and (dir1 > 0 and dir2 < 0 and dir3 < 0)
    if strategy.opentrades >= 1
        if dataToCalculate > strategy.opentrades.entry_price(0)
            entrySL4Long1 := true
        else 
            entrySL4Long1 := false

        if entrySL4Long1 and close > strategy.opentrades.entry_price(0)
            strategy.exit('exit1', from_entry = 'long1', stop = strategy.opentrades.entry_price(0))

    if strategy.opentrades >= 2 
        if dataToCalculate > strategy.opentrades.entry_price(1)
            entrySL4Long2 := true
        else 
            entrySL4Long2 := false
    
        if entrySL4Long2 and close > strategy.opentrades.entry_price(1)
            strategy.exit('exit2', from_entry = 'long2', stop = strategy.opentrades.entry_price(1))   

    if strategy.opentrades >= 3 
        if dataToCalculate > strategy.opentrades.entry_price(2) 
            entrySL4Long3 := true
        else 
            entrySL4Long3 := false
    
        if entrySL4Long3 and close >  strategy.opentrades.entry_price(2)
            strategy.exit('exit3', from_entry = 'long3', stop = strategy.opentrades.entry_price(2))

if strategy.closedtrades > strategy.closedtrades[1]
    if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit3'
        entrySL4Long3 := false
    if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit2'
        entrySL4Long2 := false
    if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit1'
        entrySL4Long1 := false

    
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Entry
if dir3 < 0
    if dir2 > 0 and dir1 < 0
        strategy.entry('long1', strategy.long)
    else if dir2 < 0
        strategy.entry('long2', strategy.long, stop=superTrend1)
else
    if dir1 < 0 and highestGreen > 0
        strategy.entry('long3', strategy.long, stop=highestGreen)


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Exit
isUseAllDowntrendExit = input.bool(true, group = "Exit Type")
if isUseAllDowntrendExit and dir3 > 0 and dir2 > 0 and dir1 > 0 and close < open
    strategy.close_all()

isUseAvgPriceInLoss = input.bool(true, group = "Exit Type")
if isUseAvgPriceInLoss and strategy.position_avg_price > close //and strategy.position_avg_price <= close[1]
    //  and (dir1 > 0 or dir2 > 0 or dir3 > 0)
    //  and strategy.opentrades >= 1  
    //  and strategy.opentrades >= 3  
    strategy.close_all()

isUseAllPositionsInLoss = input.bool(false, group = "Exit Type")
if isUseAllPositionsInLoss
      and (
       false
         or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close))

         or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close)
             and ((not na(strategy.opentrades.entry_price(1))) and strategy.opentrades.entry_price(1) > close))

         or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close)
             and ((not na(strategy.opentrades.entry_price(1))) and strategy.opentrades.entry_price(1) > close)
             and ((not na(strategy.opentrades.entry_price(2))) and strategy.opentrades.entry_price(2) > close))
         )
    strategy.close_all()


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Plot
plot(superTrend1, title='Fast Supertrend',      color=dir1 == 1 and dir1[1] == 1 ? color.red : dir1 == -1 and dir1[1] == -1 ? color.green : na)
plot(superTrend2, title='Medium Supertrend',    color=dir2 == 1 and dir2[1] == 1 ? color.red : dir2 == -1 and dir2[1] == -1 ? color.green : na)
plot(superTrend3, title='Slow Supertrend',      color=dir3 == 1 and dir3[1] == 1 ? color.red : dir3 == -1 and dir3[1] == -1 ? color.green : na)