Estratégia baseada na média móvel exponencial e no indicador MACD

Autora:ChaoZhang, Data: 2023-12-08 16:58:01
Tags:

img

Resumo

Esta estratégia combina os sinais de ruptura da média móvel exponencial e do indicador MACD, com períodos de retenção longos e curtos, para obter lucros através da negociação de tendência e reversão média.

Princípio da estratégia

A estratégia baseia-se principalmente nos seguintes elementos:

  1. Calcule a EMA de 200 dias para determinar a direção da tendência principal.

  2. Calcule a EMA com base no preço médio dos preços mais altos, mais baixos e de fechamento, e obtenha a diferença entre a EMA e os preços mais altos/mais baixos para construir o histograma MACD.

  3. Calcule a MA de 9 dias do histograma MACD para construir a linha de sinal MACD.

  4. Um sinal de compra é gerado quando o MACD cruza acima da linha de sinal, enquanto um sinal de venda é gerado quando o MACD cruza abaixo da linha de sinal.

  5. Combinar a análise das principais tendências para determinar se o mercado está no início de uma nova tendência ou apenas uma inversão de curto prazo.

Vantagens

A estratégia combina o seguimento da tendência e a negociação de reversão média, que pode acompanhar as tendências de longo prazo e captar oportunidades de reversão de curto prazo para lidar com diferentes condições de mercado.

As principais vantagens incluem:

  1. A EMA de 200 dias determina a direcção da tendência principal, evitando a negociação contra as tendências.

  2. O indicador MACD é sensível às variações de preços a curto prazo e pode captar sinais de reversão rentáveis.

  3. Diferentes parâmetros para os componentes do MACD podem gerar sinais de negociação em diferentes prazos.

  4. Integra estratégias de stop loss para controlar efetivamente a perda de uma única transação.

Riscos

Os principais riscos incluem:

  1. O atraso de tempo pode existir entre os sinais de negociação de indicadores de longo prazo e de curto prazo.

  2. O MACD como indicador de reversão média pode apresentar um desempenho inferior durante tendências fortes.

  3. A colocação inadequada de um stop loss pode resultar em um desencadeamento prematuro de um stop loss ou em uma perda excessiva.

  4. Os sinais de fuga muito frequentes podem introduzir mais falsos sinais.

Soluções:

  1. Otimizar os parâmetros do MACD para ajustar a sensibilidade do indicador.

  2. Combinar outros indicadores para determinar as condições do mercado, evitar seguir cegamente os sinais MACD.

  3. Teste e otimize os parâmetros da estratégia de stop loss.

  4. Adicionar filtros para reduzir os falsos sinais.

Orientações de otimização

A estratégia pode ser otimizada através de:

  1. Otimizar os parâmetros da média móvel e do MACD para obter sinais de negociação mais eficazes.

  2. Adicione outros indicadores como volume, RSI para melhorar a eficácia da estratégia.

  3. Estabelecer regras de dimensionamento de posição em vez de quantidade fixa para cada negociação.

  4. Adicionar regras de saída mais avançadas em cima do stop loss, por exemplo, meta de lucro, trailing stop.

  5. Backtest com configurações de taxas mais realistas para simular a negociação real.

  6. Realizar análises de avanço e testes de robustez para melhorar a fiabilidade.

Conclusão

A estratégia equilibra o seguimento da tendência e a negociação de reversão média. A essência reside no ajuste apropriado dos parâmetros e na compreensão correta das principais tendências. Ao otimizar os parâmetros, adicionando filtros, a estratégia pode fazer um melhor julgamento do sinal de negociação e alcançar lucros mais constantes.


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

//@version=4
strategy("Strategia EMA + Impulse MACD", shorttitle="EMA+IMACD", overlay=true)

// Impostazioni
ema_length = input(200, title="Periodo EMA a 200", type=input.integer)
lengthMA = input(34, title="Periodo EMA", type=input.integer)
lengthSignal = input(9, title="Periodo Signal", type=input.integer)
lengthImpulseMACD = input(12, title="Periodo Impulse MACD", type=input.integer)
lengthImpulseMACDSignal = input(9, title="Periodo Impulse MACD Signal", type=input.integer)
stopLossPeriod = input(20, title="Periodo Stop Loss", type=input.integer)

var float ema200 = na
if bar_index >= ema_length
    ema200 := ema(close, ema_length)

// Impulse MACD
var float hi = na
var float lo = na
var float mi = na
var float impulseMACD = na
var float impulseMACDSignal = na

calc_smma(src, len) =>
    var float smma = na
    if na(smma)
        smma := sma(src, len)
    else
        smma := (smma[1] * (len - 1) + src) / len
    smma

calc_zlema(src, length) =>
    ema1 = ema(src, length)
    ema2 = ema(ema1, length)
    d = ema1 - ema2
    ema1 + d

if bar_index >= lengthMA
    src = hlc3
    hi := calc_smma(high, lengthMA)
    lo := calc_smma(low, lengthMA)
    mi := calc_zlema(src, lengthMA)

    impulseMACD := (mi > hi) ? (mi - hi) : (mi < lo) ? (mi - lo) : 0
    impulseMACDSignal := sma(impulseMACD, lengthSignal)

// Calcolo dello stop loss
var float stopLossLong = na
var float stopLossShort = na

stopLossLong := lowest(low, stopLossPeriod)
stopLossShort := highest(high, stopLossPeriod)

// Calcolo del take profit
var float takeProfitLong = na
var float takeProfitShort = na

if not na(stopLossLong)
    takeProfitLong := close + (close - stopLossLong) * 1.5
if not na(stopLossShort)
    takeProfitShort := close - (stopLossShort - close) * 1.5

// Condizioni per aprire una posizione long
longCondition = not na(ema200) and not na(impulseMACD) and not na(impulseMACDSignal) and close > ema200 and impulseMACD < 0 and impulseMACDSignal < 0 and crossover(impulseMACD, impulseMACDSignal)

// Condizioni per aprire una posizione short
shortCondition = not na(ema200) and not na(impulseMACD) and not na(impulseMACDSignal) and close < ema200 and impulseMACD > 0 and impulseMACDSignal > 0 and crossunder(impulseMACD, impulseMACDSignal)

// Disegna l'EMA 200 sul grafico
plot(ema200, color=color.blue, title="EMA 200")

// Imposta lo stop loss e il take profit
strategy.entry("Long", strategy.long, when=longCondition)
strategy.entry("Short", strategy.short, when=shortCondition)
strategy.exit("Take Profit/Stop Loss Long", from_entry="Long", stop=stopLossLong, limit=takeProfitLong)
strategy.exit("Take Profit/Stop Loss Short", from_entry="Short", stop=stopLossShort, limit=takeProfitShort)

// Impulse MACD
plot(0, color=color.gray, linewidth=1, title="MidLine")
plot(impulseMACD, color=color.red, linewidth=2, title="ImpulseMACD", style=plot.style_histogram)
plot(impulseMACDSignal, color=color.blue, linewidth=2, title="ImpulseMACDSignal", style=plot.style_histogram)

// Disegna le operazioni long e short sul grafico
plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.triangleup, title="Long Entry")
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.triangledown, title="Short Entry")


Mais.