Estrategia para el seguimiento de la oscilación cruzada de la EMA doble

El autor:¿ Qué pasa?, fecha: 2024-01-03 11:38:51
Las etiquetas:

img

Resumen general

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.

Estrategia lógica

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.

Análisis de ventajas

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.

Análisis de riesgos

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.

Direcciones de optimización

Las posibles optimizaciones para esta estrategia incluyen:

  1. Probando más períodos de EMA para encontrar la combinación óptima.

  2. Optimización de los parámetros ADX, incluidos el período ADX y los valores umbral.

  3. Mejorar los algoritmos de obtención de ganancias y stop loss, por ejemplo mediante la introducción de stops dinámicos.

  4. Combinar indicadores adicionales como KDJ y MACD para crear un sistema de confirmación de múltiples indicadores.

Resumen de las actividades

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()


Más.