Ehlers MESA Estratégia de negociação de média móvel adaptativa

Autora:ChaoZhang, Data: 2023-09-28 15:37:13
Tags:

Resumo

Esta estratégia é baseada no Ehlers MESA Adaptive Moving Average e projetada como uma estratégia de negociação de tendência que rastreia cruzes entre duas médias móveis.

Estratégia lógica

O núcleo desta estratégia é calcular duas médias móveis adaptativas: a linha MAMA e a linha FAMA.

alpha = fl / dphase
alpha = iff(alpha < sl, sl, iff(alpha > fl, fl, alpha))  
mama = alpha*src + (1 - alpha)*nz(mama[1])

Onde fl é o limite rápido, sl é o limite lento e dphase é a diferença de fase.

A linha FAMA é calculada como:

fama = .5*alpha*mama + (1 - .5*alpha)*nz(fama[1])

A linha FAMA é uma suavização filtrada de baixa passagem da linha MAMA.

A estratégia compara a relação de magnitude entre as linhas MAMA e FAMA para determinar se o mercado está atualmente em tendência de alta ou de baixa, e gera sinais de negociação com base nisso.

Análise das vantagens

A estratégia apresenta as seguintes vantagens:

  1. Utiliza médias móveis adaptativas onde os parâmetros são ajustados automaticamente com base nas alterações do mercado, sem necessidade de parâmetros fixos definidos manualmente.

  2. A linha de filtro de baixa passagem FAMA pode filtrar falhas.

  3. O uso de um desenho de média móvel dupla pode rastrear tendências de médio a longo prazo.

  4. Uma lógica estratégica simples e clara que seja fácil de entender e modificar.

  5. Indicadores visuais que mostram claramente os sinais de negociação.

Análise de riscos

A estratégia apresenta também alguns riscos:

  1. As estratégias de cruzamento de duas linhas podem gerar sinais de negociação excessivos, sendo recomendado um controlo adequado do drawdown e dos intervalos.

  2. Os cálculos MAMA e FAMA complexos, as configurações inadequadas dos parâmetros podem causar distorções da curva.

  3. Os parâmetros de adaptação podem conduzir a um sobreajuste, sendo necessária a verificação com outros indicadores técnicos.

  4. Os cruzeiros de duas linhas têm atrasos de tempo, podem perder pontos de virada da tendência.

  5. Precisa de ter cuidado com os riscos de stop loss de falhas.

Orientações de otimização

A estratégia pode ser otimizada nos seguintes domínios:

  1. Otimizar as definições dos parâmetros para encontrar as melhores combinações de limite rápido e limite lento.

  2. Adicionar estratégias de stop loss para controlar estritamente por trade stop loss.

  3. Adicionar outros indicadores aos sinais de filtragem, tais como MACD, RSI etc. para evitar falhas.

  4. Adicionar indicadores de avaliação da tendência para evitar transações contra tendência.

  5. Otimizar o ritmo de entrada ajustando os requisitos de cruzamento para reduzir a troca excessivamente frequente.

  6. Otimizar estratégias de lucro de acordo com a força da tendência.

  7. Ensaiar diferenças de parâmetros entre vários produtos para encontrar combinações ideais de parâmetros.

Resumo

Em geral, esta é uma tendência típica após a estratégia, usando as médias móveis adaptativas do Ehlers MESA para construir um indicador visualizado e gerar sinais de negociação através de cruzamentos de linha dupla. A estratégia tem vantagens como parâmetros adaptativos, filtragem de falhas e visualização, mas também riscos como lags de tempo e negociação excessiva. Melhorias futuras podem ser feitas através de otimização de parâmetros, estratégias de stop loss, filtragem de sinal etc. para tornar a estratégia mais robusta.


/*backtest
start: 2023-09-20 00:00:00
end: 2023-09-27 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// @author LazyBear 
// 
// List of my public indicators: http://bit.ly/1LQaPK8 
// List of my app-store indicators: http://blog.tradingview.com/?p=970 
//
strategy("Ehlers MESA Adaptive Moving Average [LazyBear with ekoronin fix]", shorttitle="EMAMA_LB (ekoronin fix)", overlay=false, calc_on_every_tick=true, precision=0)
src=input(close, title="Source")
fl=input(.4, title="Fast Limit")
sl=input(.04, title="Slow Limit")
pi = 3.1415926
sp = (4*src + 3*src[1] + 2*src[2] + src[3]) / 10.0
dt = (.0962*sp + .5769*nz(sp[2]) - .5769*nz(sp[4])- .0962*nz(sp[6]))*(.075*nz(p[1]) + .54)
q1 = (.0962*dt + .5769*nz(dt[2]) - .5769*nz(dt[4])- .0962*nz(dt[6]))*(.075*nz(p[1]) + .54)
i1 = nz(dt[3])
jI = (.0962*i1 + .5769*nz(i1[2]) - .5769*nz(i1[4])- .0962*nz(i1[6]))*(.075*nz(p[1]) + .54)
jq = (.0962*q1 + .5769*nz(q1[2]) - .5769*nz(q1[4])- .0962*nz(q1[6]))*(.075*nz(p[1]) + .54)
i2_ = i1 - jq
q2_ = q1 + jI
i2 = .2*i2_ + .8*nz(i2[1])
q2 = .2*q2_ + .8*nz(q2[1])
re_ = i2*nz(i2[1]) + q2*nz(q2[1])
im_ = i2*nz(q2[1]) - q2*nz(i2[1])
re = .2*re_ + .8*nz(re[1])
im = .2*im_ + .8*nz(im[1])
//p1 = iff(im!=0 and re!=0, 360/atan(im/re), nz(p[1]))
p1 = iff(im!=0 and re!=0, 2*pi/atan(im/re), nz(p[1]))
p2 = iff(p1 > 1.5*nz(p1[1]), 1.5*nz(p1[1]), iff(p1 < 0.67*nz(p1[1]), 0.67*nz(p1[1]), p1))
p3 = iff(p2<6, 6, iff (p2 > 50, 50, p2))
p = .2*p3 + .8*nz(p3[1])
spp = .33*p + .67*nz(spp[1])
//phase = atan(q1 / i1)
phase = 180/pi * atan(q1 / i1) 
dphase_ = nz(phase[1]) - phase
dphase = iff(dphase_< 1, 1, dphase_)
alpha_ = fl / dphase
alpha = iff(alpha_ < sl, sl, iff(alpha_ > fl, fl, alpha_))
mama = alpha*src + (1 - alpha)*nz(mama[1])
fama = .5*alpha*mama + (1 - .5*alpha)*nz(fama[1])
//pa=input(false, title="Mark crossover points")
//plotarrow(pa?(cross(mama, fama)?mama<fama?-1:1:na):na, title="Crossover Markers")
//fr=input(false, title="Fill MAMA/FAMA Region")
//duml=plot(fr?(mama>fama?mama:fama):na, style=circles, color=gray, linewidth=0, title="DummyL")
//mamal=plot(mama, title="MAMA", color=red, linewidth=2)
//famal=plot(fama, title="FAMA", color=green, linewidth=2)
//fill(duml, mamal, red, transp=70, title="NegativeFill")
//fill(duml, famal, green, transp=70, title="PositiveFill")
//ebc=input(false, title="Enable Bar colors")
//bc=mama>fama?lime:red
//barcolor(ebc?bc:na)

longSpike=mama>fama? 1:0
shortSpike=mama<fama? 1:0

plot(longSpike, title = "Mama Long", style=line, linewidth=1, color=yellow)
plot(shortSpike, title = "Mama Short", style=line, linewidth=1, color=red)

//possig = iff(reverse and pos == 1, -1,
//          iff(reverse and pos == -1, 1, pos))	   
if (longSpike) 
    strategy.entry("Long", strategy.long)
if (shortSpike)
    strategy.entry("Short", strategy.short)	


Mais.