Estrategia dinámica de suspensión de pérdidas

El autor:¿ Qué pasa?, Fecha: 2023-12-29 10:42:27
Las etiquetas:

img

Resumen general

La estrategia de stop loss dinámico es una estrategia de trading cuantitativa que utiliza un mecanismo de stop loss. Establece una línea de stop loss basado en la teoría de seguimiento de tendencias para confirmar la stop loss y ajustar la stop loss.

Estrategia lógica

El núcleo de la estrategia de stop loss dinámico está en establecer tres parámetros clave: la distancia inicial de stop loss, la distancia de stop loss y la distancia de activación de stop loss. Después de que se activa una señal de compra, el precio inicial de stop loss se calcula en función del precio de entrada y la distancia de stop loss inicial establecida. Luego, cada barra juzgará si se cumple la condición de activación de stop loss. Si es así, se establecerá un nuevo precio de stop loss. El nuevo precio de stop loss se calcula en función del precio de cierre actual y la distancia de stop loss. Por lo tanto, siempre que el precio se ejecute en una dirección favorable, la línea de stop loss seguirá subiendo para obtener ganancias. Cuando la inversión de precios activa la línea de stop loss, se generará una señal de venta.

Esta estrategia también tiene un stop loss más bajo. No importa si se activa o no el trailing stop loss, si el precio se rompe por debajo del stop loss más bajo, el stop loss se activará directamente. El stop loss más bajo sirve para protegerse contra las brechas de precios causadas por eventos repentinos. Por lo tanto, a través del mecanismo de stop loss dinámico en forma de stop loss de doble línea, la línea de stop loss puede rastrear automáticamente las tendencias favorables, al tiempo que evita pérdidas excesivas.

Ventajas

  1. Bloquear continuamente las ganancias a través de un stop loss, evitando dar demasiado espacio de retroceso.

  2. Adoptar una estructura de stop loss de dos líneas para garantizar que la línea de stop loss pueda dar seguimiento rápidamente, evitando al mismo tiempo pérdidas excesivas.

  3. Se utilizará un mecanismo de juicio continuo para el ajuste de pérdidas de parada con una operación sencilla y una aplicación fácil.

  4. Los parámetros se pueden optimizar de acuerdo con las características del mercado y de las existencias para mejorar la eficacia del stop loss.

  5. No hay necesidad de predecir las tendencias del mercado, sólo seguir la tendencia.

Los riesgos

  1. La configuración incorrecta de los parámetros puede resultar en pérdidas de parada demasiado sueltas o demasiado ajustadas.

  2. En caso de diferencias de precios causadas por acontecimientos repentinos, puede no detener las pérdidas.

  3. Los costos de negociación y el deslizamiento pueden afectar al precio de venta real después de que se activa la línea de stop loss.

  4. La adaptabilidad no es fuerte. No funciona bien en ciertas etapas, como los movimientos limitados al rango.

Contramedidas:

  1. Se recomienda optimizar continuamente los parámetros basados en los resultados de las pruebas previas y en vivo.
  2. Establezca un stop loss más amplio y más bajo para protegerse de las brechas de precios.
  3. Tenga en cuenta los costes de negociación y el deslizamiento al calcular el precio de stop loss.
  4. Uso en combinación con indicadores de tendencia y volatilidad.

Direcciones para la optimización

  1. Ajustar la línea de stop loss en el cambio porcentual, lo que puede rastrear mejor los movimientos de precios en diferentes niveles de precios.

  2. Se añaden métricas de volatilidad para suspender el stop loss trasero cuando se enfrenta a una alta volatilidad, evitando que las fluctuaciones normales desencadenen el stop loss.

  3. Optimiza automáticamente los parámetros a través del aprendizaje automático.

  4. Añadir criterios de posición abierta teniendo en cuenta indicadores como tendencia, soporte y resistencia para evitar la apertura de posiciones en mercados variados.

Conclusión

La estrategia de stop loss dinámica de seguimiento establece líneas de stop loss de seguimiento a través de un mecanismo de stop loss de doble línea para confirmar la stop loss y ajustar la stop loss de seguimiento en función de los cambios de precio. Puede ajustar automáticamente la distancia de stop loss para bloquear las ganancias, reducir los pullbacks y controlar las pérdidas. Con una operación simple y una implementación fácil, esta estrategia puede optimizarse aún más en función de las condiciones del mercado y usarse junto con otras estrategias para un mejor rendimiento. Pero también tiene algunas limitaciones. Es aconsejable mejorar y probarlo lo suficiente antes de aplicarlo en el comercio en vivo.


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




Más.