Estratégia de negociação de curto prazo de compra e venda de filtro de intervalo


Data de criação: 2023-09-21 21:17:40 última modificação: 2023-09-21 21:17:40
cópia: 0 Cliques: 854
1
focar em
1617
Seguidores

Visão geral

Esta estratégia baseia-se na variação do preço para determinar a hora de comprar e vender. Ela calcula a variação do preço em um determinado período e gera um sinal de negociação com essa variação como condição de filtragem.

Princípio da estratégia

O indicador central da estratégia é a amplitude de flutuação dos preços.

  1. Calcula a diferença entre o preço mais alto e o preço mais baixo nos últimos N ciclos como um aumento de preço

  2. A amplitude de preços é tratada de forma linear e obtém um filtro de alcance.

  3. Quando o aumento do preço excede o filtro de alcance, gera um sinal de compra

  4. Produz um sinal de venda quando o preço cai acima do filtro de alcance

Desta forma, pode-se usar a ruptura de preços para determinar a direção da tendência, filtrar o ruído da negociação e obter um sinal de negociação mais claro.

Vantagens estratégicas

  • Usando a escala de preços, é mais fácil de avaliar as rupturas
  • Processamento de fluxo de fluxo suave, filtração de ruído eficaz
  • Sinais de ruptura, fáceis de capturar tendências de linha curta
  • Frequência de transação mais alta, adequada para operações de linha curta
  • Parâmetros ajustáveis, fácil de otimizar para diferentes variedades

Risco estratégico

  • A ruptura da faixa é suscetível a uma reversão acelerada
  • Requer um alcance de cálculo de dados históricos mais longo
  • Parâmetros mal definidos podem ser muito sensíveis ou lentos
  • Não há controle efetivo sobre o stop loss e há um grande recuo
  • Efeitos podem ser afetados por taxas de transação

As medidas a seguir podem reduzir o risco:

  • Coeficiente de flutuação de filtragem de amplitude apropriada
  • Parâmetros de otimização para encontrar a melhor combinação de parâmetros
  • Parar a linha de paragem ou paragem móvel
  • Reduzir adequadamente a frequência de transações e reduzir as taxas de transação
  • Parâmetros de teste de acordo com as diferentes variedades

Direção de otimização

A estratégia pode ser melhorada em vários aspectos:

  1. Parâmetros de diferentes períodos para a gama de cálculos do teste

  2. Coeficiente de flutuação do filtro de alcance optimizado

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

  4. Usar Stop Loss móvel ou Stop Loss tracking

  5. Parâmetros de ajuste variam de acordo com a variedade

  6. Considere otimizar o seu sistema de gestão de posições

Resumir

A estratégia utiliza o intervalo de ruptura de preços para produzir sinais de negociação de curta linha. Isso permite identificar oportunidades de tendências de curto prazo. Mas também é propenso a riscos de reversão. Podemos melhorar o sistema de estratégia por meio de métodos como otimização de parâmetros, configuração de regras de stop loss, adição de filtros de indicadores, etc.

Código-fonte da estratégia
/*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)