Esta estrategia combina la súper tendencia, los puntos de giro y el rango verdadero promedio (ATR) para formar una línea de stop loss dinámica, y el indicador de índice de movimiento direccional promedio (ADX) para juzgar y rastrear tendencias.
El Super Trend combinado con Pivot Points y ATR stop loss juzga la dirección del precio rompiendo la línea de stop loss dinámica para determinar la dirección de apertura. Al mismo tiempo, el indicador ADX juzga la fuerza de la tendencia y solo emite señales comerciales cuando la tendencia es lo suficientemente fuerte.
Específicamente, los Puntos Pivot primero obtienen el último soporte y resistencia, y luego forman un precio medio dinámico con la media aritmética de los dos días anteriores. Luego, ATR se calcula y multiplica por el factor ATR, y luego se suma o resta del precio medio dinámico para obtener los rieles superior e inferior. Cuando el precio rompe el rieles superior, es alcista. Cuando rompe el rieles inferior, es bajista. El indicador ADX juzga la fuerza de la tendencia y solo participa en el comercio cuando la tendencia es lo suficientemente fuerte.
La línea de stop loss se ajustará dinámicamente de acuerdo con el último precio y el valor ATR, lo que puede rastrear la tendencia muy bien.
La estrategia tiene las siguientes ventajas:
Utilice el indicador Super Trend para rastrear la dirección de la tendencia para evitar el bloqueo de las ganancias por los mercados oscilantes.
Con la ayuda del indicador ADX para juzgar la fuerza de la tendencia, evite errores en las operaciones durante la consolidación.
La línea de stop loss se ajusta dinámicamente para maximizar las ganancias de bloqueo.
Combine el RSI para evitar la sobrecompra y la sobreventa.
En general, la configuración del parámetro de la estrategia es razonable. La selección de dframe considera la continuidad. La configuración de take profit y stop loss también es buena.
La estrategia también tiene algunos riesgos:
Los indicadores Super Trend y MA pueden emitir señales contradictorias.
El indicador ADX está ajustado a 14 ciclos, lo que no es lo suficientemente sensible a eventos repentinos.
El parámetro RSI está configurado como predeterminado, lo que puede no evitar completamente la sobrecompra y la sobreventa.
No se ha considerado el impacto de eventos repentinos, como las malas/buenas noticias.
Soluciones correspondientes:
Ajuste el ciclo de MA para que coincida con el indicador Super Trend.
Trate de acortar el ciclo de ADX para aumentar la sensibilidad a eventos repentinos.
Optimice los parámetros del RSI para encontrar valores óptimos.
Añadir módulo de filtro de noticias para evitar los principales comunicados de prensa.
La estrategia también puede optimizarse en los siguientes aspectos:
Agregue el modelo de aprendizaje automático para juzgar la tendencia, haciendo las decisiones comerciales más inteligentes.
Trate de introducir indicadores emocionales alternativos en lugar de ADX para juzgar la fuerza de la tendencia.
Aumentar el módulo de stop loss adaptativo para hacer que el stop loss sea más dinámico y preciso.
Extraer más características con tecnología de aprendizaje profundo para optimizar la estrategia general.
Utilice lenguajes avanzados como Python para el desarrollo de estrategias para aumentar la escalabilidad de estrategias.
En general, esta estrategia es muy práctica. El núcleo es rastrear la dirección de la tendencia y participar cuando la tendencia es lo suficientemente fuerte. La configuración de stop loss y take profit también está muy en su lugar para maximizar el bloqueo de ganancias evitando pérdidas. Por supuesto, todavía hay mucho espacio para la optimización.
/*backtest start: 2023-01-15 00:00:00 end: 2024-01-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Bendre ADX STrend", 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 = 21, title = "ATR Period") StartDate = input(timestamp("1 Dec 2023"), title="Start Date") EndDate = input(timestamp("12 Jan 2024"), title="End Date") window() => true 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) // // DMI - Direction Movement Index // [diplus1, diminus1, adx] = ta.dmi(14, 14) // Buy - Sell Entries buy = bsignalSSPP and outMA < close and ADX > th sell = ssignalSSPP if (buy and vrsi > overBought and adx > 19) // .order // Tuned version strategy.entry("Buy", strategy.long, when = window()) // 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 and adx > 25) strategy.entry("Sell", strategy.short, when = window()) if ( ta.crossover( diminus1, diplus1) or ((buy) and (strategy.position_size > 0)) ) strategy.close("Sell", "close Sell") // if(sell) and (diminus1 > diplus1) and adx > 23 and adx > adx[1] and (vrsi < overSold) // strategy.entry("Sell", strategy.short, when = window()) // if (strategy.position_size > 0 and ta.crossunder(diminus1, adx)) or (strategy.position_size > 0 and (buy)) // strategy.close("Sell", "close Sell")