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

Crossover da EMA com a estratégia de dupla entrada de bandas de Bollinger: um sistema quantitativo de negociação que combina a tendência de seguimento e a volatilidade de ruptura

Autora:ChaoZhang, Data: 2024-07-29 17:14:32
Tags:EMABBATR

img

Resumo

A estratégia de entrada dupla de bandas de Bollinger é um sistema de negociação quantitativo que combina metodologias de breakout de volatilidade e seguimento de tendências. Esta estratégia usa principalmente crossovers de média móvel exponencial (EMA) para determinar as tendências do mercado, enquanto utiliza bandas de Bollinger (BB) para identificar oportunidades potenciais de breakout. Esta abordagem visa capturar fortes tendências de mercado, fornecendo pontos de entrada adicionais através de breakouts de bandas de Bollinger, aumentando assim as oportunidades de negociação e otimizando a gestão de capital.

Princípios de estratégia

  1. EMA Crossover: A estratégia emprega EMAs de 12 períodos e 26 períodos para determinar a direção da tendência.

  2. Bandas de Bollinger: A estratégia usa uma banda de Bollinger de 55 períodos com desvio padrão de 0,9.

  3. Logic de entrada:

    • Entrada primária: cruzamento da EMA ou ruptura do preço acima da banda de Bollinger superior.
    • Inscrição adicional: Se já estiver numa posição longa, aumentar o tamanho da posição em breakouts de Bollinger Band.
  4. Lógico de saída:

    • Sair quando a EMA rápida cruzar abaixo da EMA lenta.
    • Saída opcional quando o preço fecha abaixo da linha média da Banda de Bollinger.
  5. Configuração para parar perdas:

    • O valor da posição em risco deve ser calculado de acordo com o método de classificação da posição em risco.
    • O valor da posição em risco deve ser calculado em função do valor da posição em risco.
  6. Gestão de riscos:

    • Risco de incumprimento de 3% do capital da conta por transação (ajustável).
    • Utilização de ATR para ajustamento dinâmico de stop loss, adaptando-se à volatilidade do mercado.
    • Pausa opcional na negociação quando o preço está abaixo da linha média da Banda de Bollinger.

Vantagens da estratégia

  1. Análise multidimensional: combina estratégias de seguimento de tendências (EMA) e de ruptura de volatilidade (Bollinger Bands), aumentando a confiabilidade dos sinais de negociação.

  2. Mecanismo de entrada flexível: para além dos sinais cruzados da EMA primários, utiliza breakouts da banda de Bollinger para oportunidades de entrada adicionais, aumentando a adaptabilidade da estratégia.

  3. Gestão dinâmica do risco: utiliza o ATR para definir o stop loss e ajustar o tamanho das posições, permitindo que a estratégia se adapte melhor à volatilidade em diferentes condições de mercado.

  4. Consciência das condições de mercado: utiliza a linha média da banda de Bollinger para avaliar as condições de mercado, com a opção de pausar a negociação em condições desfavoráveis, reduzindo o risco.

  5. Gestão de capital otimizada: alcança um controlo de capital mais refinado através da gestão de risco baseada em percentagem e do dimensionamento dinâmico das posições baseado em ATR.

  6. Alta personalização: múltiplos parâmetros ajustáveis, tais como períodos de EMA, configurações de banda de Bollinger e multiplicador ATR, permitem que a estratégia se adapte a diferentes instrumentos de negociação e ambientes de mercado.

Riscos estratégicos

  1. Risco de inversão de tendência: apresenta um bom desempenho em mercados com tendências fortes, mas pode gerar frequentes sinais falsos de ruptura em mercados limitados à faixa.

  2. Risco de excesso de negociação: os breakouts da banda de Bollinger podem levar a sinais de negociação excessivos, aumentando os custos de transação.

  3. Risco de deslizamento: em mercados altamente voláteis, os preços de entrada e saída podem desviar-se significativamente das expectativas.

  4. Sensibilidade dos parâmetros: o desempenho da estratégia pode ser sensível a alterações nos períodos de EMA, configurações da banda de Bollinger, etc., exigindo uma otimização cuidadosa e backtesting.

  5. Dependência do ambiente de mercado: o desempenho da estratégia pode ser inconsistente em diferentes ciclos de mercado e ambientes de volatilidade.

  6. Risco de gestão de capital: Apesar da utilização de uma gestão de risco baseada em percentagem, a conta pode ainda enfrentar atrasos significativos em caso de perdas consecutivas.

Orientações para a otimização da estratégia

  1. Análise de quadros de tempo múltiplos: introduzir uma confirmação de tendência a longo prazo, como as EMAs semanais ou mensais, para reduzir os falsos sinais.

  2. Filtragem da volatilidade: ajustar os parâmetros da banda de Bollinger ou pausar a negociação em ambientes de baixa volatilidade para evitar excesso de negociação em mercados laterais.

  3. Incorporar Indicadores de Momento: Adicionar RSI ou MACD para confirmar a força da tendência e sinais de reversão potenciais.

  4. Otimizar o mecanismo de saída: considerar o uso de paradas de trail ou metas de lucro dinâmicas baseadas em ATR para melhor bloquear os lucros.

  5. Classificação do estado do mercado: desenvolver um sistema de classificação do ambiente de mercado para utilizar diferentes parâmetros em diferentes estados do mercado.

  6. Optimização de aprendizado de máquina: usar algoritmos de aprendizado de máquina para ajustar dinamicamente os parâmetros da estratégia para se adaptar a diferentes condições do mercado.

  7. Análise de correlação: considerar as correlações entre instrumentos quando se negocia vários ativos para otimizar as características gerais de risco-retorno do portfólio.

  8. Incorporar fatores fundamentais: Para ações ou commodities, considerar a adição de indicadores fundamentais relevantes para melhorar a qualidade do sinal de entrada.

Conclusão

A estratégia de entrada dupla da EMA é um sistema de negociação quantitativo que combina os conceitos de seguimento de tendências e volatilidade. Ele capta as principais tendências através de crossovers da EMA e fornece oportunidades de entrada adicionais usando breakouts da Bollinger Band, ao mesmo tempo em que emprega métodos dinâmicos de gerenciamento de risco para otimizar a utilização do capital.

Há um espaço significativo para otimização através de análise de vários prazos, filtragem de volatilidade, incorporação de indicadores de momento e outros métodos. Em particular, a introdução de algoritmos de aprendizado de máquina e sistemas de classificação do estado do mercado poderia melhorar significativamente a adaptabilidade e a estabilidade da estratégia. No entanto, na aplicação prática, o backtesting abrangente e o teste forward ainda são necessários, e são necessários ajustes cuidadosos de parâmetros com base em instrumentos comerciais específicos e ambientes de mercado.

Em geral, trata-se de um quadro de estratégia de negociação quantitativa bem concebido e promissor. Através da otimização contínua e da gestão cuidadosa, tem o potencial de se tornar um sistema de negociação robusto adequado para investidores que procuram capturar tendências, controlando os riscos.


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

//@version=5
strategy("EMA Crossover with BB Double Entry", overlay=true, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=100)

// Input parameters
fastLength = input.int(12, "Fast EMA Length")
slowLength = input.int(26, "Slow EMA Length")
atrPeriod = input.int(14, "ATR Period")
atrMultiplier = input.float(1.0, "ATR Multiplier")
useATRStopLoss = input.bool(true, "Use ATR Stop Loss")
stopLossDays = input.int(5, "Number of days for stop loss", minval=1, maxval=50)
riskPerTrade = input.float(3.0, "Risk per trade (%)", minval=0.1, maxval=5, step=0.1)
bbRiskPerTrade = input.float(1.5, "Risk for BB breakout trade (%)", minval=0.1, maxval=5, step=0.1)

// Bollinger Bands parameters
bbLength = input.int(55, "BB Length")
bbMult = input.float(0.9, "BB Standard Deviation")
useBBPauseResume = input.bool(false, "Use BB for Pause/Resume trading")

// Backtesting dates
startDate = input(timestamp("2020-01-01"), "Start Date")
endDate = input(timestamp("9999-12-31"), "End Date")

// Calculate EMAs
fastEMA = ta.ema(close, fastLength)
slowEMA = ta.ema(close, slowLength)

// Calculate ATR
atr = ta.atr(atrPeriod)

// Calculate Bollinger Bands
bbBasis = ta.sma(close, bbLength)
bbDev = bbMult * ta.stdev(close, bbLength)
bbUpper = bbBasis + bbDev
bbLower = bbBasis - bbDev

// Define trading conditions
longCondition = ta.crossover(fastEMA, slowEMA)
shortCondition = ta.crossunder(fastEMA, slowEMA)
bullish = fastEMA > slowEMA
bearish = fastEMA < slowEMA

// Bollinger Bands breakout
bbBreakout = close > bbUpper and close[1] <= bbUpper[1]

// Calculate lowest low for stop loss
lowestLow = ta.lowest(low, stopLossDays)

// Variables to store entry price and stop loss
var float entryPrice = na
var float stopLoss = na
var bool inPosition = false
var bool pauseTrading = false

// Entry logic
entryConditions = (longCondition or (bbBreakout and bullish)) and
                  (not useBBPauseResume or close > bbBasis) and
                  not pauseTrading

if entryConditions and not inPosition
    entryPrice := close
    atrStopLoss = close - (atr * atrMultiplier)
    lowStopLoss = lowestLow
    stopLoss := useATRStopLoss ? atrStopLoss : lowStopLoss
    
    riskAmount = strategy.equity * (riskPerTrade / 100)
    positionSize = riskAmount / (close - stopLoss)
    
    strategy.entry("Long", strategy.long, qty=positionSize)
    inPosition := true
    pauseTrading := false
    
    alert("BUY," + syminfo.ticker + ",EntryPrice=" + str.tostring(close) + ",StopLoss=" + str.tostring(stopLoss) + ",PositionSize=" + str.tostring(positionSize), alert.freq_once_per_bar_close)

// Additional entry on BB breakout
if inPosition and bbBreakout and bullish and (not useBBPauseResume or close > bbBasis)
    bbRiskAmount = strategy.equity * (bbRiskPerTrade / 100)
    bbPositionSize = bbRiskAmount / (close - stopLoss)
    
    strategy.entry("Long_BB", strategy.long, qty=bbPositionSize)
    
    alert("ADD," + syminfo.ticker + ",EntryPrice=" + str.tostring(close) + ",StopLoss=" + str.tostring(stopLoss) + ",PositionSize=" + str.tostring(bbPositionSize), alert.freq_once_per_bar_close)

// Exit logic
if shortCondition or (useBBPauseResume and inPosition and close < bbBasis)
    if shortCondition
        strategy.close_all(comment="EMA Crossdown")
        inPosition := false
        pauseTrading := false
        alert("SELL," + syminfo.ticker + ",Reason=EMA_Crossdown", alert.freq_once_per_bar_close)
    else if useBBPauseResume
        strategy.close_all(comment="Close under BB basic")
        pauseTrading := true
        alert("SELL," + syminfo.ticker + ",Reason=Below_BB_Basic", alert.freq_once_per_bar_close)
    
    entryPrice := na
    stopLoss := na

// Resume trading if price closes above BB basic
if useBBPauseResume and pauseTrading and close > bbBasis
    pauseTrading := false
    alert("RESUME," + syminfo.ticker, alert.freq_once_per_bar_close)

// Stop loss
if strategy.position_size > 0
    strategy.exit("Stop Loss", "Long", stop=stopLoss)
    strategy.exit("Stop Loss", "Long_BB", stop=stopLoss)
    if close <= stopLoss
        alert("SELL," + syminfo.ticker + ",Reason=Stop_Loss", alert.freq_once_per_bar_close)

// Plotting
plot(fastEMA, color=color.new(color.blue, 0), title="Fast EMA")
plot(slowEMA, color=color.new(color.red, 0), title="Slow EMA")
plot(bbUpper, color=color.new(color.green, 50), title="BB Upper")
plot(bbLower, color=color.new(color.green, 50), title="BB Lower")
plot(bbBasis, color=color.new(color.yellow, 50), title="BB Basic")
plot(strategy.position_size > 0 ? stopLoss : na, color=color.red, style=plot.style_cross, linewidth=2, title="Stop Loss")

// Alert conditions
alertcondition(entryConditions, title="Buy Alert", message="Buy {{ticker}}")
alertcondition(bbBreakout and inPosition and bullish and (not useBBPauseResume or close > bbBasis), title="Add Position Alert", message="Add Position {{ticker}}")
alertcondition(shortCondition, title="Sell Alert (EMA)", message="Sell {{ticker}} (EMA crossdown)")
alertcondition(useBBPauseResume and inPosition and close < bbBasis, title="Pause Alert", message="Pause trading {{ticker}} (Close under BB basic)")
alertcondition(useBBPauseResume and pauseTrading and close > bbBasis, title="Resume Alert", message="Resume trading {{ticker}} (Close above BB basic)")

Relacionados

Mais.