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.
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.
McGinley MA mejora el retraso en la emisión de las MA tradicionales y puede capturar rápidamente los cambios de tendencia.
El uso de MAs duales para generar señales puede filtrar eficazmente falsos brotes.
La adición de precios por encima/por debajo de McGinley MA evita una negociación excesiva en los mercados de rango.
El uso de EMA hace que el MA sea más sensible a los cambios recientes de precios.
Los parámetros se pueden ajustar para filtrar las señales.
Las aberturas pueden no activar la entrada a tiempo. Las reglas de entrada podrían ser relajadas.
El ajuste de parámetros inadecuado puede afectar el rendimiento de la estrategia.
Los períodos de retención largos implican riesgos sistémicos.
Prueba diferentes longitudes MA para encontrar las combinaciones óptimas.
Añadir otros indicadores como KD, MACD para mejorar los tiempos de entrada/salida.
Ajustar el valor k basado en diferentes productos y mercados para optimizar el cálculo de la MA de McGinley.
Incorporar medidas de volatilidad para el dimensionamiento dinámico de las posiciones y el control de riesgos.
Establezca el stop loss para controlar las pérdidas.
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()