Stratégie dynamique d'arrêt des pertes basée sur ATR

Auteur:ChaoZhang est là., Date: 2023-10-10 à 10h50
Les étiquettes:

Résumé

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 logique de la stratégie

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:

  • prix de départ: prix de départ
  • prix stop_price: prix stop-loss
  • prix de prise de profit: prix de prise de profit
  • atr_down: ligne descendante de l'ATR
  • atr_up: ATR vers le haut
  • atr_current: ligne ATR actuelle
  • ATR: valeur de l'ATR

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.

Les avantages

  1. 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é.

  2. Suivez les tendances tout en limitant les pertes.

  3. Le mécanisme de prise partielle de profit bloque certains bénéfices et réduit les risques.

Les risques

  1. L'indicateur ATR n'est pas sensible à des renversements et à des écarts importants.

  2. Les EMA ne peuvent pas déterminer l'inversion de tendance, elles peuvent entrer de nouvelles positions lors d'inversions de tendance.

  3. Haute probabilité de pertes après une prise partielle de profit.

  4. 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.

Améliorations

  1. Envisagez d'ajouter d'autres indicateurs de stop-loss comme le canal Donchian pour compenser le retard ATR.

  2. Testez différentes moyennes mobiles ou ajoutez le MACD, etc., pour juger de l'inversion de tendance.

  3. Optimiser les ratios et la fréquence des bénéfices partiels pour différents produits.

  4. Optimisation des paramètres sur les multiples ATR pour le stop et le take profit.

  5. Les performances des tests pendant les tendances faibles peuvent désactiver la stratégie pendant les tendances faibles.

Résumé

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))

Plus de