Estratégia quantitativa: Bandas de Bollinger RSI Estratégia de cruzamento CCI

Autora:ChaoZhang, Data: 2023-12-20 16:24:49
Tags:

img

Resumo

Esta estratégia combina Bandas de Bollinger, Índice de Força Relativa (RSI) e Índice de Canal de Commodities (CCI) para encontrar sinais cruzados e gerar sinais de compra e venda.

Estratégia lógica

Bandeiras de Bollinger

As bandas de Bollinger consistem em uma banda média, uma banda superior e uma banda inferior. A banda média é geralmente uma média móvel de 20 dias. A banda superior é dois desvios padrão acima da banda média. A banda inferior é dois desvios padrão abaixo. Os preços perto da banda inferior podem indicar uma condição de sobrevenda. Os preços perto da banda superior podem indicar uma condição de sobrecompra.

RSI

O RSI mede a velocidade dos movimentos direcionais de preços para cima e para baixo. Ele mostra sobrecompra acima de 70 e sobrevenda abaixo de 30. Quando o RSI cai acima de 70, pode ser um sinal de venda. Quando o RSI salta acima de 30, pode ser um sinal de compra.

CCI

O CCI mede o quão longe os preços se moveram do preço médio. Leituras acima de +100 implicam uma condição de sobrecompra. Leituras abaixo de -100 implicam uma condição de sobrevenda. O CCI reflete níveis extremos de preços.

Sinais cruzados

Esta estratégia usa Bandas de Bollinger para julgar os níveis de sobrecompra/supervenda de curto prazo, RSI para medir o impulso de alta/baixa e CCI para identificar os extremos de preços.

Vantagens

  1. A combinação de vários indicadores melhora a precisão do sinal e reduz os falsos sinais
  2. Captura oportunidades de reversão em pontos de virada
  3. Parâmetros personalizáveis adaptados às diferentes condições do mercado
  4. O filtro CCI suavizado reduz o ruído e melhora a estabilidade

Riscos e soluções

  1. Todos os três indicadores podem produzir sinais ruins, resultando em perdas.
  2. O CCI luta com mercados agitados, pode substituí-los por médias móveis ou indicadores de volatilidade.
  3. Só pode adicionar paradas de trailers para bloquear alguns lucros.

Oportunidades de otimização

  1. Teste mais combinações de parâmetros para encontrar configuração ideal
  2. Introduzir aprendizado de máquina para ajustar automaticamente parâmetros
  3. Estratégias de captação de lucro com metas de lucro
  4. Incorporar mais indicadores como MACD, KD para validar sinais

Conclusão

Esta estratégia analisa as condições gerais do mercado usando as Bandas de Bollinger, RSI e indicadores CCI. Identifica pontos de inflexão através de sinais de cruzamento para reversões do mercado comercial. Com outras otimizações como ajuste de parâmetros, mecanismos de captação de lucro, etc., pode ser uma estratégia de contra-tendência robusta para vários ambientes de mercado.


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

//@version=5
strategy(shorttitle="BBRSIstr", title="Bollinger Bands", overlay=true)
length = input.int(20, minval=1)
maType = input.string("SMA", "Basis MA Type", options = ["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
src = input(close, title="Source")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev")

ma(source, length, _type) =>
    switch _type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

basis = ma(src, length, maType)
dev = mult * ta.stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input.int(0, "Offset", minval = -500, maxval = 500)
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))

//RSI
rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")
showDivergence = input.bool(false, title="Show Divergence", group="RSI Settings")

up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiMA = ma(rsi, maLengthInput, maTypeInput)
isBB = maTypeInput == "Bollinger Bands"

rsiPlot = plot(rsi, "RSI", color=#7E57C2)
plot(rsiMA, "RSI-based MA", color=color.yellow)
rsiUpperBand = hline(70, "RSI Upper Band", color=#787B86)
midline = hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
rsiLowerBand = hline(30, "RSI Lower Band", color=#787B86)
fill(rsiUpperBand, rsiLowerBand, color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")

//cci
ma = ta.sma(src, length)
cci = (src - ma) / (0.015 * ta.dev(src, length))
plot(cci, "CCI", color=#2962FF)
band1 = hline(100, "Upper Band", color=#787B86, linestyle=hline.style_dashed)
hline(0, "Middle Band", color=color.new(#787B86, 50))
band0 = hline(-100, "Lower Band", color=#787B86, linestyle=hline.style_dashed)
fill(band1, band0, color=color.rgb(33, 150, 243, 90), title="Background")

typeMA = input.string(title = "Method", defval = "SMA", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="Smoothing")
smoothingLength = input.int(title = "Length", defval = 5, minval = 1, maxval = 100, group="Smoothing")

smoothingLine = ma(cci, smoothingLength, typeMA)
plot(smoothingLine, title="Smoothing Line", color=#f37f20, display=display.none)


longCBB= close < lower
shortCBB = close>upper
longBRSI = rsi < 33
shortBRSI = rsi > 70
longcci = cci < -215
shortcci = cci > 250

strategy.entry("LONG", strategy.long, when = longCBB and longBRSI and longcci)
strategy.exit("Exit ", profit = 600)
strategy.entry("SHORT", strategy.short, when = shortCBB and shortBRSI and shortcci)
strategy.exit("Exit ", profit = 600)

Mais.