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.
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.
Mit dem Kalman-Filter können Sie Preise in Echtzeit verfolgen und schnell reagieren.
Die Nutzung einer gleitenden Stop-Line zur Gewinnschließung und Risikomanagement ist sehr effektiv. Die Stop-Loss-Distanz kann angepasst werden.
Flexible Wahl zwischen mehr oder nur mehr/weniger Freizeit.
Der Trend kann positiv oder konservativ eingestellt werden.
Die Stop-Loss-Einstellungen sind flexibel.
Eine falsche Einstellung der Parameter des Kalman-Filters kann zu einer instabilen Verfolgung führen.
Ein Gleitpunkt kann dazu führen, dass der Stopppunkt zuerst ausgelöst wird. Der Stoppstand kann entsprechend gelockert werden.
Bei starken Trends ist es nicht ratsam, eine rutschende Stop-Loss-Strategie zu verwenden, sondern den Trend zu verfolgen.
Die Stopps können häufig ausgelöst werden. Sie können die Stoppdistanz entsprechend lockern oder keine Gleitstopps verwenden.
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.
Die Schrittlänge der Stop-Line können je nach Marktschwankungen angepasst werden.
Die optimale Schadensschutzparameter können in Kombination mit maschinellen Lerntechniken trainiert werden.
Das Management von Positionen kann dynamisch angepasst werden, in Kombination mit weiteren Risikoindikatoren.
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.
/*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")