Stratégie de trading d'ETF basée sur l'ATR et les cassures


Date de création: 2023-12-26 16:05:55 Dernière modification: 2023-12-26 16:05:55
Copier: 2 Nombre de clics: 822
1
Suivre
1623
Abonnés

Stratégie de trading d’ETF basée sur l’ATR et les cassures

Aperçu

La stratégie est une stratégie de trading automatique d’ETF basée sur l’amplitude réelle moyenne (ATR) et les ruptures de prix. Elle utilise l’ATR pour calculer les points d’arrêt et de perte et pour faire une position en plus ou en moins lorsque le prix franchit le prix le plus élevé ou le plus bas d’une période donnée.

Principe de stratégie

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

  1. Utilisez les prix les plus élevés et les plus bas d’une période donnée (comme 20 lignes K) pour déterminer le mouvement et la direction des prix. Lorsque le prix atteint le prix le plus élevé du cycle, faites plus; lorsque le prix atteint le prix le plus bas du cycle, faites moins.

  2. Utilisez l’ATR pour calculer dynamiquement le stop loss. La distance entre le stop loss et le prix d’entrée est la valeur de l’ATR d’un cycle d’ATR multipliée par le coefficient ((comme 2) ).

  3. Utilisez l’ATR pour calculer l’arrêt de la position. La distance d’arrêt du prix d’entrée est la valeur de l’ATR d’un cycle ATR multipliée par un facteur ((comme 1) ).

  4. Utilisez le multifacteur ATRtrailer pour suivre les arrêts. Lorsque le prix franchit le point d’arrêt du trailer dans une direction défavorable, la position est fermée.

Cette stratégie est simple et fiable, elle prend en compte la direction de la tendance des prix, ce qui permet de saisir les tendances des prix en temps opportun. Elle met également en place des arrêts de perte et des arrêts de position, ce qui permet de saisir les opportunités de profit et de contrôler les risques.

Analyse des avantages

Cette stratégie présente les avantages suivants:

  1. Les idées stratégiques sont simples, claires, faciles à comprendre et à mettre en œuvre.

  2. L’ATR est utilisé pour calculer le stop loss, pour ajuster dynamiquement la taille de la position et pour contrôler le risque de manière flexible.

  3. Les stratégies de jugement de rupture de cycle sont plus faciles à saisir les tendances des prix et les rendements sont meilleurs.

  4. Les trailers peuvent être arrêtés en temps opportun pour éviter de prendre des risques excessifs.

  5. Il s’applique à des variétés qui ont une tendance plus évidente, comme les ETF, les actions, etc.

Analyse des risques

La stratégie présente également les risques suivants:

  1. Il y a plus de faux signaux et de positions inversées lorsque les prix sont volatiles.

  2. Une mauvaise configuration des paramètres cycliques peut entraîner une perte de tendance des prix ou un nombre trop élevé de transactions par surprise.

  3. Les paramètres des coefficients sont mal réglés, ce qui peut entraîner des pertes ou des arrêts trop radicaux ou conservateurs, affectant les bénéfices.

  4. Les risques inhérents aux ETF, tels que les risques de politique, les risques de prime, etc., ont également une incidence sur la stratégie.

La réponse:

  1. Optimiser les paramètres pour réduire le taux de transaction virtuelle.
  2. Il existe plusieurs facteurs et filtres pour déterminer le signal de transaction.
  3. Paramètres adaptés aux différents marchés.
  4. Les investissements décentralisés, qui contrôlent les positions d’un seul ETF.

Direction d’optimisation

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

  1. Les indicateurs tels que les moyennes mobiles sont utilisés pour filtrer les signaux faux.

  2. Ajout d’un module d’optimisation des paramètres d’adaptabilité pour optimiser automatiquement les paramètres en fonction des différents cycles et variétés.

  3. Ajout d’un modèle d’apprentissage automatique pour prédire les hauts et les bas de la prochaine ligne K afin de déterminer le signal de rupture.

  4. Il est important de prendre en compte les indicateurs tels que les débordements de transactions et de prévenir les fausses ruptures.

  5. Optimiser la taille et la proportion des emplacements de stockage, l’adaptation des emplacements aux différentes variétés et aux conditions du marché.

Résumer

L’idée générale de la stratégie est claire et concise, la rupture du mécanisme central et le stop-loss dynamique ATR permettent de contrôler efficacement les risques et de bloquer les bénéfices. En optimisant les paramètres et en combinant plus d’indicateurs de filtrage, la capacité de contrôle des facteurs de profit et de risque de la stratégie peut être encore améliorée.

Code source de la stratégie
/*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, "#"))