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

Estratégia de negociação de tendências avançadas baseada em bandas de Bollinger e padrões de velas

Autora:ChaoZhang, Data: 2024-11-27 14:18:33
Tags:BBATRRRPSRMAS.D.WBR

img

Resumo

Esta é uma estratégia de seguimento de tendências baseada em Bandas de Bollinger e análise de padrões de velas. A estratégia identifica principalmente pontos potenciais de reversão do mercado observando padrões de velas quando o preço toca Bandas de Bollinger, combinados com a relação de relação entre as mechas e o corpo. Além disso, a estratégia emprega um modelo de risco fixo para controlar a exposição por comércio e utiliza análise de vários prazos para melhorar a precisão da negociação.

Princípios de estratégia

A lógica central da estratégia baseia-se em vários elementos-chave: primeiro, calcula as Bandas de Bollinger em 20 períodos para determinar a faixa de volatilidade de preços; segundo, quando o preço toca as Bandas de Bollinger, analisa a relação entre as mechas superior/inferior e o corpo do candelabro, considerando-o como um sinal de reversão potencial quando a relação excede o limiar definido; terceiro, calcula os principais níveis de suporte e resistência para a colocação de stop-loss; finalmente, calcula o tamanho da posição para cada negociação com base em uma porcentagem fixa (1%) do saldo da conta, implementando a gestão de risco dinâmico.

Vantagens da estratégia

  1. Controlo preciso do risco: utiliza um modelo de gestão de risco por percentagem fixa, garantindo uma exposição ao risco controlada por transacção
  2. Pontos de entrada flexíveis: fornece várias opções de preços de entrada para acomodar diferentes estilos de negociação
  3. Combinação de indicadores técnicos: combina Bandas de Bollinger com análise de padrões de velas para melhorar a fiabilidade do sinal
  4. Posicionamento racional de stop-loss: define stop-loss com base nos principais níveis de suporte e resistência, alinhados com a dinâmica do mercado
  5. Gestão abrangente do comércio: inclui um mecanismo de expiração de ordens para evitar falsos sinais

Riscos estratégicos

  1. Risco de flutuação rápida do mercado: os rácios Wick podem gerar falsos sinais em mercados voláteis
  2. Risco de gestão de fundos: o modelo de risco porcentual fixo pode conduzir a posições subdimensionadas após perdas consecutivas
  3. Risco de colocação de stop-loss: os cálculos de suporte e resistência podem não ser precisos em determinadas condições de mercado
  4. Dependência do prazo: uma estratégia baseada principalmente no prazo diário pode perder oportunidades em prazos menores

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

  1. Incorporar indicadores de volume: adicionar análise de volume para confirmação de sinal para melhorar a confiabilidade
  2. Otimizar o mecanismo de stop-loss: considerar a implementação de stop-loss dinâmico que se ajuste com base na volatilidade do mercado
  3. Adicionar filtros de ambiente de mercado: incluir indicadores de força da tendência para ajustar os parâmetros da estratégia em diferentes condições de mercado
  4. Melhorar a gestão das posições: considerar a implementação de um dimensionamento dinâmico das posições com base na volatilidade do mercado
  5. Adicionar filtros de tempo: incluir filtros de tempo para evitar negociações durante sessões de mercado altamente voláteis

Resumo

Esta estratégia combina ferramentas clássicas de análise técnica com métodos modernos de gestão de risco para construir um sistema de negociação relativamente abrangente. As principais vantagens estão em seu controle de risco rigoroso e mecanismos de entrada flexíveis, enquanto a atenção precisa ser dada às mudanças do ambiente de mercado e à verificação da confiabilidade do sinal em aplicações práticas. Através das direções de otimização sugeridas, há espaço para melhorias adicionais, particularmente nos aspectos de filtragem de sinal e gerenciamento de risco.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-11-26 00:00:00
period: 12h
basePeriod: 12h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Trade Entry Detector, based on Wick to Body Ratio when price tests Bollinger Bands", overlay=true, default_qty_type=strategy.fixed)

// Input for primary analysis time frame
timeFrame = "D"  // Daily time frame

// Bollinger Band settings
length = input.int(20, title="Bollinger Band Length", minval=1)
mult = input.float(2.0, title="Standard Deviation Multiplier", minval=0.1)
source = input(close, title="Source")

// Entry ratio settings
wickToBodyRatio = input.float(1.0, title="Minimum Wick-to-Body Ratio", minval=0)

// Order Fill Timing Option
fillOption = input.string("Daily Close", title="Order Fill Timing", options=["Daily Close", "Daily Open", "HOD", "LOD"])

// Account and risk settings
accountBalance = 100000  // Account balance in dollars
riskPercentage = 1.0     // Risk percentage per trade
riskAmount = (riskPercentage / 100) * accountBalance // Fixed 1% risk amount

// Request daily data for calculations
dailyHigh = request.security(syminfo.tickerid, timeFrame, high)
dailyLow = request.security(syminfo.tickerid, timeFrame, low)
dailyClose = request.security(syminfo.tickerid, timeFrame, close)
dailyOpen = request.security(syminfo.tickerid, timeFrame, open)

// Calculate Bollinger Bands on the daily time frame
dailyBasis = request.security(syminfo.tickerid, timeFrame, ta.sma(source, length))
dailyDev = mult * request.security(syminfo.tickerid, timeFrame, ta.stdev(source, length))
dailyUpperBand = dailyBasis + dailyDev
dailyLowerBand = dailyBasis - dailyDev

// Calculate the body and wick sizes on the daily time frame
dailyBodySize = math.abs(dailyOpen - dailyClose)
dailyUpperWickSize = dailyHigh - math.max(dailyOpen, dailyClose)
dailyLowerWickSize = math.min(dailyOpen, dailyClose) - dailyLow

// Conditions for a candle with an upper wick or lower wick that touches the Bollinger Bands
upperWickCondition = (dailyUpperWickSize / dailyBodySize >= wickToBodyRatio) and (dailyHigh > dailyUpperBand)
lowerWickCondition = (dailyLowerWickSize / dailyBodySize >= wickToBodyRatio) and (dailyLow < dailyLowerBand)

// Define the swing high and swing low for stop loss placement
var float swingLow = na
var float swingHigh = na

if (ta.pivothigh(dailyHigh, 5, 5))
    swingHigh := dailyHigh[5]

if (ta.pivotlow(dailyLow, 5, 5))
    swingLow := dailyLow[5]

// Determine entry price based on chosen fill option
var float longEntryPrice = na
var float shortEntryPrice = na

if lowerWickCondition
    longEntryPrice := fillOption == "Daily Close" ? dailyClose :
                      fillOption == "Daily Open" ? dailyOpen :
                      fillOption == "HOD" ? dailyHigh : dailyLow

if upperWickCondition
    shortEntryPrice := fillOption == "Daily Close" ? dailyClose :
                       fillOption == "Daily Open" ? dailyOpen :
                       fillOption == "HOD" ? dailyHigh : dailyLow

// Execute the long and short entries with expiration
var int longOrderExpiry = na
var int shortOrderExpiry = na

if not na(longEntryPrice)
    longOrderExpiry := bar_index + 2  // Order expires after 2 days

if not na(shortEntryPrice)
    shortOrderExpiry := bar_index + 2  // Order expires after 2 days

// Check expiration and execute orders
if (longEntryPrice and bar_index <= longOrderExpiry and high >= longEntryPrice)
    longStopDistance = close - nz(swingLow, close)
    longPositionSize = longStopDistance > 0 ? riskAmount / longStopDistance : na
    if (not na(longPositionSize))
        strategy.entry("Long", strategy.long, qty=longPositionSize)
    longEntryPrice := na  // Reset after entry

if (shortEntryPrice and bar_index <= shortOrderExpiry and low <= shortEntryPrice)
    shortStopDistance = nz(swingHigh, close) - close
    shortPositionSize = shortStopDistance > 0 ? riskAmount / shortStopDistance : na
    if (not na(shortPositionSize))
        strategy.entry("Short", strategy.short, qty=shortPositionSize)
    shortEntryPrice := na  // Reset after entry

// Exit logic: hit the opposing Bollinger Band
if (strategy.position_size > 0) // Long position
    strategy.exit("Exit Long", "Long", limit=dailyUpperBand)
else if (strategy.position_size < 0) // Short position
    strategy.exit("Exit Short", "Short", limit=dailyLowerBand)

if (strategy.position_size > 0) // Long position
    strategy.exit("Stop Loss Long", "Long", stop=swingLow)
else if (strategy.position_size < 0) // Short position
    strategy.exit("Stop Loss Short", "Short", stop=swingHigh)

// Plot daily Bollinger Bands and levels on the chosen time frame
plot(dailyUpperBand, color=color.blue, linewidth=1, title="Daily Upper Bollinger Band")
plot(dailyLowerBand, color=color.blue, linewidth=1, title="Daily Lower Bollinger Band")
plot(dailyBasis, color=color.gray, linewidth=1, title="Daily Middle Bollinger Band")


Relacionados

Mais.