Estrategia de tendencia dinámica interperíodo de combinación de promedios móviles MACD

El autor:¿ Qué pasa?, Fecha: 2024-02-19 10:48:11
Las etiquetas:

img

Resumen general

Esta estrategia se basa en la combinación de promedios móviles del indicador MACD para realizar un juicio de tendencia dinámica a través de períodos de tiempo. Pertenece a una estrategia de seguimiento de tendencia más clásica.

Principio de la estrategia

  1. Juzgar la dirección actual de la tendencia basándose en la diferencia entre los promedios móviles rápidos y lentos del indicador MACD y su relación con la línea de señal.
  2. La diferencia MACD que cruza por encima de la línea de señal es una señal larga, y cruzar por debajo es una señal corta.
  3. Introduzca la diferencia MACD y el histograma MACD en la misma dirección para mejorar las señales de estrategia.
  4. Añadir un módulo de juicio de ciclo cruzado, utilizar el indicador MACD de un marco de tiempo más alto como filtro de señal y base de ajuste de posición.
  5. Ajuste dinámico de la posición, reducción del tamaño de la posición cuando la señal de ciclo cruzado es más débil y aumento de la posición cuando la señal es mejorada.

Análisis de ventajas

  1. La eficacia del MACD en sí mismo para determinar la dirección de la tendencia es relativamente alta.
  2. La combinación de la diferencia MACD y la doble verificación del histograma puede mejorar la precisión de la señal.
  3. El juicio transversal mejora la estabilidad de la estrategia y evita ser engañado por señales de alta frecuencia.
  4. El ajuste dinámico de la posición permite a la estrategia aprovechar mejor las oportunidades y aumentar los rendimientos excedentes.

Análisis de riesgos y soluciones

  1. Las señales MACD tienen retraso, lo que puede conducir a efectos de señal ligeramente inferiores.
  • Solución: Aumente la diferencia entre las medias móviles rápidas y lentas para capturar las señales con anticipación.
  1. Las señales de ciclo cruzado no son necesariamente precisas y pueden engañar las estrategias.
  • Solución: Introducir un mecanismo de ajuste dinámico de la posición para garantizar que la estrategia del ciclo principal domine.
  1. La estabilidad general de las estrategias combinadas de múltiples factores puede ser insuficiente.
  • Solución: ajustar cuidadosamente la proporción de peso de cada parámetro de estrategia para garantizar la robustez general.

Direcciones de optimización

  1. Probar los efectos de diferentes combinaciones de parámetros del ciclo.
  2. Probar el impacto de diferentes combinaciones de ciclos cruzados en la eficacia de la estrategia.
  3. Ajustar los parámetros del indicador MACD, como los ciclos de medias móviles rápidas y lentas, los ciclos de líneas de señal, etc.
  4. Prueba los efectos de diferentes factores de ajuste de posición.
  5. Prueba los efectos de las pruebas posteriores en otras variedades.

Resumen de las actividades

Esta estrategia de tendencia dinámica de combinación de medias móviles MACD de períodos cruzados integra las ventajas de los indicadores clásicos y las referencias de marcos de tiempo múltiples. A través de la optimización de parámetros y las pruebas de combinación, se puede construir una estrategia de seguimiento de tendencias relativamente estable y rentable.


/*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')



Más.