Estratégia quantitativa de acompanhamento de tendências


Data de criação: 2024-02-01 11:42:22 última modificação: 2024-02-01 11:42:22
cópia: 0 Cliques: 524
1
focar em
1617
Seguidores

Estratégia quantitativa de acompanhamento de tendências

Visão geral

A estratégia usa vários indicadores como a faixa de Brin, RSI, ADX e MACD para julgar a tendência do mercado, com uma forte capacidade de identificação de tendências. Quando o indicador é bullish, a estratégia de retorno é adotada; Quando o indicador é bearish, a perda de posição é eliminada.

Princípio da estratégia

  • Usar a faixa de Brin para determinar se o preço está próximo da faixa de Brin para cima ou para baixo, como base para determinar se uma tendência se formou
  • Combinando com o RSI, verifique se você está em uma zona de sobrevenda ou sobrecompra para evitar falsas rupturas
  • Usar o ADX para determinar a força da tendência, emitindo sinais apenas quando a tendência é forte
  • Utilização do MACD para determinar a consistência de tendências de curto e longo prazo
  • Combinação de períodos do dia e negociação somente em períodos de tempo de negociação especificados

Compartilhar um conjunto de indicadores para identificar com precisão as tendências de preços, acompanhar as tendências em tempo hábil e obter lucros extras.

Análise de vantagens

A principal vantagem desta estratégia é que o conjunto de indicadores é mais abrangente e preciso, permitindo identificar com eficiência as tendências de preços e evitar falsos sinais causados por um único indicador.

O blogueiro também compartilhou algumas das vantagens:

  1. A faixa de Brin pode determinar a amplitude e a fraqueza das flutuações dos preços
  2. RSI evita compras em áreas de sobrecompra e vendas em áreas de sobrevenda
  3. O ADX julga a força da tendência e segue apenas a forte
  4. MACD determina consistência de linha curta e longa
  5. Limitar o horário de negociação para evitar o risco da noite

A combinação de indicadores pode minimizar os falsos sinais e aumentar a estabilidade da estratégia.

Análise de Riscos

Os principais riscos dessa estratégia são:

  1. Eventos inesperados causaram falhas nos indicadores
  2. O tremor gerou muitos sinais falsos.

Em relação ao risco 1, devido à dependência de vários indicadores, é possível evitar, em certa medida, a falha de um único indicador, mas ainda é necessário aperfeiçoar o mecanismo de controle de risco.

Para o risco 2, os parâmetros podem ser adequadamente ajustados, reduzindo o intervalo de negociação, reduzindo a frequência de negociação e reduzindo o risco.

Direção de otimização

As principais áreas de otimização da estratégia incluem:

  1. Aumentar os mecanismos de suspensão, como suspensão de movimento, suspensão de tempo, suspensão de ruptura, etc., evitando o recuo profundo
  2. Parâmetros de otimização, ajuste de combinação de parâmetros de indicadores, busca de parâmetros ótimos
  3. Aumentar as condições de filtragem, como a filtragem em massa, para evitar falsas rupturas de pequena quantidade
  4. Combinação de mais indicadores, como KDJ, OBV, etc., para melhorar a precisão do sinal
  5. Parâmetros de otimização automática usando métodos de aprendizagem de máquina

Aumentar a robustez dos parâmetros estratégicos e reduzir a probabilidade de falsos sinais através da otimização contínua.

Resumir

A estratégia, como um todo, tem uma forte capacidade de identificar sinais de tendência, sendo capaz de identificar de forma eficaz as tendências de preços através de uma combinação de indicadores.

Mas também existe um certo risco, que requer o aperfeiçoamento contínuo do mecanismo de controle de vento e a otimização contínua dos parâmetros para um funcionamento estável a longo prazo. Se, posteriormente, for possível introduzir métodos como o aprendizado de máquina para otimizar automaticamente os parâmetros, a robustez e a capacidade de lucro da estratégia serão grandemente aumentadas.

Código-fonte da estratégia
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 5h
basePeriod: 15m
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/
// © abilash.s.90


dIMinusCalc(adxLen) =>
    
    smoothedTrueRange = 0.0
    smoothedDirectionalMovementMinus = 0.0
    dIMinus = 0.0
    trueRange = 0.0
    directionalMovementMinus = 0.0
    
    trueRange := max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
    directionalMovementMinus := nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
    
    smoothedTrueRange := nz(smoothedTrueRange[1]) - (nz(smoothedTrueRange[1])/adxLen) + trueRange
    smoothedDirectionalMovementMinus := nz(smoothedDirectionalMovementMinus[1]) - (nz(smoothedDirectionalMovementMinus[1])/adxLen) + directionalMovementMinus
    
    dIMinus := smoothedDirectionalMovementMinus / smoothedTrueRange * 100
    
    dIMinus

dIPlusCalc(adxLen) =>
    
    smoothedTrueRange = 0.0
    smoothedDirectionalMovementPlus = 0.0
    dIPlus =  0.0
    trueRange = 0.0
    directionalMovementPlus = 0.0
    
    trueRange := max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
    directionalMovementPlus := high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
    
    smoothedTrueRange := nz(smoothedTrueRange[1]) - (nz(smoothedTrueRange[1])/adxLen) + trueRange
    smoothedDirectionalMovementPlus := nz(smoothedDirectionalMovementPlus[1]) - (nz(smoothedDirectionalMovementPlus[1])/adxLen) + directionalMovementPlus
    
    dIPlus := smoothedDirectionalMovementPlus / smoothedTrueRange * 100
    
    dIPlus
    
    
Adx(adxLen) =>
    dIPlus =  0.0
    dIMinus = 0.0
    dX = 0.0
    aDX = 0.0
    dIPlus := dIPlusCalc(adxLen)
    dIMinus := dIMinusCalc(adxLen)
    dX := abs(dIPlus-dIMinus) / (dIPlus+dIMinus)*100
    aDX := sma(dX, adxLen)
    
    aDX
    
BarInSession(sess) => time(timeframe.period, sess) != 0


//@version=4
strategy("Bollinger Band + RSI + ADX + MACD", overlay=true)

//Session

session = input(title="Trading Session", type=input.session, defval="0930-1500")

sessionColor = BarInSession(session) ? color.green : na

bgcolor(color=sessionColor, transp=95)

// Bollinger Bands
src = input(high, title="Bollinger Band Source", type=input.source)
length = input(3, minval=1, type=input.integer, title="Bollinger Band Length")
mult = input(4.989, minval=0.001, maxval=50, step=0.001, type=input.float, title="Bollinger Band Std Dev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev


plot(upper, title="Bollinger Band Upper", color=color.red)
plot(lower, title="Bollinger Band Lower", color=color.green)

// RSI
rsiSrc = input(close, title="RSI Source", type=input.source)
rsiLength = input(16, minval=1, type=input.integer, title="RSI Length")
rsiComparator = input(39.2, title="RSI Comparator", type=input.float, step=0.1)

rsi = rsi(rsiSrc, rsiLength)

// ADX
adxLength = input(14, minval=1, type=input.integer, title="ADX Length")
adxComparator = input(14, minval=1, type=input.integer, title="ADX Comparator")

adx = Adx(adxLength)

// Heikinashi

haClose = security(heikinashi(syminfo.ticker), timeframe.period, close)
haOpen = security(heikinashi(syminfo.ticker), timeframe.period, open)

nextHaOpen = (haOpen + haClose) / 2

//MACD

macdCalcTypeProcessed = input(title="MACD Source", type=input.source, defval=high)
fast = input(12, title="MACD Fast")
slow = input(20, title="MACD Slow")
signalLen = input(15, title="MACD Signal")

fastMA = ema(macdCalcTypeProcessed, fast)
slowMA = ema(macdCalcTypeProcessed, slow)
macd = fastMA - slowMA
signal = sma(macd, signalLen)



longCondition() =>
    (low < lower) and (rsi[0] > rsiComparator) and (adx > adxComparator) and (close > nextHaOpen) and BarInSession(session) and macd > signal

stop = (close - max((low - (low * 0.0022)), (close - (close * 0.0032)))) / syminfo.mintick
target = (max(upper, (close + (close * 0.0075))) - close) / syminfo.mintick


strategy.entry("SX,LE", strategy.long, when=longCondition(), comment="SX,LE")
strategy.close_all(when=(not BarInSession(session)))
strategy.exit("LX", from_entry="SX,LE", profit=target, loss=stop)