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.
Os principais componentes são:
MACD: Julgar as mudanças do ímpeto do preço.
EMA: Determinação da direcção da tendência dos preços.
Condição de tempo: definição de um período de estratégia válido.
Opção longa/curta: escolha da direcção longa ou curta.
As regras de negociação são as seguintes:
Long/exit short: Quando se fecha acima da EMA, o histograma MACD é positivo e a vela atual é superior à vela anterior.
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.
Em comparação com os indicadores únicos, as principais vantagens são:
O MACD julga a dinâmica a curto prazo, o EMA determina a direcção da tendência.
Regras simples e claras, fáceis de compreender e de aplicar.
Ajuste flexível dos parâmetros para diferentes produtos e prazos.
Opção de negociação apenas longa/curta ou bidirecional.
Pode definir um período de estratégia válido para evitar negociações desnecessárias.
Desempenho estável ao longo dos anos.
Risco controlado por transação.
Potencial para otimizar ainda mais com aprendizagem de máquina.
Apesar dos méritos, os riscos a considerar:
A regulação dos parâmetros em larga escala corre o risco de sobreajuste.
Sem paradas no local, o risco de perdas ilimitadas.
Sem filtro de volume, risco de falhas.
O atraso na captura de tendências, não pode evitar todas as perdas.
Deterioração do desempenho decorrente de mudanças nos regimes de mercado.
Com base apenas em dados históricos, a robustez do modelo é fundamental.
A alta frequência do comércio aumenta os custos das transacções.
Necessidade de monitorizar os rácios de remuneração/risco e as curvas de equidade.
A estratégia pode ser reforçada por:
Adicionando filtro de volume para evitar falhas.
Implementação de paradas para controlar perdas por transação.
Avaliação da eficácia dos parâmetros em períodos de tempo.
Incorporar aprendizagem de máquina para otimizações dinâmicas.
Testes de robustez em todos os mercados.
Ajustar o tamanho da posição para reduzir a frequência.
Otimizar as estratégias de gestão de riscos.
Instrumentos de teste de difusão para aumentar a frequência.
Testes posteriores contínuos para evitar a sobreajuste.
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)