Une stratégie de négociation d'ETF basée sur l'ATR et la rupture

Auteur:ChaoZhang est là., Date: le 26-12-2023 à 16h05
Les étiquettes:

img

Résumé

Il s'agit d'une stratégie de trading algorithmique d'ETF basée sur la plage moyenne réelle (ATR) et la rupture de prix.

La logique de la stratégie

La stratégie repose principalement sur les principes suivants:

  1. Utilisez les prix les plus élevés et les plus bas d'une certaine période (par exemple, 20 bougies) pour déterminer la tendance et la direction des prix.

  2. Utiliser l'ATR pour calculer dynamiquement le niveau de stop loss. Le stop loss est placé à une distance de la valeur ATR d'une période ATR multipliée par un coefficient (par exemple 2) du prix d'entrée.

  3. Utiliser l'ATR pour déterminer le niveau de prise de profit. L'ATR est placé à une distance de la valeur ATR d'une période ATR multipliée par un coefficient (par exemple 1) par rapport au prix d'entrée.

  4. Utilisez le multiplicateur ATR pour tracer le stop loss. Fermez les positions avec le stop loss lorsque le prix franchit le niveau de stop loss du trailer vers une direction défavorable.

La stratégie est simple et fiable, car elle prend en compte à la fois la direction de la tendance des prix pour détecter les mouvements de prix en temps opportun et définit un stop loss et un profit pour la prise de profit et le contrôle des risques.

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. La logique de la stratégie est simple et claire, facile à comprendre et à mettre en œuvre.

  2. L'utilisation de l'ATR pour calculer les niveaux de stop loss et de profit adaptatifs permet une dimensionnement flexible des positions et un contrôle des risques.

  3. Les stratégies de rupture sont bonnes pour capter les tendances des prix, ce qui conduit à de bons rendements.

  4. L'arrêt des pertes de remorque peut fermer les positions en temps opportun, évitant ainsi des pertes excessives.

  5. Il convient aux produits présentant des tendances évidentes, tels que les FNB et les actions.

Analyse des risques

Les risques liés à cette stratégie sont les suivants:

  1. Plus de faux signaux et d'ouvertures inversées peuvent se produire pendant la consolidation des prix.

  2. Un ajustement incorrect des paramètres peut entraîner des tendances de prix manquantes ou trop de transactions inutiles.

  3. Les valeurs extrêmes des paramètres peuvent entraîner un stop-loss et un take profit trop agressifs ou trop conservateurs, ce qui influence la rentabilité de la stratégie.

  4. Les risques sous-jacents des FNB tels que les risques de politique et les risques de primes peuvent également avoir une incidence sur la performance de la stratégie.

Solution correspondante:

  1. Optimiser les paramètres pour réduire les transactions inutiles.
  2. Ajoutez plus de facteurs et de filtres pour confirmer les signaux de trading.
  3. Ajustez les paramètres de manière adaptative pour les différents marchés.
  4. Diversifier la taille des positions d'investissement et de contrôle d'un seul FNB.

Directions d'optimisation

La stratégie peut être encore optimisée dans les domaines suivants:

  1. Ajoutez des indicateurs comme la moyenne mobile pour filtrer les faux signaux.

  2. Développer un module d'optimisation adaptatif des paramètres pour régler automatiquement les paramètres pour différentes périodes et produits.

  3. Adopter des modèles d'apprentissage automatique pour prédire les prix les plus élevés et les plus bas de la prochaine bougie pour déterminer les signaux de rupture.

  4. Considérez le dépassement du volume de négociation pour éviter une fausse rupture.

  5. Optimiser la taille des positions initiales et les pourcentages d'allocation de manière adaptative pour les différents produits et régimes de marché.

Conclusion

La stratégie a une logique claire et simple. Les mécanismes de base de la rupture et de l'ATR adaptatif stop loss / take profit peuvent contrôler efficacement les risques et verrouiller les bénéfices. Améliorer davantage les facteurs de profit et les capacités de contrôle des risques grâce à l'optimisation des paramètres et à l'intégration de plus de filtres peut en faire une stratégie quantitative rentable et optimisable.


/*backtest
start: 2023-12-18 00:00:00
end: 2023-12-21 03:00:00
period: 1m
basePeriod: 1m
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/
// © FX_minds

//@version=4
strategy("ETF tradedr", overlay=true, pyramiding=100, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

//------------------------------ get user input
lookback                   = input(title="HH LL lookback", type=input.integer, defval=20)
ATR_periode                = input(title="ATR period", type=input.integer, defval=14)
ATR_SL_multiplier          = input(title="ATR SL multiplier", type=input.float, defval=2)
ATR_TP_multiplier          = input(title="ATR TP multiplier", type=input.float, defval=1)
trailing_SL_ATR_multiplier = input(title="ATR trailing SL multiplier", type=input.float, defval=3.5)
lookback_trailing_SL       = input(title="trailing SL lookback", type=input.integer, defval=4)
max_sequel_trades          = input(title="max sequel trades", type=input.float, defval=1)
trade_long                 = input(title= "trade long ?", type=input.bool, defval=true)
trade_short                = input(title= "trade short ?", type=input.bool, defval=false)

//------------------------------ determine entry conditions
long_condition   = barstate.isconfirmed and crossover(high, highest(high, lookback)[1])
short_condition  = barstate.isconfirmed and crossunder(low, lowest(low, lookback)[1])


//------------------------------ count open long trades
count_open_longs = 0
count_open_longs := nz(count_open_longs[1])

if (long_condition) 
    count_open_longs := count_open_longs +1
    //label.new(bar_index, low, tostring(count_open_longs, "#"), xloc.bar_index, yloc.belowbar, color.green, label.style_none, color.green, size.large)

if (short_condition)
    count_open_longs := 0


//------------------------------ count open short trades
count_open_shorts = 0
count_open_shorts := nz(count_open_shorts[1])

if (short_condition)
    count_open_shorts := count_open_shorts +1
    //label.new(bar_index, low, tostring(count_open_shorts, "#"), xloc.bar_index, yloc.belowbar, color.red, label.style_none, color.red, size.large)

if (long_condition)
    count_open_shorts := 0


//------------------------------ calculate entryprice
entryprice_long = long_condition ? close : na
entryprice_short = short_condition ? close : na


//------------------------------ calculate SL & TP
SL_distance = atr(ATR_periode) * ATR_SL_multiplier
TP_distance  = atr(ATR_periode) * ATR_TP_multiplier
trailing_SL_distance = atr(ATR_periode) * trailing_SL_ATR_multiplier

SL_long = entryprice_long - SL_distance
SL_short = entryprice_short + SL_distance

trailing_SL_short = lowest(close, lookback_trailing_SL) + trailing_SL_distance
trailing_SL_long  = highest(close, lookback_trailing_SL) - trailing_SL_distance

trailing_SL_short_signal = crossover(high, trailing_SL_short[1])
trailing_SL_long_signal = crossunder(low, trailing_SL_long[1])


//------------------------------ plot entry price & SL  
plot(entryprice_long, style=plot.style_linebr, color=color.white)
plot(SL_long, style=plot.style_linebr, color=color.red)
plot(SL_short, style=plot.style_linebr, color=color.green)
plot(trailing_SL_short, style=plot.style_linebr, color=color.red)
plot(trailing_SL_long, style=plot.style_linebr, color=color.green)


//------------------------------ submit entry orders
if (long_condition) and (count_open_longs <= max_sequel_trades) and (trade_long == true)
    strategy.entry("Long" + tostring(count_open_longs, "#"), strategy.long)
    strategy.exit("SL Long"+ tostring(count_open_longs, "#"), 
     from_entry="Long" + tostring(count_open_longs, "#"), stop=SL_long)

if (short_condition) and (count_open_shorts <= max_sequel_trades) and (trade_short == true)
    strategy.entry("Short" + tostring(count_open_shorts, "#"), strategy.short)
    strategy.exit("SL Short" + tostring(count_open_shorts, "#"), 
     from_entry="Short" + tostring(count_open_shorts, "#"), stop=SL_short)
    

//------------------------------ submit exit conditions
if (trailing_SL_long_signal)
    strategy.close("Long" + tostring(count_open_longs, "#"))
    strategy.close("Long" + tostring(count_open_longs-1, "#"))
    strategy.close("Long" + tostring(count_open_longs-2, "#"))
    strategy.close("Long" + tostring(count_open_longs-4, "#"))
    strategy.close("Long" + tostring(count_open_longs-5, "#"))
    strategy.close("Long" + tostring(count_open_longs-6, "#"))
    strategy.close("Long" + tostring(count_open_longs-7, "#"))
    strategy.close("Long" + tostring(count_open_longs-8, "#"))
    strategy.close("Long" + tostring(count_open_longs-9, "#"))
    
if (trailing_SL_short_signal)
    strategy.close("Short" + tostring(count_open_shorts, "#"))
    strategy.close("Short" + tostring(count_open_shorts-1, "#"))
    strategy.close("Short" + tostring(count_open_shorts-2, "#"))
    strategy.close("Short" + tostring(count_open_shorts-3, "#"))
    strategy.close("Short" + tostring(count_open_shorts-4, "#"))
    strategy.close("Short" + tostring(count_open_shorts-5, "#"))
    strategy.close("Short" + tostring(count_open_shorts-6, "#"))
    strategy.close("Short" + tostring(count_open_shorts-7, "#"))
    strategy.close("Short" + tostring(count_open_shorts-8, "#"))
    strategy.close("Short" + tostring(count_open_shorts-9, "#"))



Plus de