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.
Os principais componentes desta estratégia são:
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.
Indicador MACD: O histograma MACD deve ser positivo quando combinado com o sinal de cruzamento EMA/SMA como confirmação adicional.
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).
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.
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.
Os principais pontos fortes desta estratégia são:
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.
Parâmetros otimizadosOs parâmetros-chave, como os períodos EMA e as bandas de Bollinger, são otimizados para melhorar a estabilidade.
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.
Fácil de aplicar: Estrutura de código limpa e fácil acessibilidade dos dados resultam em operações práticas simples.
Apesar do bom desempenho, os principais riscos incluem:
Sinais falsosA tendência a longo prazo deve ser incorporada como um filtro adicional.
Parâmetros inadequadosOs parâmetros devem ser ajustados em função dos diferentes produtos e do ambiente do mercado.
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:
Intervenção manual: Em situações anormais, os sinais podem ser verificados manualmente, os parâmetros reajustados ou as estratégias temporariamente interrompidas.
Optimização de parâmetros: Métodos mais científicos e objetivos, como algoritmos genéticos, podem ser empregados para otimização sistemática.
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.
A estratégia pode ser melhorada nos seguintes domínios:
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.
Filtros de volume: Adição de indicadores de volume para evitar falhas.
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.
Aprendizagem de Máquina: LSTM, RNN e outros algoritmos podem permitir a otimização dinâmica de parâmetros.
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)