La estrategia de seguimiento de oscilaciones de doble EMA es una estrategia que identifica tendencias utilizando el indicador EMA y sigue las oscilaciones durante condiciones de mercado volátiles.
Esta estrategia utiliza la EMA de 20 períodos como indicador para juzgar las tendencias. Cuando el precio cruza por encima de la EMA, indica una tendencia al alza, y cuando el precio cruza por debajo, indica una tendencia a la baja.
Cuando el precio cruza por encima de la EMA, se ingresa una posición larga utilizando el precio más alto en los últimos 20 períodos como el take profit y el mínimo desde el cruce como el stop loss.
Al mismo tiempo, la estrategia también verifica si el ADX está por encima de 30. Las operaciones solo se realizan cuando la tendencia es lo suficientemente fuerte, es decir, cuando el ADX es superior a 30.
Durante las operaciones abiertas, el trailing stop continúa ajustándose según las condiciones del mercado para obtener más ganancias.
Esta estrategia combina las ventajas tanto del seguimiento de tendencias como del comercio de oscilaciones. Puede producir mayores rendimientos durante los mercados de tendencias y rendimientos más consistentes durante las oscilaciones. La adaptabilidad es fuerte.
El uso de EMA también mantiene los parámetros simples, reduciendo los riesgos de sobreoptimización y garantizando la estabilidad.
El principal riesgo de esta estrategia es la posibilidad de paradas más frecuentes durante oscilaciones intensificadas. Aquí es donde entra en juego el ADX. Al desactivar la negociación cuando el ADX es bajo, se pueden evitar pérdidas en ausencia de una tendencia clara.
Además, la colocación adecuada de stop loss también es clave. Las paradas excesivamente amplias pueden aumentar la cantidad de pérdida de una sola operación. Las paradas excesivamente ajustadas pueden ser demasiado sensibles y aumentar la probabilidad de stop out. Se debe encontrar un equilibrio entre los objetivos de ganancia y los riesgos de stop loss.
Las posibles optimizaciones para esta estrategia incluyen:
Probando más períodos de EMA para encontrar la combinación óptima.
Optimización de los parámetros ADX, incluidos el período ADX y los valores umbral.
Mejorar los algoritmos de obtención de ganancias y stop loss, por ejemplo mediante la introducción de stops dinámicos.
Combinar indicadores adicionales como KDJ y MACD para crear un sistema de confirmación de múltiples indicadores.
En resumen, la estrategia de seguimiento de oscilación de doble EMA es una estrategia muy práctica. Combina las fortalezas de las estrategias de trading de tendencia y las estrategias de oscilación. Se puede utilizar tanto para el seguimiento a largo plazo como para el comercio a corto plazo. Se pueden lograr mejoras adicionales en el rendimiento a través de la optimización de parámetros y la adición de indicadores de confirmación.
/*backtest start: 2023-12-26 00:00:00 end: 2024-01-02 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("Linda Raschke's Holy Grail", shorttitle="RHG", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, overlay = true) adxlen = input(14, title="ADX period") adxMin = input(30) dilen = adxlen f_highest(_src, _length)=> _adjusted_length = _length < 1 ? 1 : _length _value = _src for _i = 0 to (_adjusted_length-1) _value := _src[_i] >= _value ? _src[_i] : _value _return = _value f_lowest(_src, _length)=> _adjusted_length = _length < 1 ? 1 : _length _value = _src for _i = 0 to (_adjusted_length-1) _value := _src[_i] <= _value ? _src[_i] : _value _return = _value dirmov(len) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(tr, len) plus = fixnan(100 * rma(plusDM, len) / truerange) minus = fixnan(100 * rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) emaLength = input(20) curEma = ema(close, emaLength) highPeriod = input(20) d = na takeProfitLong = highest(high, highPeriod) stopLossLong = f_lowest(low, barssince(low >= curEma)) if strategy.position_size == 0 if adx(dilen, adxlen) <= adxMin or high < curEma strategy.cancel("Long") if adx(dilen, adxlen) > adxMin and low < curEma and high > curEma and curEma > curEma[highPeriod / 2] and curEma > curEma[highPeriod] and takeProfitLong > high strategy.order("Long", strategy.long, stop = high) strategy.exit("Exit", "Long", limit = takeProfitLong, stop = stopLossLong) d := high takeProfitShort = lowest(low, highPeriod) stopLossShort = f_highest(high, barssince(high <= curEma)) if strategy.position_size == 0 if adx(dilen, adxlen) <= adxMin or low > curEma strategy.cancel("Short") if adx(dilen, adxlen) > adxMin and high > curEma and low < curEma and curEma < curEma[highPeriod / 2] and curEma < curEma[highPeriod] and takeProfitShort < low strategy.order("Short", strategy.short, stop = low) strategy.exit("Exit", "Short", limit = takeProfitShort, stop = stopLossShort) d := low strategy.close("Exit") plot(d == high ? stopLossLong : d == low ? stopLossShort : na, style = circles, linewidth = 4, color = red) plot(d == high ? takeProfitLong : d == low ? takeProfitShort : na, style = circles, linewidth = 4, color = green) plot(d, style = circles, linewidth = 4, color = yellow) plot(curEma, color = black, linewidth = 2) // === Backtesting Dates === testPeriodSwitch = input(false, "Custom Backtesting Dates") testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(3, "Backtest Start Month") testStartDay = input(6, "Backtest Start Day") testStartHour = input(08, "Backtest Start Hour") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0) testStopYear = input(2018, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(14, "Backtest Stop Day") testStopHour = input(14, "Backtest Stop Hour") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false isPeriod = testPeriodSwitch == true ? testPeriod() : true // === /END if not isPeriod strategy.cancel_all() strategy.close_all()