Estratégia de média móvel de ruptura de impulso

Autora:ChaoZhang, Data: 2023-11-27 16:25:54
Tags:

img

Resumo

A estratégia de Moving Average é uma estratégia de negociação de ações que combina sinais de cruzamento da média móvel com indicadores de momento. A estratégia emprega vários indicadores técnicos, incluindo a média móvel exponencial (EMA), a média móvel simples (SMA), a divergência de convergência da média móvel (MACD) e um índice de força relativa modificado (StockRSI) para gerar sinais de compra ao confirmar uma tendência de alta a longo prazo.

Estratégia lógica

Os principais componentes desta estratégia são:

  1. Crossover EMA/SMA: Uma linha rápida da EMA de 9 períodos cruza acima de uma linha lenta da SMA de 21 períodos para desencadear um sinal de compra.

  2. Indicador MACD: O histograma MACD deve ser positivo quando combinado com o sinal de cruzamento EMA/SMA como confirmação adicional.

  3. Indicador StockRSI: Os sinais são acionados quando o StockRSI está acima do nível de OVERBOUGHT (80) ou abaixo do nível de OVERSOLD (20).

  4. Bandeiras de Bollinger: Exigir que o preço esteja dentro das faixas onde a faixa média é uma SMA de 20 períodos e a largura das faixas é de dois desvios padrão.

  5. Pare de Perder e Aproveite: Calculado com base no ATR de 14 períodos.

A estratégia requer pelo menos 2 dos 3 indicadores para dar sinais de compra, o preço está dentro das Bandas de Bollinger e a tendência de longo prazo permanece alta para gerar o sinal de compra final.

Análise das vantagens

Os principais pontos fortes desta estratégia são:

  1. Excelentes resultados dos exames de retorno: múltiplos indicadores comprovados conduzem a um desempenho superior ao do índice de referência e dos indicadores individuais.

  2. Parâmetros otimizadosOs parâmetros-chave, como os períodos EMA e as bandas de Bollinger, são otimizados para melhorar a estabilidade.

  3. O valor da posição em risco deve ser calculado de acordo com o método descrito no ponto 4.1.: As bandas de Bollinger e o ATR permitem um ajustamento dinâmico das paradas para um melhor controlo do risco.

  4. Fácil de aplicar: Estrutura de código limpa e fácil acessibilidade dos dados resultam em operações práticas simples.

Análise de riscos

Apesar do bom desempenho, os principais riscos incluem:

  1. Sinais falsosA tendência a longo prazo deve ser incorporada como um filtro adicional.

  2. Parâmetros inadequadosOs parâmetros devem ser ajustados em função dos diferentes produtos e do ambiente do mercado.

  3. Previsão de prejuízo: Um stop loss demasiado apertado tende a ser interrompido prematuramente, enquanto um stop loss demasiado alargado pode resultar em perdas excessivas.

Para combater os riscos acima referidos, podem ser adoptadas as seguintes medidas:

  1. Intervenção manual: Em situações anormais, os sinais podem ser verificados manualmente, os parâmetros reajustados ou as estratégias temporariamente interrompidas.

  2. Optimização de parâmetros: Métodos mais científicos e objetivos, como algoritmos genéticos, podem ser empregados para otimização sistemática.

  3. Previsão de variaçãoO valor da posição em risco deve ser calculado em função da variação da posição em risco e da variação da posição em risco.

Oportunidades de melhoria

A estratégia pode ser melhorada nos seguintes domínios:

  1. Mecanismos mais robustos para parar perdasO valor da posição em risco deve ser calculado em função do valor da posição em risco.

  2. Filtros de volume: Adição de indicadores de volume para evitar falhas.

  3. Parâmetros dinâmicos: Optimização automática de parâmetros como períodos de média móvel e largura de banda com base nas condições de mercado em mudança.

  4. Aprendizagem de Máquina: LSTM, RNN e outros algoritmos podem permitir a otimização dinâmica de parâmetros.

Conclusão

A Estratégia de Média Móvel Momentum Breakout capitaliza os pontos fortes da combinação de múltiplos indicadores técnicos e alcançou uma lucratividade decente com confirmação de longo e curto prazo.


/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Improved Custom Strategy", shorttitle="ICS", overlay=true)

// Volatility
volatility = ta.atr(14)

// EMA/MA Crossover
fast_length = 9
slow_length = 21
fast_ma = ta.ema(close, fast_length)
slow_ma = ta.sma(close, slow_length)
crossover_signal = ta.crossover(fast_ma, slow_ma)

// MACD
[macdLine, signalLine, macdHistogram] = ta.macd(close, 12, 26, 9)
macd_signal = crossover_signal and (macdHistogram > 0)

// Bollinger Bands
source = close
basis = ta.sma(source, 20)
upper = basis + 2 * ta.stdev(source, 20)
lower = basis - 2 * ta.stdev(source, 20)

// Fractal-based Support and Resistance levels
isFractalHigh = high[2] < high[1] and high[1] > high[0]
isFractalLow = low[2] > low[1] and low[1] < low[0]
resistance = ta.valuewhen(isFractalHigh, high[1], 0)
support = ta.valuewhen(isFractalLow, low[1], 0)

// StockRSI
length = 14
K = 100 * (close - ta.lowest(close, length)) / (ta.highest(close, length) - ta.lowest(close, length))
D = ta.sma(K, 3)
overbought = 80
oversold = 20
stockrsi_signal = ((K < D) and (K < oversold)) or ((K > D) and (K > overbought))

// Buy and sell conditions
mandatory_buy_conditions = (crossover_signal ? 1 : 0) + (macd_signal ? 1 : 0) + (stockrsi_signal ? 1 : 0)

// Long-term Trend Check
long_term_ma = ta.sma(close, 200)
long_term_bullish = close > long_term_ma
long_term_bearish = close < long_term_ma

// Plot the long-term MA for visual clarity
plot(long_term_ma, color=color.gray, title="200-Day MA", linewidth=1)

// Simplified Buy and Sell conditions
buy_condition = long_term_bullish and (mandatory_buy_conditions >= 2) and (close > lower) and (close < upper)
sell_condition = (macdHistogram < 0) and (K > D) and (K > overbought)


// Potential SL and TP based on volatility
potential_SL = close - volatility
potential_TP = close + 2 * volatility

plot(potential_SL, title="SL Level", color=color.red, linewidth=1, style=plot.style_linebr)
plot(potential_TP, title="TP Level", color=color.green, linewidth=1, style=plot.style_linebr)

// ... (rest of your code above)

// State variable to track if we're in a position, a counter for trades, and a delayed counter for plotting
var bool inPosition = false
var tradeCounter = 0
var tradeCounterDelayed = 0 // Declaration of the variable

// Buy logic: Check if tradeCounter is 0 and the buy condition is met
if tradeCounter == 0 and buy_condition
    strategy.entry("BUY", strategy.long, stop=potential_SL, limit=potential_TP)
    inPosition := true
    tradeCounter := tradeCounter + 1

// Sell logic: Check if tradeCounter is 1, the sell condition is met, and we are in a position
if tradeCounter == 1 and inPosition and sell_condition
    strategy.close("BUY")
    inPosition := false
    tradeCounter := tradeCounter - 1

// Update the delayed trade counter:
tradeCounterDelayed := tradeCounter

// Plotting
bgcolor(buy_condition ? color.new(color.green, 90) : sell_condition ? color.new(color.red, 90) : na)
plotshape(series=buy_condition and tradeCounterDelayed == 0, style=shape.labelup, location=location.belowbar, color=color.green, text="BUY", size=size.small)
plotshape(series=sell_condition and tradeCounterDelayed == 1, style=shape.labeldown, location=location.abovebar, color=color.red, text="SELL", size=size.small)

// ... (rest of your code if any)


Mais.