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.
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.
As vantagens desta estratégia são as seguintes:
Usar a volatilidade dos preços para construir sinais de negociação pode rastrear efetivamente as mudanças do mercado.
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.
O intervalo de bandas pode ser ajustado através do coeficiente de volatilidade, tornando a estratégia mais flexível.
Combinado com o julgamento de ruptura, pode capturar oportunidades de negociação em tempo hábil quando ocorre uma inversão de tendência.
Esta estratégia apresenta também alguns riscos:
Na volatilidade anormal do mercado, a volatilidade suavizada pode não refletir com precisão a volatilidade real, levando a sinais errados.
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.
Há um atraso de tempo nos sinais de ruptura, o que pode causar entrada prematura ou entrada tardia.
A estratégia pode ser otimizada através de:
Teste de diferentes ciclos de dados de preços para encontrar o período mais adequado para o cálculo da volatilidade.
A tentar diferentes algoritmos de média móvel, como a média móvel ponderada.
Introdução de volume de negociação ou outros indicadores para confirmar sinais de ruptura.
Configuração de stop loss ou trailing stop para controlar as perdas por transação.
Otimizar o coeficiente de volatilidade para determinar a faixa de bandas ideal.
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")