Estrategia de stop loss dinámico


Fecha de creación: 2023-12-29 10:42:27 Última modificación: 2023-12-29 10:42:27
Copiar: 0 Número de Visitas: 872
1
Seguir
1617
Seguidores

Estrategia de stop loss dinámico

Descripción general

La estrategia de seguimiento dinámico de la parada de pérdidas es una estrategia de negociación cuantitativa que utiliza el mecanismo de seguimiento de la parada de pérdidas. La estrategia se basa en la teoría de seguimiento de tendencias, configura la línea de seguimiento de la parada, realiza la confirmación de la parada de pérdidas y el seguimiento de los ajustes de la parada de pérdidas.

Principio de estrategia

El núcleo de la estrategia de seguimiento dinámico de la parada consiste en establecer tres parámetros clave: la distancia de parada inicial, la distancia de parada de seguimiento y la distancia de activación de la parada de seguimiento. Cuando se activa la señal de compra, se calcula el precio de parada inicial en función del precio de compra y la distancia de parada inicial establecida.

La estrategia también tiene un alto de pérdida bajo, ya sea que se inicie o no el seguimiento del alto de pérdida, si el precio cae por debajo del alto de pérdida, se detiene directamente. El alto de pérdida bajo se utiliza para evitar que el precio salte por sorpresa.

Ventajas estratégicas

  1. Evite dar demasiadas oportunidades de reembolso al rastrear los stop losses y bloquear los beneficios.

  2. La adopción de la estructura de suspensión de doble línea de arriba abajo, tanto para asegurar que la línea de suspensión de pérdidas pueda seguir a tiempo, como para evitar pérdidas excesivas.

  3. Utiliza un mecanismo de juicio continuo para el ajuste de pérdidas, el funcionamiento es simple y fácil de implementar.

  4. Los parámetros se pueden ajustar para optimizar el efecto de detener el daño según las características del mercado y de cada acción.

  5. Sin necesidad de predecir el movimiento del mercado, se puede seguir la tendencia.

Riesgo estratégico

  1. La configuración incorrecta de los parámetros puede causar que el stop loss sea demasiado flexible o demasiado apretado. Si es demasiado flexible, no puede detener el stop loss de manera efectiva, y si es demasiado apretado, puede ser golpeado por las fluctuaciones normales del precio.

  2. Los eventos inesperados que causan una caída en los precios pueden causar la invalidación del stop loss y deben ser acompañados de otras medidas de protección.

  3. Las comisiones de transacción y el punto de deslizamiento pueden tener un impacto en el precio de venta real después de que se haya activado la línea de parada.

  4. La adaptabilidad no es muy buena y no funciona bien en ciertas etapas, como por ejemplo en zonas de temblor.

Respuesta:

  1. Se recomienda la optimización continua de los parámetros en función de los resultados de las pruebas de retroalimentación y el disco duro.
  2. Se puede configurar un punto de parada más bajo para evitar saltos.
  3. Los efectos de las comisiones de transacción y los puntos de deslizamiento se tienen en cuenta al calcular el precio de parada.
  4. Se puede combinar con indicadores de tendencia y fluctuación.

Dirección de optimización de la estrategia

  1. Al ajustar el seguimiento de las líneas de stop loss a la forma de cambio porcentual, se puede seguir mejor el movimiento de los precios de las acciones en diferentes niveles de precios.

  2. Añadir un indicador de fluctuación para determinar si una gran fluctuación detiene el seguimiento del stop loss y evita que una fluctuación ordinaria desencadene un stop loss.

  3. Optimización automática de parámetros utilizando métodos de aprendizaje automático. La muestra de entrenamiento elige la rentabilidad de la combinación de parámetros en el período más reciente.

  4. Incrementar el criterio de apertura de posiciones, combinando indicadores como tendencias y resistencia de soporte, para evitar abrir posiciones en situaciones de crisis.

Resumir

La estrategia de seguimiento dinámico de la parada de pérdidas a través del mecanismo de parada de dos líneas, la configuración de la línea de seguimiento de la parada de pérdidas, la realización de la confirmación de la parada de pérdidas y el seguimiento de la parada de pérdidas. La distancia de parada de pérdidas se puede ajustar automáticamente según los cambios en los precios, para bloquear los beneficios, reducir el retorno y controlar las pérdidas. La estrategia es simple de operar, fácil de implementar, puede optimizar los parámetros según las condiciones del mercado, y su uso es más efectivo en combinación con otras estrategias.

Código Fuente de la Estrategia
/*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)
/////////////////////////////////////////////////////////////