La estrategia Trailing Stop es una estrategia de trading cuantitativa que combina indicadores de juicio de tendencia y mecanismos de trailing stop. Esta estrategia utiliza el indicador Supertrend para determinar la dirección de la tendencia actual, y utiliza una línea de trailing stop para rastrear los cambios de precios en tiempo real, logrando el seguimiento de tendencias y el control de riesgos.
La estrategia primero calcula el indicador de Supertrend para juzgar si la tendencia actual es ascendente o descendente. El indicador de Supertrend incorpora el indicador ATR y el punto de pivote para determinar con mayor precisión la dirección de la tendencia. Si el indicador de Supertrend juzga una tendencia alcista, se genera una señal de compra. Si juzga una tendencia bajista, se genera una señal de venta.
Cuando se genera una señal de compra, la estrategia abrirá una posición larga. Al mismo tiempo, calcula una línea de parada de seguimiento en tiempo real. El método de cálculo de esta línea de parada es el punto de pivote menos el valor del indicador ATR. Siempre que el precio de cierre actual sea mayor que esta línea de parada, la línea de parada se moverá hacia arriba en tiempo real y mantendrá una posición de stop loss razonable. Si el precio rompe la línea de parada, la posición se cerrará con un stop loss.
La estrategia también incorpora los indicadores ADX y RSI para filtrar las señales comerciales inadecuadas.
La mayor ventaja de esta estrategia es que puede captar bien la dirección de la tendencia y lograr el seguimiento de la tendencia. El indicador de Supertrend es más preciso que las medias móviles simples y puede determinar rápidamente los puntos de inflexión. Al mismo tiempo, el mecanismo de parada posterior puede ajustar automáticamente los niveles de parada para maximizar el bloqueo de ganancias y controlar eficazmente los riesgos.
Además, los indicadores ADX y RSI se añaden a la estrategia de filtración, evitando errores durante los períodos de alta volatilidad del mercado.
El mayor riesgo de esta estrategia es que el juicio de tendencia se equivoque y el indicador de Supertrend emita una señal incorrecta. Aunque el indicador de Supertrend es superior a las medias móviles simples, es inevitable que ocurran juicios erróneos en condiciones de mercado complejas. En este punto, es necesario confiar en mecanismos de stop loss para controlar las pérdidas.
Además, la configuración incorrecta de los parámetros de la estrategia también puede suponer riesgos. Por ejemplo, un parámetro ATR que es demasiado grande llevará a ajustes de línea de stop-loss demasiado agresivos. La configuración incorrecta de los parámetros ADX y RSI también puede perder oportunidades comerciales o aumentar la probabilidad de operaciones incorrectas. Esto requiere una extensa prueba histórica para encontrar los parámetros óptimos.
La estrategia se puede optimizar aún más en los siguientes aspectos:
Intentar otros indicadores de evaluación de tendencias como DMI y KDJ en combinación con el indicador Supertrend para formar un sistema de evaluación
Aumentar el módulo de optimización de parámetros adaptativos basado en aprendizaje automático para que el parámetro ATR, el parámetro ADX, el parámetro RSI, etc. puedan ajustarse de acuerdo con el mercado en tiempo real en lugar de valores fijos.
Introducir indicadores de sentimiento para reemplazar a los indicadores RSI para el filtrado de señales.
Aumentar el módulo de gestión del tamaño de la posición. De acuerdo con la distancia entre la línea de parada y el precio actual, ajuste dinámicamente el tamaño de la posición. Cuanto más lejos de la línea de parada, mayor sea el tamaño de la posición, se puede aumentar adecuadamente para mejorar el potencial de ganancia.
La estrategia de seguimiento de tendencias Trailing Stop emplea de manera integral métodos como análisis de tendencias, trailing stops y filtrado multifactorial. Mientras que captura tendencias, controla estrictamente los riesgos y es una estrategia cuantitativa más madura.
/*backtest start: 2023-01-16 00:00:00 end: 2024-01-16 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Bendre ADX Sup Trend", overlay = true) /////////////////////////// // SuperTrend + Pivot Point ////////////////////////// src = input(close, title="EMA Source") PPprd = input(defval = 2, title="Pivot Point Period") AtrFactor=input(defval = 2, title = "ATR Factor") AtrPd=input(defval = 18, title = "ATR Period") StartDate = input(timestamp("1 Dec 2022"), title="Start Date") EndDate = input(timestamp("12 Jan 2023"), title="End Date") var float ph = na var float pl = na ph := ta.pivothigh(PPprd, PPprd) pl :=ta.pivotlow(PPprd, PPprd) float center = na center := center[1] // float lastpp = ph ? ph : pl ? pl : 0.0 float lastpp = na(ph) ? na(pl) ? na : pl : ph if lastpp > 0 if na(center) center := lastpp else center := (center * 2 + lastpp) / 3 Up = center - (AtrFactor * ta.atr(AtrPd)) Dn = center + (AtrFactor * ta.atr(AtrPd)) var float TUp = na var float TDown = na Trend = 0 TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1) Trailingsl = Trend == 1 ? TUp : TDown // Lines linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na plot(Trailingsl, color = linecolor , linewidth = 2, title = "PP SuperTrend") bsignalSSPP = close > Trailingsl ssignalSSPP = close < Trailingsl /////// // ADX ////// lenADX = 14 th = 14 TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0 SmoothedTrueRange = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus SmoothedDirectionalMovementMinus = 0.0 SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = math.abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100 ADX = ta.sma(DX, lenADX) ////// // MA ///// lenMA = 21 srcMA = input(close, title="Source") // offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500) offsetMA = input(0, title="Offset") outMA = ta.sma(srcMA, lenMA) // // RSI // length = input( 14 ) overSold = input( 30 ) overBought = input( 65 ) price = close vrsi = ta.rsi(price, length) // Buy - Sell Entries buy = bsignalSSPP and outMA < close and ADX > th sell = ssignalSSPP if (buy and vrsi > overBought) // .order // Tuned version strategy.entry("Buy", strategy.long) // strategy.close("Sell", "close Sell") if (sell) and (strategy.position_size > 0) // strategy.entry("Sell", strategy.short) strategy.close("Buy", "Close Buy") // if(sell and vrsi < overSold ) // strategy.entry("Sell", strategy.short) // if(buy) and (strategy.position_size > 0) // strategy.close("Sell", "close Sell")