O recurso está a ser carregado... Carregamento...

Estratégia de faixa de volatilidade suave

Autora:ChaoZhang, Data: 2024-01-29 16:22:14
Tags:

img

Resumo

Esta estratégia gera faixas de preços com base na volatilidade suavizada do preço e produz sinais de negociação quando o preço atravessa as faixas.

Estratégia lógica

A estratégia primeiro calcula a faixa média de volatilidade do preço durante um determinado período, em seguida, suaviza a faixa de volatilidade usando uma média móvel exponencial para gerar volatilidade suavizada. A volatilidade suavizada multiplicada por um coeficiente dá a faixa das faixas. Quando o preço quebra acima da faixa superior, um sinal de compra é gerado. Quando o preço quebra abaixo da faixa inferior, um sinal de venda é gerado.

Especificamente, a volatilidade suavizada smrng é calculada pela função smoothrng. A banda superior hband e a banda inferior lband das faixas de preços são então calculadas com base em smrng. A condição longa longCondition e a condição curta shortCondition são configuradas com base nisso. Quando a longCondition é atendida, um sinal de compra é gerado. Quando a condição curta é atendida, um sinal de venda é gerado.

Análise das vantagens

As vantagens desta estratégia são as seguintes:

  1. Usar a volatilidade dos preços para construir sinais de negociação pode rastrear efetivamente as mudanças do mercado.

  2. A suavização da volatilidade com média móvel exponencial pode filtrar o ruído e gerar sinais de negociação mais confiáveis.

  3. O intervalo de bandas pode ser ajustado através do coeficiente de volatilidade, tornando a estratégia mais flexível.

  4. Combinado com o julgamento de ruptura, pode capturar oportunidades de negociação em tempo hábil quando ocorre uma inversão de tendência.

Análise de riscos

Esta estratégia apresenta também alguns riscos:

  1. Na volatilidade anormal do mercado, a volatilidade suavizada pode não refletir com precisão a volatilidade real, levando a sinais errados.

  2. A configuração incorreta do intervalo de banda pode levar a excesso de negociação ou sinais insuficientes. Diferentes parâmetros podem ser testados para encontrar o intervalo ideal.

  3. Há um atraso de tempo nos sinais de ruptura, o que pode causar entrada prematura ou entrada tardia.

Orientações de otimização

A estratégia pode ser otimizada através de:

  1. Teste de diferentes ciclos de dados de preços para encontrar o período mais adequado para o cálculo da volatilidade.

  2. A tentar diferentes algoritmos de média móvel, como a média móvel ponderada.

  3. Introdução de volume de negociação ou outros indicadores para confirmar sinais de ruptura.

  4. Configuração de stop loss ou trailing stop para controlar as perdas por transação.

  5. Otimizar o coeficiente de volatilidade para determinar a faixa de bandas ideal.

Resumo

A lógica geral desta estratégia é clara, usando a volatilidade dos preços para construir bandas e quebras de preços para gerar sinais de negociação, que podem efetivamente rastrear mudanças de tendência do mercado.


/*backtest
start: 2023-01-22 00:00:00
end: 2024-01-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("1SmSm1 Strategy", shorttitle="1SmSm1", overlay=true)

// Source
src = input(defval=close, title="Source")

// Sampling Period
per = input(defval=100, minval=1, title="Sampling Period")

// Range Multiplier
mult = input(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = (t * 2) - 1
    avrng = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper) * m
    smoothrng

smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
    rngfilt

filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])

downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// Breakouts
longCondition = (src > filt) and (src > src[1]) and (upward > 0)
shortCondition = (src < filt) and (src < src[1]) and (downward > 0)

strategy.entry("Buy", strategy.long, when = longCondition)
strategy.entry("Sell", strategy.short, when = shortCondition)

// Plotting
plot(filt, color=upward > 0 ? color.lime : downward > 0 ? color.red : color.orange, linewidth=3, title="Range Filter")
hbandplot = plot(hband, color=color.aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=color.fuchsia, transp=100, title="Low Target")

// Fills
fill(hbandplot, lbandplot, color=color.aqua, title="Target Range")

// Bar Color
barcolor(longCondition ? color.green : shortCondition ? color.red : na)

// Alerts
alertcondition(longCondition, title="Buy Alert", message="BUY")
alertcondition(shortCondition, title="Sell Alert", message="SELL")

Mais.