La estrategia utiliza un filtro de Kalman para rastrear el precio y utiliza una línea de stop para ajustar dinámicamente el punto de parada para lograr un stop deslizante.
La estrategia utiliza el filtro de Kármán para seguir el precio en tiempo real. El filtro de Kármán contiene dos ecuaciones:
La ecuación de predicción:
smooth = kf[1] + dk * sqrt(gain / 10000 * 2)
Actualización de la ecuación:
kf = smooth + velo
Dk es el error de predicción, gain es el aumento de Kalman, y deciden seguir la sensibilidad.
Además, la estrategia utiliza una línea de parada deslizante para bloquear las ganancias. La distancia de parada inicial es un porcentaje de parada establecido, como el 2% .
Cuando se hace un exceso, si el precio sube, el stop también se mueve hacia arriba y se acerca gradualmente a la línea de Kalman, con una longitud de paso de downStep, como el 0.5%. Si el precio baja, se vuelve a abrir la posición y se establece la distancia de stop inicial.
¿Qué es lo que está pasando?
De esta manera, la estrategia puede bloquear los beneficios gradualmente según la tendencia y tener una mejor gestión de riesgos.
El filtro de Kalman permite un seguimiento en tiempo real de los precios y una respuesta rápida.
El uso de la línea de stop loss deslizante para bloquear los beneficios, la gestión del riesgo es eficaz. La distancia de stop loss se puede personalizar.
La flexibilidad de elegir entre hacer más o sólo más / hacer menos.
Se puede detener de forma activa o conservadora según la tendencia.
Se puede ajustar el stop loss de forma flexible según sea necesario.
La configuración incorrecta de los parámetros del filtro de Kalman puede causar inestabilidad en el seguimiento.
El punto de deslizamiento puede causar que el punto de parada se active primero. Se puede relajar la distancia de parada adecuadamente.
El mercado de tendencias fuertes no debe adoptar una estrategia de stop loss deslizante, sino que debe seguir la tendencia.
Los puntos de parada de los mercados en movimiento se pueden disparar con frecuencia. Se puede relajar la distancia de parada de forma adecuada o no usar un parada de deslizamiento.
Se pueden introducir más indicadores para determinar la dirección de la tendencia y optimizar el momento de abrir posiciones.
La longitud de movimiento de la línea de stop loss se puede ajustar según la fluctuación del mercado.
Se puede combinar el entrenamiento de técnicas de aprendizaje automático con los parámetros óptimos de deterioro.
Se puede combinar con más indicadores de riesgo y una gestión de posiciones de ajuste dinámico.
La estrategia de stop-loss es una estrategia fiable y fácil de optimizar, que utiliza un filtro de Kalman para rastrear los cambios en los precios y utiliza una línea de stop-loss deslizante para bloquear los beneficios y controlar el riesgo al tiempo que garantiza la rentabilidad. Combinarlo con el juicio de tendencias y la tecnología de gestión de posiciones dinámicas puede obtener un mejor efecto estratégico.
/*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")