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.
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.
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")