Esta estrategia utiliza 2 indicadores para generar señales de trading: 2/20 Exponential Moving Average y Average True Range Reversal.
La estrategia consta de dos partes:
2/20 promedio móvil exponencial. Cálcula la EMA de 20 días y genera señales cuando el precio cruza la EMA hacia arriba o hacia abajo.
Indicador de reversión de rango verdadero promedio. Cálcula el nivel de stop loss basado en ATR, y genera señales cuando el precio rompe el nivel de stop loss. Aquí 3.5 x ATR se usa como el nivel de stop.
La estrategia combina las señales de ambos. Va corto cuando 2/20 EMA da señal larga mientras que la inversión ATR da señal corta. Va largo cuando se generan señales opuestas.
La estrategia combina las ideas de seguimiento de tendencias y de reversión, con el objetivo de capturar las reversiones.
2/20 EMA identifica la tendencia a medio plazo, evita el ruido del mercado.
La reversión ATR captura las reversiones y oportunidades a corto plazo.
La combinación de las señales capta la inversión de tendencia antes de tiempo y mejora la rentabilidad.
Una pérdida de parada ATR razonable proporciona cierto control del riesgo.
El multiplicador de ATR personalizable se adapta a diferentes productos.
La opción de reversión se adapta a diferentes entornos de mercado.
Los riesgos son:
La EMA 2/20 es lenta y puede perder oportunidades a corto plazo.
La pérdida de frenado de ATR puede penetrarse fácilmente. Se necesita una pérdida de frenado más amplia.
La señal de un solo indicador es poco confiable.
Cuidado con el exceso de comercio.
Se necesita ajuste de parámetros y pruebas de retroceso para que el producto se ajuste.
Se necesita una gestión de capital estricta para controlar el riesgo por operación.
La estrategia puede mejorarse a partir de:
Ajuste de parámetros EMA para la mejor combinación.
Optimizando el multiplicador ATR para una mejor parada de pérdida.
Añadiendo condiciones de filtro como volumen y volatilidad.
Añadir un modelo de gestión de capital para el dimensionamiento dinámico de las posiciones.
Añadiendo otras estrategias de stop loss como Chandelier Exit.
Prueba de parámetros en diferentes productos.
Añadir modelos de aprendizaje automático para un mejor rendimiento.
Combinando múltiples sub-estrategias para más Alfa.
La estrategia combina dos ideas principales y tiene cierta ventaja de capturar reversiones. Pero la selección inadecuada de parámetros también puede introducir riesgos.
/*backtest start: 2022-10-27 00:00:00 end: 2023-11-02 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 //////////////////////////////////////////////////////////// // Copyright by HPotter v1.0 05/04/2022 // This is combo strategies for get a cumulative signal. // // First strategy // This indicator plots 2/20 exponential moving average. For the Mov // Avg X 2/20 Indicator, the EMA bar will be painted when the Alert criteria is met. // // Second strategy // Average True Range Trailing Stops Strategy, by Sylvain Vervoort // The related article is copyrighted material from Stocks & Commodities Jun 2009 // Please, use it only for learning or paper trading. Do not for real trading. // // // WARNING: // - For purpose educate only // - This script to change bars colors. //////////////////////////////////////////////////////////// EMA20(Length) => pos = 0.0 xPrice = close xXA = ta.ema(xPrice, Length) nHH = math.max(high, high[1]) nLL = math.min(low, low[1]) nXS = nLL > xXA or nHH < xXA ? nLL : nHH iff_1 = nXS < close[1] ? 1 : nz(pos[1], 0) pos := nXS > close[1] ? -1 : iff_1 pos ATRR(nATRPeriod,nATRMultip) => pos = 0.0 xATR = ta.atr(nATRPeriod) nLoss = nATRMultip * xATR xATRTrailingStop = 0.0 xATRTrailingStop := close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), close - nLoss) : close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), close + nLoss) : close > nz(xATRTrailingStop[1], 0) ? close - nLoss : close + nLoss pos:= close[1] < nz(xATRTrailingStop[1], 0) and close > nz(xATRTrailingStop[1], 0) ? 1 : close[1] > nz(xATRTrailingStop[1], 0) and close < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0) pos strategy(title='Combo 2/20 EMA & Average True Range Reversed', shorttitle='Combo', overlay=true) var I1 = '●═════ 2/20 EMA ═════●' Length = input.int(14, minval=1, group=I1) var I2 = '●═════ Average True Range Reversed ═════●' nATRPeriod = input.int(5, group=I2) nATRMultip = input.float(3.5, group=I2) var misc = '●═════ MISC ═════●' reverse = input.bool(false, title='Trade reverse', group=misc) var timePeriodHeader = '●═════ Time Start ═════●' d = input.int(1, title='From Day', minval=1, maxval=31, group=timePeriodHeader) m = input.int(1, title='From Month', minval=1, maxval=12, group=timePeriodHeader) y = input.int(2005, title='From Year', minval=0, group=timePeriodHeader) StartTrade = time > timestamp(y, m, d, 00, 00) ? true : false posEMA20 = EMA20(Length) prePosATRR = ATRR(nATRPeriod,nATRMultip) iff_1 = posEMA20 == -1 and prePosATRR == -1 and StartTrade ? -1 : 0 pos = posEMA20 == 1 and prePosATRR == 1 and StartTrade ? 1 : iff_1 iff_2 = reverse and pos == -1 ? 1 : pos possig = reverse and pos == 1 ? -1 : iff_2 if possig == 1 strategy.entry('Long', strategy.long) if possig == -1 strategy.entry('Short', strategy.short) if possig == 0 strategy.close_all() barcolor(possig == -1 ? #b50404 : possig == 1 ? #079605 : #0536b3)