Estratégia de média móvel dupla e supertendência

Autora:ChaoZhang, Data: 2023-09-28 15:12:50
Tags:

Resumo

Esta estratégia gera sinais de negociação com base no cruzamento de médias móveis de 21 dias e 55 dias, e usa o indicador de supertendência para filtrar sinais falsos.

Estratégia lógica

O código define primeiro a EMA de 21 dias (EMA1) e a EMA de 55 dias (EMA2). Um sinal de compra é gerado quando a EMA1 cruza acima da EMA2.

Para filtrar sinais falsos, o indicador de supertendência é adicionado. O supertendência calcula a direção da tendência com base no ATR e nos preços altos e baixos recentes. No código, acima da linha de supertendência é a tendência de alta e abaixo é a tendência de baixa.

Assim, um sinal de compra é gerado apenas quando a EMA1 cruza acima da EMA2 durante uma tendência de alta. Um sinal de venda é gerado apenas quando a EMA1 cruza abaixo da EMA2 durante uma tendência de baixa. A supertendência filtra sinais falsos durante as transições de tendência.

Além disso, as médias móveis de 200 dias e 233 dias são adicionadas para determinar a tendência de longo prazo.

Vantagens

  1. As médias móveis duplas combinadas com a supertendência podem identificar efetivamente tendências e filtrar falsos sinais.

  2. Os parâmetros da média móvel ajustáveis permitem adaptar a estratégia às diferentes condições de mercado.

  3. As médias móveis de longo prazo evitam riscos de tendências conflitantes.

  4. Regras claras fáceis para negociação algorítmica.

  5. Os sinais visuais de compra/venda tornam as decisões comerciais claras.

Riscos

  1. As médias móveis podem gerar sinais falsos em torno de pontos de virada.

  2. As configurações inadequadas dos parâmetros podem causar tendências perdidas ou sinais falsos excessivos, sendo necessário ajustar os parâmetros para diferentes mercados.

  3. A alta frequência de negociação leva a custos de transacção mais elevados.

  4. Os parâmetros de supertendência devem ser otimizados para equilibrar a eficácia da filtragem e o atraso.

  5. As médias de longo prazo podem atrasar a geração de sinais.

Melhorias

  1. Teste diferentes combinações de médias móveis para encontrar parâmetros ótimos.

  2. Otimizar os parâmetros da supertendência para equilibrar a filtragem e o atraso.

  3. Adicionar outros indicadores como volume para validar ainda mais os sinais.

  4. Incorporar sentimentos e análises de notícias para identificar potenciais pontos de virada.

  5. Usar machine learning para otimizar dinamicamente parâmetros.

Conclusão

Esta estratégia combina os pontos fortes das médias móveis duplas e da supertendência na identificação de tendências e filtragem de falsos sinais. Pode ser continuamente melhorada através da otimização de parâmetros e validação adicional. Apesar de certos riscos, eles podem ser gerenciados através de técnicas de controle de risco. A estratégia é adequada para negociação algorítmica.


/*backtest
start: 2022-09-21 00:00:00
end: 2023-09-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"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/
// © bhavikmota

//@version=4
strategy("EMA & Supertrend", overlay = true)

//length = input(9, minval=1)
//ema1 = ema(close, length)
//ema2 = ema(ema1, length)
//ema3 = ema(ema2, length)

//shortest = ema(close, 20)
//short = ema(close, 50)
//longer = ema(close, 100)
//longest = ema(close, 200)


//for Ema1
len1 = input(21, minval=1)
//src1 = input(close)
ema1 = ema(close,len1)
plot(ema1, color=color.red, linewidth=1)

//for Ema2
len2 = input(55, minval=1)
//src2 = input(close)
ema2 = ema(close,len2)
plot(ema2, color=color.green, linewidth=1)

//for Ema3
len3 = input(200, minval=1)
//src3 = input(close)
ema3 = ema(close,len3)
plot(ema3, color=color.blue, linewidth=1)

//for Ema4
len4 = input(233, minval=1)
//src4 = input(close)
ema4 = ema(close,len4)
plot(ema4, color=color.black, linewidth=1)


Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")


//Trading logic

Enterlong = crossover(ema1,ema2) or (close>ema1 and close>ema2 and ema1>ema2) and close>ema4// positive ema crossover
Exitlong = crossunder(close,ema2) // candle closes below supertrend

Entershort = crossunder(ema1,ema2) or (close<ema1 and close<ema2 and ema2<ema1) and close<ema4// negative ema crossover
Exitshort = crossover(close,ema2) // candle closes above supertrend

//Execution Logic - Placing Order

start = timestamp(2008,1,1,0,0)

if time>= start
    strategy.entry("long", strategy.long, when=Enterlong)
    strategy.close("long",when=Exitlong)
//strategy.entry("short",strategy.short,100,when=Entershort)
//strategy.close("short",when=Exitshort)

Mais.