Dynamische ATR Stop Loss Centerline Strategie


Erstellungsdatum: 2023-10-16 16:20:06 zuletzt geändert: 2023-10-16 16:20:06
Kopie: 0 Klicks: 716
1
konzentrieren Sie sich auf
1617
Anhänger

Dynamische ATR Stop Loss Centerline Strategie

Überblick

Die Strategie berechnet einen Preiskanal, der aus zwei grünen und zwei roten Linien besteht. Sie verwendet dynamische Stopps, die auf den aktuellen ATR basieren, um Stop-Bills zu platzieren.

Strategieprinzip

Die Strategie verwendet die Längen von 25, die lineare Regression der Verlagerung 5 und berechnet die Mittellinie xLG. Dann werden 6% der jeweiligen Preise unterhalb der Mittellinie als Kanalbereich verwendet, wobei die oberen Kanallinien xLG1r und die unteren Kanallinien xLG1s sind.

Wenn der Preis höher ist als xLG1r, macht er einen Plus; wenn der Preis niedriger ist als xLG1s, macht er einen Minus. Und notiert die letzte Menge und die Zeit des Minus. Erzeugt ein Plussignal, wenn die letzte Menge größer ist als die letzte Menge. Erzeugt ein Minussignal, wenn die letzte Menge größer ist als die letzte Menge.

Der dynamische ATR-Stop wird mit ATR-Zyklus 1, Multiplikator 2 berechnet. Bei Überschreitung wird die Stop-Line als die Multiplikation des Schließwerts abzüglich des ATR-Wertes und des Multiplikators berechnet; bei Kurzschluss wird die Stop-Line als die Multiplikation des Schließwerts plus des ATR-Wertes und des Multiplikators berechnet.

Analyse der Stärken

  • Mit linearen Regressionskanälen können langfristige Trends verfolgt werden.
  • Auf der Grundlage der ATR-Berechnung kann der Stop-Loss dynamisch angepasst werden, um zu große oder zu kleine Stop-Losses zu vermeiden.
  • Der Einsatz von Preis-Breakouts zur Erzeugung von Signalen kann falsche Signale reduzieren.

Risiken und Verbesserung

  • Lineare Regressionskanal-Parameter müssen optimiert werden, da der Kanalbereich möglicherweise zu eng ist
  • ATR-Multiplikatoren müssen auch getestet werden, um die besten Parameter zu erhalten
  • Ein zusätzlicher Bestätigungsmechanismus bei einem Durchbruch kann in Erwägung gezogen werden, um falsche Durchbrüche zu vermeiden.

Optimierung

  • Verschiedene Regressionslängen-Perioden testen, um optimale Parameter zu finden
  • Versuchen Sie es mit verschiedenen ATR-Zyklen und ATR-Stopp-Loss-Multiplikatoren
  • Hinzufügen von zusätzlichen Bestätigungsbedingungen, wie z. B. Durchbruch der Handelsmenge, bei einem Durchbruchsignal

Zusammenfassen

Die Strategie integriert mehrere technische Indikatoren wie Trend-Tracking, Dynamische Stopps und Breakout-Signale zu einem Trend-Tracking-System mit hoher Adaptivität. Durch die Optimierung der Parameter und die Erhöhung der Signalfilterung kann die Strategie Stabilität und Profitabilität weiter verbessert werden.

Strategiequellcode
/*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)