Die beste Strategie zur Verzögerung

Schriftsteller:ChaoZhang, Datum: 2021-09-21 20:58:22
Tags:

Übersicht

Diese Strategie verwendet einen Trailing-Stop-Loss-Mechanismus, um den Stop-Loss dynamisch basierend auf dem Kursschwankungsbereich zu bewegen und dynamische Stops zu erzielen. Der Trailing-Stop wird aktiviert, nachdem der Preis ein Gewinnziel erreicht hat, um Gewinne zu schützen und gleichzeitig vorzeitige Stop-Outs zu vermeiden.

Strategie Logik

Die Strategie basiert auf doppelten MA-Kreuzungen, die die Trendrichtung beurteilen.

Die Innovation liegt im Stop-Loss-Design:

  1. Ein Stopp-Trigger-Streifen wird eingestellt. Der Trailing-Stop beginnt, wenn der Preis diese Linie durchbricht.

  2. Die Stop-Loss-Linie verläuft nach dem Parameter Prozentsatz.

  3. Die Position wird geschlossen, wenn sich der Kurs umkehrt, um die Stop-Loss-Linie zu berühren.

Dies stellt sicher, dass der Stopp automatisch Gewinne verfolgt und gleichzeitig die Wahrscheinlichkeit verringert, dass der Stopp ausfällt, wenn der Gewinn noch gut ist.

Vorteile

  • Automatischer Rücklauf auf Prozentsatzbasis
  • Auslöserlinie verhindert vorzeitige Aktivierung
  • Dynamisches Trailing schützt die Gewinne
  • Vermeidet Stopps durch kurze Retracements
  • Triggerlinie und prozentuale Marktanpassung

Risiken

  • Die MA-Kreuzung kann verzögert sein und falsche Signale erzeugen.
  • Falsche Auslösereinstellungen verursachen eine vorzeitige oder verspätete Aktivierung
  • Falsche Prozentsatz Einstellungen führen zu breiten oder engen Stopps
  • Kann die Gefahren nicht vollständig vermeiden
  • Die Parameter müssen für die Marktvolatilität optimiert werden

Die Risiken können verringert werden, indem

  • Optimierung der Zulassungsfristen für bessere Einträge
  • Prüfung verschiedener Auslöserwerte für eine optimale Positionierung
  • Zurückprüfung der idealen Prozentsätze auf der Grundlage historischer Abzüge
  • Überlegungen zur Wiedereingliederung, um fehlende Trends zu vermeiden
  • Hinzufügen von Filtern, um falsche Ausbrüche zu vermeiden

Anweisungen zur Verbesserung

Die Strategie kann verbessert werden, indem

  1. Optimierung der doppelten MA-Perioden

  2. Optimierung oder Entfernung der Auslöserlinie

    Direkt mit dem Trailing beginnen oder für verschiedene Produkte unterschiedliche Werte verwenden

  3. Prüfung unterschiedlicher Rückstandswerte

    Finden Sie optimale Werte für verschiedene Produkte

  4. Hinzufügen von Wiedereinreisebestimmungen

    Einstellung der Wiedereintrittsbedingungen nach Erreichen der Stopps

  5. Anpassung der Stopp-Strichtheit an die Volatilität

    Weitere Stopps in Umgebungen mit erhöhter Volatilität

Zusammenfassung

Diese Strategie verwendet vor der Aktivierung einen Trailing-Prozentsatz-Stop mit einer Triggerlinie. Dieser dynamische Mechanismus balanciert den Gewinn und vermeidet unnötige Stopps basierend auf Marktbewegungen. Aber die Parameter müssen für verschiedene Produkte optimiert werden, sowie zusätzliche Filter auf Einträgen, um die Genauigkeit zu verbessern. Wiedereinträge helfen auch, fehlende Trends nach einem vorzeitigen Stopp zu vermeiden.


/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//@author=Daveatt

SystemName = "BEST Trailing Stop 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, 
//  pyramiding=InitPyramidMax, initial_capital=InitCapital, default_qty_type=DefaultQtyType, default_qty_value=InitPosition, commission_type=strategy.commission.percent, 
//  commission_value=InitCommission, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick, precision=2)


src = close
// Calculate moving averages
fastSMA = sma(close, 15)
slowSMA = sma(close, 45)

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

change_trend = (buy_trend and sell_trend[1]) or (sell_trend and buy_trend[1])

//plot(buy_trend ? 1 : 0, title='buy_trend', transp=100)
//plot(sell_trend ? 1 : 0, title='sell_trend', transp=100)

// get the entry price
entry_price = valuewhen(enterLong or enterShort, close, 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")
// Configure trail stop level with input
StopTrailPerc = input(title="Trail Loss (%)", type=input.float, minval=0.0, step=0.1, defval=3) * 0.01
// Will trigger the take profit trailing once reached
use_SL_Trigger = input(true, "Use stop Loss Trigger")
StopTrailTrigger   = input(2.0, "SL Trigger (%)",minval=0,step=0.5,type=input.float) * 0.01


StopLossPriceTrigger = 0.0
StopLossPriceTrigger := if (use_SL_Trigger)
    if buy_trend
        entry_price * (1 + StopTrailTrigger) 
    else
        entry_price * (1 - StopTrailTrigger)
else
    -1


var SL_Trigger_Long_HIT = false
SL_Trigger_Long_HIT := useSL and use_SL_Trigger and buy_trend and high >= StopLossPriceTrigger
 ? true : SL_Trigger_Long_HIT[1]


var SL_Trigger_Short_HIT = false
SL_Trigger_Short_HIT := useSL and use_SL_Trigger and sell_trend and low <= StopLossPriceTrigger
 ? true : SL_Trigger_Short_HIT[1]


display_long_SL_trigger     = useSL and buy_trend  and use_SL_Trigger 
 and SL_Trigger_Long_HIT == false and StopLossPriceTrigger != -1
display_short_SL_trigger    = useSL and sell_trend and use_SL_Trigger 
 and SL_Trigger_Short_HIT == false and StopLossPriceTrigger != -1
display_SL_trigger          = display_long_SL_trigger or display_short_SL_trigger

plot(display_SL_trigger ? StopLossPriceTrigger : na, title='SLPriceTrigger', transp=0, 
 color=color.maroon, style=plot.style_circles, linewidth=3)


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

longStopPrice := if useSL and buy_trend
    stopValue = low * (1 - StopTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0

shortStopPrice := if useSL and sell_trend
    stopValue = high * (1 + StopTrailPerc)
    min(stopValue, shortStopPrice[1])
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]) 
 and (SL_Trigger_Long_HIT or use_SL_Trigger == false)
cond_short_stop_loss_hit = useSL and sell_trend and crossover(high, shortStopPrice[1]) 
 and (SL_Trigger_Short_HIT or use_SL_Trigger == false)


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

plot(series=useSL and sell_trend and high <= shortStopPrice 
 and (SL_Trigger_Short_HIT or use_SL_Trigger == false)
 ? 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)


if change_trend
    SL_Trigger_Long_HIT := false
    SL_Trigger_Short_HIT := false


Mehr