Esta estrategia calcula el impulso del precio para determinar la dirección de la tendencia y establece paradas bidireccionales de seguimiento para bloquear las ganancias, realizando el stop loss siguiendo la tendencia.
Calcula el impulso del precio de 12 períodos, y calcula el impulso del momento de 1 período. Cuando el impulso rápido (momento del momento del precio de 1 período) es mayor que 0, va largo. Cuando es menor que 0, va corto. Esto juzga el cambio de dirección del impulso del precio para determinar la tendencia del precio.
Establece la distancia de parada de seguimiento y el nivel de activación. La distancia de parada de seguimiento se refiere al ajuste de la parada a una distancia especificada desde el máximo o mínimo más reciente cuando el precio alcanza nuevos máximos o mínimos. El nivel de activación significa que la parada de seguimiento comienza solo después de alcanzar una cierta proporción de ganancias.
La estrategia bloquea las ganancias siguiendo el precio más alto o el precio más bajo, enviando órdenes de cierre cuando el precio retrocede más allá de la distancia de parada establecida.
La determinación del doble impulso juzga con precisión la dirección de la tendencia, reduce las operaciones y evita quedar atrapado.
La distancia de detención flexible reduce el riesgo y bloquea los beneficios.
El nivel de activación evita el stop loss prematuro al permitir el retraso solo después de alcanzar un objetivo de ganancia.
Las paradas bidireccionales controlan de manera integral los riesgos tanto para largos como para cortos.
Cálculo simple y eficiente, fácil de entender e implementar.
El doble impulso puede generar señales inversas, necesitando un filtro de tendencia.
La distancia excesiva de parada puede causar pérdidas significativas.
Un alto nivel de activación puede perder oportunidades de detención.
Se necesitan más pruebas y optimización de parámetros para encontrar paradas óptimas.
Puede reducir las señales falsas mediante el juicio de tendencia y la optimización de parámetros. Prueba en diferentes productos y conjuntos de parámetros para encontrar la mejor configuración.
Combinar el reconocimiento de la estructura del mercado para la tendencia, evitando el comercio inverso.
Añadir más condiciones de tiempo como cambios de volumen, apretar breakouts para mejorar la precisión de la señal.
Optimizar los parámetros probando diferentes distancias de parada y niveles de activación.
Considere la parada de seguimiento dinámica según la volatilidad del mercado.
Establecer paradas parciales o paradas en movimiento para un mejor control del riesgo.
La estrategia tiene una estructura clara, juzga la tendencia con doble impulso y bloquea las ganancias con paradas de seguimiento flexibles, controlando eficazmente los riesgos comerciales. Es fácil de entender e implementar, con espacio optimizable. Agregar más indicadores técnicos y pruebas de parámetros puede mejorar aún más el rendimiento de la estrategia. La estrategia proporciona ideas y referencias para realizar la gestión de pérdidas de parada.
/*backtest start: 2023-01-01 00:00:00 end: 2023-02-03 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Trailing Stop Snippet", overlay=true) length = input(12) price = close momentum(seria, length) => mom = seria - seria[length] mom mom0 = momentum(price, length) mom1 = momentum( mom0, 1) tsact = input.float(0.0, "Trailing Stop Activation |", group="strategy", tooltip="Activates the Trailing Stop once this PnL is reached.") / 100 tsact := tsact ? tsact : na ts = input.float(0.0, "Position Trailing Stop |", group="strategy", tooltip="Trails your position with a stop loss at this distance from the highest PnL") / 100 ts := ts ? ts : na in_long = strategy.position_size > 0 in_short = strategy.position_size < 0 var ts_ = array.new_float() ts_size = array.size(ts_) ts_get = ts_size > 0 ? array.get(ts_, ts_size - 1) : 0 if in_long if tsact and high > strategy.position_avg_price + strategy.position_avg_price * tsact if ts_size > 0 and ts_get < high array.push(ts_, high) if ts_size < 1 array.push(ts_, high) if not tsact if ts_size > 0 and ts_get < high array.push(ts_, high) if ts_size < 1 array.push(ts_, high) if in_short if tsact and low < strategy.position_avg_price - strategy.position_avg_price * tsact if ts_size > 0 and ts_get > low array.push(ts_, low) if ts_size < 1 array.push(ts_, low) if not tsact if ts_size > 0 and ts_get > low array.push(ts_, low) if ts_size < 1 array.push(ts_, low) trail = in_long and ts_size > 0 ? low < ts_get - ts_get * ts : in_short and ts_size > 0 ? high > ts_get + ts_get * ts : na if (mom0 > 0 and mom1 > 0) strategy.entry("MomLE", strategy.long, stop=high+syminfo.mintick, comment="MomLE") else strategy.cancel("MomLE") if (mom0 < 0 and mom1 < 0) strategy.entry("MomSE", strategy.short, stop=low-syminfo.mintick, comment="MomSE") else strategy.cancel("MomSE") tsClose = in_long ? ts_get - ts_get * ts : in_short ? ts_get + ts_get * ts : na if trail strategy.close_all() if not strategy.opentrades array.clear(ts_) //plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr) plotchar(ts_get, "GET", "") plot(strategy.position_avg_price > 0 ? strategy.position_avg_price : na, "Average", color.rgb(251, 139, 64), 2, plot.style_cross) plot(tsClose > 0 ? tsClose : na, "Trailing", color.rgb(251, 64, 64), 2, plot.style_cross) plot(strategy.position_avg_price - strategy.position_avg_price * tsact > 0 ? strategy.position_avg_price - strategy.position_avg_price * tsact : na, "TS Activation", color.fuchsia, 2, plot.style_cross)