Estrategia de negociación de promedio móvil de McGinley

El autor:¿ Qué pasa?, Fecha: 2023-11-14 15:48:46
Las etiquetas:

img

Resumen general

Esta estrategia se basa en el indicador de promedio móvil dinámico de McGinley. El indicador de MA de McGinley es una versión mejorada de los promedios móviles que pueden rastrear mejor las tendencias de precios.

Estrategia lógica

La estrategia utiliza principalmente dos promedios móviles, un EMA de 21 períodos y un EMA de 42 períodos. Cuando el MA más corto cruza por encima del MA más largo, se considera una señal de compra. Cuando el MA más corto cruza por debajo del MA más largo, se considera una señal de venta.

Además, la estrategia también requiere que el precio esté por encima del MA dinámico de McGinley y rompa por encima del MA más corto para generar una señal de compra.

Específicamente, la señal de compra se activa cuando: el MA más corto cruza por encima del MA más largo, el precio cerrado por encima del MA de McGinley, el precio cerrado rompe por debajo del MA más corto. La señal de venta se activa cuando: el MA más corto cruza por debajo del MA más largo, el precio cerrado por debajo del MA de McGinley, el precio cerrado rompe por encima del MA más corto.

El MA de McGinley se calcula como: MDIt = MDIt-1 + (Close - MDIt-1) / Max(k * Período * (Close / MDIt-1) ^ 4, 1). Donde MDIt es el valor actual, MDIt-1 es el valor anterior, Close es el precio de cierre, k es la constante de suavizado y Periodo es el período de cálculo.

Ventajas

  1. McGinley MA mejora el retraso en la emisión de las MA tradicionales y puede capturar rápidamente los cambios de tendencia.

  2. El uso de MAs duales para generar señales puede filtrar eficazmente falsos brotes.

  3. La adición de precios por encima/por debajo de McGinley MA evita una negociación excesiva en los mercados de rango.

  4. El uso de EMA hace que el MA sea más sensible a los cambios recientes de precios.

Los riesgos

  1. Los parámetros se pueden ajustar para filtrar las señales.

  2. Las aberturas pueden no activar la entrada a tiempo. Las reglas de entrada podrían ser relajadas.

  3. El ajuste de parámetros inadecuado puede afectar el rendimiento de la estrategia.

  4. Los períodos de retención largos implican riesgos sistémicos.

Mejoras

  1. Prueba diferentes longitudes MA para encontrar las combinaciones óptimas.

  2. Añadir otros indicadores como KD, MACD para mejorar los tiempos de entrada/salida.

  3. Ajustar el valor k basado en diferentes productos y mercados para optimizar el cálculo de la MA de McGinley.

  4. Incorporar medidas de volatilidad para el dimensionamiento dinámico de las posiciones y el control de riesgos.

  5. Establezca el stop loss para controlar las pérdidas.

Conclusión

Esta estrategia utiliza la capacidad de seguimiento rápido de la MA de McGinley combinada con señales de ruptura de precios para seguir efectivamente las tendencias y cambiar de posición cuando la tendencia se invierte.


/*backtest
start: 2022-11-07 00:00:00
end: 2023-11-13 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © LucasZancheta

//@version=4
strategy(shorttitle="Maguila", title="McGinley Dynamic Indicator", overlay=true)

//Médias móveis
MA1Period=input(21, title="MA1")
MA2Period=input(42, title="MA2")

MA1 = ema(close, MA1Period)
MA2 = ema(close, MA2Period)

aboveAverage = MA1 >= MA2
hunderAverage = MA2 >= MA1

//Período do backtest
startDate = input(title="Start Date", type=input.integer, defval=28, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=5, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2019, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer, defval=28, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer, defval=5, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer, defval=2030, minval=1800, maxval=2100)

//Verifica se o candle está dentro do período do backtest
inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))

//Número de periodos da média móvel
period  = input(title="Períodos", type=input.integer, defval=20)
//Constante K (0.6)
k = input(title="Constante K", type=input.float, defval=0.6)
//Preço de fechamento 
closePrice = input(title="Preço", type=input.source, defval=close)

mdi = 0.0

//Fórmula de McGinley
mdi := na(mdi[1]) ? closePrice : mdi[1] + (closePrice - mdi[1]) / max((k * period * pow(closePrice / mdi[1], 4)), 1)

//Regra de coloração 
mdiColor = closePrice > mdi ? color.green : closePrice < mdi ? color.red : color.black

//Inserindo as informações no gráfico    
plot(MA1, color=color.blue, linewidth=2)
plot(MA2, color=color.purple, linewidth=2)

barcolor(mdiColor)

//Estratégia
buySignal = aboveAverage and closePrice > mdi and crossunder(low, MA1) and close > MA1  
buyLoss = closePrice < mdi and close < MA1 and close < MA2

if (inDateRange)
    strategy.entry("Compra", strategy.long, qty=1, when= buySignal)
    strategy.exit("Gain da compra", "Compra", qty=1, profit=20)
    strategy.close("Compra", qty=1, when= buyLoss, comment="Loss na operação")

sellSignal = hunderAverage and closePrice < mdi and crossover(high, MA1) and close < MA1
sellLoss = closePrice > mdi and close > MA1 and close > MA2

if (inDateRange)
    strategy.entry("Venda", strategy.short, qty=1, when= sellSignal)
    strategy.exit("Gain da venda", "Venda", qty=1, profit=20)
    strategy.close("Venda", qty=1, when= sellLoss, comment="Loss na operação")

if (not inDateRange)
    strategy.close_all()




Más.