Oscilador MACD com estratégia de cruzamento da EMA

Autora:ChaoZhang, Data: 23 de Fevereiro de 2023
Tags:

Resumo

Esta é uma estratégia de negociação simples mas eficiente que combina o oscilador MACD e o crossover EMA. Atualmente configurado para velas de 4h, mas adaptável a outros prazos. Ele teve um bom desempenho no BTC e no ETH nos últimos 3 anos, superando o buy and hold. Com otimizações, ele pode ser adaptado para futuros, índices, forex, ações etc.

Estratégia lógica

Os principais componentes são:

  1. MACD: Julgar as mudanças do ímpeto do preço.

  2. EMA: Determinação da direcção da tendência dos preços.

  3. Condição de tempo: definição de um período de estratégia válido.

  4. Opção longa/curta: escolha da direcção longa ou curta.

As regras de negociação são as seguintes:

  1. Long/exit short: Quando se fecha acima da EMA, o histograma MACD é positivo e a vela atual é superior à vela anterior.

  2. Curto/sair longo: Quando fechado abaixo da EMA, histograma MACD negativo e vela atual inferior à vela anterior.

A estratégia combina a tendência e o impulso num sistema simples e eficiente.

Vantagens

Em comparação com os indicadores únicos, as principais vantagens são:

  1. O MACD julga a dinâmica a curto prazo, o EMA determina a direcção da tendência.

  2. Regras simples e claras, fáceis de compreender e de aplicar.

  3. Ajuste flexível dos parâmetros para diferentes produtos e prazos.

  4. Opção de negociação apenas longa/curta ou bidirecional.

  5. Pode definir um período de estratégia válido para evitar negociações desnecessárias.

  6. Desempenho estável ao longo dos anos.

  7. Risco controlado por transação.

  8. Potencial para otimizar ainda mais com aprendizagem de máquina.

Riscos

Apesar dos méritos, os riscos a considerar:

  1. A regulação dos parâmetros em larga escala corre o risco de sobreajuste.

  2. Sem paradas no local, o risco de perdas ilimitadas.

  3. Sem filtro de volume, risco de falhas.

  4. O atraso na captura de tendências, não pode evitar todas as perdas.

  5. Deterioração do desempenho decorrente de mudanças nos regimes de mercado.

  6. Com base apenas em dados históricos, a robustez do modelo é fundamental.

  7. A alta frequência do comércio aumenta os custos das transacções.

  8. Necessidade de monitorizar os rácios de remuneração/risco e as curvas de equidade.

Melhorias

A estratégia pode ser reforçada por:

  1. Adicionando filtro de volume para evitar falhas.

  2. Implementação de paradas para controlar perdas por transação.

  3. Avaliação da eficácia dos parâmetros em períodos de tempo.

  4. Incorporar aprendizagem de máquina para otimizações dinâmicas.

  5. Testes de robustez em todos os mercados.

  6. Ajustar o tamanho da posição para reduzir a frequência.

  7. Otimizar as estratégias de gestão de riscos.

  8. Instrumentos de teste de difusão para aumentar a frequência.

  9. Testes posteriores contínuos para evitar a sobreajuste.

Conclusão

Em resumo, a estratégia forma um sistema simples mas poderoso a partir da combinação MACD e EMA. Mas as otimizações contínuas e testes de robustez são críticos para qualquer estratégia se adaptar às condições de mercado em mudança.


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

//@version=4
strategy("My Script", overlay=true)

//heiking ashi calculation
UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")
//
// === /INPUTS ===

// === BASE FUNCTIONS ===

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//timecondition
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2020, title = "From Year", minval = 1970)
 //monday and session 
 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2021, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true

//ema data  -- moving average
len = input(9, minval=1, title="Length")
src = input(hl2, title="Source")
out = ema(src, len)
//plot(out, title="EMA", color=color.blue)

//histogram
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false)

// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


//main variables to apply conditions are going to be out(moving avg) and hist(macd)

long = haClose > out and haClose > haClose[1] and out > out[1] and hist> 0 and hist[1] < 0 and time_cond
short = haClose < out and haClose < haClose[1] and out < out[1] and hist < 0 and hist[1] > 0 and time_cond

//limit to 1 entry
var longOpeneda = false
var shortOpeneda = false
var int timeOfBuya = na



longCondition= long and not longOpeneda 

if longCondition
    longOpeneda := true
    timeOfBuya := time


longExitSignala = short
exitLongCondition = longOpeneda[1] and longExitSignala

if exitLongCondition
    longOpeneda := false
    timeOfBuya := na


plotshape(longCondition, style=shape.labelup, location=location.belowbar, color=color.green, size=size.tiny, title="BUY", text="BUY", textcolor=color.white)
plotshape(exitLongCondition, style=shape.labeldown, location=location.abovebar, color=color.red, size=size.tiny, title="SELL", text="SELL", textcolor=color.white)

//automatization

longEntry= input(true)
shortEntry=input(false)

if(longEntry)
    strategy.entry("long",strategy.long,when=longCondition)
    strategy.close("long",when=exitLongCondition)

if(shortEntry)
    strategy.entry("short",strategy.short,when=exitLongCondition)
    strategy.close("short",when=longCondition)



Mais.