Diferença de preços e tendência na sequência da estratégia de negociação

Autora:ChaoZhang, Data: 2023-10-25 18:02:11
Tags:

img

Resumo

Esta estratégia usa o indicador CCI e o indicador de momentum combinados com o indicador RSI para identificar tendências de mercado e entrar quando a lacuna aparece na zona de sobrecompra / sobrevenda.

Estratégia lógica

Em primeiro lugar, a estratégia determina os sinais longos e curtos pelo indicador CCI ou pelo indicador de dinâmica que atravessa a linha 0/abaixo.

Além disso, a estratégia pode optar por determinar as divergências RSI de alta/baixa para garantir sinais mais confiáveis.

Quando o CCI ou impulso desencadeia o sinal longo e o RSI está na zona de sobrevenda, a estratégia verificará se o alto e o baixo anteriores estão acima da linha média da Banda de Bollinger.

Assim, a estratégia utiliza indicadores de tendência e oscilação, para entrar em uma tendência cedo e evitar uma falha de ruptura com a faixa de reversão média.

Análise das vantagens

  1. A combinação de indicadores de tendência e oscilação pode entrar na tendência mais cedo e evitar posições desnecessárias no mercado de intervalo.

  2. Usando a média da banda de Bollinger com as diferenças de preço filtra falhas efetivamente.

  3. A verificação do RSI histórico evita gerar sinais comerciais errados.

  4. Negociação totalmente automatizada sem interferência manual, adequada para negociação por algoritmos.

  5. O ajustamento flexível dos parâmetros adapta-se aos diferentes produtos comerciais.

  6. Parar perdas e tomar riscos de controle de lucro de forma eficaz.

Análise de riscos

  1. Os parâmetros incorretos da faixa de Bollinger podem causar uma identificação inválida da reversão da média.

  2. Os parâmetros errados do indicador podem gerar muitos sinais falsos.

  3. A ruptura fracassada precisa de uma parada de perda oportuna quando o preço recuar para a média.

  4. A falta de liquidez pode causar uma negociação de breakout ineficaz.

  5. Assegurar dados históricos suficientes para evitar uma má adaptação da curva.

  6. Preste atenção às sessões de negociação para evitar falhas.

Orientações para melhorias

  1. Otimizar os parâmetros das bandas de Bollinger para um intervalo de reversão média mais estável.

  2. Testar parâmetros em diferentes produtos para melhor otimização.

  3. Adicionar dimensionamento de posição para evitar posições individuais de grande porte.

  4. Adicionar filtro de sessão de negociação para negociar principalmente em horas ativas.

  5. Incorporar modelos de aprendizagem de máquina para gerar sinais mais inteligentes.

  6. Integrar mais fontes de dados para determinar a tendência geral do mercado.

  7. Adicionar mais indicadores para formar um conjunto robusto de indicadores.

Conclusão

Esta estratégia integra indicadores de tendência e oscilação para capturar tendências cedo. Com a média da banda de Bollinger e as lacunas de preço, evita falhas de ruptura efetivamente. Parâmetros flexíveis se adaptam a diferentes produtos com ótimos resultados de backtest. Os próximos passos são otimizar os parâmetros e o conjunto do modelo para mais robustez e alcançar retornos excessivos consistentes a longo prazo.


/*backtest
start: 2022-10-18 00:00:00
end: 2023-10-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='BroTheJo Strategy', shorttitle='BTJ', overlay=true)

// Input settings
ccimomCross = input.string('CCI', 'Entry Signal Source', options=['CCI', 'Momentum'])
ccimomLength = input.int(10, minval=1, title='CCI/Momentum Length')
useDivergence = input.bool(false, title='Find Regular Bullish/Bearish Divergence')
rsiOverbought = input.int(65, minval=1, title='RSI Overbought Level')
rsiOversold = input.int(35, minval=1, title='RSI Oversold Level')
rsiLength = input.int(14, minval=1, title='RSI Length')
plotMeanReversion = input.bool(true, 'Plot Mean Reversion Bands on the chart')
emaPeriod = input(200, title='Lookback Period (EMA)')
bandMultiplier = input.float(1.6, title='Outer Bands Multiplier')

// 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]

// 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

// Entry Conditions
prevHigh = ta.highest(high, 1)
prevLow = ta.lowest(low, 1)
longEntryCondition = ccimomCrossUp and oversoldAgo and (not useDivergence or bullishDivergenceCondition) and (prevHigh >= meanReversion) and (prevLow >= meanReversion)
shortEntryCondition = ccimomCrossDown and overboughtAgo and (not useDivergence or bearishDivergenceCondition) and (prevHigh <= meanReversion) and (prevLow <= meanReversion)

// Plotting
oldLongEntryCondition = ccimomCrossUp and oversoldAgo and (not useDivergence or bullishDivergenceCondition)
oldShortEntryCondition = ccimomCrossDown and overboughtAgo and (not useDivergence or bearishDivergenceCondition)
plotshape(oldLongEntryCondition, title='BUY', style=shape.triangleup, location=location.belowbar, color=color.new(color.lime, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(oldShortEntryCondition, title='SELL', style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

// Strategy logic
if (longEntryCondition)
    strategy.entry("Buy", strategy.long)
if (shortEntryCondition)
    strategy.entry("Sell", strategy.short)

// Close all open positions when outside of bands
closeAll = (high >= upperBand) or (low <= lowerBand)

if (closeAll)
    strategy.close_all("Take Profit/Cut Loss")


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

Mais.