La mejor estrategia para detener el retraso

El autor:¿ Qué pasa?, Fecha: 2023-09-21 20:58:22
Las etiquetas:

Resumen general

Esta estrategia utiliza un mecanismo de stop loss para mover el stop loss dinámicamente basado en el rango de fluctuación de precios, logrando paradas dinámicas.

Estrategia lógica

La estrategia entra en base a los cruces de doble MA que juzgan la dirección de la tendencia.

La innovación radica en el diseño del stop loss:

  1. Se establece una línea de detonante de parada. La parada de seguimiento comienza después de que el precio rompa esta línea.

  2. La línea de stop loss se mueve en función del parámetro de porcentaje, por ejemplo, un retraso del 3% significa un 3% por debajo del mínimo más reciente.

  3. La posición se cierra cuando el precio se invierte para tocar la línea de stop loss.

Esto asegura que la parada seguirá las ganancias automáticamente, al tiempo que reduce la posibilidad de detenerse cuando la ganancia todavía es buena.

Ventajas

  • Detención automática del seguimiento en porcentaje
  • La línea de disparo evita la activación prematura
  • El seguimiento dinámico protege los beneficios
  • Evita detenerse debido a retracements cortos
  • Línea de activación y porcentaje ajustable a los mercados

Los riesgos

  • El cruce MA puede tener un retraso, generando señales falsas
  • La configuración incorrecta de la línea de disparo causa una activación prematura o tardía
  • Configuración incorrecta del porcentaje da paradas demasiado anchas o ajustadas
  • No se puede evitar completamente los riesgos de la horquilla
  • Los parámetros deben optimizarse para la volatilidad del mercado

Los riesgos pueden reducirse:

  • Optimización de los períodos de admisión para mejores entradas
  • Prueba de diferentes valores de activación para obtener el mejor posicionamiento
  • Pruebas de retroceso de porcentajes ideales basados en los retiros históricos
  • Consideración de las reingresas para evitar tendencias perdidas
  • Añadir filtros para evitar errores

Direcciones de mejora

La estrategia puede mejorarse mediante:

  1. Optimización de los períodos de doble MA

  2. Optimización o eliminación de la línea de disparo

    Comience directamente el seguimiento o use diferentes valores para diferentes productos

  3. Prueba de diferentes valores de porcentaje de retención

    Encontrar valores óptimos para diferentes productos

  4. Añadir normas de reingreso

    Establecer las condiciones de reingreso después de que se alcancen las paradas

  5. Ajuste de la rigurosidad de la parada por volatilidad

    Las paradas más amplias en entornos de mayor volatilidad

Resumen de las actividades

Este mecanismo dinámico equilibra la protección de las ganancias y evita paradas innecesarias basadas en los movimientos del mercado. Pero los parámetros necesitan optimización para diferentes productos, además de filtros adicionales en las entradas para mejorar la precisión. Las reentras también ayudan a evitar perder tendencias después de detenerse prematuramente. Se necesitan mejoras continuas para la adaptabilidad.


/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//@author=Daveatt

SystemName = "BEST Trailing Stop Strategy"
TradeId = "BEST"

InitCapital = 100000
InitPosition = 100
InitCommission = 0.075
InitPyramidMax = 1
CalcOnorderFills = true
CalcOnTick = true
DefaultQtyType = strategy.fixed
DefaultQtyValue = strategy.fixed
Precision = 2
Overlay=true


// strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay, 
//  pyramiding=InitPyramidMax, initial_capital=InitCapital, default_qty_type=DefaultQtyType, default_qty_value=InitPosition, commission_type=strategy.commission.percent, 
//  commission_value=InitCommission, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick, precision=2)


src = close
// Calculate moving averages
fastSMA = sma(close, 15)
slowSMA = sma(close, 45)

// Calculate trading conditions
enterLong  = crossover(fastSMA, slowSMA)
enterShort = crossunder(fastSMA, slowSMA)

// trend states
since_buy  = barssince(enterLong)
since_sell = barssince(enterShort)
buy_trend  = since_sell > since_buy
sell_trend = since_sell < since_buy 

change_trend = (buy_trend and sell_trend[1]) or (sell_trend and buy_trend[1])

//plot(buy_trend ? 1 : 0, title='buy_trend', transp=100)
//plot(sell_trend ? 1 : 0, title='sell_trend', transp=100)

// get the entry price
entry_price = valuewhen(enterLong or enterShort, close, 0)

// Plot moving averages
plot(series=fastSMA, color=color.teal)
plot(series=slowSMA, color=color.orange)

// Plot the entries
plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small)
plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small)



///////////////////////////////
//======[ Trailing STOP ]======//
///////////////////////////////

// use SL?
useSL = input(true, "Use stop Loss")
// Configure trail stop level with input
StopTrailPerc = input(title="Trail Loss (%)", type=input.float, minval=0.0, step=0.1, defval=3) * 0.01
// Will trigger the take profit trailing once reached
use_SL_Trigger = input(true, "Use stop Loss Trigger")
StopTrailTrigger   = input(2.0, "SL Trigger (%)",minval=0,step=0.5,type=input.float) * 0.01


StopLossPriceTrigger = 0.0
StopLossPriceTrigger := if (use_SL_Trigger)
    if buy_trend
        entry_price * (1 + StopTrailTrigger) 
    else
        entry_price * (1 - StopTrailTrigger)
else
    -1


var SL_Trigger_Long_HIT = false
SL_Trigger_Long_HIT := useSL and use_SL_Trigger and buy_trend and high >= StopLossPriceTrigger
 ? true : SL_Trigger_Long_HIT[1]


var SL_Trigger_Short_HIT = false
SL_Trigger_Short_HIT := useSL and use_SL_Trigger and sell_trend and low <= StopLossPriceTrigger
 ? true : SL_Trigger_Short_HIT[1]


display_long_SL_trigger     = useSL and buy_trend  and use_SL_Trigger 
 and SL_Trigger_Long_HIT == false and StopLossPriceTrigger != -1
display_short_SL_trigger    = useSL and sell_trend and use_SL_Trigger 
 and SL_Trigger_Short_HIT == false and StopLossPriceTrigger != -1
display_SL_trigger          = display_long_SL_trigger or display_short_SL_trigger

plot(display_SL_trigger ? StopLossPriceTrigger : na, title='SLPriceTrigger', transp=0, 
 color=color.maroon, style=plot.style_circles, linewidth=3)


// Determine trail stop loss prices
longStopPrice = 0.0, shortStopPrice = 0.0

longStopPrice := if useSL and buy_trend
    stopValue = low * (1 - StopTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0

shortStopPrice := if useSL and sell_trend
    stopValue = high * (1 + StopTrailPerc)
    min(stopValue, shortStopPrice[1])
else
    999999

//////////////////////////////////////////////////////////////////////////////////////////
//*** STOP LOSS HIT CONDITIONS TO BE USED IN ALERTS  ***//
//////////////////////////////////////////////////////////////////////////////////////////

cond_long_stop_loss_hit  = useSL and buy_trend and crossunder(low, longStopPrice[1]) 
 and (SL_Trigger_Long_HIT or use_SL_Trigger == false)
cond_short_stop_loss_hit = useSL and sell_trend and crossover(high, shortStopPrice[1]) 
 and (SL_Trigger_Short_HIT or use_SL_Trigger == false)


// Plot stop loss values for confirmation
plot(series=useSL and buy_trend and low >= longStopPrice 
 and (SL_Trigger_Long_HIT or use_SL_Trigger == false)
 ? longStopPrice : na,
 color=color.fuchsia, style=plot.style_cross,
 linewidth=2, title="Long Trail Stop")

plot(series=useSL and sell_trend and high <= shortStopPrice 
 and (SL_Trigger_Short_HIT or use_SL_Trigger == false)
 ? shortStopPrice : na,
 color=color.fuchsia, style=plot.style_cross,
 linewidth=2, title="Short Trail Stop")

close_long  = cond_long_stop_loss_hit
close_short = cond_short_stop_loss_hit

// Submit entry orders
strategy.entry(TradeId + " L", long=true, when=enterLong)
strategy.close(TradeId + " L", when=close_long)

//if (enterShort)
strategy.entry(TradeId + " S", long=false, when=enterShort)
strategy.close(TradeId + " S", when=close_short)


if change_trend
    SL_Trigger_Long_HIT := false
    SL_Trigger_Short_HIT := false


Más.