Estrategia de seguimiento de oscilación de cruz dorada de doble EMA


Fecha de creación: 2024-01-03 11:38:51 Última modificación: 2024-01-03 11:38:51
Copiar: 0 Número de Visitas: 591
1
Seguir
1621
Seguidores

Estrategia de seguimiento de oscilación de cruz dorada de doble EMA

Descripción general

La estrategia de seguimiento de la oscilación de la cruz dorada de la doble EMA es una estrategia que utiliza el indicador EMA para identificar la tendencia y realizar el seguimiento en situaciones de oscilación. La estrategia integra la idea de seguimiento de tendencias y captura de oscilaciones, para realizar un seguimiento de línea larga en situaciones de fuerza y operaciones de línea corta en situaciones de oscilación con la esperanza de obtener mejores ganancias.

Principio de estrategia

La estrategia utiliza EMA de 20 ciclos como indicador de tendencia. Cuando el precio se eleva por encima de EMA, se considera que el precio comienza a subir; cuando el precio se eleva por debajo de EMA, se considera que el precio comienza a bajar.

Cuando el precio está en EMA, toma el precio más alto de 20 periodos más altos como parada, toma el precio más bajo después de la EMA como parada de pérdidas, y hace más entrada; cuando el precio está en EMA, toma el precio más bajo de 20 periodos más bajos como parada, toma el precio más alto después de la EMA como parada de pérdidas, y hace una entrada en blanco.

Al mismo tiempo, la estrategia también determina si el ADX es mayor que 30. La estrategia solo opera cuando la tendencia es lo suficientemente clara, es decir, cuando el ADX es superior a 30.

Durante el proceso de mantenimiento de la posición, el trail stop se ajusta a la situación real del mercado para bloquear más ganancias.

Análisis de las ventajas

Esta estrategia combina las ventajas de seguir una tendencia y el comercio de la oscilación, que permite obtener ganancias más lucrativas en situaciones de tendencia, y obtener ganancias más estables en situaciones de oscilación, con una mayor adaptabilidad.

La aplicación de EMA también reduce los parámetros de la estrategia y reduce el riesgo de optimización excesiva, lo que garantiza la estabilidad de la estrategia.

Análisis de riesgos

El principal riesgo de esta estrategia es que puede haber más pérdidas de parada cuando la oscilación se intensifica. En este caso, la función de ADX se destaca. Cuando el valor de ADX es bajo, se cierran las operaciones para evitar pérdidas cuando no hay una tendencia clara.

Además, es clave establecer un punto de parada razonable. Si el punto de parada es demasiado grande, puede aumentar las pérdidas individuales; Si el punto de parada es demasiado pequeño, puede ser demasiado sensible y aumentar la probabilidad de parar. Aquí se necesita encontrar un equilibrio entre el objetivo de ganancias y el riesgo de parada.

Dirección de optimización

La estrategia puede ser optimizada en los siguientes aspectos:

  1. La selección de los ciclos de EMA. Se pueden probar más parámetros de los ciclos de EMA para encontrar la combinación de parámetros óptima.

  2. Los parámetros de ADX se pueden optimizar. Se pueden probar diferentes configuraciones para el ciclo de ADX y el umbral de ADX.

  3. El algoritmo de stop-loss puede ser mejorado, como la introducción de stop-loss dinámico.

  4. Se puede considerar la combinación de otros indicadores, como KDJ, MACD, etc., para formar una estrategia de verificación de múltiples indicadores.

Resumir

La estrategia de seguimiento de la oscilación de doble cruce de oro de la EMA es en general una estrategia muy práctica. Combina las características de la estrategia de tendencia y la estrategia de oscilación, que se puede utilizar tanto para el seguimiento de la línea larga como para el comercio de la línea corta. La eficacia de la estrategia se puede mejorar aún más mediante la optimización de los parámetros y la verificación de los indicadores combinados.

Código Fuente de la Estrategia
/*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()