
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.
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.
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.
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.
La estrategia puede ser optimizada en los siguientes aspectos:
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.
Los parámetros de ADX se pueden optimizar. Se pueden probar diferentes configuraciones para el ciclo de ADX y el umbral de ADX.
El algoritmo de stop-loss puede ser mejorado, como la introducción de stop-loss dinámico.
Se puede considerar la combinación de otros indicadores, como KDJ, MACD, etc., para formar una estrategia de verificación de múltiples indicadores.
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.
/*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()