Estratégia de compressão de impulso de média móvel dupla

Autora:ChaoZhang, Data: 2023-12-25 17:01:28
Tags:

img

Resumo

Esta estratégia combina três indicadores técnicos diferentes e gera sinais de negociação utilizando um sistema de média móvel dupla, com filtros adicionais com base na cor e no corpo dos candelabros, para construir uma estratégia de negociação relativamente estável e eficaz a curto prazo.

Estratégia lógica

A estratégia usa Bandas de Bollinger e canais de KC em combinação para identificar as fases de compressão e expansão no mercado. Especificamente, quando as Bandas de Bollinger estão dentro do canal de KC, é considerada compressão; quando as Bandas de Bollinger atravessam o canal de KC, é considerada expansão. A compressão representa volatilidade intensificada e possível inversão de tendência, e a regressão linear é usada como o principal indicador de sinal de negociação neste momento.

Se o histograma de regressão linear for positivo (representando uma tendência ascendente) e a barra for um candelabro vermelho (representando um fechamento inferior), ao mesmo tempo em que o corpo do candelabro é maior que 1/3 do corpo médio dos últimos 30 candelabros, tal sinal de combinação vai longo.

A estratégia também fornece uma visualização do contexto de compressão e expansão para ajudar a julgar a fase do mercado.

Análise das vantagens

  • Usando vários indicadores para combinação pode efetivamente filtrar falsos sinais
  • A compressão representa pontos de reversão potenciais e melhora o desempenho da estratégia
  • O filtro corporal evita ser enganado por pequenas ondas de falsos surtos
  • Fácil de obter melhores resultados através da otimização de parâmetros

Análise de riscos

  • Regressão linear pode facilmente emitir sinais errados, o que pode levar a perdas
  • O efeito das bandas de Bollinger e dos canais KC para julgar a compressão não é ideal
  • Critérios de filtragem demasiado rigorosos, possivelmente sem melhores pontos de entrada
  • As reduções podem ser maiores, devem suportar um certo grau de tolerância

Os riscos podem ser reduzidos ajustando os parâmetros dos indicadores, otimizando os critérios de filtragem, etc.

Orientações de otimização

A estratégia pode ser otimizada nos seguintes aspectos:

  1. Tente diferentes combinações de parâmetros e comprimentos para encontrar os parâmetros ideais
  2. Aumentar ou diminuir as condições de filtragem para encontrar o nível de filtragem ideal
  3. Usar métodos de aprendizagem de máquina para encontrar automaticamente parâmetros ideais
  4. Efeitos dos ensaios em variedades específicas e ajuste dos parâmetros de acordo com as diferentes variedades
  5. Adicionar estratégia de stop loss para controlar perdas únicas

Conclusão

Esta estratégia combina múltiplos indicadores, ao mesmo tempo em que identifica oportunidades de compressão, aumenta as condições de filtragem para formar uma estratégia de curto prazo relativamente robusta e eficiente.


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

//Noro
//2017

//@version=2
strategy(shorttitle = "Squeeze str 1.0", title="Noro's Squeeze Momentum Strategy v1.0", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
length = input(20, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
useTrueRange = true
usecolor = input(true, defval = true, title = "Use color of candle")
usebody = input(true, defval = true, title = "Use EMA Body")
needbg = input(false, defval = false, title = "Show trend background")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

bcolor = iff( val > 0, iff( val > nz(val[1]), lime, green), iff( val < nz(val[1]), red, maroon))
scolor = noSqz ? blue : sqzOn ? black : gray 

trend = val > 0 ? 1 : val < 0 ? -1 : 0

//Background
col = needbg == false ? na : trend == 1 ? lime : red
bgcolor(col, transp = 80)

//EMA Body
body = abs(close - open)
emabody = ema(body, 30) / 3

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
up = trend == 1 and (bar == -1 or usecolor == false) and (body > emabody or usebody == false)
dn = trend == -1 and (bar == 1 or usecolor == false) and (body > emabody or usebody == false)

if up
    strategy.entry("Long", strategy.long)

if dn
    strategy.entry("Short", strategy.short)

Mais.