Estratégia de tendência gradual do BB KC

Autora:ChaoZhang, Data: 2024-01-26 15:10:41
Tags:

img

Resumo

Esta estratégia usa uma combinação de Bollinger Bands e sinais do canal de Keltner para identificar tendências de mercado. Bollinger Bands é uma ferramenta de análise técnica que define canais com base em intervalos de volatilidade de preços. O sinal do canal de Keltner combina volatilidade de preços e tendências para determinar níveis de suporte ou resistência. Esta estratégia utiliza as vantagens de ambos os indicadores, julgando se ocorre uma cruz de ouro entre as bandas de Bollinger e os canais de Keltner para encontrar oportunidades longas e curtas.

Princípios de estratégia

  1. Calcule as Bandas de Bollinger do meio, superior e inferior em 20 períodos.
  2. Calcule os canais Keltner intermediários, superiores e inferiores em 20 períodos.
  3. Quando a linha superior do canal de Keltner cruzar acima da linha superior da banda de Bollinger e o volume for maior que a sua média móvel de 10 períodos, vá longo.
  4. Quando a linha inferior do canal de Keltner cruzar abaixo da linha inferior da banda de Bollinger e o volume for maior que a sua média móvel de 10 períodos, vá curto.
  5. Fechar todas as posições se não se activarem sinais de saída após 20 bares desde a entrada.
  6. Defina um stop loss de 1,5% para transações longas e um stop loss de -1,5% para transações curtas.

Esta estratégia depende principalmente das bandas de Bollinger para julgar os intervalos de volatilidade e o momento. O canal de Keltner serve como uma ferramenta de verificação devido às suas características semelhantes, mas diferentes parâmetros.

Análise da força

  1. Utiliza as vantagens combinadas das bandas de Bollinger e dos canais de Keltner para melhorar a precisão do sinal.
  2. A filtragem por volume de negociação reduz os sinais inválidos de toques frequentes de linha.
  3. Controle eficaz do risco através de mecanismos de stop loss e trailing stop programados.
  4. Saidas rápidas e perdas limitadas de lucros forçados após sinais inválidos.

Análise de riscos

  1. Tanto as Bandas de Bollinger quanto os Canais de Keltner são baseados em médias móveis e volatilidade.
  2. A ausência de um mecanismo de composição significa que várias paradas podem levar a perdas excessivas.
  3. Os sinais de reversão ocorrem com frequência. Os ajustes de parâmetros podem causar oportunidades de tendência a serem perdidas.

A ampliação dos intervalos de stop loss ou a adição de indicadores de confirmação como o MACD podem reduzir os riscos de falsos sinais.

Orientações de otimização

  1. Impactos dos parâmetros de ensaio no retorno da estratégia, como comprimentos, múltiplos do desvio padrão, etc.
  2. Adicionar outros indicadores para confirmação do sinal, por exemplo, KDJ, MACD.
  3. Usar machine learning para otimização automática de parâmetros.

Resumo

Esta estratégia combina Bandas de Bollinger e Canais de Keltner para identificar tendências, verificadas pelo volume de negociação.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © jensenvilhelm

//@version=5
strategy("BB and KC Strategy", overlay=true)

// Define the input parameters for the strategy, these can be changed by the user to adjust the strategy
kcLength = input.int(20, "KC Length", minval=1) // Length for Keltner Channel calculation
kcStdDev = input.float(2.2, "KC StdDev") // Standard Deviation for Keltner Channel calculation
bbLength = input.int(20, "BB Length", minval=1) // Length for Bollinger Bands calculation
bbStdDev = input.float(2, "BB StdDev") // Standard Deviation for Bollinger Bands calculation
volumeLength = input.int(10, "Volume MA Length", minval=1) // Length for moving average of volume calculation
stopLossPercent = input.float(1.5, "Stop Loss (%)") // Percent of price for Stop loss 
trailStopPercent = input.float(2, "Trail Stop (%)") // Percent of price for Trailing Stop
barsInTrade = input.int(20, "Bars in trade before exit", minval = 1) // Minimum number of bars in trade before considering exit

// Calculate Bollinger Bands and Keltner Channel
[bb_middle, bb_upper, bb_lower] = ta.bb(close, bbLength, bbStdDev) // Bollinger Bands calculation
[kc_middle, kc_upper, kc_lower] = ta.kc(close, kcLength, kcStdDev) // Keltner Channel calculation

// Calculate moving average of volume
vol_ma = ta.sma(volume, volumeLength) // Moving average of volume calculation

// Plotting Bollinger Bands and Keltner Channels on the chart
plot(bb_upper, color=color.red) // Bollinger Bands upper line
plot(bb_middle, color=color.blue) // Bollinger Bands middle line
plot(bb_lower, color=color.red) // Bollinger Bands lower line
plot(kc_upper, color=color.rgb(105, 255, 82)) // Keltner Channel upper line
plot(kc_middle, color=color.blue) // Keltner Channel middle line
plot(kc_lower, color=color.rgb(105, 255, 82)) // Keltner Channel lower line

// Define entry conditions: long position if upper KC line crosses above upper BB line and volume is above MA of volume
// and short position if lower KC line crosses below lower BB line and volume is above MA of volume
longCond = ta.crossover(kc_upper, bb_upper) and volume > vol_ma // Entry condition for long position
shortCond = ta.crossunder(kc_lower, bb_lower) and volume > vol_ma // Entry condition for short position

// Define variables to store entry price and bar counter at entry point
var float entry_price = na // variable to store entry price
var int bar_counter = na // variable to store bar counter at entry point

// Check entry conditions and if met, open long or short position
if (longCond)
    strategy.entry("Buy", strategy.long) // Open long position
    entry_price := close // Store entry price
    bar_counter := 1 // Start bar counter
if (shortCond)
    strategy.entry("Sell", strategy.short) // Open short position
    entry_price := close // Store entry price
    bar_counter := 1 // Start bar counter

// If in a position and bar counter is not na, increment bar counter
if (strategy.position_size != 0 and na(bar_counter) == false)
    bar_counter := bar_counter + 1 // Increment bar counter

// Define exit conditions: close position if been in trade for more than specified bars
// or if price drops by more than specified percent for long or rises by more than specified percent for short
if (bar_counter > barsInTrade) // Only consider exit after minimum bars in trade
    if (bar_counter >= barsInTrade)
        strategy.close_all() // Close all positions
    // Stop loss and trailing stop
    if (strategy.position_size > 0)
        strategy.exit("Sell", "Buy", stop=entry_price * (1 - stopLossPercent/100), trail_points=entry_price * trailStopPercent/100) // Set stop loss and trailing stop for long position
    else if (strategy.position_size < 0)
        strategy.exit("Buy", "Sell", stop=entry_price * (1 + stopLossPercent/100), trail_points=entry_price * trailStopPercent/100) // Set stop loss and trailing stop for short position


Mais.