Esta es una estrategia de trading cuantitativa que combina los indicadores triple supertrend, EMA y ADX. Genera señales de trading utilizando un sistema triple supertrend y aplica EMA y ADX como filtros para controlar la frecuencia de trading y mejorar la calidad de la señal.
Utilice tres sistemas de supertendencias con diferentes parámetros y genere señales comerciales cuando las tres supertendencias estén de acuerdo en la dirección.
Aplicar la EMA como un filtro de tendencia, sólo ir largo cuando el cierre está por encima de la EMA y ir corto cuando el cierre está por debajo de la EMA.
Aplicar el ADX como filtro de fuerza de tendencia, solo operar cuando el ADX esté por encima de un umbral.
Permitir la opción de reingreso para ajustar la rentabilidad y el control de riesgos.
Específicamente, la condición de entrada larga es cuando las tres supertendencias se vuelven alcistas, el cierre está por encima de la EMA y el ADX es superior al umbral. La condición de entrada corta es cuando las tres supertendencias se vuelven bajistas, el cierre está por debajo de la EMA y el ADX es superior al umbral. Salida cuando cualquiera de las supertendencias invierte la dirección.
La estrategia también traza líneas de soporte y resistencia de supertrend para ayudar a la determinación visual de la tendencia.
El sistema de súper tendencia triple filtra las falsas rupturas y mejora la precisión de entrada.
Los filtros dobles EMA y ADX reducen las pérdidas y mejoran la gestión del riesgo.
La opción de reingreso permite ajustar la rentabilidad en función de la preferencia de riesgo.
Las líneas de supertrend visuales ayudan a determinar la dirección de la tendencia.
Supertrend y otros indicadores tienen retraso y pueden causar entrada tardía o salida temprana.
Los filtros demasiado estrictos pueden perder oportunidades.
Los whipssaws pueden causar pérdidas en los mercados de rango.
Permitir la reentrada aumenta la frecuencia del comercio y los costos de deslizamiento.
Estos riesgos pueden reducirse mediante la optimización de parámetros, filtros y el uso de paradas dinámicas.
Esta estrategia puede optimizarse en varios aspectos:
Prueba diferentes combinaciones de parámetros para encontrar la configuración óptima de supertrend y EMA.
Optimizar el umbral ADX para reducir las señales falsas.
Añadir otros filtros como volatilidad, volumen, etc.
Optimizar los parámetros por separado para los diferentes productos.
Construir mecanismos dinámicos de detención de pérdidas para un mejor control del riesgo.
Explorar el aprendizaje automático para encontrar mejores reglas de entrada y salida.
Esta estrategia utiliza los puntos fuertes de los sistemas de triple supertrend y los aumenta con filtros dobles EMA y ADX para mejorar efectivamente la calidad de la señal y controlar los riesgos.
/*backtest start: 2023-08-18 00:00:00 end: 2023-09-17 00:00:00 period: 2h 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/ // ©kunjandetroja //@version=5 strategy('Triple Supertrend with EMA and ADX', overlay=true) m1 = input.float(1,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 1') m2 = input.float(2,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 2') m3 = input.float(3,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 3') p1 = input.int(10,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 1') p2 = input.int(15,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 2') p3 = input.int(20,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 3') len_EMA = input.int(200,"EMA Len",minval = 5,maxval= 250,step=1) len_ADX = input.int(14,"ADX Len",minval = 1,maxval= 25,step=1) len_Di = input.int(14,"Di Len",minval = 1,maxval= 25,step=1) adx_above = input.float(25,"adx filter",minval = 1,maxval= 50,step=0.5) var bool long_position = false adx_filter = input.bool(false, "Add Adx & EMA filter") renetry = input.bool(true, "Allow Reentry") f_getColor_Resistance(_dir, _color) => _dir == 1 and _dir == _dir[1] ? _color : na f_getColor_Support(_dir, _color) => _dir == -1 and _dir == _dir[1] ? _color : na [superTrend1, dir1] = ta.supertrend(m1, p1) [superTrend2, dir2] = ta.supertrend(m2, p2) [superTrend3, dir3] = ta.supertrend(m3, p3) EMA = ta.ema(close, len_EMA) [diplus,diminus,adx] = ta.dmi(len_Di,len_ADX) // ADX Filter adxup = adx > adx_above and close > EMA adxdown = adx > adx_above and close < EMA sum_dir = dir1 + dir2 + dir3 dir_long = if(adx_filter == false) sum_dir == -3 else sum_dir == -3 and adxup dir_short = if(adx_filter == false) sum_dir == 3 else sum_dir == 3 and adxdown Exit_long = dir1 == 1 and dir1 != dir1[1] Exit_short = dir1 == -1 and dir1 != dir1[1] // BuySignal = dir_long and dir_long != dir_long[1] // SellSignal = dir_short and dir_short != dir_short[1] // if BuySignal // label.new(bar_index, low, 'Long', style=label.style_label_up) // if SellSignal // label.new(bar_index, high, 'Short', style=label.style_label_down) longenter = if(renetry == false) dir_long and long_position == false else dir_long shortenter = if(renetry == false) dir_short and long_position == true else dir_short if longenter long_position := true if shortenter long_position := false strategy.entry('BUY', strategy.long, when=longenter) strategy.entry('SELL', strategy.short, when=shortenter) strategy.close('BUY', Exit_long) strategy.close('SELL', Exit_short) buy1 = ta.barssince(dir_long) sell1 = ta.barssince(dir_short) colR1 = f_getColor_Resistance(dir1, color.red) colS1 = f_getColor_Support(dir1, color.green) colR2 = f_getColor_Resistance(dir2, color.orange) colS2 = f_getColor_Support(dir2, color.yellow) colR3 = f_getColor_Resistance(dir3, color.blue) colS3 = f_getColor_Support(dir3, color.maroon) plot(superTrend1, 'R1', colR1, linewidth=2) plot(superTrend1, 'S1', colS1, linewidth=2) plot(superTrend2, 'R1', colR2, linewidth=2) plot(superTrend2, 'S1', colS2, linewidth=2) plot(superTrend3, 'R1', colR3, linewidth=2) plot(superTrend3, 'S1', colS3, linewidth=2) // // Intraday only // var int new_day = na // var int new_month = na // var int new_year = na // var int close_trades_after_time_of_day = na // if dayofmonth != dayofmonth[1] // new_day := dayofmonth // if month != month[1] // new_month := month // if year != year[1] // new_year := year // close_trades_after_time_of_day := timestamp(new_year,new_month,new_day,15,15) // strategy.close_all(time > close_trades_after_time_of_day)