Cette stratégie utilise l'indicateur ATR pour définir des points de stop-loss dynamiques et ajuster les positions de stop-loss en fonction des fluctuations de prix, afin de contrôler les risques.
La stratégie juge d'abord si 5EMA franchit au-dessus de 20EMA pour aller long. Après l'entrée, elle calcule les multiples ATR du prix d'entrée au prix actuel à l'aide de l'indicateur ATR et fixe la position stop loss à 1,5ATR en dessous du prix d'entrée. Au fur et à mesure que le prix augmente, la position stop loss est progressivement augmentée pour augmenter les profits de la position.
Plus précisément, la stratégie définit les variables suivantes:
Après l'entrée, il calcule atr_ref comme la valeur actuelle d'ATR, et atr_div comme le ATR multiples du prix d'entrée au prix actuel. Ensuite, il définit les positions de atr_down, atr_current et atr_up basées sur atr_div. Le prix stop_prix est fixé à 1,5ATR en dessous du prix d'entrée.
Au fur et à mesure que le prix augmente, en comparant le prix actuel avg et atr_up, si avg dépasse atr_up, il recalcule les positions de la ligne atr_div et ATR, augmentant ainsi progressivement la ligne stop loss pour augmenter les bénéfices.
Si le prix dépasse 3ATR du prix d'entrée, il fermera partiellement la position pour verrouiller les bénéfices et définira tookProfit à true. Par la suite, si le prix continue de monter, il continuera à augmenter le stop loss. Lorsque le stop loss est déclenché, il vérifie tookProfit - si vous avez déjà pris un profit partiel plus tôt, il ne fermera que la position restante; sinon, fermez la position complète.
L'utilisation de l'indicateur ATR pour ajuster dynamiquement le stop loss permet de définir une distance de stop raisonnable en fonction de la volatilité du marché.
Suivez les tendances tout en limitant les pertes.
Le mécanisme de prise partielle de profit bloque certains bénéfices et réduit les risques.
L'indicateur ATR n'est pas sensible à des renversements et à des écarts importants.
Les EMA ne peuvent pas déterminer l'inversion de tendance, elles peuvent entrer de nouvelles positions lors d'inversions de tendance.
Haute probabilité de pertes après une prise partielle de profit.
Les paramètres doivent être optimisés davantage, l'arrêt 1.5ATR et la prise de profit 3ATR doivent être ajustés pour différents produits.
Envisagez d'ajouter d'autres indicateurs de stop-loss comme le canal Donchian pour compenser le retard ATR.
Testez différentes moyennes mobiles ou ajoutez le MACD, etc., pour juger de l'inversion de tendance.
Optimiser les ratios et la fréquence des bénéfices partiels pour différents produits.
Optimisation des paramètres sur les multiples ATR pour le stop et le take profit.
Les performances des tests pendant les tendances faibles peuvent désactiver la stratégie pendant les tendances faibles.
La stratégie a une logique claire d'utilisation de l'ATR pour la gestion dynamique des pertes d'arrêt qui est sa plus grande force. Cependant, l'ATR lui-même a des limitations telles que le retard. L'ajout d'autres indicateurs d'arrêt et de tendance l'améliorera.
/*backtest start: 2022-10-03 00:00:00 end: 2023-10-09 00:00:00 period: 1d basePeriod: 1h 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/ // © ekinbasarkomur //@version=5 strategy("[EKIN] ATR Exit Strategy", overlay=true, initial_capital = 1000, default_qty_value = 100, default_qty_type = strategy.percent_of_equity, calc_on_every_tick = true) // Simple EMA tracking fastEMA = ta.ema(close, 5) slowEMA = ta.ema (close, 20) atr = ta.atr(14) // We define entry price for future reference var float entry_price = na // We define stop and take profit for future calculations var float stop_price = na var float take_profit_price = na // We define atr limtim its here var float atr_down = na var float atr_up = na var float atr_current = na var float atr_ref = na avg = (low + high) / 2 // Conditions enterCondition = ta.crossover(fastEMA, slowEMA) var bool tookProfit = false timePeriod = time >= timestamp(syminfo.timezone, 2021, 12, 15, 0, 0) InTrade = strategy.position_size > 0 // Go long if conditions are met if (enterCondition and timePeriod and not InTrade) // Calculate and update variables entry_price := avg atr_ref := atr atr_div = int((avg - entry_price) / atr_ref) atr_down := entry_price + (atr_ref * (atr_div - 1.5)) atr_up := entry_price + (atr_ref * (atr_div + 1)) atr_current := entry_price + (atr_ref * atr_div) stop_price := (entry_price - (atr_ref * 1.5)) take_profit_price := (entry_price + (atr_ref * 3)) strategy.order("buy", strategy.long, qty = 2) // Enter here if in position if InTrade or tookProfit stopCondition = avg < stop_price takeProfitCondition = avg > take_profit_price if avg < atr_down stopCondition := true // Move stop price and exit price if price for each atr price increase if avg > atr_up if tookProfit atr_ref := atr atr_div = int((avg - entry_price) / atr_ref) atr_down := entry_price + (atr_ref * (atr_div - 1)) atr_up := entry_price + (atr_ref * (atr_div + 1)) atr_current := entry_price + (atr_ref * atr_div) // Take half of the investment if current price is 3 atr higher than entry price if (takeProfitCondition and timePeriod and InTrade and not tookProfit) strategy.order("take_half_profit", strategy.short, qty = 1) tookProfit := true // Exit position if conditions are met and reset the variables if (stopCondition and timePeriod and InTrade) if tookProfit strategy.order("exit", strategy.short, qty = 1) else strategy.order("stop_loss", strategy.short, qty = 2) tookProfit := false // Plot EMA's plot(fastEMA, color = color.blue) plot(slowEMA, color = color.yellow) // Plot ATR Limit/Stop positions profit_plot = plot(series = InTrade?atr_up:na, title = "profit", color = color.green, style=plot.style_linebr) close_plot = plot(series = InTrade?atr_current:na, title = "close", color = color.white, style=plot.style_linebr) stop_plot = plot(series = InTrade?atr_down:na, title = "stop_loss", color = color.red, style=plot.style_linebr) fill(profit_plot, close_plot, color = color.new(color.green, 80)) fill(close_plot, stop_plot, color =color.new(color.red,80))