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

Tendência de seguir uma estratégia baseada na SMA multiperíodo

Autora:ChaoZhang, Data: 2024-02-04 14:50:24
Tags:

img

Resumo

Esta estratégia combina várias linhas SMA com diferentes períodos para identificar e seguir a tendência. A ideia central é: comparar as direções de alta/baixa das SMAs com diferentes períodos para determinar a tendência; ir longo quando a SMA de curto período cruza a SMA de longo período e ir curto quando a SMA curta cruza abaixo da SMA longa.

Estratégia lógica

  1. Utilize 5 linhas SMA com períodos de 10, 20, 50, 100 e 200 respectivamente.
  2. Para determinar a tendência, compare as direcções destas 5 SMAs. Por exemplo, quando as SMAs de 10, 20, 100 e 200 períodos estão subindo juntas, indica uma tendência ascendente; quando todas estão caindo, indica uma tendência descendente.
  3. Compare os valores das SMAs com diferentes períodos para gerar sinais de negociação. Por exemplo, quando a SMA de 10 períodos cruza a SMA de 20 períodos, vá longo; quando a SMA de 10 períodos cruza abaixo da SMA de 20, vá curto.
  4. Use o ZeroLagEMA para confirmação de entrada e sinais de saída. Vá longo quando o ZeroLagEMA rápido cruza o ZeroLagEMA lento, saia longo quando cruza abaixo. A lógica de julgamento para os shorts é o oposto.

Vantagens

  1. A combinação de múltiplas SMA com períodos diferentes pode determinar eficazmente a tendência do mercado.
  2. A comparação dos valores da SMA gera regras quantitativas de entrada e saída.
  3. O filtro ZeroLagEMA evita trocas desnecessárias e melhora a estabilidade.
  4. Combinando o julgamento da tendência e os sinais de negociação, obtém-se uma tendência após a negociação.

Riscos e soluções

  1. Quando o mercado entra em consolidação, os crossovers frequentes da SMA podem causar perdas redundantes.
    • Solução: aumentar o filtro ZeroLagEMA para evitar entradas de sinal inválidas.
  2. A partir das SMA de períodos múltiplos, o mercado tem um certo atraso, não conseguindo responder rapidamente a fortes variações de preços a curto prazo.
    • Solução: adicionar indicadores mais rápidos como o MACD para ajudar no julgamento.

Orientações de otimização

  1. Otimizar os parâmetros do período SMA para encontrar a melhor combinação.
  2. Adicione estratégias de stop loss como trailing stop para limitar ainda mais as perdas.
  3. Adicionar um mecanismo de dimensionamento das posições para aumentar as apostas em tendências fortes e diminuir as apostas em consolidações.
  4. Incorporar mais indicadores auxiliares como o MACD e o KDJ para melhorar a estabilidade geral.

Conclusão

Esta estratégia determina efetivamente a tendência do mercado combinando SMAs de vários períodos e gera sinais de negociação quantificados. ZeroLagEMA melhora a taxa de vitória. Em resumo, a estratégia alcançou uma tendência quantitativa após a negociação, com resultados notáveis.


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

//@version=2
strategy("Forex MA Racer - SMA Performance /w ZeroLag EMA Trigger", shorttitle = "FX MA Racer (5x SMA, 2x zlEMA)", overlay=false )

// === INPUTS ===
hr0             = input(defval = true, title = "=== SERIES INPUTS ===")
smaSource       = input(defval = close, title = "SMA Source")
sma1Length      = input(defval = 10, title = "SMA 1 Length")
sma2Length      = input(defval = 20, title = "SMA 2 Length")
sma3Length      = input(defval = 50, title = "SMA 3 Length")
sma4Length      = input(defval = 100, title = "SMA 4 Length")
sma5Length      = input(defval = 200, title = "SMA 5 Length")
smaDirSpan      = input(defval = 4, title = "SMA Direction Span")
zlmaSource      = input(defval = close, title = "ZeroLag EMA Source")
zlmaFastLength  = input(defval = 9, title = "ZeroLag EMA Fast Length")
zlmaSlowLength  = input(defval = 21, title = "ZeroLag EMA Slow Length")
hr1             = input(defval = true, title = "=== PLOT TIME LIMITER ===")
useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
// set up where we want to run from
startYear       = input(defval = 2018, title = "Start From Year", minval = 0, step = 1)
startMonth      = input(defval = 02, title = "Start From Month", minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day", minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour", minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute", minval = 0,step = 1)
hr2             = input(defval = true, title = "=== TRAILING STOP ===")
useStop     = input(defval = false, title = "Use Trailing Stop?")
slPoints    = input(defval = 200, title = "Stop Loss Trail Points", minval = 1)
slOffset    = input(defval = 400, title = "Stop Loss Trail Offset", minval = 1)
// === /INPUTS ===

// === SERIES SETUP ===
// Fast ZeroLag EMA
zema1=ema(zlmaSource, zlmaFastLength)
zema2=ema(zema1, zlmaFastLength)
d1=zema1-zema2
zlemaFast=zema1+d1

// Slow ZeroLag EMA
zema3=ema(zlmaSource, zlmaSlowLength)
zema4=ema(zema3, zlmaSlowLength)
d2=zema3-zema4
zlemaSlow=zema3+d2

// Simple Moving Averages
period10 = sma(close, sma1Length)
period20 = sma(close, sma2Length)
period50 = sma(close, sma3Length)
period100 = sma(close, sma4Length)
period200 = sma(close, sma5Length)
// === /SERIES SETUP ===

// === PLOT ===
// colors of plotted MAs
p1 = (close < period10) ? #FF0000 : #00FF00
p2 = (close < period20) ? #FF0000 : #00FF00
p3 = (close < period50) ? #FF0000 : #00FF00
p4 = (close < period100) ? #FF0000 : #00FF00
p5 = (close < period200) ? #FF0000 : #00FF00

plot(period10, title='10 Period', color = p1, linewidth=1)
plot(period20, title='20 Period', color = p2, linewidth=2)
plot(period50, title='50 Period', color = p3, linewidth=4)
plot(period100, title='100 Period', color = p4, linewidth=6)
plot(period200, title='200 Period', color = p5, linewidth=10)
// === /PLOT ===

//BFR = BRFIB ? (maFast+maSlow)/2 : abs(maFast - maSlow)

// === STRATEGY ===
// calculate SMA directions
direction10 = rising(period10, smaDirSpan) ? +1 : falling(period10, smaDirSpan) ? -1 : 0
direction20 = rising(period20, smaDirSpan) ? +1 : falling(period20, smaDirSpan) ? -1 : 0
direction50 = rising(period50, smaDirSpan) ? +1 : falling(period50, smaDirSpan) ? -1 : 0
direction100 = rising(period100, smaDirSpan) ? +1 : falling(period100, smaDirSpan) ? -1 : 0
direction200 = rising(period200, smaDirSpan) ? +1 : falling(period200, smaDirSpan) ? -1 : 0

// conditions
// SMA Direction Trigger
dirUp = direction10 > 0 and direction20 > 0 and direction100 > 0 and direction200 > 0
dirDn = direction10 < 0 and direction20 < 0 and direction100 < 0 and direction200 < 0

longCond = (period10>period20) and (period20>period50) and (period50>period100) and  dirUp//and (close > period10) and (period50>period100) //and (period100>period200)
shortCond = (period10<period20) and (period20<period50) and dirDn//and (period50<period100) and (period100>period200)

longExit = crossunder(zlemaFast, zlemaSlow) or crossunder(period10, period20)
shortExit = crossover(zlemaFast, zlemaSlow) or crossover(period10, period20)


// entries and exits
startTimeOk() =>
    // get our input time together
    inputTime   = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    // check the current time is greater than the input time and assign true or false
    timeOk      = time > inputTime ? true : false
    // last line is the return value, we want the strategy to execute if..
    // ..we are using the limiter, and the time is ok -OR- we are not using the limiter
    r = (useTimeLimit and timeOk) or not useTimeLimit


if( true )
    // entries
    strategy.entry("long", strategy.long, when = longCond)
    strategy.entry("short", strategy.short, when = shortCond)

        
    // trailing stop
    if (useStop)
        strategy.exit("XL", from_entry = "long", trail_points = slPoints, trail_offset = slOffset)
        strategy.exit("XS", from_entry = "short", trail_points = slPoints, trail_offset = slOffset)

    // exits
    strategy.close("long", when = longExit)
    strategy.close("short", when = shortExit)
// === /STRATEGY ===

Mais.