Estratégia de negociação de curto prazo de ruptura do filtro de intervalo

Autora:ChaoZhang, Data: 21 de setembro de 2023 21:17:40
Tags:

Resumo

Esta estratégia de negociação de curto prazo gera sinais de compra e venda com base na faixa de flutuação de preços. Ele calcula a faixa de movimento de preços ao longo de um período e usa isso como um filtro para sinais comerciais. Os sinais são acionados quando o preço sai da faixa.

Estratégia lógica

O indicador central é a faixa de flutuação dos preços.

  1. Calcular o intervalo alto-baixo ao longo dos últimos N períodos como a amplitude de preço

  2. Suavizar a amplitude usando médias móveis para derivar o filtro de faixa

  3. Um sinal de compra é gerado quando o preço sobe acima do filtro do intervalo

  4. Um sinal de venda é gerado quando o preço cai abaixo do filtro do intervalo

Desta forma, as rupturas da faixa de preços são usadas para determinar a direção da tendência e filtrar o ruído para sinais mais limpos.

Vantagens

  • Intervalo de preços fácil de avaliar
  • A gama suavizada filtra eficazmente o ruído
  • Os sinais de ruptura detectam tendências de curto prazo
  • Frequência de negociação mais elevada adequada para operações de curto prazo
  • Parâmetros ajustáveis fáceis de otimizar

Riscos

  • Fugas de alcance propensas a arremessos
  • Precisa de dados históricos suficientes para calcular o alcance
  • Os parâmetros ruins causam hipersensibilidade ou lentitude.
  • Não há paradas eficazes, grandes saques
  • Desempenho afectado pelas taxas devido à alta frequência

Os riscos podem ser mitigados por:

  • Coeficiente de volatilidade do filtro do intervalo de relaxamento
  • Optimização de parâmetros para configurações ideais
  • Implementação de paralisações de perda ou paralisações de atraso
  • Reduzir a frequência das trocas para reduzir as taxas
  • Ensaios de parâmetros específicos do produto

Orientações para a melhoria

A estratégia pode ser melhorada:

  1. Ensaios de diferentes períodos de cálculo do intervalo

  2. Optimização do coeficiente de volatilidade do filtro de intervalo

  3. Adição de indicadores de confirmação como o MACD

  4. Utilização de paradas em movimento ou traseiras

  5. Parâmetros de regulação específicos para cada produto

  6. Otimização do sistema de dimensionamento de posição

Resumo

Esta estratégia usa a quebra de preços para gerar sinais de curto prazo, capturando efetivamente tendências temporárias. Mas existem riscos como whipssaws. Melhorias podem ser feitas por meio de otimização de parâmetros, stop losses, adição de filtros etc. para controlar riscos, mantendo a eficácia.


/*backtest
start: 2023-08-21 00:00:00
end: 2023-09-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Range Filter Buy and Sell 5min [Strategy]", overlay=true, commission_type=strategy.commission.percent, commission_value=0.025, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, slippage=0)

// === INPUT BACKTEST RANGE ===
useDate = input(true,     title='---------------- Use Date ----------------', type=bool)
FromMonth = input(defval = 7, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 25, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true  // create function "within window of time"
// === INPUT BACKTEST RANGE ===


sources = input(defval=close, title="Source")
isHA = input(false, "Use HA Candles", bool)
src = isHA ? security(heikenashi(tickerid), period, sources) : sources
// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters

per = input(defval=50, 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

// Colors

filtcolor = upward > 0 ? lime : downward > 0 ? red : orange
barcolor  = (src > filt) and (src > src[1]) and (upward > 0) ? lime : (src > filt) and (src < src[1]) and (upward > 0) ? green : 
   (src < filt) and (src < src[1]) and (downward > 0) ? red : (src < filt) and (src > src[1]) and (downward > 0) ? maroon : orange

filtplot = plot(filt, color=filtcolor, linewidth=3, title="Range Filter")

// Target

hbandplot = plot(hband, color=aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=fuchsia, transp=100, title="Low Target")

// Fills

fill(hbandplot, filtplot, color=aqua, title="High Target Range")
fill(lbandplot, filtplot, color=fuchsia, title="Low Target Range")

// Bar Color

//barcolor(barcolor)

// Break Outs 

longCond = na
shortCond = na
longCond := ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0)) 
shortCond := ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > src[1]) and (downward > 0))

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Alerts

plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = white, style=shape.labelup, size = size.normal, location=location.belowbar, color = green, transp = 0)
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = red, transp = 0)

//strategy.entry("Long", strategy.long, stop = hband, when = window() , comment="Long")
//strategy.entry("Short", strategy.short, stop = lband, when = window() , comment="Short")

strategy.entry("Long", strategy.long, when = longCondition and window() , comment="Long")
strategy.entry("Short", strategy.short, when = shortCondition and window() , comment="Short")



// === Stop LOSS ===
useStopLoss = input(false, title='----- Use Stop Loss / Take profit -----', type=bool)
sl_inp = input(100, title='Stop Loss %', type=float, step=0.25)/100
tp_inp = input(1.5, title='Take Profit %', type=float, step=0.25)/100
stop_level = strategy.position_avg_price * (1 - sl_inp)
take_level = strategy.position_avg_price * (1 + tp_inp)
stop_level_short = strategy.position_avg_price * (1 + sl_inp)
take_level_short = strategy.position_avg_price * (1 - tp_inp)
// === Stop LOSS ===

if useStopLoss
    strategy.exit("Stop Loss/Profit Long","Long", stop=stop_level, limit=take_level)
    strategy.exit("Stop Loss/Profit Short","Short", stop=stop_level_short, limit=take_level_short)


Mais.