O recurso está a ser carregado... Carregamento...

EMA Slope Cross Trend Seguindo a Estratégia

Autora:ChaoZhang, Data: 2023-10-17 17:02:30
Tags:

img

Resumo

Esta estratégia utiliza o cruzamento das inclinações de duas EMAs com comprimentos diferentes para gerar tendências seguindo sinais.

As condições que fazem com que a estratégia entre no mercado são:

  • Inclinado rápido > Inclinado lento e preço > EMA 200: longo
  • Ponto rápido < Ponto lento e preço < EMA 200: curto

Quando as inclinações simples se cruzam na direção oposta, fecha a posição.

A estratégia tem melhor desempenho no Bitcoin e nas altcoins mais líquidas e capitalizadas, mas também funciona muito em ativos voláteis, especialmente se eles frequentemente entrarem em tendência. Funciona melhor no período de 4 horas.

Há também um filtro de Volatilidade opcional, que abre a posição apenas se a diferença entre as duas inclinações for superior a um valor específico.

Aproveita!

Estratégia lógica

O núcleo desta estratégia consiste em comparar as inclinações de dois EMA de comprimentos diferentes.

Em primeiro lugar, são calculadas EMAs com comprimentos de 130 e 400, em seguida, as inclinações de cada uma são calculadas, em seguida, são calculadas EMAs de comprimento 3 em cada inclinação para obter curvas de inclinação suavizadas.

Quando a inclinação da EMA rápida cruza acima da inclinação da EMA lenta, um sinal de compra é gerado.

Para filtrar o ruído, uma EMA de 200 períodos pode ser usada como um filtro de tendência, considerando sinais longos apenas quando o preço está acima da EMA e sinais curtos apenas quando abaixo.

Além disso, pode utilizar-se um filtro de volatilidade, gerando sinais apenas quando a diferença entre as duas inclinações for superior a um limiar, para evitar casos em que as inclinações se cruzam mas a volatilidade é insuficiente.

Quando as inclinações rápidas e lentas se cruzam inversamente, as posições são fechadas para parar os lucros/perdas.

Análise das vantagens

  1. Usando cruzes de inclinação para gerar sinais pode efetivamente rastrear tendências

  2. Ajustar as combinações de períodos da EMA pode adaptar-se a diferentes condições de mercado

  3. O filtro de tendência evita ser enganado pela ação de preços instável

  4. O filtro de volatilidade filtra sinais falsos

  5. Lógica simples e clara, fácil de compreender e implementar

  6. Pode ser utilizado em vários prazos

Análise de riscos

  1. Podem ocorrer aberturas e fechamentos frequentes em mercados de grande amplitude

  2. Períodos EMA inadequados podem perder pontos de virada da tendência

  3. Os parâmetros devem ser ajustados para se adaptarem às condições de mercado em evolução

  4. Tal como os sistemas de MA, grandes tendências podem inverter-se em situações extremas

Orientações de otimização

  1. Tente diferentes combinações de períodos EMA para encontrar parâmetros ideais

  2. Escolher parâmetros de acordo com as características dos ativos e as condições do mercado

  3. Considerar a adição de estratégias de stop loss para controlar o risco

  4. Considerar o ajustamento dinâmico dos períodos da EMA

  5. Teste diferentes valores limiares de volatilidade

  6. Eficácia dos ensaios em diferentes prazos

Resumo

A estratégia tem uma lógica clara e fácil de entender, usando cruzes de inclinação da EMA para gerar sinais e rastrear efetivamente as tendências. Os filtros de tendência e volatilidade reduzem as negociações ruidosas.


/*backtest
start: 2023-10-09 00:00:00
end: 2023-10-16 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// strategy(title="Slopes",initial_capital=1000, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.06, slippage = 2, default_qty_value=30, overlay=false)

//definizione input

start = timestamp(input(2018, "start year"), input(1, "start month"), input(1, "start day"), 00, 00)
end = timestamp(input(2020, "end year"), input(1, "end month"), input(1, "end day"), 00, 00)

average = input (title="Source MA Type", type=input.string, defval="EMA",options=["EMA","SMA"])

len1=input(130,title="Fast MA Length")
len2=input(400,title="Slow MA Length")

smoothingavg = input (title="Smoothing MAs Type", type=input.string, defval="EMA",options=["EMA","SMA"])
smoothingavglen = input (3,title="Smoothing MAs Length")

trendfilter=input(true,title="Trend Filter")
trendfilterperiod=input(200,title="Trend Filter MA Period")
trendfiltertype=input (title="Trend Filter MA Type", type=input.string, defval="EMA",options=["EMA","SMA"])

volatilityfilter=input(false,title="Volatility Filter")
volatilitydelta=input(0.0003,step=0.0001,title="Delta Slopes EMA")

//variabili

m1 = if average == "EMA" 
    ema(close,len1)
else
    sma(close,len1)

m2=if average == "EMA" 
    ema(close,len2)
else
    sma(close,len2)

slp1=(m1-m1[1])/m1
slp2=(m2-m2[1])/m2

e1=if smoothingavg == "EMA" 
    ema(slp1,smoothingavglen)
else
    sma(slp1,smoothingavglen)

e2=if smoothingavg == "EMA" 
    ema(slp2,smoothingavglen)
else
    sma(slp2,smoothingavglen)

plot(e1,color=color.yellow)
plot(e2,color=color.red)
//plot (abs(e1-e2),color=color.white)
//plot (ema(e1-e2,9),color=color.yellow)

//variabili accessorie e condizioni

TrendConditionL=if trendfiltertype =="EMA"
    close>ema(close,trendfilterperiod)
else
    close>sma(close,trendfilterperiod)
    
TrendConditionS=if trendfiltertype =="EMA"
    close<ema(close,trendfilterperiod)
else
    close<sma(close,trendfilterperiod)
    
VolatilityCondition = abs(e1-e2) > volatilitydelta

ConditionEntryL= if trendfilter == true
    if volatilityfilter == true
        e1>e2 and TrendConditionL and VolatilityCondition
    else
        e1>e2 and TrendConditionL
else
    if volatilityfilter == true
        e1>e2 and VolatilityCondition
    else 
        e1>e2

ConditionEntryS= if trendfilter == true
    if volatilityfilter == true
        e1<e2 and TrendConditionS and VolatilityCondition
    else 
        e1<e2 and TrendConditionS
else
    if volatilityfilter == true
        e1<e2 and VolatilityCondition
    else
        e1<e2

ConditionExitL=crossunder(e1,e2)
ConditionExitS=crossover(e1,e2)

if true
    if ConditionExitS
        if strategy.position_size < 0
            strategy.close("SLPShort")

if true
    if ConditionExitL
        if strategy.position_size > 0
            strategy.close("SLPLong")

if true
    if ConditionEntryL
        strategy.entry ("SLPLong",long=true)
        
if true
    if ConditionEntryS 
        strategy.entry("SLPShort",long=false)

Mais.