Estratégia de captação de lucro e stop loss de média móvel exponencial tripla

Autora:ChaoZhang, Data: 2024-02-04 10:38:42
Tags:

img

Resumo

A Triple Exponential Moving Average Profit Taking and Stop Loss Strategy é uma estratégia de tendência baseada em três médias móveis exponenciais com períodos diferentes para entrada e saída do mercado.

Estratégia lógica

A estratégia usa três médias móveis exponenciais: linha rápida, linha média e linha lenta. Ela vai longa quando a linha média cruza acima da linha lenta e fecha a posição quando a linha rápida cruza abaixo da linha média.

Ao mesmo tempo, a estratégia aproveita o indicador Average True Range para calcular os níveis de captação de lucro e stop-loss. Especificamente, o take profit para posições longas é o preço de entrada + Average True Range * fator de lucro, e para posições curtas é o preço de entrada - Average True Range * fator de lucro. A lógica de stop loss é semelhante. Isso limita efetivamente o risco de grandes perdas.

Análise das vantagens

  1. Os indicadores de decisão são intuitivos e fáceis de entender.
  2. Systemático e fácil de automatizar.
  3. Equilibra o seguimento de tendências e o controlo de riscos.

Análise de riscos

  1. Há algum atraso e incapacidade de capturar reversões em tempo hábil.
  2. Tendência a parar perdas em mercados variados.
  3. O ajuste de parâmetros precisa de otimização, caso contrário os resultados podem ser pobres.

As medidas de mitigação do risco incluem: encurtar os períodos de média móvel, otimizar o fator lucro/paragem e adicionar indicadores auxiliares.

Orientações de otimização

  1. Teste combinações de médias móveis para encontrar parâmetros ótimos.
  2. Adicionar outros indicadores técnicos como MACD, RSI etc.
  3. Usar aprendizagem de máquina para otimizar automaticamente parâmetros.
  4. Ajuste dinâmico do nível de lucro/stop com base no intervalo real.
  5. Incorpore sentimentos para evitar a superlotação.

Conclusão

No geral, esta é uma estratégia eficaz de seguir tendências com desempenho estável e implementação fácil através de parâmetros simples. A tomada de lucro dinâmica e a parada de perda baseada no Real Range Médio limitam o risco por lado. Mas a otimização de parâmetros e as combinações de indicadores precisam ser feitas cuidadosamente para evitar sobreajuste ou atraso na decisão. No balanço, esta estratégia tem um bom perfil de risco-recompensa e vale a pena considerar.


/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//© Densz
strategy("3EMA with TP & SL (ATR)", overlay=true )

// INPUTS
startTime           =       input(title="Start Time", type = input.time, defval = timestamp("01 Jan 2017 00:00 +0000"))
endTime             =       input(title="End Time", type = input.time, defval = timestamp("01 Jan 2022 00:00 +0000"))

slowEMALength       =       input(title="Slow EMA Length", type = input.integer, defval = 55)
middleEMALength     =       input(title="Middle EMA Length", type = input.integer, defval = 21)
fastEMALength       =       input(title="Fast EMA Length", type = input.integer, defval = 9)

trendMALength       =       input(title="Trend indicator MA Length", type = input.integer, defval = 200)

atrLength           =       input(title="ATR Length", type = input.integer, defval = 14)
tpATRMult           =       input(title="Take profit ATR multiplier", type = input.integer, defval = 3)
slATRMult           =       input(title="Stop loss ATR multiplier", type = input.integer, defval = 2)

rsiLength           =       input(title="RSI Length", type = input.integer, defval = 14)

// Indicators
slowEMA             =       ema(close, slowEMALength)
middEMA             =       ema(close, middleEMALength)
fastEMA             =       ema(close, fastEMALength)
atr                 =       atr(atrLength)

rsiValue            =       rsi(close, rsiLength)
isRsiOB             =       rsiValue >= 80
isRsiOS             =       rsiValue <= 20

sma200              =       sma(close, trendMALength)

inDateRange         =       true

// Plotting
plot(slowEMA, title="Slow EMA", color=color.red, linewidth=2, transp=50)
plot(middEMA, title="Middle EMA", color=color.orange, linewidth=2, transp=50)
plot(fastEMA, title="Fast EMA", color=color.green, linewidth=2, transp=50)

plot(sma200, title="SMA Trend indicator", color=color.purple, linewidth=3, transp=10)
plotshape(isRsiOB, title="Overbought", location=location.abovebar, color=color.red, transp=0, style=shape.triangledown, text="OB")
plotshape(isRsiOS, title="Oversold", location=location.belowbar, color=color.green, transp=0, style=shape.triangledown, text="OS")

float takeprofit    =       na
float stoploss      =       na

var line tpline     =       na
var line slline     =       na

if strategy.position_size != 0
    takeprofit := takeprofit[1]
    stoploss := stoploss[1]
    line.set_x2(tpline, bar_index)
    line.set_x2(slline, bar_index)
    line.set_extend(tpline, extend.none)
    line.set_extend(slline, extend.none)
    
// STRATEGY
goLong  = crossover(middEMA, slowEMA) and inDateRange
closeLong = crossunder(fastEMA, middEMA) and inDateRange


if goLong
    takeprofit := close + atr * tpATRMult
    stoploss := close - atr * slATRMult
    // tpline := line.new(bar_index, takeprofit, bar_index, takeprofit, color=color.green, width=2, extend=extend.right, style=line.style_dotted)
    // slline := line.new(bar_index, stoploss, bar_index, stoploss, color=color.red, width=2, extend=extend.right, style=line.style_dotted)
    // label.new(bar_index, takeprofit, "TP", style=label.style_labeldown)
    // label.new(bar_index, stoploss, "SL", style=label.style_labelup)
    strategy.entry("Long", strategy.long, when = goLong)
    strategy.exit("TP/SL", "Long", stop=stoploss, limit=takeprofit)
if closeLong
    takeprofit := na
    stoploss := na
    strategy.close(id = "Long", when = closeLong)

if (not inDateRange)
    strategy.close_all()


Mais.