Estratégia de negociação da média móvel de McGinley

Autora:ChaoZhang, Data: 2023-11-14 15:48:46
Tags:

img

Resumo

A estratégia é baseada no indicador de média móvel dinâmica de McGinley. O indicador de MA de McGinley é uma versão aprimorada de médias móveis que pode rastrear melhor as tendências de preços. A estratégia utiliza os sinais gerados pelo indicador de MA de McGinley combinados com as quebras de preços de MA para estabelecer regras de negociação para lucro.

Estratégia lógica

A estratégia usa principalmente duas médias móveis, uma EMA de 21 períodos e uma EMA de 42 períodos. Quando o MA mais curto cruza acima do MA mais longo, é considerado um sinal de compra. Quando o MA mais curto cruza abaixo do MA mais longo, é considerado um sinal de venda.

Além disso, a estratégia também requer que o preço esteja acima do MA dinâmico de McGinley e quebre acima do MA mais curto para gerar um sinal de compra.

Especificamente, o sinal de compra é acionado quando: MA mais curto cruza acima de MA mais longo, preço de fechamento acima de MA McGinley, preço de fechamento rompe abaixo de MA mais curto. O sinal de venda é acionado quando: MA mais curto cruza abaixo de MA mais longo, preço de fechamento abaixo de MA McGinley, preço de fechamento rompe acima de MA mais curto.

O MA de McGinley é calculado como: MDIt = MDIt-1 + (Close - MDIt-1) / Max(k * Período * (Close / MDIt-1) ^ 4, 1). Onde MDIt é o valor atual, MDIt-1 é o valor anterior, Close é o preço de fechamento, k é a constante de suavização e Periodo é o período de cálculo. Esta fórmula permite ao MA rastrear mudanças de preço em tempo real.

Vantagens

  1. A MA McGinley melhora a emissão atrasada das MA tradicionais e pode captar rapidamente as mudanças de tendência.

  2. Usando MAs duplas para gerar sinais pode filtrar efetivamente falsos escape.

  3. A adição de preços acima/abaixo do MCM evita a negociação excessiva em mercados de intervalo.

  4. A utilização da EMA torna a MA mais sensível às recentes variações de preços.

Riscos

  1. Os Whipsaws podem gerar sinais falsos em mercados laterais, causando perdas.

  2. As aberturas podem falhar em desencadear a entrada a tempo.

  3. O ajuste inadequado dos parâmetros pode afetar o desempenho da estratégia. Os parâmetros devem ser otimizados.

  4. Os períodos de detenção longos implicam riscos sistémicos.

Melhorias

  1. Teste diferentes comprimentos MA para encontrar combinações ideais.

  2. Adicionar outros indicadores como KD, MACD para melhorar o tempo de entrada/saída.

  3. Ajustar o valor k com base em diferentes produtos e mercados para otimizar o cálculo do MA de McGinley.

  4. Incorporar medidas de volatilidade para dimensionamento dinâmico das posições e controlo do risco.

  5. O trailing stop também pode ser testado para bloquear os lucros.

Conclusão

Esta estratégia utiliza a capacidade de rastreamento rápido da MA de McGinley combinada com sinais de ruptura de preço para seguir efetivamente as tendências e mudar de posição quando a tendência se inverte.


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




Mais.