Sliding-Stop-Strategie


Erstellungsdatum: 2023-10-07 16:11:45 zuletzt geändert: 2023-10-07 16:11:45
Kopie: 0 Klicks: 701
1
konzentrieren Sie sich auf
1617
Anhänger

Überblick

Die Strategie verwendet den Kalman-Filter, um die Preise zu verfolgen, und verwendet die Stop-Line, um die Stop-Punkte dynamisch anzupassen, um einen gleitenden Stop zu erreichen.

Grundsätze

Die Strategie verwendet den Kalman-Filter, um die Preise in Echtzeit zu verfolgen. Der Kalman-Filter enthält zwei Gleichungen:

Die Prognose-Gleichung:

smooth = kf[1] + dk * sqrt(gain / 10000 * 2)

Aktualisiert:

kf = smooth + velo

DEK ist die Prognose-Fehler, GAN ist der KALMAN-Gewinn, und DECISION ist die Sensitivität.

Darüber hinaus verwendet die Strategie eine gleitende Stop-Loss-Linie, um Gewinne zu sichern. Die anfängliche Stop-Loss-Distanz ist ein Stop-Loss-Prozentsatz, z. B. 2% [2].

Wenn der Preis steigt, bewegt sich die Stop-Line nach oben und nähert sich der Kalman-Linie, wobei der Schritt als DownStep bezeichnet wird, z. B. 0,5%. Wenn der Preis nach unten geht, wird die Position erneut eröffnet und die anfängliche Stop-Distanz festgelegt.

Das ist eine schlechte Idee.

Auf diese Weise kann die Strategie die Gewinne schrittweise nach den Trends abschließen und die Risiken besser verwalten.

Vorteile

  1. Mit dem Kalman-Filter können Sie Preise in Echtzeit verfolgen und schnell reagieren.

  2. Die Nutzung einer gleitenden Stop-Line zur Gewinnschließung und Risikomanagement ist sehr effektiv. Die Stop-Loss-Distanz kann angepasst werden.

  3. Flexible Wahl zwischen mehr oder nur mehr/weniger Freizeit.

  4. Der Trend kann positiv oder konservativ eingestellt werden.

  5. Die Stop-Loss-Einstellungen sind flexibel.

Die Gefahr

  1. Eine falsche Einstellung der Parameter des Kalman-Filters kann zu einer instabilen Verfolgung führen.

  2. Ein Gleitpunkt kann dazu führen, dass der Stopppunkt zuerst ausgelöst wird. Der Stoppstand kann entsprechend gelockert werden.

  3. Bei starken Trends ist es nicht ratsam, eine rutschende Stop-Loss-Strategie zu verwenden, sondern den Trend zu verfolgen.

  4. Die Stopps können häufig ausgelöst werden. Sie können die Stoppdistanz entsprechend lockern oder keine Gleitstopps verwenden.

Optimierung

  1. Es ist möglich, weitere Indikatoren einzuführen, um die Richtung der Trends zu bestimmen und die Zeit für die Eröffnung von Positionen zu optimieren.

  2. Die Schrittlänge der Stop-Line können je nach Marktschwankungen angepasst werden.

  3. Die optimale Schadensschutzparameter können in Kombination mit maschinellen Lerntechniken trainiert werden.

  4. Das Management von Positionen kann dynamisch angepasst werden, in Kombination mit weiteren Risikoindikatoren.

Zusammenfassen

Die Sliding Stop Strategie, die den Kalman-Filter verwendet, um Preisänderungen zu verfolgen, und die Sliding Stop-Linie nutzt, um Gewinne zu lockern und Risiken zu kontrollieren, während sie Gewinn garantiert. Es ist eine zuverlässige und leicht optimierbare Strategie.

Strategiequellcode
/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 2h
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/
// © BigCoinHunter

//@version=5
// strategy(title='Loft Strategy V1', overlay=true, 
//      pyramiding=0, default_qty_type=strategy.fixed, 
//      default_qty_value=100, initial_capital=100000, 
//      currency=currency.USD, commission_value=0.05, 
//      commission_type=strategy.commission.percent, 
//      process_orders_on_close=true)

//-------------- fetch user inputs ------------------
gain = input.float(title="Kalman Gain:", defval=1.0, minval=1.0, maxval=5000.0, step=100.0)
src = input(defval=close, title='Source:')

stopPercentMax = input.float(title='Beginning Approach(%):', defval=2.0, minval=0.1, maxval=30.0, step=0.1)
stopPercentMin = input.float(title='Final Approach(%):    ', defval=0.5, minval=0.1, maxval=30.0, step=0.1)
downStep = input.float(title='Approach Decrease Step:', defval=0.005, minval=0.0, maxval = 5, step=0.005)

tp = input.float(title="Take Profit:", defval=1.5, minval=0.0, maxval=100.0, step=0.1) * 0.01
sl = input.float(title="Stop Loss:  ", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01

longEntry = input.bool(defval=true, title= 'Long Entry', inline="11")
shortEntry = input.bool(defval=true, title='Short Entry', inline="11")

//---------- backtest range setup ------------
fromDay   = input.int(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input.int(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear  = input.int(defval = 2021, title = "From Year", minval = 2010)
toDay     = input.int(defval = 30, title = "To Day", minval = 1, maxval = 31)
toMonth   = input.int(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear    = input.int(defval = 2022, title = "To Year", minval = 2010)


//------------ time interval setup -----------
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)  // backtest start window
finish    = timestamp(toYear, toMonth, toDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"

//------- define the global variables ------
enterLongComment = "ENTER LONG"
exitLongComment = "EXIT LONG"

enterShortComment = "ENTER SHORT"
exitShortComment = "EXIT SHORT"

longTPSL = "Long TP/SL"
longTP = "Long TP"
longSL = "Long SL"
shortTPSL = "Short TP/SL"
shortTP = "Short TP"
shortSL = "Short SL"

var bool long = true
var bool stoppedOutLong = false
var bool stoppedOutShort = false
var float kf = 0.0
var float velo = 0.0

//------ kalman filter calculation --------
dk = src - nz(kf[1], src)
smooth = nz(kf[1], src) + dk * math.sqrt(gain / 10000 * 2)
velo := nz(velo[1], 0) + gain / 10000 * dk
kf := smooth + velo

//--------- calculate the loft stopLoss line ---------
var stopPercent = stopPercentMax
var stopLoss = kf - kf * (stopPercent /100)

if long == true
    stopLoss := kf - (kf * (stopPercent / 100))
    
    if long[1] == true and stopLoss <= stopLoss[1]
        stopLoss := stopLoss[1]
    else if (long[1] == true)
        stopPercent := stopPercent - downStep
        if(stopPercent < stopPercentMin)
            stopPercent := stopPercentMin
    
    if(kf < stopLoss)
        long := false
        stopPercent := stopPercentMax
        stopLoss := kf + (kf * (stopPercent / 100))
        
else
    stopLoss := kf + (kf * (stopPercent / 100))
    
    if long[1] == false and stopLoss >= stopLoss[1]
        stopLoss := stopLoss[1]
    else if(long[1] == false)
        stopPercent := stopPercent - downStep
        if(stopPercent < stopPercentMin)
            stopPercent := stopPercentMin
            
    if(kf > stopLoss)
        long := true
        stopPercent := stopPercentMax
        stopLoss := kf - (kf * (stopPercent / 100))
        
//--------- calculate the input/output points -----------
longProfitPrice  = strategy.position_avg_price * (1 + tp)     // tp -> take profit percentage
longStopPrice = strategy.position_avg_price * (1 - sl)        // sl -> stop loss percentage

shortProfitPrice  = strategy.position_avg_price * (1 - tp)
shortStopPrice = strategy.position_avg_price * (1 + sl)

//------------------- determine buy and sell points ---------------------
buySignall = window() and long  and (not stoppedOutLong)
sellSignall = window() and (not long)  and (not stoppedOutShort)

//---------- execute the strategy -----------------
if(longEntry and shortEntry)
    if long 
        strategy.entry("LONG", strategy.long, when = buySignall, comment = enterLongComment)
        stoppedOutLong := true
        stoppedOutShort := false
    else 
        strategy.entry("SHORT", strategy.short, when = sellSignall, comment = enterShortComment)
        stoppedOutLong  := false
        stoppedOutShort := true

else if(longEntry)
    strategy.entry("LONG", strategy.long,  when = buySignall, comment = enterLongComment)
    strategy.close("LONG", when = sellSignall, comment = exitLongComment)
    if long 
        stoppedOutLong := true
    else
        stoppedOutLong  := false

else if(shortEntry)
    strategy.entry("SHORT", strategy.short, when = sellSignall, comment = enterShortComment)
    strategy.close("SHORT", when = buySignall, comment = exitShortComment)
    if not long
        stoppedOutShort := true
    else
        stoppedOutShort := false
    

//----------------- take profit and stop loss -----------------
if(tp>0.0 and sl>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG", limit=longProfitPrice, stop=longStopPrice, comment = longTPSL)

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT", limit=shortProfitPrice, stop=shortStopPrice, comment = shortTPSL)

else if(tp>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG", limit=longProfitPrice, comment = longTP)

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT", limit=shortProfitPrice, comment = shortTP)
        
else if(sl>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG",  stop=longStopPrice, comment = longSL)

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT",  stop=shortStopPrice, comment = shortSL)
        
//------------- plot charts ---------------------
lineColor1 = long ? color.green : color.red
lineColor2 = long ? color.aqua : color.fuchsia

kalmanLine = plot(kf, color=lineColor1, linewidth=3, title = "Kalman Filter")
stopLine = plot(stopLoss, color=lineColor2, linewidth=2, title = "Stop Loss Line")