Estratégia de tendência de oscilação de reversão das bandas de Bollinger

Autora:ChaoZhang, Data: 2023-10-31 14:30:45
Tags:

img

Resumo

Esta é uma estratégia de tendência de oscilação de reversão baseada no canal de Bollinger Bands.

Estratégia lógica

A estratégia usa Bandas de Bollinger como principal indicador técnico. Bandas de Bollinger consistem em média móvel de n períodos e desvio de bandas superior/inferior. Banda superior = MA de n períodos + m * desvio padrão de n períodos, banda inferior = MA de n períodos - m * desvio padrão de n períodos. n e m são parâmetros.

Quando o preço se aproxima da faixa superior, ele indica uma tendência de alta, mas pode reverter no pico. Quando o preço se aproxima da faixa inferior, ele indica uma tendência de queda, mas pode reverter na parte inferior.

As regras específicas de negociação são:

  1. Vai longo quando perto > banda superior, vai curto quando perto < banda inferior.

  2. Usar média móvel de n períodos como sinal de captação de lucro e stop loss. Fechar longo quando fechar breaks abaixo de MA, fechar curto quando fechar breaks acima de MA.

  3. Utilize uma quantidade fixa para cada transacção.

  4. Aumentar o tamanho da posição por valor fixo quando se atende ao rácio de lucro fixo, diminuir o tamanho quando se perde.

Análise das vantagens

As vantagens desta estratégia:

  1. Usar o canal de Bandas de Bollinger para determinar a direção da tendência e inversões de negociação, evita a maioria dos whipsaws e melhora a taxa de vitória.

  2. A média móvel é um sinal confiável de tomada de lucro/stop loss, bloqueia a maioria dos lucros.

  3. A quantidade fixa é simples e fácil de implementar, sem necessidade de cálculos complexos.

  4. O dimensionamento fracionário fixo da posição aumenta os lucros enquanto controla o risco através do ajuste da posição.

Análise de riscos

Os riscos desta estratégia:

  1. As Bandas de Bollinger podem gerar sinais incorretos, causando perdas na negociação contra a tendência.

  2. O atraso da média móvel pode conduzir a um lucro insuficiente.

  3. A quantidade fixa não pode adaptar-se às condições de mercado, existem riscos de sobre/subdimensionamento das posições.

  4. O ajustamento agressivo do tamanho da posição no método fracionário fixo pode aumentar as perdas.

Soluções: Otimize os parâmetros das Bandas de Bollinger para melhorar a precisão do sinal. Adicione outros indicadores para determinar a tendência. Reduzir o tamanho da quantidade fixa. Reduzir a taxa de ajuste do tamanho da posição no método de dimensionamento de posição fracionário.

Orientações para melhorias

A estratégia pode ser melhorada pelos seguintes aspectos:

  1. Otimize os parâmetros das bandas de Bollinger como n e m para aumentar a precisão.

  2. Adicione outros indicadores como MACD, KD para evitar sinais errados.

  3. Alteração da quantidade fixa para o posicionamento dinâmico com base nas condições de mercado.

  4. Relação de ajustamento de dimensionamento de posição mais baixa no dimensionamento de posição fracionário para curva equitativa suave.

  5. Adicione estratégias de stop loss como stop loss em movimento, stop loss de fuga para controlar o risco.

  6. Optimização de parâmetros para encontrar combinações ótimas de parâmetros.

Resumo

Em resumo, esta é uma estratégia típica de reversão de Bollinger Bands. Identifica pontos de reversão por Bollinger Bands, define a tomada de lucro / parada de perda por média móvel, controla o risco por quantidade fixa e dimensionamento de posição fracionário. Como uma estratégia de reversão, teoricamente evita alguns problemas e melhora a lucratividade em comparação com as estratégias tradicionais de Bollinger Bands. No entanto, falhas em Bollinger Bands, médias móveis exigem mais otimização e gerenciamento de risco para aplicação prática robusta.


/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
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/
// © gsanson66


//This strategy uses the well-known Bollinger Bands Indicator
//@version=5
strategy("BOLLINGER BANDS BACKTESTING", shorttitle="BB BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18)


//----------------------------------------FUNCTIONS---------------------------------------//

//@function Displays text passed to `txt` when called.
debugLabel(txt, color) =>
    label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//---------------------------------------USER INPUTS--------------------------------------//

//Technical parameters
bbLength = input.int(defval=20, minval=1, title="BB Length", group="Technical Parameters")
mult = input.float(defval=2, minval=0.1, title="Standard Deviation Multipler", group="Technical Parameters")
smaLength = input.int(defval=20, minval=1, title="SMA Exit Signal Length", group="Technical Parameters")
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2020 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")


//----------------------------------VARIABLES INITIALISATION-----------------------------//
strategy.initial_capital = 50000
//Exit SMA
smaExit = ta.sma(close, smaLength)
//BB Calculation
basis = ta.sma(close, bbLength)
dev = mult * ta.stdev(close, bbLength)
upperBB = basis + dev
lowerBB = basis - dev
//Money management
equity = strategy.equity - strategy.openprofit
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95
//Backtesting period
bool inRange = na


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    strategy.close_all()
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116))


//-----------------------------------EXIT SIGNAL------------------------------//

if strategy.position_size > 0 and close < smaExit
    strategy.close("Long")
if strategy.position_size < 0 and close > smaExit
    strategy.close("Short")


//----------------------------------LONG/SHORT CONDITION---------------------------//

//Long Condition
if close > upperBB and inRange
    qty = cashOrder/close
    strategy.entry("Long", strategy.long, qty)
//Short Condition
if close < lowerBB and inRange
    qty = cashOrder/close
    strategy.entry("Short", strategy.short, qty)


//---------------------------------PLOTTING ELEMENT----------------------------------//

plot(smaExit, color=color.orange)
upperBBPlot = plot(upperBB, color=color.blue)
lowerBBPlot = plot(lowerBB, color=color.blue)
fill(upperBBPlot, lowerBBPlot, title = "Background", color=strategy.position_size>0 ? color.rgb(0, 255, 0, 90) : strategy.position_size<0 ? color.rgb(255, 0, 0, 90) : color.rgb(33, 150, 243, 95))


Mais.