Estratégias de Reversão à Média com RSI2 de Larry Connors para Day Trading
Introdução
Larry Connors é um trader e autor renomado, mais conhecido por seu trabalho em trading quantitativo e estratégias como o RSI de 2 períodos (RSI2), que ajuda a identificar condições de sobrecompra e sobrevenda de curto prazo no mercado. Neste artigo, primeiro explicaremos a motivação por trás de nossa pesquisa, depois recriaremos três das estratégias mais famosas de Connors em MQL5 e as aplicaremos ao trading intradiário do CFD do índice S&P 500. Em seguida, analisaremos os resultados de cada estratégia e apresentaremos o conceito de construção de sistemas-modelo no trading. Por fim, forneceremos sugestões para melhorias futuras dessas estratégias.
Motivações
Larry Connors desenvolveu inúmeras estratégias quantitativas para o varejo ao longo de sua carreira e documentou suas pesquisas em seu site. A maioria de suas estratégias é testada e negociada no mercado de ações dos EUA utilizando timeframes diários, com extensos backtests comprovando sua lucratividade. No entanto, poucos traders adaptaram suas ideias para timeframes menores voltados ao trading intradiário.
Este artigo investiga essa abordagem por meio da codificação de três das estratégias mais famosas de Connors em MQL5 e de seus testes no CFD US500 utilizando um timeframe de 30 minutos. O objetivo é determinar se seus conceitos de reversão à média podem agregar valor a operações em frequência mais alta, onde o ruído aumenta, e o volume de observações também aumenta. Selecionamos o CFD do índice US500 para operações em frequência mais alta do mercado de ações dos EUA, já que Connors originalmente projetou suas estratégias para ações. O timeframe de 30 minutos oferece um equilíbrio — reduzindo o ruído excessivo enquanto fornece atividade de negociação suficiente. O backtest cobrirá o último ano para garantir a atualidade dos dados.
O cálculo do RSI é o seguinte:

O RSI mede o número de barras de alta e de baixa durante um determinado período e utiliza um método de suavização, como uma média móvel, para indicar a força relativa do movimento do mercado. Um período mais curto torna o RSI mais sensível, mas também mais suscetível ao ruído. Connors aproveita essa alta sensibilidade utilizando um RSI de 2 períodos para identificar condições de sobrevenda ou sobrecompra de curto prazo, que servem como sinais para operações de reversão à média alinhadas com a tendência geral.
Comparada às estratégias tradicionais de reversão à média, como as Bandas de Bollinger, essa abordagem difere de várias maneiras importantes:
- O RSI2 é mais simples e rápido, reagindo mais rapidamente às reversões de curto prazo do que o cálculo em múltiplas etapas das Bandas de Bollinger.
- O RSI2 oferece níveis claros de sobrecompra (acima de 90) e sobrevenda (abaixo de 10), ao contrário dos sinais menos precisos de toque nas bandas das Bandas de Bollinger.
- O RSI2 ignora a amplitude de preço e o contexto da tendência, enquanto as Bandas de Bollinger capturam visualmente mudanças de tendência e volatilidade.
No geral, essa abordagem se concentra mais em capturar recuos instantâneos do que desvios extremos de preço.
Estratégia um - Connors RSI2 Clássica
A Estratégia Connors RSI2 Clássica opera com base no princípio da reversão à média, aproveitando recuos temporários dentro de tendências estabelecidas. A lógica é que mesmo ativos com tendências fortes passam por quedas de curto prazo devido à realização de lucros ou ao ruído do mercado. Queremos utilizar um RSI de 2 períodos para identificar condições extremas de sobrevenda/sobrecompra (abaixo de 5/acima de 95) ao longo de apenas duas barras de 30 minutos e sinalizar potenciais oportunidades de repique. Utilizamos uma média móvel para alinhar as operações com a tendência mais ampla, aumentando a probabilidade de que os recuos sejam temporários e não reversões de tendência.
Essa estratégia exata é detalhada em Short-Term Trading Strategies That Work (2008) e foi rigorosamente testada por Larry Connors e seu parceiro de pesquisa Cesar Alvarez na época. Gostaríamos de verificar se essa vantagem estatística ainda se mantém anos depois.
Regras de sinal:
- Comprar quando: RSI2 < 5, último preço de fechamento > média móvel de 200 períodos e nenhuma posição aberta.
- Vender quando: RSI2 > 95, último preço de fechamento < média móvel de 200 períodos e nenhuma posição aberta.
- Encerrar compra quando: último preço de fechamento > média móvel de 5 períodos, ou último preço de fechamento < média móvel de 200 períodos.
- Encerrar venda quando: último preço de fechamento < média móvel de 5 períodos, ou último preço de fechamento > média móvel de 200 períodos.
- A distância do stop loss é de 0,15% em relação ao preço atual.
O código MQL5:
//US500 M30 #include <Trade/Trade.mqh> CTrade trade; input int Magic = 0; input double lot = 0.1; int barsTotal = 0; int handleMa; int handleMaFast; int handleRsi; const int Max = 5; const int Min = 95; const int MaPeriods = 200; const int MaPeriodsFast = 5; const double slp = 0.0015; int OnInit() { trade.SetExpertMagicNumber(Magic); handleMa =iMA(_Symbol,PERIOD_CURRENT,MaPeriods,0,MODE_SMA,PRICE_CLOSE); handleMaFast = iMA(_Symbol,PERIOD_CURRENT,MaPeriodsFast,0,MODE_SMA,PRICE_CLOSE); handleRsi = iRSI(_Symbol,PERIOD_CURRENT,2,PRICE_CLOSE); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { } void OnTick() { int bars = iBars(_Symbol,PERIOD_CURRENT); if (barsTotal!= bars){ barsTotal = bars; bool NotInPosition = true; double ma[]; double ma_fast[]; double rsi[]; CopyBuffer(handleMa,BASE_LINE,1,1,ma); CopyBuffer(handleMaFast,BASE_LINE,1,1,ma_fast); CopyBuffer(handleRsi,0,1,1,rsi); double lastClose = iClose(_Symbol, PERIOD_CURRENT, 1); for(int i = PositionsTotal()-1; i>=0; i--){ ulong pos = PositionGetTicket(i); string symboll = PositionGetSymbol(i); if(PositionGetInteger(POSITION_MAGIC) == Magic&&symboll== _Symbol){ NotInPosition = false; if((PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY&&(lastClose>ma_fast[0]||lastClose<ma[0])) ||(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL&&(lastClose<ma_fast[0]||lastClose>ma[0])))trade.PositionClose(pos); }} if(rsi[0]<Max&&NotInPosition&&lastClose>ma[0])executeBuy(); if(rsi[0]>Min&&NotInPosition&&lastClose<ma[0])executeSell(); } } void executeSell() { double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); bid = NormalizeDouble(bid,_Digits); double sl = bid*(1+slp); sl = NormalizeDouble(sl, _Digits); trade.Sell(lot,_Symbol,bid,sl); } void executeBuy() { double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); ask = NormalizeDouble(ask,_Digits); double sl = ask*(1-slp); sl = NormalizeDouble(sl, _Digits); trade.Buy(lot,_Symbol,ask,sl); }
Uma operação típica seria semelhante a esta:

Aqui estão os resultados do backtest para o US500 (M30) de 1º de janeiro de 2024 a 1º de março de 2025.




A frequência de operações aqui é bastante alta em comparação com outras estratégias de negociação, com média de cerca de 1–2 operações por dia ao longo de 252 dias de negociação em um ano. Isso provavelmente ocorre porque o RSI2 é extremamente reativo, gerando sinais com frequência mesmo com critérios de entrada extremos. O lucro médio corresponde aproximadamente à perda média, o que é positivo para uma estratégia de reversão à média, na qual a taxa de acerto geralmente supera 50%. Embora as regras de negociação sejam completamente simétricas, existe uma diferença entre as taxas de acerto das operações vendidas e compradas: as operações vendidas apresentaram uma taxa de acerto mais alta, apesar de serem menos numerosas no mercado altista de 2024, sugerindo que os recuos em tendências de alta podem ser mais difíceis de capturar com essa estratégia.
Estratégia dois - RSI2 Pullback
A Estratégia RSI2 Pullback aprimora o trading de reversão à média ao exigir vários valores extremos consecutivos do RSI. A ideia é que um ativo em uma tendência de longo prazo, enfrentando um recuo acentuado ao longo de várias barras, esteja preparado para uma recuperação. Ao utilizar o RSI2 com um limite ligeiramente mais alto do que na versão tradicional e combiná-lo com três valores consecutivos do RSI acima ou abaixo desse limite, o sinal torna-se mais forte, sugerindo capitulação e aumentando as chances de uma reversão rápida.
Esta estratégia se baseia na estrutura de Larry Connors, mas eu a modifiquei adicionando a exigência de múltiplas leituras extremas consecutivas do RSI e introduzindo uma regra de saída incomum. Encerramos a posição quando o preço de fechamento ultrapassa a máxima ou a mínima da vela anterior. Essa ideia de saída surgiu da observação de que reversões de curto prazo frequentemente exibem uma vela de reversão que supera a máxima ou mínima da vela anterior, permitindo que saiamos rapidamente e garantamos um pequeno lucro.
Regras de sinal:
- Comprar quando: os três valores anteriores do RSI2 < 10, último preço de fechamento > média móvel de 200 períodos e nenhuma posição aberta.
- Vender quando: os três valores anteriores do RSI2 > 90, último preço de fechamento < média móvel de 200 períodos e nenhuma posição aberta.
- Encerrar compra quando: último preço de fechamento > máxima da penúltima vela, ou último preço de fechamento < média móvel de 200 períodos.
- Encerrar venda quando: último preço de fechamento < mínima da penúltima vela, ou último preço de fechamento > média móvel de 200 períodos.
- A distância do stop loss é de 0,15% em relação ao preço atual.
O código MQL5:
//US500 M30 #include <Trade/Trade.mqh> CTrade trade; input int Magic = 0; input double lot = 0.1; int barsTotal = 0; int handleMa; int handleRsi; const int Max = 10; const int Min = 90; const int MaPeriods = 200; const double slp = 0.0015; int OnInit() { trade.SetExpertMagicNumber(Magic); handleMa =iMA(_Symbol,PERIOD_CURRENT,MaPeriods,0,MODE_SMA,PRICE_CLOSE); handleRsi = iRSI(_Symbol,PERIOD_CURRENT,2,PRICE_CLOSE); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { } void OnTick() { int bars = iBars(_Symbol,PERIOD_CURRENT); if (barsTotal!= bars){ barsTotal = bars; bool NotInPosition = true; double ma[]; double rsi[]; CopyBuffer(handleMa,BASE_LINE,1,1,ma); CopyBuffer(handleRsi,0,1,3,rsi); double lastClose = iClose(_Symbol, PERIOD_CURRENT, 1); double lastlastHigh = iHigh(_Symbol,PERIOD_CURRENT,2); double lastlastLow = iLow(_Symbol,PERIOD_CURRENT,2); for(int i = PositionsTotal()-1; i>=0; i--){ ulong pos = PositionGetTicket(i); string symboll = PositionGetSymbol(i); if(PositionGetInteger(POSITION_MAGIC) == Magic&&symboll== _Symbol){ NotInPosition = false; if((PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY&&(lastClose>lastlastHigh||lastClose<ma[0])) ||(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL&&(lastClose<lastlastLow||lastClose>ma[0])))trade.PositionClose(pos); }} if(rsi[0]<Max&&rsi[1]<Max&&rsi[2]<Max&&NotInPosition&&lastClose>ma[0])executeBuy(); if(rsi[0]>Min&&rsi[1]>Min&&rsi[2]>Min&&NotInPosition&&lastClose<ma[0])executeSell(); } } void executeSell() { double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); bid = NormalizeDouble(bid,_Digits); double sl = bid*(1+slp); sl = NormalizeDouble(sl, _Digits); trade.Sell(lot,_Symbol,bid,sl); } void executeBuy() { double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); ask = NormalizeDouble(ask,_Digits); double sl = ask*(1-slp); sl = NormalizeDouble(sl, _Digits); trade.Buy(lot,_Symbol,ask,sl); }
Uma operação típica seria semelhante a esta:

Aqui estão os resultados do backtest para o US500 (M30) de 1º de janeiro de 2024 a 1º de março de 2025.




Esta estratégia negocia com menos frequência do que a anterior, principalmente porque a entrada agora exige três valores extremos consecutivos do RSI. A taxa de acerto das operações compradas não é exatamente impressionante. Como observamos na estratégia anterior, como estamos fazendo scalping de pequenos repiques (geralmente 2–3 velas), talvez não estejamos aproveitando totalmente a grande volatilidade da tendência de alta de 2024. Isso pode se equilibrar se a testarmos por mais anos para coletar dados de diferentes condições de mercado.
Estratégia três - RSI2 Sobrecomprado/Sobrevendido
A Estratégia RSI2 Sobrecomprado/Sobrevendido oferece mais flexibilidade, já que o nível de saída se ajusta dependendo de quão tendencial é o ativo. Ela também parte do pressuposto de que leituras extremas do RSI2 significam que uma ação foi longe demais, rápido demais, e está propensa a uma reversão, permitindo que traders comprem quedas (sobrevendido) ou vendam repiques (sobrecomprado). Diferentemente das duas estratégias anteriores, esta possui uma saída mais dinâmica baseada em um limite ajustável de valor do RSI. O problema é que ela pode ser mais arriscada devido aos riscos de cauda, já que o RSI, mesmo com configuração de 2 períodos, é suavizado e apresenta atraso em relação à ação do preço. Assim, se a operação rapidamente se mover contra nós, apenas o stop loss poderá salvar a posição.
Além disso, a média móvel de 200 períodos é normalmente utilizada para identificar tendências de longo prazo em mercados acionários de alta. Foi por isso que, nas duas estratégias anteriores, Larry as projetou apenas para operações compradas. Como estamos fazendo day trading com CFDs aqui, adaptei todas as estratégias para operar tanto comprado quanto vendido. No entanto, Larry mencionou que esta estratégia pode operar em ambos os lados do mercado, incluindo vendas a descoberto de ações. Ela utiliza uma média móvel de 50 períodos em vez da de 200 para filtrar tendências, tornando-se mais responsiva às mudanças de tendência, já que as vendas a descoberto frequentemente estão ligadas a mudanças rápidas, e não a tendências de longo prazo do mercado acionário.
Esta estratégia vem das pesquisas de Larry Connors e é destacada em seus escritos e seminários como uma forma flexível de utilizar o indicador, adequada tanto para operações compradas quanto vendidas, dependendo do mercado.
Regras de sinal:
- Comprar quando: RSI2 < 5, último preço de fechamento > média móvel de 50 períodos e nenhuma posição aberta.
- Vender quando: RSI2 > 95, último preço de fechamento < média móvel de 50 períodos e nenhuma posição aberta.
- Encerrar compra quando: RSI2 > 70.
- Encerrar venda quando: RSI2 < 30.
- A distância do stop loss é de 1% em relação ao preço atual.
O código MQL5:
//US500 M30 #include <Trade/Trade.mqh> CTrade trade; input int Magic = 0; input double lot = 0.1; const int Max = 5; const int Min = 95; const int MaPeriods = 50; const double slp = 0.01; int barsTotal = 0; int handleMa; int handleRsi; int OnInit() { trade.SetExpertMagicNumber(Magic); handleMa =iMA(_Symbol,PERIOD_CURRENT,MaPeriods,0,MODE_SMA,PRICE_CLOSE); handleRsi = iRSI(_Symbol,PERIOD_CURRENT,2,PRICE_CLOSE); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { } void OnTick() { int bars = iBars(_Symbol,PERIOD_CURRENT); if (barsTotal!= bars){ barsTotal = bars; bool NotInPosition = true; double ma[]; double rsi[]; CopyBuffer(handleMa,BASE_LINE,1,1,ma); CopyBuffer(handleRsi,0,1,1,rsi); double lastClose = iClose(_Symbol, PERIOD_CURRENT, 1); for(int i = PositionsTotal()-1; i>=0; i--){ ulong pos = PositionGetTicket(i); string symboll = PositionGetSymbol(i); if(PositionGetInteger(POSITION_MAGIC) == Magic&&symboll== _Symbol){ NotInPosition = false; if((PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY&&rsi[0]>70) ||(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL&&rsi[0]<30))trade.PositionClose(pos); }} if(rsi[0]<Max&&NotInPosition&&lastClose>ma[0])executeBuy(); if(rsi[0]>Min&&NotInPosition&&lastClose<ma[0])executeSell(); } } void executeSell() { double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); bid = NormalizeDouble(bid,_Digits); double sl = bid*(1+slp); sl = NormalizeDouble(sl, _Digits); trade.Sell(lot,_Symbol,bid,sl); } void executeBuy() { double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); ask = NormalizeDouble(ask,_Digits); double sl = ask*(1-slp); sl = NormalizeDouble(sl, _Digits); trade.Buy(lot,_Symbol,ask,sl); }
Uma operação típica seria semelhante a esta:

Aqui estão os resultados do backtest para o US500 (M30) de 1º de janeiro de 2024 a 1º de março de 2025.




Comparada às duas estratégias anteriores, esta apresenta uma taxa de acerto maior, mas também um drawdown flutuante de capital mais elevado, como pode ser observado pelas linhas verdes na curva de capital. Isso está relacionado ao risco de cauda grossa mencionado anteriormente e à necessidade de um stop loss mais amplo do que o habitual. O risco de cauda grossa descreve a maior probabilidade de eventos extremos em uma distribuição, o que pode causar perdas substanciais em uma estratégia de reversão à média que espera que os preços retornem à sua média histórica. Nessas estratégias, oscilações inesperadamente grandes de preço, mais frequentes em distribuições de cauda grossa, podem impedir a reversão esperada e levar a riscos ou perdas amplificados em comparação com o que uma distribuição normal preveria. Embora esta estratégia apresente um fator de lucro mais alto, o drawdown precisa ser tratado para torná-la uma estratégia prática e negociável.

Reflexões
Ao analisar as três estratégias que cobrimos, elas são bastante semelhantes em termos de código e regras de sinal. Isso ocorre principalmente porque todas derivam do modelo de sistema "RSI2 Mean-Reversion". Quando você possui um modelo de sistema sólido, ajustar algumas regras para criar diferentes estratégias é relativamente simples. Vamos analisar a diferença entre um sistema conceitual e uma estratégia individual no trading CTA.
Uma estratégia individual está vinculada a um timeframe e ativo específicos, com regras de sinal detalhadas e difíceis de substituir. Já um modelo de sistena é mais um ponto de partida amplo para encontrar sua vantagem estatística com base em conceitos historicamente comprovados, como reversão à média, seguimento de tendência, momentum ou rompimento. A partir daí, um modelo de sistema específico combina fontes-chave de sinais com esse conceito maior, como RSI2 Mean-Reversion neste artigo. Os modelos de sistemas são mais flexíveis em diferentes timeframes, ativos e regras de sinal, tornando mais simples criar múltiplas estratégias e construir um portfólio diversificado de forma eficiente.
Para implementar um modelo de sistema e desenvolver estratégias a partir dele, é uma boa ideia:
- Calcular todos os sinais ou distâncias de preço de forma estacionária por meio de normalização, ou utilizar percentuais do preço para torná-los mais escaláveis entre diferentes ativos e timeframes.
- Evitar codificar rigidamente o timeframe e o símbolo no código. Utilize _Symbol e PERIOD_CURRENT para ajustes automáticos durante os backtests sob diferentes condições.
- Dividir uma estratégia em regras claras de entrada e saída, listá-las e considerar regras alternativas que ainda capturem a mesma motivação baseada em vantagem estatística.
- Encapsular código reutilizável em funções para mantê-lo organizado e eficiente, facilitando ajustes futuros nas regras de sinal.
Agora que entendemos o conceito de pensar em modelos de sistemas em vez de estratégias específicas, aqui estão algumas sugestões para melhorias futuras na utilização do modelo de reversão à média RSI2 para criar uma estratégia mais negociável.
- Testar as estratégias em diversos timeframes e ativos além do US500 M30 para descobrir se existem condições melhores do que as que estamos utilizando atualmente. Certifique-se de realizar todas as descobertas em dados in-sample para evitar viés de antecipação (look-ahead bias).
- Alterar os indicadores de momentum e tendência, como substituir o RSI por ROC ou VIX, ou trocar as médias móveis por um filtro de Kalman.
- Combinar as regras de entrada e saída com outras estratégias de reversão à média, como utilizar Bandas de Bollinger para as entradas enquanto mantém a regra de saída deste artigo.
Essas são técnicas fundamentais nas quais pesquisadores quantitativos experientes de CTA confiam para construir estratégias de forma mais eficaz. Ter novas ideias de estratégias nunca foi uma questão de inventar algo totalmente inédito. Trata-se mais de ajustar ou combinar modelos existentes e comprovados que já estão disponíveis, mas que não são suficientemente lucrativos por si só. Essa parte do trabalho é abstrata o suficiente para que as máquinas não consigam assumir o controle, mas estruturada o bastante para que as pessoas continuem explorando dados metodicamente seguindo um processo.
Conclusão
Neste artigo, começamos explicando por que escolhemos construir estratégias intradiárias a partir do conceito de reversão à média RSI2. Em seguida, analisamos três estratégias bem conhecidas de Larry Connors, detalhando a lógica por trás de suas regras de sinal, descrevendo exatamente as condições de entrada e saída e realizando backtests delas no MetaTrader 5. Depois disso, introduzimos a ideia de criar estratégias a partir de sistemas-modelo, oferecemos dicas práticas para aplicar essa abordagem e sugerimos maneiras de desenvolver estratégias de reversão à média RSI2 mais lucrativas no futuro. Em resumo, este artigo apresenta uma estrutura clara para traders: pegar uma estratégia popular e publicamente disponível na internet, modificá-la um pouco e testá-la em MQL5 para refinar ainda mais o conceito. Os traders podem adotar esse processo facilmente e aumentar a eficiência do desenvolvimento de suas estratégias.
Tabela de Arquivos
| Nome do Arquivo | Uso dos Arquivos |
|---|---|
| RSI2_V1.mq5 | O EA da primeira estratégia |
| RSI2_V2.mq5 | O EA da segunda estratégia |
| RSI2_V3.mq5 | O EA da terceira estratégia |
Traduzido do Inglês pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/en/articles/17636
Aviso: Todos os direitos sobre esses materiais pertencem à MetaQuotes Ltd. É proibida a reimpressão total ou parcial.
Esse artigo foi escrito por um usuário do site e reflete seu ponto de vista pessoal. A MetaQuotes Ltd. não se responsabiliza pela precisão das informações apresentadas nem pelas possíveis consequências decorrentes do uso das soluções, estratégias ou recomendações descritas.
Introdução ao MQL5 (Parte 14): Guia para Iniciantes na Criação de Indicadores Personalizados (III)
Do básico ao intermediário: Arquivo template (II)
Algoritmo do Átomo Artificial — Artificial Atom Algorithm (A3)
Rede neural na prática: Retro propagação manual
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso