Estratégia de filtro de média móvel dupla de rompimento de tendência


Data de criação: 2023-11-27 17:03:08 última modificação: 2023-11-27 17:03:08
cópia: 0 Cliques: 689
1
focar em
1617
Seguidores

Estratégia de filtro de média móvel dupla de rompimento de tendência

Visão geral

É uma estratégia que utiliza a linha de equilíbrio e o canal de Brin para determinar a tendência, combinando a filtragem e o princípio de parada de ruptura. Pode capturar sinais em tempo hábil quando a tendência muda, reduzindo os sinais errôneos através da filtragem de linha de equilíbrio dupla e configurando paradas para controlar o risco.

Princípio da estratégia

A estratégia é composta por:

  1. Determinação de tendências: Use o MACD para determinar as tendências de preços, distinguindo as tendências de cabeça e cabeça.

  2. Filtragem de alcance: usa o canal de Brin para determinar o alcance das flutuações de preços e filtra os sinais que não ultrapassam o alcance.

  3. Confirmação de dupla linha de equilíbrio: dupla linha de equilíbrio composta por EMA rápido e EMA lento, usada para confirmar um sinal de tendência. Um sinal de compra só é gerado quando há EMA rápido> EMA lento.

  4. Mecanismo de parada de perda: define um ponto de parada de perda, que é o ponto de parada de liquidação quando o preço quebra o ponto de parada de perda na direção negativa.

A lógica de julgamento do sinal de entrada é:

  1. O MACD é considerado uma tendência ascendente.
  2. Preços de passagem no Canal de Brin
  3. EMA rápido acima do EMA lento

Quando as três condições acima são simultaneamente satisfeitas, um sinal de compra é gerado.

A lógica de equilíbrio é dividida em dois tipos, o equilíbrio de parada e o equilíbrio de parada. O ponto de parada é o preço de entrada multiplicado por uma certa proporção, e o ponto de parada é o preço de entrada multiplicado por uma certa proporção.

Análise de vantagens

A estratégia tem as seguintes vantagens:

  1. O Google Analytics é uma ferramenta de pesquisa de tendências que permite capturar mudanças de tendências em tempo real, com menos traceback.
  2. Melhorar a qualidade do sinal através da filtragem de sinais de erro em linha dupla.
  3. O mecanismo de parada de prejuízos é eficaz no controle de perdas individuais.
  4. Os parâmetros de otimização são grandes e podem ser ajustados para o melhor estado.

Análise de Riscos

A estratégia também apresenta alguns riscos:

  1. Um sinal de erro produzido durante um tremor pode causar danos.
  2. A configuração inadequada do ponto de parada pode causar perdas desnecessárias.
  3. Os parâmetros errados podem levar a uma estratégia pouco eficaz.

Os riscos podem ser otimizados e melhorados por meio de parâmetros de otimização, ajuste de posição de parada, etc.

Direção de otimização

A estratégia pode ser otimizada em várias direções:

  1. Ajustar o comprimento da linha de dupla média para encontrar a melhor combinação de parâmetros.
  2. Teste diferentes métodos de parada de danos, como parada de rastreamento, parada de vibração, etc.
  3. Teste de um parâmetro MACD para encontrar o melhor parâmetro.
  4. Otimizar automaticamente os parâmetros usando aprendizado de máquina.
  5. Adição de sinais de filtragem condicional adicional.

O melhor estado da estratégia pode ser encontrado testando diferentes configurações de parâmetros, avaliando a taxa de retorno e a taxa de Sharpe.

Resumir

Trata-se de uma estratégia quantitativa que utiliza o discernimento de tendências, o filtro de alcance, a confirmação de dupla equilíbrio e o pensamento de parada. É capaz de determinar a direção da tendência de forma eficaz e encontrar o equilíbrio entre a maximização de lucros e o controle de riscos.

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

//@version=5
strategy(title="Range Filter Buy and Sell Strategies", shorttitle="Range Filter Strategies", overlay=true,pyramiding = 5)

// Original Script > @DonovanWall
// Adapted Version > @guikroth
// 
// Updated PineScript to version 5
// Republished by > @tvenn
// Strategizing by > @RonLeigh
//////////////////////////////////////////////////////////////////////////
// Settings for 5min chart, BTCUSDC. For Other coin, change the parameters
//////////////////////////////////////////////////////////////////////////



SS = input.bool(false,"Percentage Take Profit Stop Loss")


longProfitPerc = input.float(title='LongProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortProfitPerc = input.float(title='ShortProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


longLossPerc = input.float(title='LongStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortLossPerc = input.float(title='ShortStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


// Color variables
upColor   = color.white
midColor  = #90bff9
downColor = color.blue

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

// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters
per = input.int(defval=100, minval=1, title="Sampling Period")

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

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.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 ? upColor : downward > 0 ? downColor : midColor
barcolor = src > filt and src > src[1] and upward > 0 ? upColor :
   src > filt and src < src[1] and upward > 0 ? upColor : 
   src < filt and src < src[1] and downward > 0 ? downColor : 
   src < filt and src > src[1] and downward > 0 ? downColor : midColor

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

// Target
hbandplot = plot(hband, color=color.new(upColor, 70), title="High Target")
lbandplot = plot(lband, color=color.new(downColor, 70), title="Low Target")

// Fills
fill(hbandplot, filtplot, color=color.new(upColor, 90), title="High Target Range")
fill(lbandplot, filtplot, color=color.new(downColor, 90), title="Low Target Range")

// Bar Color
barcolor(barcolor)

// Break Outs
longCond = bool(na)
shortCond = bool(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



// alertcondition(longCondition, title="Buy alert on Range Filter", message="Buy alert on Range Filter")
// alertcondition(shortCondition, title="Sell alert on Range Filter", message="Sell alert on Range Filter")
// alertcondition(longCondition or shortCondition, title="Buy and Sell alert on Range Filter", message="Buy and Sell alert on Range Filter")


////////////// 副

sensitivity = input(150, title='Sensitivity')
fastLength = input(20, title='FastEMA Length')
slowLength = input(40, title='SlowEMA Length')
channelLength = input(20, title='BB Channel Length')
multt = input(2.0, title='BB Stdev Multiplier')

DEAD_ZONE = nz(ta.rma(ta.tr(true), 100)) * 3.7

calc_macd(source, fastLength, slowLength) =>
    fastMA = ta.ema(source, fastLength)
    slowMA = ta.ema(source, slowLength)
    fastMA - slowMA

calc_BBUpper(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis + dev

calc_BBLower(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis - dev

t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity

e1 = calc_BBUpper(close, channelLength, multt) - calc_BBLower(close, channelLength, multt)

trendUp = t1 >= 0 ? t1 : 0
trendDown = t1 < 0 ? -1 * t1 : 0

duoad = trendUp > 0 and trendUp > e1

kongad = trendDown > 0 and trendDown > e1



duo =  longCondition and duoad

kong = shortCondition and kongad


//Alerts
plotshape(longCondition  and trendUp > e1 and  trendUp > 0 , title="Buy Signal", text="Buy", textcolor=color.white, style=shape.labelup, size=size.small, location=location.belowbar, color=color.new(#aaaaaa, 20))
plotshape(shortCondition  and trendDown > e1 and  trendDown > 0 , title="Sell Signal", text="Sell", textcolor=color.white, style=shape.labeldown, size=size.small, location=location.abovebar, color=color.new(downColor, 20))




if  longCondition and trendUp > e1 and  trendUp > 0 
    strategy.entry('Long',strategy.long, comment = "buy" )

if  shortCondition and trendDown > e1 and  trendDown > 0 
    strategy.entry('Short',strategy.short, comment = "sell" )




longlimtPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortlimtPrice = strategy.position_avg_price * (1 - shortProfitPerc)
   
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



if (strategy.position_size > 0)  and SS == true
    
    strategy.exit(id="Long",comment_profit = "Profit",comment_loss = "StopLoss", stop=longStopPrice,limit = longlimtPrice)
    

if (strategy.position_size < 0)  and SS == true
    
    strategy.exit(id="Short",comment_profit = "Profit",comment_loss = "StopLoss", stop=shortStopPrice,limit = shortlimtPrice)