L'idée de base de cette stratégie est d'utiliser l'indicateur Average True Range (ATR) pour définir une ligne de stop loss adaptative pour maximiser la protection des positions rentables tout en évitant une perte de stop prématurée. L'indicateur ATR peut capturer dynamiquement la volatilité du marché et ajuster la distance de stop loss en fonction de la volatilité du marché, garantissant un stop loss efficace tout en minimisant la probabilité d'un stop loss. Cette stratégie intègre également des bandes de Bollinger pour visualiser les limites supérieures et inférieures de la ligne de stop loss, avec la possibilité d'ajouter une protection de mèche pour contrer l'effet de la scie à fouet sur les marchés en évolution.
Cette stratégie utilise la moyenne de la période N de l'indicateur ATR multipliée par un facteur comme distance de stop-loss de base. Plus la valeur ATR est grande, plus la volatilité du marché est grande, donc plus la distance de stop-loss est large. Plus la valeur ATR est petite, plus la distance de stop-loss est étroite. Cela permet un ajustement dynamique de la distance de stop-loss en fonction de la volatilité du marché.
Plus précisément, la stratégie utilise la logique de base suivante:
Calculer la valeur ATR de la période ATR (nATRPeriod).
On obtient la distance de stop-loss de base nLoss en multipliant la valeur ATR par un facteur (nATRMultip).
Mettre à jour la ligne de stop loss xATRTrailingStop basée sur la ligne actuelle haute, basse et stop loss de la période précédente.
Si le bas actuel déclenche la ligne de stop loss de la période précédente, la ligne de stop loss se déplace jusqu'en dessous du bas par distance nLoss.
Si le haut actuel déclenche la ligne d'arrêt de la perte de la période précédente, la ligne d'arrêt de la perte descend jusqu'au-dessus du haut par distance nLoss.
Si le stop loss n'est pas déclenché, ajustez la ligne de stop loss en fonction de la distance de prix proche.
Ajouter une distance de protection de mèche en option pour optimiser davantage la ligne de perte d'arrêt.
Tracer des bandes de Bollinger pour visualiser la limite supérieure et inférieure de la ligne de stop loss.
Déterminez la direction de position en fonction de la couleur de la ligne de stop loss.
La stratégie utilise de manière flexible l'indicateur ATR pour permettre à la ligne de stop loss de s'adapter en fonction de la volatilité du marché, en assurant une distance de stop loss raisonnable tout en évitant un stop loss excessif qui entraîne une perte inutile de positions.
Les avantages de cette stratégie:
Utiliser l'indicateur ATR pour ajuster la distance d'arrêt des pertes en s'adaptant dynamiquement aux différentes conditions du marché.
Le multiplicateur personnalisable permet un réglage flexible de la distance de stop loss.
L'ajout de bandes de Bollinger permet de visualiser les limites supérieure et inférieure de la ligne de stop loss.
La protection contre les mèches en option évite la piqûre à la scie dans divers marchés.
Peut être utilisé comme stop loss pour maximiser le retrait des positions rentables.
La logique stratégique est claire et facile à comprendre avec peu de paramètres optimisables.
Applicable à plusieurs produits et à plusieurs délais.
Certains risques de cette stratégie à noter:
L'indicateur ATR réagit lentement aux chocs du marché, ce qui conduit à une grande distance de stop loss.
Un réglage excessif du multiplicateur augmente également la distance d'arrêt des pertes, augmentant le risque de perte.
La protection contre les mèches peut rendre la ligne de stop-loss trop lâche lorsque la scie à fouet augmente.
Les règles d'entrée non prises en compte ne peuvent pas être utilisées comme stratégie Entrées/Sortes.
Tests approfondis et optimisation des paramètres nécessaires pour différents produits et délais.
L'échec du stop-loss peut accroître les pertes, ce qui nécessite une gestion efficace du capital.
La stratégie peut être optimisée dans les aspects suivants:
Testez différentes périodes ATR pour optimiser la distance d'arrêt des pertes.
Ajustez le multiplicateur pour équilibrer la distance de stop-loss et la probabilité.
Optimiser la période de protection de la mèche pour éviter le fouet.
Essayez d'ajouter des conditions d'entrée en plus du stop loss pour en faire une stratégie Entrées/Sortes.
Ajouter un indicateur de tendance pour ajuster la distance stop loss en fonction de la tendance.
Ajustez le stop loss basé sur la théorie des ondes d'Elliott.
L'exposition au risque de défaillance de l'épargne-investissement est calculée en fonction de l'exposition au risque de défaillance.
Cette stratégie utilise la caractéristique adaptative de l'indicateur ATR pour concevoir un mécanisme de stop loss dynamique. Tout en assurant le stop loss, elle minimise également les déclencheurs de stop loss inutiles. La logique de la stratégie est simple et claire, permettant une optimisation flexible en fonction des besoins. Elle fonctionne mieux comme stop loss de suivi pour maximiser la protection des profits. Avec une optimisation des paramètres et un contrôle des risques appropriés, cette stratégie peut être un outil de stop loss efficace dans le trading quantitatif.
/*backtest start: 2022-10-12 00:00:00 end: 2023-10-18 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 //////////////////////////////////////////////////////////// // Copyright by HPotter v2.0 13/10/2014 // Average True Range Trailing Stops Strategy, by Sylvain Vervoort // The related article is copyrighted material from Stocks & Commodities Jun 2009 // Modified by River to add Bands, and change color of Trailing Stop and add Wick Protection. Now turned into a Strategy for Backtesting Purposes. // After backtesting, it seems clear that it functions well as a Trailing Stop, but not as an Entry/Exit strategy. //////////////////////////////////////////////////////////// strategy(title="ATR Trailing Stop Bands Strategy[R] ", overlay = true) nATRPeriod = input(5) nATRMultip = input(4) length = input(30, "#Periods of Wick Protection", minval=2) bType = input(0, "Max [1] or Avg Wick Protection [0]", minval=0, maxval=1) avgupperwick = sma(close[1] <= open[1] ? high[1] - open[1] : high[1] - close[1], length) maxupperwick = highest(close[1] <= open[1] ? high[1] - open[1] : high[1] - close[1], length) avglowerwick = sma(close[1] > open[1] ? open[1] - low[1] : close[1] - low[1], length) maxlowerwick = highest(close[1] > open[1] ? open[1] - low[1] : close[1] - low[1], length) upperwick = bType == 0 ? avgupperwick : maxupperwick lowerwick = bType == 0 ? avglowerwick : maxlowerwick xATR = atr(nATRPeriod) nLoss = nATRMultip * xATR upperband = iff(high < nz(upperband[1], 0) and high[1] < nz(upperband[1], 0), min(nz(upperband[1]), high + nLoss + upperwick), high + nLoss + upperwick) lowerband = iff(low > nz(lowerband[1], 0) and low[1] > nz(lowerband[1], 0), max(nz(lowerband[1]), low - nLoss - lowerwick), low - nLoss - lowerwick) xATRTrailingStop = iff(low > nz(xATRTrailingStop[1], 0) and low[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), low - nLoss - lowerwick), iff(high < nz(xATRTrailingStop[1], 0) and high[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), high + nLoss + upperwick), // iff(low <= nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), high + nLoss + upperwick, iff(high >= nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), low - nLoss - lowerwick,0)))) iff(low <= nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), upperband[1], iff(high >= nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), lowerband[1],0)))) pos = iff(close[1] > nz(xATRTrailingStop[1], 0) and low <= nz(xATRTrailingStop[1], 0), 1, iff(close[1] < nz(xATRTrailingStop[1], 0) and high >= nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) color = pos == 1 ? red: pos == -1 ? green : blue plot(upperband, color=red, title="ATR Upper") plot(xATRTrailingStop, color=color, title="ATR Trailing Stop", linewidth=2) plot(lowerband, color=green, title="ATR Lower") longCondition = (color == green and color[1] == red) if (longCondition) strategy.entry("Long", strategy.long) longExitCondition = (color == red and color[1] == green) if (longExitCondition) strategy.close("Long") shortCondition = (color == red and color[1] == green) if (shortCondition) strategy.entry("Short", strategy.short) shortexitCondition = (color == green and color[1] == red) if (shortexitCondition) strategy.close("Short")