RSI Estratégia de cruzamento da EMA

Autora:ChaoZhang, Data: 2023-10-25 11:46:49
Tags:

img

Resumo

Esta estratégia utiliza o princípio da média móvel exponencial (EMA), combinado com o indicador RSI, para determinar a direção da tendência para entradas e saídas.

Estratégia lógica

A estratégia usa 3 linhas EMA com períodos diferentes - linhas rápidas, médias e lentas. Um sinal de compra é gerado quando a EMA rápida cruza acima da EMA média, e um sinal de venda é gerado quando a EMA rápida cruza abaixo da EMA média.

A estratégia também incorpora o indicador RSI para avaliar as condições de sobrecompra e sobrevenda. O RSI calcula uma relação de dias médios de alta para dias médios de baixa em um período para mostrar a força relativa de um ativo. Valores acima do limiar de sobrecompra sinalizam condições de sobrecompra, enquanto valores abaixo do limiar de sobrevenda sinalizam condições de sobrevenda.

As condições de compra da estratégia são:

  1. Cruzamento dos preços acima das linhas EMA rápidas, médias e lentas
  2. RSI ultrapassando o limiar de sobrevenda

As condições de venda são:

  1. Cruzamento rápido da EMA abaixo da EMA média
  2. RSI cruzando abaixo da linha média

Utilizando crossovers da EMA para determinar a direção da tendência combinada com o RSI para identificar oportunidades de reversão a curto prazo, esta estratégia faz uso de ambos os conceitos de tendência e reversão média.

Análise das vantagens

Esta estratégia combina os crossovers da EMA e o RSI para avaliar os níveis de tendência e de sobrecompra/supervenda, filtrando falhas e negociações ruidosas.

As configurações do RSI permitem que a estratégia cronometre entradas e saídas em áreas de sobrecompra/supervenda vantajosas.

A exigência de que o preço quebre todas as 3 linhas EMA antes de entrar em negociações ajuda a evitar ser espancado.

Análise de riscos

Como todas as estratégias de backtest, esta estratégia enfrenta o risco de sobreajuste de backtest.

Em mercados variados, a estratégia pode gerar sinais falsos e sofrer perdas.

A má regulação dos parâmetros do RSI pode levar a oportunidades perdidas ou sinais falsos.

Oportunidades de melhoria

  1. Considere adicionar validação em prazos mais longos para evitar ruído.

  2. Espere pelo retest das linhas EMA antes de entrar em negociações para validar o sinal.

  3. Incorporar outros indicadores como MACD, Bollinger Bands para confirmação combinada do sinal.

  4. Usar machine learning para otimizar parâmetros de robustez.

  5. Considere adicionar stop loss para sair rapidamente de tendências incertas.

Conclusão

Esta estratégia combina crossovers EMA e RSI para identificar tendência, aproveitando-se de reversões de curto prazo. Utiliza os conceitos de tendência seguinte e de reversão média de forma eficiente. Há espaço para otimização por meio de validação de sinal, ajuste de parâmetros, stop losses, etc. Mas o sobreajuste do backtest precisa ser considerado e o desempenho ao vivo deve ser avaliado.


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

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

//@version=5
strategy("EMA Cross V1", overlay= true)

//rsi
length = input.int(title = "Rsi Lenght" , defval=26 , minval=1, maxval=50)
overS = input.int(title = "Rsi OVS line" , defval=30 , minval=1, maxval=40)
overB = input.int(title = "Rsi OVB line" , defval=70 , minval=1, maxval=100)
mLine = input.int(title = "Rsi Medium line" , defval=42 , minval=1, maxval=60)
price = close
vrsi = ta.rsi(price, length)
co = vrsi >= mLine and vrsi < overB 
cu = ta.crossunder(vrsi, overB)
//ema
F = input.int(title = "EMA Fast" , defval=17 , minval=1, maxval=50)
M = input.int(title = "EMA Medium" , defval=35, minval=1, maxval=100)
S = input.int(title = "EMA Slow" , defval=142, minval=1, maxval=200)
emaF = ta.ema(price , F)
emaM = ta.ema(price , M)
emaS = ta.ema(price , S)

//plot
plot(emaF , color = color.green , linewidth=1)
plot(emaM , color = color.yellow , linewidth=1)
plot(emaS , color = color.red , linewidth=1)

//Time Stamp
start = timestamp(input.int(title = "Start Year" , defval=2011 , minval=2011, maxval=2025), input.int(title = "Start Month" , defval=1 , minval=1, maxval=12), input.int(title = "Start Day" , defval=1 , minval=1, maxval=31), 0, 0)
end = timestamp(input.int(title = "End Year" , defval=2025 , minval=2011, maxval=2025), input.int(title = "End Month" , defval=1 , minval=1, maxval=12), input.int(title = "End Day" , defval=1 , minval=1, maxval=31), 0, 0)
// years = input.int(title = "Year" , defval=2018 , minval=2011, maxval=2025)
// months = input.int(title = "Month" , defval=1 , minval=1, maxval=12)
// days = input.int(title = "Day" , defval=1 , minval=1, maxval=31)

//longCondition Default
// longCondition1 = EMA_Fast >= EMA_Slow and EMA_Fast >= EMA_Medium//ta.crossover(EMA_Fast, EMA_Slow)  EMA_Fast > EMA_Slow and EMA_Medium > EMA_Slow
// longCondition3 = price >= EMA_Medium and price > EMA_Slow
// longCondition2 = vrsi >= overSold and vrsi <= overBought 

//longCondition & shortCondition ETHUSD
// 1.price > emaF > emaM > emaS
// 2.rsi overcross overS
longC1 = price > emaF and price > emaM and price > emaS 
// longC1 = ta.crossover(emaF, emaM)
longC2 = if longC1
    co
// shortC1 = EMA_Fast < EMA_Medium //and EMA_Fast < EMA_Slow and EMA_Medium < EMA_Slow //and cu
// shortC2 = overBought > vrsi //and vrsi < overBought //overSold < vrsi and vrsi < mediumLine

// exitLong Condition
// 1.price < emaF < emaM < emaS
// 2.rsi overcross mediumLine
exitLong1 = ta.crossunder(emaF, emaM) //or emaF < emaM//and price < emaM and price < emaF
exitLong2 = ta.crossunder(vrsi,mLine)
//exitLong3 = price < emaM
//strategy.entry
if time >=start and time <=end
    strategy.entry("Buy", strategy.long , when = longC1 and longC2)

// if(exitLong1 or exitLong2)
strategy.close("Buy" , when = exitLong1 or exitLong2)
    
// exitShort1 = EMA_Fast > EMA_Medium
// //exitShort2 = ta.crossover(vrsi , mediumLine) 
// exitShort2 = ta.crossunder (vrsi,mediumLine)
// strategy.close("Short" , when = exitShort1 or exitShort2)
// //shortCondition = cu


// //if (shortCondition1 and shortCondition2)
//     //strategy.entry("My Short Entry Id", strategy.short)


Mais.