Estratégia de indicador reversal

Autora:ChaoZhang, Data: 2023-12-13 14:45:51
Tags:

img

Resumo

Esta é uma estratégia de negociação de revasal baseada em múltiplos indicadores técnicos. Combina CCI, indicador de Momentum, RSI e outros indicadores para identificar potenciais oportunidades de negociação longas e curtas. A estratégia gera sinais de negociação quando os indicadores mostram sinais de sobrecompra / sobrevenda e os preços recuam.

Estratégia lógica

Os sinais de negociação da estratégia vêm de um indicador personalizado chamado Edri Extreme Points Buy & Sell.

Condições de sinal de longa duração:

  1. O indicador Edri Extreme Points Buy & Sell desencadeia um sinal de compra, ou seja, um cruzamento do CCI acima de 0 ou um cruzamento do Momentum acima de 0, e o RSI está abaixo do nível de sobrevenda.
  2. O preço retorna para ou abaixo da EMA de 100 períodos.

Condições de sinal curto:

  1. O indicador Edri Extreme Points Buy & Sell desencadeia um sinal de venda, ou seja, um cruzamento do CCI abaixo de 0 ou um cruzamento do Momentum abaixo de 0, e o RSI está acima do nível de sobrecompra.
  2. O preço retorna para ou acima da EMA de 100 períodos.

A estratégia também pode ser configurada para encontrar divergências regulares de alta/baixa, gerando sinais de negociação apenas quando o RSI diverge significativamente do preço.

Quando os sinais de negociação são acionados, a estratégia define stop loss no preço de entrada ± 2ATR, take profit no preço de entrada ± 4ATR. Isso permite uma faixa de stop loss e take profit razoável com base na volatilidade do mercado.

Análise das vantagens

  1. A combinação de vários indicadores evita sinais falsos provenientes de um único indicador.
  2. O estilo de negociação de reversão capta oportunidades de médio prazo em mercados de gama.
  3. O sistema de stop loss e take profit baseado no ATR pode ajustar as posições com base na volatilidade do mercado.
  4. A determinação da divergência evita a abertura de posições sem níveis extremos de sobrecompra/supervenda.

Análise de riscos

  1. Os parâmetros de indicadores inadequados podem conduzir a oportunidades perdidas ou a demasiados sinais errados.
  2. A negociação de reversão pode causar stop loss consecutivos em mercados de tendência.
  3. O ATR tem um efeito de atraso e não pode atualizar o stop loss/take profit em tempo útil em mercados em rápida evolução.

Soluções:

  1. Testar e otimizar os parâmetros do indicador para encontrar a melhor combinação.
  2. Considere suspender a estratégia quando a tendência for forte.
  3. Combinar com outros métodos de stop loss como stop loss móvel ou stop loss contrário.

Orientações de otimização

  1. Ensaiar diferentes combinações de parâmetros de CCI, comprimento de momento, parâmetros RSI, multiplicador ATR, etc.
  2. Adicionar outras condições de filtragem, como padrões de preços, alterações de volume, etc.
  3. Ajustar regras de dimensionamento de posição como a relação de posição baseada em ATR.
  4. Estabelecer modelos de parâmetros para diferentes produtos e prazos.
  5. Considere a adição de rastreamento de tendências para suspender a negociação de reversão em mercados de tendências.

Resumo

A estratégia funciona principalmente para mercados de faixa, capturando reversões de médio prazo para ganhos relativamente constantes. Ajuda a identificar estiramentos de preços de curto prazo e gera sinais de negociação com base em múltiplos indicadores. Com otimização e gerenciamento de risco adequados, suas vantagens podem ser efetivamente utilizadas.


/*backtest
start: 2023-11-12 00:00:00
end: 2023-12-02 00:00:00
period: 1h
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/
// © MagicStrategies

//@version=5
strategy("Reversal Indicator Strategy", overlay = true)

// Input settings
ccimomCross = input.string('CCI', 'Entry Signal Source', options=['CCI', 'Momentum'], tooltip='CCI or Momentum will be the final source of the Entry signal if selected.')
ccimomLength = input.int(10, minval=1, title='CCI/Momentum Length')
useDivergence = input.bool(true, title='Find Regular Bullish/Bearish Divergence', tooltip='If checked, it will only consider an overbought or oversold condition that has a regular bullish or bearish divergence formed inside that level.')
rsiOverbought = input.int(65, minval=1, title='RSI Overbought Level', tooltip='Adjusting the level to extremely high may filter out some signals especially when the option to find divergence is checked.')
rsiOversold = input.int(35, minval=1, title='RSI Oversold Level', tooltip='Adjusting this level extremely low may filter out some signals especially when the option to find divergence is checked.')
rsiLength = input.int(14, minval=1, title='RSI Length')
plotMeanReversion = input.bool(false, 'Plot Mean Reversion Bands on the chart', tooltip='This function doesn\'t affect the entry of signal but it suggests buying when the price is at the lower band, and then sell it on the next bounce at the higher bands.')
emaPeriod = input(200, title='Lookback Period (EMA)')
bandMultiplier = input.float(1.8, title='Outer Bands Multiplier', tooltip='Multiplier for both upper and lower bands')


// CCI and Momentum calculation
momLength = ccimomCross == 'Momentum' ? ccimomLength : 10
mom = close - close[momLength]
cci = ta.cci(close, ccimomLength)
ccimomCrossUp = ccimomCross == 'Momentum' ? ta.cross(mom, 0) : ta.cross(cci, 0)
ccimomCrossDown = ccimomCross == 'Momentum' ? ta.cross(0, mom) : ta.cross(0, cci)

// RSI calculation
src = close
up = ta.rma(math.max(ta.change(src), 0), rsiLength)
down = ta.rma(-math.min(ta.change(src), 0), rsiLength)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - 100 / (1 + up / down)
oversoldAgo = rsi[0] <= rsiOversold or rsi[1] <= rsiOversold or rsi[2] <= rsiOversold or rsi[3] <= rsiOversold
overboughtAgo = rsi[0] >= rsiOverbought or rsi[1] >= rsiOverbought or rsi[2] >= rsiOverbought or rsi[3] >= rsiOverbought

// Regular Divergence Conditions
bullishDivergenceCondition = rsi[0] > rsi[1] and rsi[1] < rsi[2]
bearishDivergenceCondition = rsi[0] < rsi[1] and rsi[1] > rsi[2]

// Entry Conditions
longEntryCondition = ccimomCrossUp and oversoldAgo and (not useDivergence or bullishDivergenceCondition)
shortEntryCondition = ccimomCrossDown and overboughtAgo and (not useDivergence or bearishDivergenceCondition)


// Mean Reversion Indicator
meanReversion = plotMeanReversion ? ta.ema(close, emaPeriod) : na
stdDev = plotMeanReversion ? ta.stdev(close, emaPeriod) : na
upperBand = plotMeanReversion ? meanReversion + stdDev * bandMultiplier : na
lowerBand = plotMeanReversion ? meanReversion - stdDev * bandMultiplier : na


// Plotting
plotshape(longEntryCondition, title='BUY', style=shape.triangleup, text='B', location=location.belowbar, color=color.new(color.lime, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(shortEntryCondition, title='SELL', style=shape.triangledown, text='S', location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

plot(upperBand, title='Upper Band', color=color.new(color.fuchsia, 0), linewidth=1)
plot(meanReversion, title='Mean', color=color.new(color.gray, 0), linewidth=1)
plot(lowerBand, title='Lower Band', color=color.new(color.blue, 0), linewidth=1)

// Entry signal alerts
alertcondition(longEntryCondition, title='BUY Signal', message='Buy Entry Signal')
alertcondition(shortEntryCondition, title='SELL Signal', message='Sell Entry Signal')
alertcondition(longEntryCondition or shortEntryCondition, title='BUY or SELL Signal', message='Entry Signal')

ema100 = ta.ema(close, 100)
plot(ema100, color=color.red)

// Define trading signals based on the original indicator's entry conditions
// Buy if long condition is met and price has pulled back to or below the 100 EMA
longCondition  = longEntryCondition and close <= ema100
// Sell if short condition is met and price has pulled back to or above the 100 EMA
shortCondition = shortEntryCondition and close >= ema100

// Strategy Entries
if longCondition
    strategy.entry("Buy", strategy.long)
if shortCondition
    strategy.entry("Sell", strategy.short)

Mais.