Estratégia de filtragem de sinal de compra e venda com base na faixa de flutuação de preço


Data de criação: 2024-03-08 17:06:50 última modificação: 2024-03-08 17:06:50
cópia: 2 Cliques: 1110
1
focar em
1617
Seguidores

Estratégia de filtragem de sinal de compra e venda com base na faixa de flutuação de preço

Visão geral

A estratégia de filtragem de sinais de compra e venda baseada em intervalos de flutuação de preços é uma estratégia de negociação quantitativa muito prática. Utiliza os intervalos de flutuação de preços para filtrar os sinais de compra e venda, reduzindo os falsos sinais em mercados de baixa flutuação e aumentando a qualidade do sinal em mercados de alta flutuação.

Princípio da estratégia

A estratégia primeiro calcula a amplitude de flutuação dos preços dos ativos em um determinado período. Concretamente, ela calcula a diferença entre os preços mais altos e mais baixos em um determinado período para determinar a amplitude da flutuação dos preços.

Em seguida, ele gera sinais de compra e venda. No entanto, nem todos os sinais são acionados, mas sim os que precisam atender às condições de filtragem da faixa de flutuação do preço. Por exemplo, um sinal de compra só é emitido quando o preço quebra a faixa de flutuação.

Dessa forma, a estratégia pode filtrar a maioria dos falsos sinais em ambientes de mercado de baixa volatilidade, evitando entradas desnecessárias. Em ambientes de alta volatilidade, ela pode capturar movimentos de maior direção e lucrar com eles.

Vantagens estratégicas

A maior vantagem desta estratégia é que pode ajustar dinamicamente a intensidade de filtragem dos sinais. Em situações de baixa volatilidade, ele escolhe apenas sinais de alta qualidade; e em situações de alta volatilidade, ele pode aproveitar mais oportunidades oferecidas pelo mercado.

A estratégia é mais inteligente e adaptável do que um filtro de parâmetros fixos. Ela oferece um retorno de risco superior, independentemente do estado do mercado.

Além disso, a estratégia combina o discernimento da direção da tendência, proporcionando um sinal de negociação mais confiável do que uma única condição de operação. Ao mesmo tempo, ela também possui uma função de parada de prejuízos que permite controlar o risco de negociações individuais.

Risco estratégico

O principal risco da estratégia é a definição de um parâmetro de amplitude de flutuação. Se o alcance for muito grande ou muito pequeno, isso afetará negativamente a qualidade do sinal e as oportunidades de lucratividade.

Além disso, em mercados onde os preços tendem a flutuar a curto prazo, a oportunidade de lucro da estratégia é relativamente menor. A combinação de diferentes sistemas de ciclo pode ajudar a mitigar este problema.

Direção de otimização da estratégia

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

  1. Utilizando algoritmos de parâmetros adaptativos para otimizar automaticamente os parâmetros do intervalo de variação, tornando-o mais inteligente e dinâmico.

  2. Aumentar as regras de filtragem baseadas em tendências de grandes ciclos, evitando que os mercados se encaixem em turbulências.

  3. Esta estratégia, combinada com diferentes ciclos, forma um sistema que aumenta a estabilidade do conjunto.

  4. Adição de algoritmos de aprendizagem de máquina para melhorar a configuração de parâmetros e o efeito das regras de filtragem.

Resumir

A estratégia de filtragem de sinais de compra e venda com base no intervalo de flutuação de preços é uma estratégia de negociação quantitativa muito prática e eficaz. Ela pode ajustar dinamicamente a intensidade de filtragem e oferecer um retorno de risco excelente em diferentes ambientes de mercado.

Código-fonte da estratégia
/*backtest
start: 2023-03-02 00:00:00
end: 2024-03-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=5
strategy(title='Range Filter - B&S Signals', shorttitle='[Doan]_RF-B&S Signals', overlay=true)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longLossPerc = input.float(title='Long Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01
shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01

longTakePerc = input.float(title='Long Take(%)', minval=0.0, step=0.1, defval=1) * 0.01
shortTakePerc = input.float(title='Short Take (%)', minval=0.0, step=0.1, defval=1) * 0.01

emaLength = input.int(200, title="EMA Length")

// Determine stop loss price

//Range Size Function
rng_size(x, qty, n) =>
    wper = n * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), n)
    AC = ta.ema(avrng, wper) * qty
    rng_size = AC

//Range Filter Function
rng_filt(x, rng_, n) =>
    r = rng_
    var rfilt = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)

    hi_band = rng_filt1 + r
    lo_band = rng_filt1 - r
    rng_filt = rng_filt1
    [hi_band, lo_band, rng_filt]

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, title='Swing Source')

//Range Period
rng_per = input.int(defval=20, minval=1, title='Swing Period')

//Range Size Inputs
rng_qty = input.float(defval=3.5, minval=0.0000001, title='Swing Multiplier')

//Bar Colors
use_barcolor = input(defval=false, title='Bar Colors On/Off')

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward = fdir == 1 ? 1 : 0
downward = fdir == -1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_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

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color = upward and rng_src > filt ? rng_src > rng_src[1] ? #05ff9b : #00b36b : downward and rng_src < filt ? rng_src < rng_src[1] ? #ff0583 : #b8005d : #cccccc


ema = ta.ema(close, emaLength)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longStopPrice = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)

longTakePrice = strategy.position_avg_price * (1 + longTakePerc)
shortTakePrice = strategy.position_avg_price * (1 - shortTakePerc)

//Filter Plot
filt_plot = plot(filt, color=filt_color, linewidth=3, title='Filter', transp=67)

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title='High Band')
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title='Low Band')

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title='High Band Fill')
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title='Low Band Fill')

//Bar Color
barcolor(use_barcolor ? bar_color : na)
// Entry
strategy.entry("Long", strategy.long, when=longCondition)
strategy.entry("Short", strategy.short, when=shortCondition)

plot(ema)

//Plot Buy and Sell Labels
plotshape(longCondition, title='Buy Signal', text='BUY', textcolor=color.white, style=shape.labelup, size=size.normal, location=location.belowbar, color=color.new(color.green, 0))
plotshape(shortCondition, title='Sell Signal', text='SELL', textcolor=color.white, style=shape.labeldown, size=size.normal, location=location.abovebar, color=color.new(color.red, 0))

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