Dynamische Strategie zur Verringerung von Verlusten

Schriftsteller:ChaoZhang, Datum: 29.12.2023
Tags:

img

Übersicht

Die dynamische Trailing Stop Loss Strategie ist eine quantitative Handelsstrategie, die einen Trailing Stop Loss Mechanismus nutzt. Sie setzt eine Trailing Stop Loss-Linie basierend auf der Trendverfolgungstheorie, um den Stop Loss zu bestätigen und den Trailing Stop Loss anzupassen. Sie wird hauptsächlich zur Steuerung des Stop Loss eines einzelnen Handels, zur Maximierung der Gewinnverbindung und zur Verringerung der Handelsrisiken verwendet.

Strategie Logik

Der Kern der dynamischen Trailing Stop-Loss-Strategie besteht darin, drei wichtige Parameter festzulegen: die anfängliche Stop-Loss-Distanz, die Trailing Stop-Loss-Distanz und die Trailing Stop-Loss-Trigger-Distanz. Nachdem ein Kaufsignal ausgelöst wurde, wird der anfängliche Stop-Loss-Preis anhand des Einstiegspreises und der festgelegten anfänglichen Stop-Loss-Distanz berechnet. Dann wird jeder Balken beurteilen, ob die Trailing Stop-Loss-Trigger-Bedingung erfüllt ist. Wenn ja, wird ein neuer Trailing Stop-Loss-Preis festgelegt. Der neue Trailing Stop-Loss-Preis wird anhand des aktuellen Schlusskurses und der Trailing Stop-Loss-Distanz berechnet. Solange der Preis in eine günstige Richtung verläuft, wird sich die Trailing Stop-Loss-Linie weiter nach oben bewegen, um Gewinne zu erzielen. Wenn die Preisumkehr die Trailing Stop-Loss-

Diese Strategie hat auch einen niedrigeren Stop-Loss. Egal, ob der Trailing-Stop-Loss aktiviert wird oder nicht, wenn der Preis unter den niedrigeren Stop-Loss bricht, wird der Stop-Loss direkt ausgelöst. Der niedrigere Stop-Loss dient zur Abwehr von Preislücken, die durch plötzliche Ereignisse verursacht werden. Daher kann die Stop-Loss-Linie durch den dynamischen Stop-Loss-Mechanismus in Form eines doppelten Stop-Loss automatisch günstige Trends verfolgen und gleichzeitig übermäßige Verluste verhindern.

Vorteile

  1. Verringern Sie die Gewinne kontinuierlich, indem Sie den Stop-Loss verfolgen und vermeiden Sie, zu viel Rückzugsraum zu geben.

  2. Ein zweigliedriges Stop-Loss-Struktursystem einführen, um sicherzustellen, dass die Stop-Loss-Linie umgehend verfolgt werden kann und gleichzeitig übermäßige Verluste verhindert werden.

  3. Verwenden Sie einen kontinuierlichen Beurteilungsmechanismus für die Einstellung von Stop-Loss mit einfacher Bedienung und einfacher Umsetzung.

  4. Die Parameter können entsprechend den Merkmalen des Marktes und der Lagerbestände optimiert werden, um die Stop-Loss-Effizienz zu verbessern.

  5. Es ist nicht nötig, Markttrends vorherzusagen, sondern einfach dem Trend zu folgen.

Risiken

  1. Eine falsche Einstellung der Parameter kann entweder zu lockeren oder zu engen Stop-Lossen zur Folge haben.

  2. Im Falle von Preisunterschieden, die durch plötzliche Ereignisse verursacht werden, kann es nicht gelingen, den Verlust zu stoppen.

  3. Handelskosten und Slippage können den tatsächlichen Verkaufspreis nach Auslösung der Stop-Loss-Linie beeinflussen.

  4. Die Anpassungsfähigkeit ist nicht stark, sie funktioniert nicht gut in bestimmten Phasen, wie beispielsweise bei bewegungsbedingten Bewegungen.

Gegenmaßnahmen:

  1. Es wird empfohlen, die Parameter kontinuierlich auf der Grundlage von Backtest- und Live-Ergebnissen zu optimieren.
  2. Ein breiterer, niedrigerer Stop-Loss wird eingestellt, um sich vor Preislücken zu schützen.
  3. Bei der Berechnung des Stop-Loss-Preises sind Handelskosten und Slippage zu berücksichtigen.
  4. Verwendung in Kombination mit Trend- und Volatilitätsindikatoren.

Richtungen für die Optimierung

  1. Anpassung der nachfolgenden Stop-Loss-Linie in Prozentänderung, um die Preisbewegungen auf verschiedenen Preisniveaus besser nachvollziehen zu können.

  2. Hinzufügen von Volatilitätsmetriken zur Aussetzung von Trailing Stop Loss bei hoher Volatilität, um zu vermeiden, dass normale Schwankungen zum Stop Loss führen.

  3. Optimieren Sie automatisch Parameter über maschinelles Lernen. Wählen Sie die Rückgabe verschiedener Parameterkombinationen in der letzten Periode als Trainingsproben.

  4. Hinzufügen von Kriterien für offene Positionen unter Berücksichtigung von Indikatoren wie Trend, Unterstützung und Widerstand, um die Eröffnung von Positionen in unterschiedlichen Märkten zu vermeiden.

Schlussfolgerung

Die dynamische Trailing Stop Loss Strategie setzt Trailing Stop Loss Lines durch einen Doppel-Line Stop Loss Mechanismus fest, um Stop Loss zu bestätigen und Trailing Stop Loss basierend auf Preisänderungen anzupassen. Sie kann automatisch den Stop Loss Abstand anpassen, um Gewinne zu erzielen, Pullbacks zu reduzieren und Verluste zu kontrollieren. Mit einfacher Bedienung und einfacher Implementierung kann diese Strategie basierend auf den Marktbedingungen weiter optimiert und zusammen mit anderen Strategien für eine bessere Leistung verwendet werden. Aber sie hat auch einige Einschränkungen. Es ist ratsam, sie zu verbessern und ausreichend zu testen, bevor sie im Live-Handel angewendet wird.


/*backtest
start: 2023-11-28 00:00:00
end: 2023-12-17 00:00:00
period: 1h
basePeriod: 15m
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/
// © Thumpyr
//@version=5

/////////////////////////////////////////////////////////////////////////////////////////////
// Comment out Strategy Line and remove // from Indicator line to turn into Indicator  //////
// Do same for alertConidction at bottom                                               //////
/////////////////////////////////////////////////////////////////////////////////////////////
strategy("PCT Trailing Stoploss-Strategy", shorttitle="PCT Trailing Stoploss- Strategy", overlay=true)
//indicator(title="PCT Trailing Stoploss- Indicator", shorttitle="PCT Trailing Stoploss - Indicator", timeframe="", timeframe_gaps=true, overlay=true)//

sellLow=input.float(.035, minval=0, title="Stop Loss Loss: 1% = .01", group="Sell Settings")
trailStopArm=input.float(.0065, minval=0, title="Trailing Stop Arm: 1%=.01", group="Sell Settings")
trailStopPct=input.float(.003, minval=0, title="Trailing Stop Trigger: 1%=.01 ", group="Sell Settings")

/////////////////////////////////////////////////
//               Indicators                    //
/////////////////////////////////////////////////
ema1Len = input.int(14, minval=1, title=" ema 1 Length", group="Trend Line Settings")
ema1Src = input(close, title="ema 1 Source", group="Trend Line Settings")
ema1 = ta.ema(ema1Src, ema1Len)
plot(ema1, title="EMA", color=color.blue)

ema2Len = input.int(22, minval=1, title=" ema 2 Length", group="Trend Line Settings")
ema2Src = input(close, title="ema 2 Source", group="Trend Line Settings")
ema2 = ta.ema(ema2Src, ema2Len)
plot(ema2, title="EMA", color=color.orange)

ema3Len = input.int(200, minval=1, title=" ema 3 Length", group="Trend Line Settings")
ema3Src = input(close, title="ema 2 Source", group="Trend Line Settings")
ema3 = ta.ema(ema3Src, ema3Len)
plot(ema3, title="EMA", color=color.gray)


/////////////////////////////
////   Buy Conditions    ////
/////////////////////////////

alertBuy = ta.crossover(ema1,ema2) and close>ema3

////////////////////////////////////////////////////////////////////
////   Filter redundant Buy Signals if Sell has not happened    ////
////////////////////////////////////////////////////////////////////
var lastsignal = 0
showAlertBuy = 0
if(alertBuy and lastsignal !=1)
    showAlertBuy  := 1
    lastsignal      := 1
buyAlert= showAlertBuy > 0


//////////////////////////////////////////////////////////////////
////          Track Conditions at buy Signal                  ////
//////////////////////////////////////////////////////////////////

alertBuyValue = ta.valuewhen(buyAlert, close,0)
alertSellValueLow = alertBuyValue - (alertBuyValue*sellLow)

////////////////////////////////////////////////////////////
/////            Trailing Stop                         /////
////////////////////////////////////////////////////////////
var TSLActive=0         //Check to see if TSL has been activated
var TSLTriggerValue=0.0 //Initial and climbing value of TSL
var TSLStop = 0.0       //Sell Trigger
var TSLRunning =0       //Continuously check each bar to raise TSL or not

//  Check if a Buy has been triggered and set initial value for TSL //
if buyAlert
    TSLTriggerValue := alertBuyValue+(alertBuyValue*trailStopArm)
    TSLActive := 0
    TSLRunning :=1
    TSLStop := TSLTriggerValue - (TSLTriggerValue*trailStopPct)
    

//  Check that Buy has triggered and if Close has reached initial TSL//  
//  Keeps from setting Sell Signal before TSL has been armed w/TSLActive//
beginTrail=TSLRunning==1 and TSLActive==0 and close>alertBuyValue+(alertBuyValue*trailStopArm) and ta.crossover(close,TSLTriggerValue)
if beginTrail
    TSLTriggerValue :=close
    TSLActive :=1
    TSLStop :=TSLTriggerValue - (TSLTriggerValue*trailStopPct)
    
//  Continuously check if TSL needs to increase and set new value //    
runTrail= TSLActive==1 and (ta.crossover(close,TSLTriggerValue) or close>=TSLTriggerValue)
if runTrail
    TSLTriggerValue :=close
    TSLStop :=TSLTriggerValue - (TSLTriggerValue*trailStopPct)
    
//  Verify that TSL is active and trigger when close cross below TSL Stop//
TSL=TSLActive==1 and (ta.crossunder(close,TSLStop) or (close[1]>TSLStop and close<TSLStop)) 

// Plot point of inital arming of TSL//
TSLTrigger=TSLActive==1 and TSLActive[1]==0
plotshape(TSLTrigger, title='TSL Armed', location=location.abovebar, color=color.new(color.blue, 0), size=size.small, style=shape.cross, text='TSL Armed')


////////////////////////////////////////////////////////////
// Plots used for troubleshooting and verification of TSL //
////////////////////////////////////////////////////////////
//plot(TSLActive,"Trailing Stop", color=#f48fb1)
//plot(TSLRunning,"Trailing Stop", color=#f48fb1)
//plot(TSLTriggerValue,"Trailing Stop Trigger", color.new(color=#ec407a, transp = TSLRunning==1 ? 0 : 100))
//plot(TSLStop,"Trailing Stop", color.new(color=#f48fb1, transp = TSLRunning==1 ? 0 : 100))//


////////////////////////////////////////////////////////////
/////             Sell Conditions                    ///////
////////////////////////////////////////////////////////////
Sell1 = TSL
Sell2 = ta.crossunder(close,alertSellValueLow)

alertSell= Sell1 or Sell2
////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////
////        Remove Redundant Signals                    ////
////////////////////////////////////////////////////////////
showAlertSell = 0
if(alertSell and lastsignal != -1)
    showAlertSell := 1
    lastsignal      := -1
sellAlert= showAlertSell > 0

if sellAlert
    TSLActive :=0
    TSLRunning :=0

/////////////////////////////////////////
//  Plot Buy and Sell Shapes on Chart  //
/////////////////////////////////////////
plotshape(buyAlert, title='Buy', location=location.belowbar, color=color.new(color.green, 0), size=size.small, style=shape.triangleup, text='Buy')
plotshape(sellAlert, title='Sell', location=location.abovebar, color=color.new(color.red, 0), size=size.small, style=shape.triangledown, text='Sell')

/////////////////////////////////////////////////////////////////////////////////////////////
//                        Remove // to setup for Indicator                                 //
/////////////////////////////////////////////////////////////////////////////////////////////
//Alerts
//alertcondition(title='Buy Alert', condition=buyAlert, message='Buy Conditions are Met')
//alertcondition(title='Sell Alert', condition=sellAlert, message='Sell Conditions are Met')
/////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////
////  Comment out this section if setup as Indicator    ////
////////////////////////////////////////////////////////////
longCondition = buyAlert
if (longCondition)
    strategy.entry("Buy", strategy.long)
    alert(message='Buy', freq=alert.freq_once_per_bar_close)
    
shortCondition = sellAlert
if (shortCondition)
    strategy.close_all(sellAlert,"Sell")
    alert(message='Sell', freq=alert.freq_once_per_bar_close)
/////////////////////////////////////////////////////////////




Mehr