Stratégie de SuperTrend

Auteur:ChaoZhang est là., Date: 2024-02-02 11h48
Les étiquettes:

img

Résumé

Cette stratégie utilise l'indicateur Supertrend pour déterminer les tendances des prix et entre dans des positions longues ou courtes lorsque les tendances changent.

La stratégie a des plages de dates de backtesting intégrées et la possibilité de négocier uniquement à certaines heures de la journée et de fermer tous les métiers à la fin de cette période. Cela est particulièrement utile pour les actions de day trading. Lorsque l'option de la période est activée, vous pouvez choisir d'entrer dans la position actuelle immédiatement lorsque la période commence, ou attendre un changement de tendance pour entrer dans la première position.

La stratégie vous permet également de spécifier des niveaux de stop loss et de profit basés sur le pourcentage. Dans la plupart des cas, l'arrêt basé sur l'ATR fourni par Supertrend lui-même rend un stop loss supplémentaire inutile.

Enfin, il existe des champs d'alerte personnalisés pour les messages d'entrée et de sortie à utiliser avec les services de négociation automatisés.

La logique de la stratégie

La stratégie Supertrend est basée sur les principes clés suivants:

  1. Calcul de la valeur ATR: peut choisir entre le calcul de la SMA ou l'indicateur ATR intégré. Formule SMA:

    atr2 = sma(tr, Periods)
    
  2. Calculez les bandes supérieure et inférieure. la bande supérieure est proche moins ATR multiplicateur fois ATR. la bande inférieure est proche plus multiplicateur fois ATR.

    up = close - (Multiplier * atr) 
    dn = close + (Multiplier * atr)
    
  3. Déterminez la direction de la tendance en comparant le prix aux bandes. Tendance haussière lorsque le prix dépasse la bande inférieure. Tendance baissière lorsque le prix dépasse la bande supérieure.

    trend := trend == -1 and close > dn ? 1 : trend == 1 and close < up ? -1 : trend
    
  4. Générer des signaux de négociation sur les changements de tendance, par exemple un signal de vente lors d'un passage de tendance haussière à tendance baissière:

    sellSignal = trend == -1 and trend[1] == 1 
    
  5. Filtrez l'entrée en fonction des signaux et des conditions supplémentaires.

  6. Utilisez le stop loss et le take profit pour bloquer les bénéfices ou limiter les risques.

Ce sont les principes de fonctionnement clés derrière la stratégie Supertrend. Combiné avec l'optimisation des paramètres, il peut produire de bons résultats commerciaux.

Les avantages

La stratégie Supertrend présente plusieurs avantages:

  1. Supertrend lui-même identifie efficacement les tendances et est couramment utilisé pour les arrêts de trailing.

  2. Les paramètres ATR personnalisables peuvent être optimisés entre les produits pour un meilleur ajustement.

  3. Des intervalles de temps de backtest et de trading en direct configurables s'adaptent aux différentes sessions de trading.

  4. L'option d'entrer immédiatement dans la première transaction ou d'attendre le signal s'adresse à différents produits.

  5. Le stop loss et le take profit intégrés aident à améliorer la gestion des risques ou à générer plus de bénéfices.

  6. Alertes commerciales personnalisables pour l'intégration avec les systèmes de négociation automatisés et les robots.

Les risques

Il y a aussi quelques risques à prendre en considération:

  1. Supertrend peut produire de faux signaux qui doivent être filtrés avec des conditions supplémentaires.

  2. Les paramètres incorrects de l'ATR peuvent entraîner un sur-échange ou des tendances manquantes, ce qui nécessite une optimisation pour un meilleur équilibre.

  3. Un stop-loss trop proche peut entraîner une sortie prématurée des transactions rentables.

  4. Une mauvaise configuration des délais peut entraîner des manquements aux sessions de négociation ou des frais de marge inutilement élevés.

Ces risques peuvent être traités par des ajustements appropriés des paramètres ou des filtres supplémentaires pour améliorer la robustesse.

Des possibilités d'optimisation

Certaines façons d'optimiser davantage la stratégie:

  1. Testez différentes périodes d'ATR pour trouver le bon équilibre, généralement 10-20 fonctionne bien.

  2. Essayez différentes valeurs de multiplicateur ATR, généralement 2-5 est approprié, ajustez pour trouver l'optimum.

  3. Ajoutez des filtres comme MACD, RSI etc. pour réduire les faux signaux.

  4. Optimiser les niveaux de stop loss et de profit pour obtenir les meilleurs résultats.

  5. Testez différentes plages de temps de négociation, des durées plus courtes conviennent aux stratégies intraday et à haute fréquence.

  6. Mettre en œuvre la sélection automatique des symboles pour suivre une dynamique ou une volatilité élevée.

Conclusion

Dans l'ensemble, il s'agit d'une stratégie de suivi des tendances assez courante et pratique. Il suit efficacement les tendances avec des paramètres personnalisables, mais comporte également des risques inhérents à gérer.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © REV0LUTI0N

//@version=4

// Strategy
strategy("Supertrend Strategy", overlay=true, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash)
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
enableentry = input(true, title="Enter First Trade ASAP")
waitentry = input(false, title="Wait To Enter First Trade")

atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
Long = (trend == 1 ? up : na)
buySignal = trend == 1 and trend[1] == -1

dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
Short = (trend == 1 ? na : dn)
sellSignal = trend == -1 and trend[1] == 1

// Strategy Backtesting
startDate  = input(timestamp("2021-01-01T00:00:00"), type = input.time, title='Backtesting Start Date')
finishDate = input(timestamp("2021-12-31T00:00:00"), type = input.time, title='Backtesting End Date')

time_cond  = true

//Time Restriction Settings
startendtime = input("", title='Time Frame To Enter Trades')
enableclose = input(false, title='Enable Close Trade At End Of Time Frame')
timetobuy = (time(timeframe.period, startendtime))
timetoclose = na(time(timeframe.period, startendtime))

// Stop Loss & Take Profit % Based
enablesl = input(false, title='Enable Stop Loss')
enabletp = input(false, title='Enable Take Profit')
stopTick = input(5.0, title='Stop Loss %', type=input.float, step=0.1) / 100
takeTick = input(10.0, title='Take Profit %', type=input.float, step=0.1) / 100

longStop = strategy.position_avg_price * (1 - stopTick)
shortStop = strategy.position_avg_price * (1 + stopTick)
shortTake = strategy.position_avg_price * (1 - takeTick)
longTake = strategy.position_avg_price * (1 + takeTick)

plot(strategy.position_size > 0 and enablesl ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL")
plot(strategy.position_size < 0 and enablesl ? shortStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Short Fixed SL")
plot(strategy.position_size > 0 and enabletp ? longTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Take Profit")
plot(strategy.position_size < 0 and enabletp ? shortTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Take Profit")

// Alert messages
message_enterlong  = input("", title="Long Entry message")
message_entershort = input("", title="Short Entry message")
message_closelong = input("", title="Close Long message")
message_closeshort = input("", title="Close Short message")

// Strategy Execution
if Long and time_cond and timetobuy and enableentry
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if Short and time_cond and timetobuy and enableentry
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if buySignal and time_cond and timetobuy and waitentry
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if sellSignal and time_cond and timetobuy and waitentry
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if strategy.position_size > 0 and timetoclose and enableclose
    strategy.close_all(alert_message = message_closelong)
if strategy.position_size < 0 and timetoclose and enableclose
    strategy.close_all(alert_message = message_closeshort)
    
if strategy.position_size > 0 and enablesl and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong)
if strategy.position_size < 0 and enablesl and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)
    
if strategy.position_size > 0 and enabletp and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong)
if strategy.position_size < 0 and enabletp and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)






Plus de