Meilleure stratégie ATR Stop multiple

Auteur:ChaoZhang est là., Date: 21 février 2024
Les étiquettes:

img

Résumé

La stratégie Best ATR Stop Multiple est une stratégie de suivi de tendance qui utilise des multiples de la plage moyenne vraie (ATR) pour définir des points de stop-loss et ajuster dynamiquement le risque.

La logique de la stratégie

La stratégie calcule d'abord les moyennes mobiles simples des périodes SMA rapides et lentes.

Après l'entrée, il surveille la valeur ATR en temps réel. L'ATR représente la volatilité moyenne sur une certaine période de lookback. La stratégie nous permet de définir la période ATR (défaut 14) et le multiplicateur (défaut 2). Le système calcule la valeur ATR à l'entrée, puis la multiplie par le multiplicateur défini comme distance d'arrêt.

Par exemple, si l'ATR après l'entrée est de 50 points et que le multiplicateur est de 2, alors la distance d'arrêt serait de 100 points. Si le prix dépasse alors 100 points, l'ordre stop loss sera déclenché. Cela permet d'arrêter les pertes en temps opportun pour éviter des pertes excessives.

La stratégie prend également en compte la détermination de la tendance. Le stop-loss long n'est activé que lorsque le signal d'achat correspond à une tendance à la hausse. Le stop-loss court correspond à une tendance à la baisse.

Les lignes de stop loss sont tracées sur le graphique pour que nous puissions les vérifier en temps réel.

Analyse des avantages

Le plus grand avantage de cette stratégie est qu'elle ajuste dynamiquement la distance de stop loss et modifie automatiquement l'exposition au risque en fonction des changements de volatilité du marché.

Comparée aux distances de stop loss fixes, cette approche contrôle efficacement les pertes par transaction tout en suivant les tendances.

En outre, en combinaison avec la détermination de la tendance, ces méthodes de stop loss peuvent réduire le risque d'être arrêtées par des coups de fouet dans les zones de consolidation.

Analyse des risques

Le principal risque de cette stratégie est la possibilité que les prix reculent à court terme pendant une position, déclenchant le stop loss.

Un autre risque est que les prix puissent franchir le niveau de stop loss lors de mouvements violents. Cela nécessiterait des réglages de multiplicateur ATR plus importants, mais cela signifie également une réduction du potentiel de profit.

Enfin, la stratégie ne tient pas compte de l'impact des opérations après la fin de la journée et avant le début du marché sur les valeurs ATR, ce qui peut entraîner un calcul inexact des données ATR sur les ouvertures et les fermetures.

Directions d'optimisation

La stratégie peut être optimisée sous plusieurs aspects:

  1. Optimiser les paramètres de la période ATR et tester les meilleures combinaisons pour différents marchés

  2. Comparer les multiples ATR fixes et dynamiques en termes de rendement

  3. Incorporer les données des heures supplémentaires dans le calcul de l'ATR pour réduire les lacunes sur les ouvertures

  4. Définir les conditions d'ATR: autoriser les arrêts uniquement lorsque l'ATR atteint certains niveaux, en évitant les arrêts inutiles dans des environnements à faible volatilité

  5. Incorporer plus de filtres: les principales tendances, les indicateurs de volume et de dynamique, etc.

Conclusion

La meilleure stratégie ATR Stop Multiple équilibre efficacement le suivi de la tendance et le contrôle des risques en ajustant dynamiquement les distances d'arrêt.

Bien sûr, certains risques demeurent, comme les écarts de prix et les arrêts trop sensibles.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//@author=Daveatt
//This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

SystemName = "BEST ATR Stop Multiple Strategy"
TradeId = "BEST"

InitCapital = 100000
InitPosition = 100
InitCommission = 0.075
InitPyramidMax = 1
CalcOnorderFills = true
CalcOnTick = true
DefaultQtyType = strategy.fixed
DefaultQtyValue = strategy.fixed
Precision = 2
Overlay=true


strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay )

fastSMAperiod = input(defval=15, title='Fast SMA', type=input.integer, minval=2, step=1)
slowSMAperiod = input(defval=45, title='Slow SMA', type=input.integer, minval=2, step=1)

src = close
// Calculate moving averages
fastSMA = sma(src, fastSMAperiod)
slowSMA = sma(src, slowSMAperiod)

// Calculate trading conditions
enterLong  = crossover(fastSMA, slowSMA)
enterShort = crossunder(fastSMA, slowSMA)

// trend states
since_buy  = barssince(enterLong)
since_sell = barssince(enterShort)
buy_trend  = since_sell > since_buy
sell_trend = since_sell < since_buy 

is_signal = enterLong or enterShort

// get the entry price
entry_price = valuewhen(enterLong or enterShort, src, 0)

// Plot moving averages
plot(series=fastSMA, color=color.teal)
plot(series=slowSMA, color=color.orange)

// Plot the entries
plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small)
plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small)



///////////////////////////////
//======[ Trailing STOP ]======//
///////////////////////////////

// use SL?
useSL = input(true, "Use stop Loss")
// ATR multiple Stop
stop_atr_length         = input(14,title="ATR Length", minval=1, type=input.integer)
stop_atr_mult           = input(2,title="ATR Multiple", minval=0.05, step=0.1, type=input.float)

// Global STOP

stop_price = 0.0, stop_price := nz(stop_price[1])

// STOP ATR
var stop_atr      = 0.0
var entry_stop_atr   = 0.0

stop_atr          := nz(atr(stop_atr_length))

if enterLong or enterShort
    entry_stop_atr := stop_atr * stop_atr_mult

// display the ATR value multiple
plotshape(enterLong, title='ATR Long Stop value', style=shape.labelup, 
 location=location.bottom, color=color.green, transp=0, text='', textcolor=color.navy, editable=true, size=size.small, show_last=1, size=size.small)

// var label atr_long_label = na
// var label atr_short_label = na
lapos_y_entry_up = lowest(30)
lapos_y_entry_dn = highest(30)

// text_label = "ATR value: " + tostring(stop_atr, '#.#') + "\n\nATR Multiple value: " + tostring(entry_stop_atr, '#.#')

// if enterLong

//     label.delete(atr_long_label)

//     atr_long_label := label.new(bar_index, lapos_y_entry_up, text=text_label, 
//      xloc=xloc.bar_index, yloc=yloc.price, color=color.green, style=label.style_labelup, textcolor=color.white, 
//      size=size.normal)    

// if enterShort

//     label.delete(atr_short_label)

//     atr_short_label := label.new(bar_index, lapos_y_entry_dn, text=text_label, 
//      xloc=xloc.bar_index, yloc=yloc.price, color=color.red, style=label.style_labeldown, textcolor=color.black, 
//      size=size.normal)    

// Determine trail stop loss prices
longStopPrice = 0.0, shortStopPrice = 0.0

longStopPrice := if useSL and buy_trend
    stopValue = entry_price - entry_stop_atr
else
    0

shortStopPrice := if useSL and sell_trend
    stopValue = entry_price + entry_stop_atr
else
    999999

//////////////////////////////////////////////////////////////////////////////////////////
//*** STOP LOSS HIT CONDITIONS TO BE USED IN ALERTS  ***//
//////////////////////////////////////////////////////////////////////////////////////////

cond_long_stop_loss_hit  = useSL and buy_trend and crossunder(low, longStopPrice[1]) 

cond_short_stop_loss_hit = useSL and sell_trend and crossover(high, shortStopPrice[1]) 


// Plot stop loss values for confirmation
plot(series=useSL and buy_trend and low >= longStopPrice 
 ? longStopPrice : na,
 color=color.fuchsia, style=plot.style_cross,
 linewidth=2, title="Long Trail Stop")

plot(series=useSL and sell_trend and high <= shortStopPrice 
 ? shortStopPrice : na,
 color=color.fuchsia, style=plot.style_cross,
 linewidth=2, title="Short Trail Stop")

close_long  = cond_long_stop_loss_hit
close_short = cond_short_stop_loss_hit

// Submit entry orders
strategy.entry(TradeId + " L", long=true, when=enterLong)
strategy.close(TradeId + " L", when=close_long)

//if (enterShort)
strategy.entry(TradeId + " S", long=false, when=enterShort)
strategy.close(TradeId + " S", when=close_short)


Plus de