Beste ATR-Stopp-Mehrfachstrategie

Schriftsteller:ChaoZhang, Datum: 21.02.2024
Tags:

img

Übersicht

Die Best ATR Stop Multiple Strategie ist eine Trend-folgende Strategie, die Multiples des Average True Range (ATR) verwendet, um Stop-Loss-Punkte zu setzen und das Risiko dynamisch anzupassen.

Strategie Logik

Die Strategie berechnet zunächst die einfachen gleitenden Durchschnitte der schnellen und langsamen SMA-Perioden.

Nach dem Eintritt überwacht es den ATR-Wert in Echtzeit. Der ATR stellt die durchschnittliche Volatilität über einen bestimmten Rückblickzeitraum dar. Die Strategie ermöglicht es uns, den ATR-Zeitraum (Standard 14) und den Multiplikator (Standard 2) festzulegen. Das System berechnet den ATR-Wert beim Eintritt und multipliziert ihn dann mit dem festgelegten Multiplikator als Stoppdistanz.

Zum Beispiel, wenn der ATR nach dem Eintritt 50 Punkte beträgt und der Multiplikator auf 2 gesetzt ist, dann wäre die Stop-Distanz 100 Punkte. Wenn sich der Preis dann mehr als 100 Punkte bewegt, wird die Stop-Loss-Order ausgelöst. Dies ermöglicht zeitnahe Stop-Losses, um übermäßige Verluste zu vermeiden.

Die Strategie berücksichtigt auch die Trendbestimmung. Der lange Stop Loss ist nur aktiviert, wenn das Kaufsignal einem Aufwärtstrend entspricht. Der kurze Stop Loss entspricht einem Abwärtstrend.

Die Stop-Loss-Linien sind auf dem Chart gezeichnet, so dass wir sie in Echtzeit überprüfen können.

Analyse der Vorteile

Der größte Vorteil dieser Strategie besteht darin, dass sie die Stop-Loss-Distanz dynamisch anpasst und das Risiko automatisch basierend auf Änderungen der Marktvolatilität anpasst. Wenn die Volatilität wächst, steigt auch die Stop-Distanz, wodurch die Wahrscheinlichkeit, dass ein Stop-Loss getroffen wird, reduziert wird.

Im Vergleich zu festen Stop-Loss-Distanzen kontrolliert dieser Ansatz die Verluste effektiv pro Handel und verfolgt dabei Trends.

Darüber hinaus können solche Stop-Loss-Methoden in Kombination mit der Trendbestimmung die Wahrscheinlichkeit verringern, dass sie in Konsolidierungszonen durch Whipsaws gestoppt werden.

Risikoanalyse

Das Hauptrisiko dieser Strategie ist die Wahrscheinlichkeit, dass sich die Preise kurzfristig während einer Position zurückziehen und den Stop-Loss auslösen.

Ein weiteres Risiko besteht darin, dass die Preise bei gewaltsamen Bewegungen durch das Stop-Loss-Niveau gehen können. Dies würde größere ATR-Multiplikator-Einstellungen erfordern, bedeutet aber auch ein geringeres Gewinnpotenzial.

Schließlich berücksichtigt die Strategie nicht den Einfluss des Handels nach den Öffnungs- und Vormarktzeiten auf die ATR-Werte, was zu einer ungenauen Berechnung der ATR-Daten bei Eröffnungen und Schließungen führen kann.

Optimierungsrichtlinien

Die Strategie kann in mehreren Aspekten optimiert werden:

  1. Optimierung der ATR-Periodenparameter und Prüfung der besten Kombinationen für verschiedene Märkte

  2. Vergleichen von festen und dynamischen ATR-Multiplikatoren in Bezug auf Rendite

  3. Einbeziehung der Daten nach der Arbeitszeit in die ATR-Berechnung zur Verringerung der Lücken bei den Öffnungen

  4. Einstellung der ATR-Bedingungen: Stopps werden nur aktiviert, wenn die ATR bestimmte Werte erreicht, und unnötige Stopps in Umgebungen mit geringer Volatilität werden vermieden.

  5. Mehr Filter einzubeziehen: Haupttrends, Volumen-/Impulsindikatoren usw.

Schlussfolgerung

Die Best ATR Stop Multiple Strategy balanciert effektiv Trendfolgung und Risikokontrolle durch dynamische Anpassung der Stoppdistanzen. Im Vergleich zu festen Stops gewährleistet sie Gewinnpotenzial und begrenzt gleichzeitig effektiv Verluste.

Natürlich bleiben einige Risiken bestehen, wie Preislücken und überempfindliche Stopps.


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


Mehr