O Sistema de Comércio Dual Quant

Autora:ChaoZhang, Data: 2024-02-26 14:30:54
Tags:

img

Esta estratégia combina o indicador CCI, indicador RSI e duas médias móveis em um sistema de negociação composto.

Princípio da estratégia

A estratégia usa principalmente o indicador CCI para determinar a direção da tendência. Leituras do CCI acima de 100 indicam um mercado de alta, enquanto as abaixo de -100 indicam um mercado de baixa. O sistema usa dois cruzamento de médias móveis para ajudar a determinar a direção da tendência.

Após determinar a tendência de alta ou baixa, o sistema usa o cruzamento de dois RSI com diferentes comprimentos de parâmetros como verificação de entrada. Por exemplo, em um mercado de alta, se o RSI de curto período cruzar acima do RSI de longo período, é o sinal de compra final.

A estratégia só abre posições durante a sessão de negociação especificada, fechando ativamente todas as posições 15 minutos antes do fechamento para evitar o risco do overnight.

Análise das vantagens

  • A combinação de julgamento de tendências e cruzamento de indicadores pode identificar efetivamente tendências e filtrar ruído para entradas precisas
  • Usando trailing stops para controlar ativamente os riscos evita ser parado por causa de acidentes flash
  • Apenas a abertura de posições durante sessões de negociação especificadas evita o risco de diferença overnight
  • Os parâmetros do RSI ajustáveis podem adaptar-se de forma flexível aos diferentes ambientes de mercado

Análise de riscos

  • A CCI apresenta um desempenho fraco em mercados excepcionalmente voláteis
  • As condições cruzadas do RSI duplo são relativamente rigorosas, perdendo potencialmente algumas oportunidades
  • As paradas de tração podem ser excessivamente subjetivas, exigindo otimização de parâmetros
  • Sessões de negociação especificadas podem perder grandes brechas de notícias durante a noite

Sugestões de otimização

  • Teste diferentes combinações de parâmetros CCI para encontrar configurações ideais
  • Ensaio de eliminação da condição de cruzamento RSI e entrada direta com base no CCI
  • Backtest e otimizar parâmetros de parada de trail para encontrar configurações ideais
  • Teste removendo a lógica de fechamento de posição forçada e, em vez disso, acompanhe os lucros com paradas de tração durante as posições para maximizar os lucros

Resumo

Esta estratégia considera de forma abrangente a determinação de tendências e a validação de cruzamento de indicadores para garantir a validade do sinal enquanto controla o risco. Através da otimização de parâmetros e ajustes lógicos, a estratégia tem potencial adicional para expandir oportunidades de lucro e reduzir oportunidades perdidas.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
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/
// © rwestbrookjr

//@version=5
strategy("EMA with RSI Cross Strategy", overlay=true)

//EMA
fastLen = input(title='Fast EMA Length', defval=9)
slowLen = input(title='Slow EMA Length', defval=20)

fastEMA = ta.ema(close, fastLen)
slowEMA = ta.ema(close, slowLen)

fema = plot(fastEMA, title='FastEMA', color=color.new(color.green, 0), linewidth=1, style=plot.style_line)
sema = plot(slowEMA, title='SlowEMA', color=color.new(color.red, 0), linewidth=1, style=plot.style_line)

fill(fema, sema, color=fastEMA > slowEMA ? color.new(#417505, 50) : color.new(#890101, 50), title='Cloud')

// Bull and Bear Alerts
//Bull = ta.crossover(fastEMA, slowEMA)
Bull = fastEMA > slowEMA
//Bear = ta.crossunder(fastEMA, slowEMA)
Bear = fastEMA < slowEMA

//RSIs
rsiLength1Input = input.int(9, minval=1, title="RSI Length", group="RSI Settings")
rsiSource1Input = input.source(close, "Source", group="RSI Settings")
rsiLength2Input = input.int(20, minval=1, title="RSI Length", group="RSI Settings")
rsiSource2Input = input.source(close, "Source", group="RSI Settings")

up1 = ta.rma(math.max(ta.change(rsiSource1Input), 0), rsiLength1Input)
down1 = ta.rma(-math.min(ta.change(rsiSource1Input), 0), rsiLength1Input)
rsi = down1 == 0 ? 100 : up1 == 0 ? 0 : 100 - (100 / (1 + up1 / down1))
up2 = ta.rma(math.max(ta.change(rsiSource2Input), 0), rsiLength2Input)
down2 = ta.rma(-math.min(ta.change(rsiSource2Input), 0), rsiLength2Input)
rsi2 = down2 == 0 ? 100 : up2 == 0 ? 0 : 100 - (100 / (1 + up2 / down2))

//CCI
cciLength = input.int(20, minval=1)
src = input(hlc3, title="Source")
ma = ta.sma(src, cciLength)
cci = (src - ma) / (0.015 * ta.dev(src, cciLength))

//Trail Stop Setup
trstp = input.float(title="Trail Loss($)", minval = 0.0, step = 0.01, defval = 0.5)

longStop = 0.0, shortStop = 0.0

longStop := if Bull
    stopValue = close - trstp
    math.max(stopValue, longStop[1])
else
    0.0

shortStop := if Bear
    stopValue = close + trstp
    math.min(stopValue, shortStop[1])
else
    999999


//Session Setup
open_session=input(defval="0930-1545")
session = time("1", open_session)
validSession=(na(session) ? 0 : 1)

//Trade Signals
longCondition = Bull and cci > 100 and ta.crossover(rsi,rsi2) and validSession
if (longCondition)
    strategy.entry("Long", strategy.long, 1)
    
//longExit = close > strategy.opentrades.entry_price(0) + 1.5 or close < strategy.opentrades.entry_price(0) - 0.75
longExit = close < longStop or not validSession
if (longExit)
    strategy.close("Long")

shortCondition = Bear and cci < 100 and ta.crossunder(rsi,rsi2) and validSession
if (shortCondition)
    strategy.entry("Short", strategy.short, 1)

//shortExit = close < strategy.opentrades.entry_price(0) - 1.5 or close > strategy.opentrades.entry_price(0) + 0.75
shortExit = close > shortStop or not validSession
if (shortExit)
    strategy.close("Short")


Mais.