Estratégia de crossover QQE rápido baseada em filtragem de tendências


Data de criação: 2024-01-25 11:34:58 última modificação: 2024-01-25 11:34:58
cópia: 1 Cliques: 1235
1
focar em
1617
Seguidores

Estratégia de crossover QQE rápido baseada em filtragem de tendências

Visão geral

A estratégia de cruzamento rápido de QQE baseada em filtragem de tendências é uma estratégia de negociação de seguimento de tendências que utiliza cruzamento rápido de QQE, bem como a média móvel para filtrar a direção da tendência. QQE ou estimativa quantitativa qualitativa é baseada no índice de força relativa, mas usa a técnica de smoothing como uma conversão adicional.

  • RSI sinais cruzam a linha zero ((XZERO)
  • RSI sinal de cruzamento rápido RSIatr linha ((XQQE)
  • RSI sinais de saída do canal de baixa do RSI ((comprar/vender)

Os sinais de compra/venda podem ser seletivamente filtrados através de médias móveis:

  • Para um sinal de compra, o preço de fechamento deve estar acima da média móvel rápida e a média móvel rápida (EMA8) > média móvel rápida (EMA20) > média móvel lenta (SMA50)
  • Para um sinal de venda, o preço de fechamento deve estar abaixo da média móvel rápida, e a média móvel rápida (EMA8) < média móvel rápida (EMA20) < média móvel lenta (SMA50)

e/ou filtro de direção de tendência:

  • Para um sinal de compra, o preço de fechamento deve estar acima da média móvel lenta (SMA50) e a média móvel direcional (EMA20) deve ser verde.
  • Para um sinal de venda, o preço de fechamento deve estar abaixo da média móvel lenta (SMA50) e a média móvel direcional (EMA20) deve ser vermelha.

XZERO e XQQE não estão incluídos no filtro, eles são usados para indicar sinais de compra/venda pendentes, especialmente XZERO.

Esta estratégia deve funcionar em qualquer par de moedas e na maioria dos quadros de tempo.

Princípio da estratégia

A ideia central desta estratégia é usar o cruzamento direcional do indicador QQE rápido como sinal de negociação e filtrar o ruído do sinal de negociação por meio de uma combinação de médias móveis para capturar a direção da tendência.

Em particular, a estratégia utiliza os seguintes indicadores e sinais:

Indicadores rápidos de QQE: Este é um indicador baseado no RSI, com um processamento adicional de suavização para torná-lo mais sensível e rápido. O indicador é composto por três linhas: a média é a média móvel do RSI, a média é a média + ATR rápido * um fator, a média é a média - ATR rápido * um fator. Quando o RSI entra em órbita, é um sinal de venda, quando o RSI entra em órbita, é um sinal de compra.

Linha zero cruzadaQuando o RSI cruza a linha zero, um cruzamento ascendente é um sinal de compra e um cruzamento descendente é um sinal de venda. Estes sinais indicam uma mudança de tendência.

Passagem de passagemQuando a trajectória do RSI entra no canal de limiar definido, gera-se um sinal, quebrando o canal superior é um sinal de venda, quebrando o canal inferior é um sinal de compra. Estes são os sinais de tendência mais fortes.

Média móvel combinadaA combinação é usada para determinar a direção da tendência geral. A linha rápida tem 8 ciclos, a linha média tem 20 ciclos e a linha lenta tem 50 ciclos.

Filtragem de direção de tendênciaO preço de fechamento produz um sinal de compra quando o preço está acima da média móvel lenta e acima da média móvel média ((o preço mais alto> o preço mais baixo no ciclo); o preço de fechamento produz um sinal de venda quando o preço está abaixo da média móvel lenta e a média móvel baixa. Isso pode filtrar alguns falsos sinais invertidos.

A combinação do uso de sinais de cruzamento de indicadores QQE rápidos e filtragem de tendências de médias móveis permite capturar reversões de curto prazo na direção da tendência em um maior período de tempo, formando um sistema de negociação mais completo. Ao mesmo tempo, os parâmetros do indicador são mais sensíveis e podem capturar o ponto de reversão da tendência o mais cedo possível.

No geral, trata-se de uma estratégia de acompanhamento de tendências de médio e longo prazo, que capta o momento de compra/venda de reversão de curto prazo através de indicadores rápidos e utiliza filtragem de médias móveis para reduzir o risco de reversão e maximizar os ganhos.

Vantagens estratégicas

  • Utiliza um indicador rápido sensível QQE para capturar rapidamente um sinal de inversão
  • Aplicação de múltiplos grupos de médias móveis para determinar a direção do grande ciclo, evitando a negociação inversa
  • Contém vários sinais de cruzamento que podem ser usados em combinação para aumentar as oportunidades de lucro
  • Parâmetros ajustáveis e podem ser otimizados para diferentes variedades e ciclos
  • O indicador usa o próprio sinal de ruptura de canal, sem desenhar canais independentes, evitando a dependência de parâmetros
  • A tendência de alta é uma boa forma de capturar a reversão de curto prazo em uma tendência de alta.
  • Conceitos simples, claros, fáceis de entender e de implementar

Risco estratégico

A estratégia também apresenta alguns riscos potenciais:

  • Indicadores rápidos são propensos a falsos sinais, médias móveis não são totalmente filtradas e existem riscos de seguir a direção errada
  • Sinais de reversão de negociação propensos a riscos quando ocorre uma reviravolta do ciclo grande
  • A existência de um excesso de transações que pode resultar em prejuízos, sem considerar a gestão de fundos
  • Sem paralisação, maior risco de expansão de perdas
  • Risco de ressonância de dados, eficácia em disco vivo a ser verificada

As medidas e soluções incluem:

  • Ajustar os parâmetros da média móvel para usar mais períodos para julgar tendências
  • Adicionar filtros de combinação de outros indicadores, como MACD, bias, etc.
  • Adotar estratégias de stop loss para controlar perdas individuais
  • Parâmetros de verificação e otimização

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

A estratégia ainda tem espaço para ser melhorada:

  1. Optimizar os parâmetros de linha rápida e lenta do indicador QQE para encontrar a melhor combinação de parâmetros
  2. Testar mais combinações de médias móveis para encontrar o melhor filtro
  3. Adição de uma combinação de outros indicadores, como MACD, para auxiliar o filtro de sinais
  4. Aplicação de estratégias de gestão de fundos, otimização de gestão de posições
  5. Estabelecer uma estratégia de stop loss para controlar o risco de perdas individuais
  6. Optimizado para diferentes parâmetros
  7. Julgar tendências em ciclos mais elevados, evitando ser enganado por reversões de curto prazo

Otimizando os parâmetros, combinando mais indicadores e complementando-os com recursos de gestão de fundos e riscos viáveis, espera-se que a estratégia melhore o desempenho no mercado.

Resumir

No geral, uma estratégia de cruzamento rápido de QQE baseada em filtragem de tendências é uma opção muito interessante. Sua vantagem é aproveitar rapidamente as oportunidades de negociação de reversão e, ao mesmo tempo, usar múltiplos grupos de médias móveis para avaliar grandes tendências e evitar erros de negociação de reversão.

Claro que o risco também não pode ser ignorado, a verificação em campo e o ajuste de otimização contínua são necessários para garantir a praticidade e a confiabilidade da estratégia. Em geral, vale a pena que os investidores aprendam e sigam a prática a longo prazo. Acredito que, com o progresso da tecnologia de negociação algorítmica, esse tipo de estratégia baseada em indicadores rápidos e filtragem de tendências será melhorada e popularizada.

Código-fonte da estratégia
/*backtest
start: 2024-01-17 00:00:00
end: 2024-01-24 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
//
// Title:   [STRATEGY][UL]QQE Cross v1.1
// Author:  JustUncleL
// Date:    22-Oct-2016
// Version: v1.1
//
// Description:
//  A trend following trading Strategy that uses fast QQE crosses with Moving Averages
//  for trend direction filtering. QQE or Qualitative Quantitative Estimation is based 
//  on the relative strength index, but uses a smoothing technique as an additional 
//  transformation. Three crosses can be selected (all selected by default): 
//    - RSI signal crossing ZERO (XZERO)
//    - RSI signal crossing Fast RSIatr line (XQQE)
//    - RSI signal exiting the RSI Threshhold Channel (BUY/SELL)
//  The (BUY/SELL) alerts can be optionally filtered by the Moving averages:
//    - For BUY alert the Close must be above the fast MA and 
//        fast MA (EMA8) > medium MA (EMA20) > slow MA (SMA50).
//    - For SELL alert the Close must be below the fast MA and
//        fast MA (EMA8) < medium MA (EMA20) < slow MA (SMA50).
//  and/or directional filter:
//    - For BUY alert the Close must be above the slow MA (SMA50) and the
//      directional MA (EMA20) must be green.
//    - For SELL alert the Close must be below the slow MA (SMA50) and the
//      directional MA (EMA20) must be red.
//. The XZERO and XQQE are not included in the filtering, they are used to indicate
//  pending BUY/SELL alerts, particularly the XZERO. 
//
//  This Strategy should work on any currency pair and most chart timeframes.
//  *** USE AT YOUR OWN RISK ***
//  
// 
//
// Mofidifications:
//  1.1 - Added Target Profit option, cleaned up the risk management code.
//        Changed Trade Close to EMA20 direction change instead of opposite BUY/SELL
//        signal, which will be earlier, this means stop loss setting should not be
//        required when an AutoTrader is available.
//        Modified code to prevent potential repaint issues.
//  1.0 - original
//
// References:
//  Some Code borrowed from:
//  - "Scalp Jockey - MTF MA Cross Visual Strategizer by JayRogers"
//  - "QQE MT4 by glaz"
//  - "Strategy Code Example by JayRogers"  
//  Inspiration from:
//  - http://www.forexstrategiesresources.com/binary-options-strategies-ii/189-aurora-binary-trading/
//  - http://www.forexstrategiesresources.com/metatrader-4-trading-systems-v/652-qqe-smoothed-trading/
//  - http://dewinforex.com/forex-indicators/qqe-indicator-not-quite-grail-but-accurately-defines-trend-and-flat.html
//

strategy(title='[STRATEGY][UL]QQE Cross v1.1', pyramiding=0, overlay=true )


// - INPUTS START
// Fast MA - type, source, length
type1   = input(defval="EMA", title="Fast MA Type: SMA, EMA, WMA, VWMA, SMMA, DEMA, TEMA, HullMA, ZEMA ( case sensitive )")
len1    = input(defval=8, title="Fast - Length", minval=1)
// Medium Fast MA - type, source, length
type2   = input(defval="EMA", title="Medium Fast MA Type: SMA, EMA, WMA, VWMA, SMMA, DEMA, TEMA, HullMA, ZEMA ( case sensitive )")
len2    = input(defval=20, title="Medium Fast - Length", minval=1)
// Slow MA - type, source, length
type3   = input(defval="SMA", title="Slow MA Type: SMA, EMA, WMA, VWMA, SMMA, DEMA, TEMA, HullMA, LSMA, ZEMA ( case sensitive )")
len3    = input(defval=50, title="Slow Length", minval=1)
//
// QQE rsi Length, Smoothing, fast ATR factor, source
RSILen  = input(6,title='RSI Length')
SF      = input(3,title='RSI Smoothing Factor')
QQE     = input(2.618,title='Fast QQE Factor')
threshhold = input(10, title="RSI Threshhold")
//
sQQEx   = input(false,title="Show QQE Signal crosses")
sQQEz   = input(false,title="Show QQE Zero crosses")
//
filter  = input(false,title="Use Moving Average Filter")
dfilter = input(true, title="Use Trend Directional Filter" )
RSIsrc  = input(close,title="Source")
srcclose= RSIsrc

// - INPUTS END

// - FUNCTIONS

// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = wma(src, len)                                                  // Weighted
    v4 = vwma(src, len)                                                 // Volume Weighted
    v5 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v6 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v7 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    ema1 = ema(src, len)
    ema2 = ema(ema1, len)
    v10 = ema1+(ema1-ema2)                                              // Zero Lag Exponential
    // return variant, defaults to SMA if input invalid.
    type=="EMA"?v2 : type=="WMA"?v3 : type=="VWMA"?v4 : type=="SMMA"?v5 : type=="DEMA"?v6 : type=="TEMA"?v7 : type=="HullMA"?v8 : type=="ZEMA"?v10 : v1

// - FUNCTIONS END

// - Fast ATR QQE
//
Wilders_Period = RSILen * 2 - 1
//
Rsi = rsi(RSIsrc,RSILen)
RSIndex = ema(Rsi, SF)
AtrRsi = abs(RSIndex[1] - RSIndex)
MaAtrRsi = ema(AtrRsi, Wilders_Period)
DeltaFastAtrRsi = ema(MaAtrRsi,Wilders_Period) * QQE
//
newshortband=  RSIndex + DeltaFastAtrRsi
newlongband= RSIndex - DeltaFastAtrRsi
longband=RSIndex[1] > longband[1] and RSIndex > longband[1] ? max(longband[1],newlongband) : newlongband
shortband=RSIndex[1] < shortband[1] and  RSIndex < shortband[1] ? min(shortband[1],newshortband) : newshortband
trend=cross(RSIndex, shortband[1])? 1 : cross(longband[1], RSIndex) ? -1 : nz(trend[1],1)
FastAtrRsiTL = trend==1 ? longband : shortband


// - SERIES VARIABLES
// MA's
ma_fast    = variant(type1, srcclose, len1)
ma_medium  = variant(type2, srcclose, len2)
ma_slow    = variant(type3, srcclose, len3)
// Get Direction From Medium Moving Average
direction = rising(ma_medium,3) ? 1 : falling(ma_medium,3) ? -1 : 0
//
// Find all the QQE Crosses
QQExshort = sQQEx and crossover(FastAtrRsiTL, RSIndex)
QQExlong  = sQQEx and crossunder(FastAtrRsiTL, RSIndex)
// Zero cross
QQEzlong = sQQEz and crossover(RSIndex,50)
QQEzshort  = sQQEz and crossunder(RSIndex,50)
//  
// Thresh Hold channel Crosses give the BUY/SELL alerts.
QQEclong = RSIndex>(50+threshhold) ? na(QQEclong[1]) ? 1 : QQEclong[1]+1 : 0
QQEcshort = RSIndex<(50-threshhold) ? na(QQEcshort[1]) ? 1 : QQEcshort[1]+1 : 0

//
// Check Filtering.
QQEflong = (not filter or (srcclose>ma_fast and ma_medium>ma_slow and ma_fast>ma_medium)) and 
  (not dfilter or (direction>0 and srcclose>ma_slow))
QQEfshort = (not filter or (srcclose<ma_fast and ma_medium<ma_slow and ma_fast<ma_medium)) and
  (not dfilter or (direction<0 and srcclose<ma_slow))
//
// Get final BUY / SELL alert determination
buy = QQEclong>0 and QQEflong ? na(buy[1]) ? 1 : buy[1]+1 : 0
sell= QQEcshort>0 and QQEfshort ? na(sell[1]) ? 1 : sell[1]+1 : 0

// - SERIES VARIABLES END

// - PLOTTING
// Ma's
plot(ma_fast, title="MA Fast", color=olive, linewidth=2, transp=20)
plot(ma_medium, title="MA Medium Fast", color=direction<0?red:green, linewidth=3, transp=0)
plot(ma_slow, title="MA Slow", color=blue, linewidth=2, transp=20)
// QQE crosses
plotshape(QQExlong and buy!=1, title="QQE Cross Over", style=shape.triangleup, location=location.belowbar, text="XQQE", color=blue, transp=20, size=size.tiny)
plotshape(QQExshort and sell!=1, title="QQE Cross Under", style=shape.triangledown, location=location.abovebar, text="XQQE", color=black, transp=20, size=size.tiny)
// Signal crosses zero line
plotshape(QQEzlong and buy!=1 and not QQExlong, title="QQE Zero Cross Over", style=shape.triangleup, location=location.belowbar, text="XZERO", color=aqua, transp=20, size=size.tiny)
plotshape(QQEzshort and sell!=1 and not QQExshort, title="QQE Zero Cross Under", style=shape.triangledown, location=location.abovebar, text="XZERO", color=fuchsia, transp=20, size=size.tiny)

// - PLOTTING END

// Create alert for cross, shunt back 1 if source is not 'open', this should prevent repaint issue.
//shunt = RSIsrc == open ? 0 : 1
shunt = 0
c_alert = (buy[shunt]==1 or sell[shunt]==1)
//alertcondition(c_alert, title="QQECROSS Alert", message="QQECROSS Alert")
// show only when alert condition is met and bar closed.
plotshape(c_alert,title= "Alert Indicator Closed", location=location.bottom, color=sell[shunt]==1?red:green, transp=0, style=shape.circle)


//  Strategy: (Thanks to JayRogers)
// === STRATEGY RELATED INPUTS ===
//tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// the risk management inputs
inpTakeProfit   = input(defval = 0, title = "Take Profit Points", minval = 0)
inpStopLoss     = input(defval = 0, title = "Stop Loss Points", minval = 0)
inpTrailStop    = input(defval = 100, title = "Trailing Stop Loss Points", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset Points", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry(id = "Buy", long = true, when = buy[shunt]==1 )// use function or simple condition to decide when to get in
strategy.close(id = "Buy", when = direction[shunt]!=direction[shunt+1])// ...and when to get out

// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry(id = "Sell", long = false, when = sell[shunt]==1)
strategy.close(id = "Sell", when = direction[shunt]!=direction[shunt+1])

// === STRATEGY RISK MANAGEMENT EXECUTION ===
// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Buy", from_entry = "Buy", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Sell", from_entry = "Sell", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)

//eof