Stratégie de stop loss dynamique ATR Centerline


Date de création: 2023-10-16 16:20:06 Dernière modification: 2023-10-16 16:20:06
Copier: 0 Nombre de clics: 716
1
Suivre
1617
Abonnés

Stratégie de stop loss dynamique ATR Centerline

Aperçu

Cette stratégie utilise la fonction de régression linéaire et la fonction de multiplication par le plus petit carré pour calculer le canal de prix, composé de deux lignes vertes et rouges. Elle utilise un stop-loss dynamique basé sur l’ATR récent pour placer les ordres de stop-loss.

Principe de stratégie

La stratégie utilise une longueur de 25, une régression linéaire de déplacement de 5 pour calculer la ligne centrale xLG ≠. Ensuite, en bas de la ligne centrale, on prend 6% du prix pour la portée du canal, la ligne supérieure du canal est xLG1r et la ligne inférieure du canal est xLG1s ≠.

Faire plus quand le prix est supérieur à xLG1r; faire moins quand le prix est inférieur à xLG1s; et enregistrer le dernier plus et le dernier temps de prise. Faire plus quand le dernier plus est supérieur au dernier temps de prise. Faire moins quand le dernier temps de prise est supérieur au dernier temps de prise.

Le stop-loss ATR dynamique est calculé en utilisant le cycle ATR 1, multiplié par 2. En cas d’excédent, le stop-loss est le produit du prix de clôture moins le ATR et le multiple; en cas de défaut, le stop-loss est le produit du prix de clôture plus l’ATR et le multiple.

Analyse des avantages

  • Une chaîne de régression linéaire pour suivre les tendances à long terme
  • Basé sur le calcul de l’ATR, le stop loss peut être ajusté dynamiquement pour éviter que le stop loss soit trop grand ou trop petit.
  • Le prix du pétrole a augmenté de façon spectaculaire au cours des dernières années.

Risques et améliorations

  • Les paramètres de la voie de régression linéaire nécessitent une optimisation, la portée actuelle de la voie pourrait être trop étroite
  • Le multiplicateur ATR doit également être testé pour obtenir le paramètre optimal.
  • On pourrait envisager d’ajouter un mécanisme de confirmation lors d’une fausse percée.

Optimiser les idées

  • Tester différents cycles de longueur de régression pour trouver des paramètres optimaux
  • Essayez différents cycles d’ATR et multiples de stop-loss
  • Ajoutez des conditions de confirmation supplémentaires au signal de rupture, telles que la rupture du volume de transaction

Résumer

La stratégie intègre plusieurs indicateurs techniques tels que le suivi de la tendance, les arrêts dynamiques et les signaux de rupture, formant un système de suivi de tendance très adaptable. La stabilité et la rentabilité de la stratégie peuvent être encore améliorées par l’optimisation des paramètres et l’augmentation du filtrage des signaux.

Code source de la stratégie
/*backtest
start: 2023-01-01 00:00:00
end: 2023-06-24 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Thanks to HPotter for the original code for Center of Gravity Backtest
strategy("Center of Gravity BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.15)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Center of Gravity /////////////
Length = input(25, minval=1)
m = input(5, minval=0)
Percent = input(6, minval=0, title="COG %")

xLG = linreg(close, Length, m)
xLG1r = xLG + ((close * Percent) / 100)
xLG1s = xLG - ((close * Percent) / 100)

pos = 0.0
pos := iff(close > xLG1r, 1, iff(close < xLG1s, -1, nz(pos[1], 0))) 
possig = iff(pos == 1, 1, iff(pos == -1, -1, pos))

/////////////// Srategy ///////////////
long = possig == 1 
short = possig == -1 

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
atrLkb = input(1, minval=1, title='ATR Stop Period')
atrMult = input(2, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop = 0.0
longStop :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1]
shortStop = 0.0
shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1]

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long SL", "Long", stop=longStop, when=since_longEntry > 0)
    strategy.exit("Short SL", "Short", stop=shortStop, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
plot(xLG1r, color=color.lime, title="LG1r")
plot(xLG1s, color=color.red, title="LG1s")
plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=1)
plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=1)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)