Estrategia de juicio de tendencia dinámica MACD basada en el promedio móvil


Fecha de creación: 2024-02-19 10:48:11 Última modificación: 2024-02-19 10:48:11
Copiar: 0 Número de Visitas: 598
1
Seguir
1617
Seguidores

Estrategia de juicio de tendencia dinámica MACD basada en el promedio móvil

Descripción general

La estrategia se basa en una combinación de medias lineal de indicadores MACD, para determinar la tendencia dinámica a lo largo de períodos de tiempo, y es una estrategia de seguimiento de tendencias más clásica. Se determina la dirección y la fuerza de la tendencia actual a través de la relación entre el MACD y su línea de señal, principalmente a través de la diferencia de la línea media rápida y lenta. Al mismo tiempo, se introduce un juicio transitorio para mejorar la precisión y ajustar la posición dinámicamente.

Principio de estrategia

  1. La dirección de la tendencia actual se determina a partir de la diferencia de la línea media rápida y lenta del indicador MACD y su relación con la línea de señal
  2. La diferencia en el MACD se ve en la línea de señales como una señal múltiple y en la línea de señales como una señal de vacío.
  3. Introducción de la diferencia MACD y la columna MACD para el refuerzo de la señal de la estrategia
  4. Añadir un módulo de juicio transitorio, tomando el MACD de períodos de tiempo más altos como filtro de señal y base para ajustar la posición
  5. Ajuste dinámico de posiciones, reducción del tamaño de la posición cuando la señal de transición es débil, aumento de la posición cuando la señal es fuerte

Análisis de las ventajas

  1. El indicador MACD en sí es más eficaz para determinar la dirección de la tendencia
  2. Combinación de diferencias MACD y doble verificación de líneas columnares para mejorar la precisión de la señal
  3. El juicio transitorio mejora la estabilidad de la estrategia y evita ser engañado por señales de alta frecuencia
  4. El ajuste dinámico de posiciones permite a la estrategia aprovechar mejor las oportunidades y aumentar los beneficios excedentes.

Análisis de riesgos y soluciones

  1. La señal MACD se retrasa, lo que puede hacer que la señal sea un poco ineficaz.
  • Solución: Aumentar el mediano rápido y el mediano lento para capturar la señal con anticipación
  1. Las señales transitorias no siempre son precisas y pueden ser una estrategia engañosa
  • Solución: Introducción de un mecanismo de ajuste dinámico de la posición para que las estrategias de ciclo principal dominen
  1. La estrategia combinada de múltiples factores puede no tener estabilidad general
  • Solución: ajustar cuidadosamente la proporción de los parámetros de la estrategia para asegurar la solidez general

Dirección de optimización

  1. Prueba de la eficacia de diferentes combinaciones de parámetros de ciclo
  2. Prueba de la influencia de diferentes combinaciones de ciclo en la eficacia de la estrategia
  3. Ajuste los parámetros del indicador MACD, como el ciclo de la línea media rápida y lenta, el ciclo de la línea de señal, etc.
  4. Prueba de los efectos de los factores de regulación de las diferentes posiciones
  5. Pruebas de retroalimentación en otras variedades

Resumir

El MACD combina una estrategia de tendencias dinámicas a lo largo de un período, que integra las ventajas de los criterios clásicos de los indicadores y las referencias a varios marcos temporales. A través de la optimización de parámetros y la prueba de combinación, se puede construir una estrategia de seguimiento de tendencias más estable y con mejores ganancias.

Código Fuente de la Estrategia
/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@temelbulut
//@version=5
strategy('MACD Strategy %80', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=50)

fastLength = input.int(title='MACD Fast Length', defval=12, minval=1)
slowLength = input.int(title='MACD Slow Length', defval=26, minval=1)
signalLength = input.int(title='MACD Signal Length', defval=9, minval=1)
crossscore = input(title='Cross (buy/sell) Score', defval=10.)
indiside = input(title='indicator Direction Score', defval=8)
histside = input(title='Histogram Direction Score', defval=2)
shotsl = input(title='Show Stop Loss Line', defval=false)
Mult = input.float(title='Stop Loss Factor', defval=1.2, minval=0.1, maxval=100)
Period = input.int(title='Stop Loss Period', defval=10, minval=1, maxval=100)
lookaheadi = input(title='Lookahead', defval=true)

HTF = timeframe.period == '1' ? '5' : timeframe.period == '3' ? '15' : timeframe.period == '5' ? '15' : timeframe.period == '15' ? '60' : timeframe.period == '30' ? '60' : timeframe.period == '45' ? '60' : timeframe.period == '60' ? '240' : timeframe.period == '120' ? '240' : timeframe.period == '180' ? '240' : timeframe.period == '240' ? 'D' : timeframe.period == 'D' ? 'W' : 'W'

calc = timeframe.period == '1' ? 5 : timeframe.period == '3' ? 5 : timeframe.period == '5' ? 3 : timeframe.period == '15' ? 4 : timeframe.period == '30' ? 4 : timeframe.period == '45' ? 4 : timeframe.period == '60' ? 4 : timeframe.period == '120' ? 3 : timeframe.period == '180' ? 3 : timeframe.period == '240' ? 6 : timeframe.period == 'D' ? 5 : 1

count() =>
    indi = ta.ema(close, fastLength) - ta.ema(close, slowLength)
    signal = ta.ema(indi, signalLength)
    Anlyse = 0.0
    // direction of indi and histogram
    hist = indi - signal
    Anlyse := indi > indi[1] ? hist > hist[1] ? indiside + histside : hist == hist[1] ? indiside : indiside - histside : 0
    Anlyse += (indi < indi[1] ? hist < hist[1] ? -(indiside + histside) : hist == hist[1] ? -indiside : -(indiside - histside) : 0)
    Anlyse += (indi == indi[1] ? hist > hist[1] ? histside : hist < hist[1] ? -histside : 0 : 0)
    // cross now earlier ?
    countcross = indi >= signal and indi[1] < signal[1] ? crossscore : indi <= signal and indi[1] > signal[1] ? -crossscore : 0.
    countcross += nz(countcross[1]) * 0.6
    Anlyse += countcross
    nz(Anlyse)

Anlys = count()
AnlysHfrm = lookaheadi ? request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_on) : request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_off)
Result = (AnlysHfrm * calc + Anlys) / (calc + 1)

longCondition = ta.change(Result) != 0 and Result > 0
if longCondition
    strategy.entry('MACD Long', strategy.long,alert_message = 'MACD Long')

shortCondition = ta.change(Result) != 0 and Result < 0
if shortCondition
    strategy.entry('MACD Short', strategy.short,alert_message = 'MACD Short')

countstop(pos) =>
    Upt = hl2 - Mult * ta.atr(Period)
    Dnt = hl2 + Mult * ta.atr(Period)
    TUp = 0.
    TDown = 0.
    TUp := close[1] > TUp[1] ? math.max(Upt, TUp[1]) : Upt
    TDown := close[1] < TDown[1] ? math.min(Dnt, TDown[1]) : Dnt
    tslmtf = pos == 1 ? TUp : TDown
    tslmtf

pos = longCondition ? 1 : -1
stline = 0.
countstop__1 = countstop(pos)
security_1 = request.security(syminfo.tickerid, HTF, countstop__1)
stline := ta.change(time(HTF)) != 0 or longCondition or shortCondition ? security_1 : nz(stline[1])
plot(stline, color=shotsl ? color.rgb(148, 169, 18) : na, style=plot.style_line, linewidth=2, title='Stop Loss')