Estratégia estocástica de média móvel dupla

Autora:ChaoZhang, Data: 2024-01-29 11:54:10
Tags:

img

Resumo

A estratégia estocástica de média móvel dupla tenta identificar oportunidades de negociação usando uma combinação de indicadores de média móvel e o oscilador estocástico.

Estratégia lógica

A estratégia baseia-se principalmente em dois indicadores técnicos:

  1. Média Móvel: Computa uma EMA rápida, SMA lenta e VWMA lenta usando diferentes parâmetros e gera sinais de negociação quando a EMA rápida cruza a SMA lenta.

  2. Oscilador estocástico: Calcula o valor de %K e considera o mercado sobrecomprado ou sobrevendido quando %K cruza os níveis de limiar superior ou inferior pré-estabelecidos, usando-o para filtrar alguns dos sinais da média móvel.

Especificamente, a lógica para a geração de sinal é:

  1. Quando a EMA rápida cruza acima da SMA lenta, e %K está abaixo do nível de sobrevenda, vá longo.

  2. Para as posições longas existentes, fechar quando %K reentrar na zona de sobrecompra ou o preço ultrapassar a parada de perda.

Ao combinar médias móveis e o oscilador estocástico, a estratégia tenta identificar pontos de sinal de média móvel de alta probabilidade para entrar em negociações, enquanto usa o estocástico para filtrar alguns dos falsos sinais.

Análise das vantagens

As principais vantagens desta estratégia são:

  1. A combinação de múltiplos indicadores técnicos permite um julgamento mais abrangente do que a utilização de um único indicador.
  2. A filtragem com o oscilador estocástico evita alguns sinais falsos.
  3. O uso de múltiplas médias móveis com parâmetros mistos permite sinais mais robustos.
  4. Incorpora um mecanismo de stop loss para controlar a perda de uma única transação.

Análise de riscos

Há também alguns riscos:

  1. As médias móveis podem gerar muitos sinais incertos, resultando em mais entradas falsas; capacidade limitada de stop loss.
  2. O oscilador estocástico também pode produzir sinais incorretos por conta própria.
  3. As definições dos parâmetros requerem otimização (por exemplo, níveis de sobrecompra/supervenda, períodos de média móvel) caso contrário, o impacto no desempenho.
  4. Falta de análise fundamental.

Atenuantes:

  1. Otimizar os parâmetros para encontrar a melhor combinação de configurações do indicador.
  2. Usar um dimensionamento de posição mais pequeno, escalar.
  3. Incorporar análise fundamental para evitar eventos.

Oportunidades de melhoria

As principais oportunidades de otimização são:

  1. Teste e otimize os parâmetros da média móvel para encontrar o ideal.
  2. Teste parâmetros estocásticos como zonas de sobrecompra/supervenda para configurações ideais.
  3. Incorporar indicadores adicionais como volume ou volatilidade para uma lógica de entrada mais rica.
  4. Melhorar a metodologia de stop loss, por exemplo, trailing stops para reduzir o risco.
  5. Melhorar a gestão de fundos, como o dimensionamento dinâmico das posições com base no ATR.
  6. Evitar eventos de risco com VIX etc.

Conclusão

A Estratégia Estocástica de Média Móvel Dupla utiliza uma mistura de médias móveis e o oscilador estocástico para projetar um sistema de tendência robusto, mas tem algumas oportunidades de aprimoramento em torno de parâmetros, paradas etc. Mais refinamentos como indicadores adicionais e otimizações podem potencialmente fornecer um alfa mais consistente.


/*backtest
start: 2023-01-22 00:00:00
end: 2024-01-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("TVIX MEAN REV V2 TREND", overlay=true)
length = input(16, minval=1)
OverBought = input(80)
OverSold = input(20)
TradeLong = input (true)
TradeShort = input (true)

OverBoughtClose = input(80)
OverSoldClose = input(20)

smoothK = 3
smoothD = 3
trail_points = input(50)

k = sma(stoch(close, high, low, length), smoothK)
d = sma(k, smoothD)
k2 = sma(stoch(close, high, low, length), smoothK)
d2 = sma(k, smoothD)


// === GENERAL INPUTS ===
// short Ema
maFastSource = input(defval=close, title="Fast EMA Source")
maFastLength = input(defval=1, title="Fast EMA Period", minval=1)
// long Sma
maSlowSource = input(defval=close, title="Slow SMA Source")
maSlowLength = input(defval=100, title="Slow SMA Period", minval=1)
// longer Sma
maSlowerSource = input(defval=close, title="Slower SMA Source")
maSlowerLength = input(defval=30, title="Slower SMA Period", minval=1)

//ATR Stop Loss Indicator by Keith Larson
atrDays = input(7, "ATR Days Lookback")
theAtr = atr(atrDays)
atrModifier = input(5.0, "ATR Modifier")
//plot(atr * atrModifier, title="ATR")

LstopLoss = close - (theAtr * atrModifier)
SstopLoss = close + (theAtr * atrModifier)



// === SERIES SETUP ===
/// a couple of ma's..
maFast = ema(maFastSource, maFastLength)
maSlow = sma(maSlowSource, maSlowLength)
maSlower = vwma(maSlowerSource, maSlowerLength)
rsi = rsi(maSlowerSource, maSlowerLength)

// === PLOTTING ===
fast = plot(maFast, title="Fast MA", color=color.red, linewidth=2, style=plot.style_line, transp=30)
slow = plot(maSlow, title="Slow MA", color=color.green, linewidth=2, style=plot.style_line, transp=30)
slower = plot(maSlower, title="Slower MA", color=color.teal, linewidth=2, style=plot.style_line, transp=30)


// === LOGIC === Basic - simply switches from long to short and vice-versa with each fast-slow MA cross
LongFilter = maFast > maSlow
ShortFilter = maSlow > maFast




BUY=crossover(k, d) and k < OverSold
SELL=crossunder(k, d) and k > OverBought

SELLCLOSE=crossover(k, d) and k < OverSoldClose
BUYCLOSE=crossunder(k, d) and k > OverBoughtClose

Open = open


if not na(k) and not na(d)
    if crossover(k, d) and k < OverSold and LongFilter and TradeLong
        strategy.entry("$", strategy.long, limit = Open, comment="Long")
    
    strategy.close("$",when = crossunder(k, d) and k > OverBoughtClose or open < LstopLoss  )
    ///strategy.close("$",when = open < LstopLoss  )
    
if not na(k) and not na(d)
    if crossunder(k, d) and k > OverBought and ShortFilter and TradeShort
        strategy.entry("$1", strategy.short, limit = Open, comment="S")
        
    strategy.close ("$1", when = crossover(k, d) and k < OverSoldClose or open > SstopLoss  )
    ///strategy.close ("$1", when = open < SstopLoss) 
    
  
        





Mais.