Estratégia de acompanhamento de tendências da EMA dupla Golden Cross

Autora:ChaoZhang, Data: 2023-11-21 15:10:54
Tags:

img

Resumo

Esta estratégia calcula a linha EMA rápida e a linha EMA lenta e compara a relação de tamanho entre as duas EMAs para determinar a direção da tendência do mercado. Ela pertence a uma estratégia de rastreamento de tendência simples. Quando a EMA rápida cruza acima da EMA lenta, vá longo. Quando a EMA rápida cruza abaixo da EMA lenta, vá curto. É uma típica estratégia de cruz de ouro dual EMA.

Estratégia lógica

Os principais indicadores desta estratégia são a EMA rápida e a EMA lenta. A duração da EMA rápida é definida em 21 períodos e a duração da EMA lenta é definida em 55 períodos. A EMA rápida pode responder mais rapidamente às mudanças de preço, refletindo a tendência de curto prazo recente; a EMA lenta responde mais lentamente às mudanças de preço, filtrando algum ruído e refletindo a tendência de médio a longo prazo.

Quando a EMA rápida cruza acima da EMA lenta, indica que a tendência de curto prazo virou para cima e a tendência de médio a longo prazo pode ter se invertido, o que é um sinal para ir longo.

Ao comparar EMAs rápidas e lentas, capta pontos de reversão da tendência em duas escalas de tempo, de curto prazo e de médio a longo prazo, que é uma estratégia típica de acompanhamento da tendência.

Vantagens

  1. Lógica simples e clara, fácil de compreender e implementar
  2. Ajuste flexível de parâmetros, períodos EMA rápidos e lentos podem ser personalizados
  3. O valor da posição em risco deve ser calculado de acordo com o método de classificação da posição em risco.

Riscos

  1. Temporização inadequada dos cruzamentos da EMA, risco de falta do melhor ponto de entrada
  2. Os sinais inválidos frequentes durante a consolidação do mercado, causando perdas
  3. Ajuste inadequado dos parâmetros ATR, que conduz a paradas demasiado lâxadas ou demasiado agressivas

Gestão de riscos:

  1. Otimizar os parâmetros de linha rápida e lenta da EMA para encontrar combinações ideais
  2. Adicionar mecanismos de filtragem para evitar sinais inválidos da consolidação do mercado
  3. Testar e otimizar os parâmetros ATR para garantir um stop loss e um lucro razoáveis

Áreas de melhoria

  1. Estabilidade de ensaio de diferentes parâmetros do período EMA com base em métodos estatísticos
  2. Adicionar condições de filtragem combinadas com outros indicadores para evitar sinais inválidos
  3. Otimizar os parâmetros ATR para obter o melhor rácio stop loss/take profit

Resumo

Esta estratégia julga a tendência com base em cruzamento EMA, que é simples e claro de implementar. Com paradas baseadas em ATR, os riscos são controláveis.


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

//@version=3
strategy(title = "VP Backtester", overlay=false)


// Create General Strategy Inputs
st_yr_inp = input(defval=2017, title='Backtest Start Year')
st_mn_inp = input(defval=01, title='Backtest Start Month')
st_dy_inp = input(defval=01, title='Backtest Start Day')
en_yr_inp = input(defval=2025, title='Backtest End Year')
en_mn_inp = input(defval=01, title='Backtest End Month')
en_dy_inp = input(defval=01, title='Backtest End Day')
 
// Default Stop Types
fstp = input(defval=false, title="Fixed Perc stop")
fper = input(defval=0.1, title='Percentage for fixed stop', type=float)
atsp = input(defval=true, title="ATR Based stop")
atrl = input(defval=14, title='ATR Length for stop')
atrmsl = input(defval=1.5, title='ATR Multiplier for stoploss')
atrtpm = input(defval=1, title='ATR Multiplier for profit')
 
// Sessions
asa_inp = input(defval=true, title="Trade the Asian Session")
eur_inp = input(defval=true, title="Trade the European Session")
usa_inp = input(defval=true, title="Trade the US session")
ses_cls = input(defval=true, title="End of Session Close Out?")
 
// Session Start / End times (In exchange TZ = UTC-5)    
asa_ses = "1700-0300" 
eur_ses = "0200-1200" 
usa_ses = "0800-1700"  
 
in_asa = time(timeframe.period, asa_ses)
in_eur = time(timeframe.period, eur_ses)
in_usa = time(timeframe.period, usa_ses)
 
strategy.risk.allow_entry_in(strategy.direction.all)
 
// Set start and end dates for backtest
start = timestamp(st_yr_inp, st_mn_inp, st_dy_inp,00,00)
end = timestamp(en_yr_inp, en_mn_inp, en_dy_inp,00,00)
window()  => time >= start and time <= end ? true : false // create function "within window of time"

 
// Check if we are in a sessions we want to trade
can_trade = asa_inp and not na(in_asa) ? true :
  eur_inp and not na(in_eur) ? true :
  usa_inp and not na(in_usa) ? true :
  false
  
// atr calc for stop and profit
atr = atr(atrl)
atr_stp_dst_sl = atr * atrmsl
atr_stp_dst_tp = atr * atrtpm



//*************************************************************************************
// Put your strategy/indicator code below
// and make sure to set long_condition=1 for opening a buy trade
// and short_condition for opening a sell trade
//*************************************************************************************
fastInput = input(21)
slowInput = input(55)

fast = ema(close, fastInput)
slow = ema(close, slowInput)

plot(fast, color = red)
plot(slow, color = blue)

long_condition = crossover(fast, slow)
short_condition = crossunder(fast, slow)


//*************************************************************************************
// Trade management with ATR based stop & profit
//*************************************************************************************
if (long_condition and window() )
    strategy.entry("Long Entry",  strategy.long)
    if strategy.position_size <= 0 // Less than as in both direction strat - Could be long before switching
        if atsp
            atr_stop = open  - atr_stp_dst_sl
            atr_profit = open + atr_stp_dst_tp
            strategy.exit('ATR Long Exit', "Long Entry", stop=atr_stop, limit = atr_profit)
        if fstp
            stop = open - (open * fper)
            strategy.exit('Perc Fixed Long Stop Exit', "Long Entry", stop=stop)
 
if (short_condition and window() )
    strategy.entry("Short Entry",strategy.short)
    if strategy.position_size >= 0 // Greater than as in both direction strat - Could be long before switching
        if atsp
            atr_stop = open  + atr_stp_dst_sl
            atr_profit = open - atr_stp_dst_tp
            strategy.exit('ATR Short Exit', "Short Entry", stop=atr_stop, limit = atr_profit)
        if fstp
            stop = open + (open * fper)
            strategy.exit('Perc Fixed Short Stop Exit', "Short Entry", stop=stop)
 
 
strategy.close_all(when=not can_trade and ses_cls)
 


Mais.