![Estratégia de negociação RSI Deep Three Move](https://c.mql5.com/2/57/The_RSI_Deep_Three_Move_600x314.jpg)
Estratégia de negociação RSI Deep Three Move
1. Introdução
Este artigo é fundamentado em uma nova série de pesquisas que demonstram diversos métodos de negociação com base no RSI. A estratégia apresentada é apenas uma maneira de utilizar o indicador. A pesquisa é baseada na linguagem de programação MQL5.
2. Breve introdução ao RSI
O índice de força relativa (RSI) é um indicador técnico usado para medir a força e o impulso de ativos financeiros, como ações, moedas ou commodities. O RSI é calculado usando fórmulas matemáticas e é exibido em um gráfico, que mostra o nível de força ou fraqueza de um ativo em um período específico.
O RSI pressupõe que, quando os preços sobem, um ativo se torna excessivamente comprado e, quando os preços caem, o ativo se torna excessivamente vendido. Nesse cenário, o RSI ajuda os traders a identificar possíveis reversões de tendência ou correções nos preços.
O cálculo do RSI envolve comparar o ganho médio de um ativo em um período específico com a perda média do mesmo ativo no mesmo período. O RSI padrão é exibido em uma escala de 0 a 100. Valores acima de 70 são considerados de sobrecompra e valores abaixo de 30 são considerados de sobrevenda. O RSI é um indicador popular entre os traders, pois pode fornecer sinais de alerta precoce sobre possíveis tendências. Por exemplo, se o RSI de um ativo estiver constantemente subindo e atingir um nível acima de 70, isso pode indicar que o ativo está sobrecomprado e pode sofrer uma correção. Por outro lado, se o RSI estiver constantemente caindo e atingir um nível abaixo de 30, isso pode indicar que o ativo está sobrevendido e pode ocorrer uma recuperação.
O RSI não deve ser usado como a única base para tomar decisões de negociação. Os traders geralmente combinam o RSI com outras ferramentas de análise técnica e indicadores de mercado para obter uma compreensão mais completa das condições do mercado e tomar decisões de negociação fundamentadas. Normalmente, o RSI é calculado em um período de 14.
3. O que é o RSI (descrição mais detalhada)
3.1 IntroduçãoO Índice de Força Relativa (RSI) é um indicador técnico usado na análise dos mercados financeiros. Ele é projetado para mostrar a força atual e histórica ou a fraqueza de uma ação ou mercado com base nos preços de fechamento do período de negociação recente. Este indicador não deve ser confundido com a força relativa.
O RSI é classificado como um oscilador de impulso, que mede a velocidade e magnitude dos movimentos de preços. Já agora o impulso é a velocidade no aumento ou queda dos preços. A Força Relativa (RS) é a relação entre os fechamentos mais altos e mais baixos. Neste caso, são calculadas duas médias dos valores absolutos das mudanças nos preços de fechamento, ou seja, duas somas que incluem o tamanho das velas em um gráfico de velas. O RSI calcula o impulso como a relação entre os fechamentos mais altos e o fechamento total: ações com mudanças positivas mais fortes têm um RSI mais alto do que ações com mudanças negativas mais fortes.
O RSI é mais frequentemente usado em um período de 14 dias e é medido em uma escala de 0 a 100, com níveis altos e baixos marcados como 70 e 30, respectivamente. Períodos mais curtos ou mais longos são usados para previsões mais curtas ou mais longas. Níveis altos e baixos (80 e 20 ou 90 e 10) são menos comuns, mas indicam um impulso mais forte.
O Índice de Força Relativa foi desenvolvido por J. Welles Wilder e publicado em 1978 no livro "New Concepts in Technical Trading Systems" e na revista Commodities (hoje Modern Trader) em junho de 1978. O RSI se tornou um dos osciladores mais populares.
O RSI emite sinais de compra quando um ativo ou moeda está sobrevendido e sinais de venda quando está sobrecomprado.
O RSI com parâmetros recomendados e otimização diária foi testado e comparado com outras estratégias no trabalho de Marek e Shedivy (2017). O teste foi aleatório no tempo e nas empresas (por exemplo, Apple, Exxon Mobil, IBM, Microsoft) e mostrou que o RSI pode fornecer bons resultados, mas à medida que o período de tempo aumenta, geralmente é superado pela estratégia simples, que é a de "comprar e manter".
3.2 CálculoPara cada período de negociação, é calculada a mudança positiva U ou a mudança negativa D.Os períodos de alta são caracterizados pelo novo fechamento sendo maior do que o anterior:
E, ao contrário, períodos de baixa são caracterizados pelo preço de fechamento sendo inferior ao preço de fechamento do período anterior.
Se o último fechamento for igual ao anterior, então U e D são iguais a zero. Note que U e D são números positivos.
Agora, as médias são calculadas com base nas sequências de U e D usando uma média móvel suavizada ou modificada ao longo de um período n (SMMA ou MMA), que é uma média móvel exponencial suavizada com α = 1 / n. Estas são médias ponderadas positivamente dos membros positivos que se comportam de forma aditiva em relação à divisão.
Inicialmente, Wilder formulou o cálculo da média móvel como: newval = (prevval * (n - 1) + newdata) / n, o que é equivalente ao mencionado suavização exponencial. Assim, os novos dados são simplesmente divididos por n ou multiplicados por α, enquanto as médias móveis anteriores são ajustadas por (n - 1) / n, ou seja, 1 - α. Algumas soluções comerciais, como o AIQ, usam a média móvel exponencial padrão (EMA) em vez da SMMA de Wilder. As médias móveis suavizadas devem ser inicializadas apropriadamente com uma média móvel simples usando os primeiros n valores da série de preços.
A relação entre essas médias representa a Força Relativa ou o Coeficiente de Força Relativa:
Em seguida, o coeficiente de força relativa é transformado em um índice de força relativa de 0 a 100:
Se a média de U for igual a zero, RS e RSI também são iguais a zero. Se a média de U for igual à média de D, RS é igual a 1 e RSI é igual a 50. Se a média de U for máxima, de modo que a média de D seja igual a zero, o valor de RS tende ao infinito, e RSI é igual a 100.
3.3 Definição
3.3.1 Configuração básicaO RSI é exibido no gráfico acima ou abaixo do gráfico de preços. O indicador possui uma linha superior, geralmente marcada em 70, uma linha inferior em 30 e uma linha média pontilhada em 50. Wilder recomendou um período de suavização igual a 14 (suavização exponencial, ou seja, α = 1/14 ou N = 14).
Wilder afirmou que quando o preço sobe muito rapidamente, em algum momento ele é considerado sobrecomprado. Da mesma forma, quando o preço cai muito rapidamente, em algum momento ele é considerado sobrevendido. Em ambos os casos, Wilder acreditava que uma reação ou reversão era inevitável.
O nível do RSI é um indicador da força de negociação recente de um ativo. A inclinação do RSI é diretamente proporcional à velocidade da mudança da tendência. A distância percorrida pelo RSI é proporcional à magnitude do movimento.
Wilder acreditava que topos e fundos são formados quando o RSI sobe acima de 70 ou cai abaixo de 30. Tradicionalmente, valores de RSI acima de 70 são considerados sobrecomprados, e valores de RSI abaixo de 30 são considerados sobrevendidos. O nível entre 30 e 70 é considerado neutro, e o nível 50 é um sinal de ausência de tendência.
Wilder também acreditava que a divergência entre o RSI e a ação de preço era um sinal muito convincente de que uma reversão de tendência no mercado era inevitável. A divergência de baixa ocorre quando o preço atinge uma nova alta, mas o RSI atinge uma alta mais baixa, não confirmando o movimento ascendente. A divergência de alta ocorre quando o preço atinge uma nova baixa, mas o RSI atinge uma baixa mais alta.
3.3.4. Condições de sobrecompra e sobrevendaWilder considerava que os "oscilações fracassadas" do RSI acima e abaixo de 50 eram sinais convincentes de uma reversão de mercado. Por exemplo, suponha que o RSI atinja 76, recue para 72 e depois suba para 77. Se o índice cair abaixo de 72, segundo Wilder, isso seria uma "oscilação fracassada" acima de 70.
Wilder escreveu que os gráficos e áreas de suporte e resistência às vezes são mais fáceis de identificar no gráfico do RSI do que no gráfico de preços. A linha central do índice de Força Relativa é igual a 50, o que frequentemente é considerado como a linha de suporte e resistência do indicador.
Se o índice de Força Relativa estiver abaixo de 50, geralmente significa que as perdas superam os ganhos. Quando o índice de Força Relativa excede 50, geralmente significa que os ganhos superam as perdas.
3.3.5. Tendências de alta e de baixaAlém da interpretação original de Wilder para o RSI, Andrew Cardwell desenvolveu várias novas interpretações do RSI que ajudam a identificar e confirmar tendências. Em primeiro lugar, Cardwell observou que uma tendência de alta normalmente é negociada entre RSI 40 e 80, enquanto uma tendência de baixa geralmente é negociada entre RSI 60 e 20. Cardwell também observou que quando os ativos mudam de uma tendência de alta para uma tendência de baixa e vice-versa, o RSI sofre uma "mudança de intervalo".
Ele também notou que a divergência de baixa: 1) ocorre apenas em uma tendência de alta e 2) geralmente leva apenas a uma correção de curto prazo, não a uma reversão de tendência. Por isso, a divergência de baixa é um sinal de confirmação de uma tendência de alta. Da mesma forma, a divergência de alta é um sinal de confirmação de uma tendência de baixa.
3.3.6. ReversõesFinalmente, Cardwell descobriu a existência de reversões positivas e negativas do RSI (elas são o oposto da divergência). Assim, por exemplo, a reversão positiva ocorre quando uma correção de preço em uma tendência de alta resulta em uma baixa mais alta em comparação com a última correção de preço, ao mesmo tempo que o RSI atinge uma baixa mais alta em comparação com a última correção. Já agora a reversão negativa ocorre quando um rali em uma tendência de baixa resulta em uma alta mais baixa em comparação com o último rali em uma tendência de baixa, mas o RSI atinge uma alta mais alta em comparação com o último rali.
Em outras palavras, apesar de um impulso mais forte, conforme evidenciado por um RSI de alta superior ou de baixa inferior, o preço não conseguiu atingir uma alta superior ou uma baixa inferior. Isso indica que a tendência principal está prestes a ser retomada. Cardwell observou que as reversões positivas só ocorrem em tendências de alta e as reversões negativas só ocorrem em tendências de baixa e, portanto, sua existência confirma a tendência.4. RSI Deep Three Move
A estratégia Deep Three Move envolve o envio de um sinal quando o RSI entra em uma condição de sobrevenda ou sobrecompra e forma três movimentos consecutivos na mesma direção, com o quarto movimento (na mesma direção) atuando como confirmação. As condições de negociação são as seguintes:
- Todo sinal de alta é identificado quando o RSI está abaixo do RSI anterior, que, por sua vez, também está abaixo do RSI anterior, e este último também está abaixo do RSI anterior. Como geralmente é usado com o RSI de 8 períodos, o RSI de três períodos atrás deve estar abaixo de 20 e o RSI de quatro períodos atrás deve estar acima de 20 (para evitar sinais duplicados).
-
Por outro lado, o sinal de baixa é verificado sempre que o RSI estiver acima do RSI anterior, que, por sua vez, também está acima do RSI anterior, e este último também está acima do RSI anterior. Como geralmente é usado com o RSI de 8 períodos, o RSI de três períodos atrás deve estar acima de 80 e o de quatro períodos atrás deve estar abaixo de 80 (para evitar sinais duplicados).
A figura a seguir mostra um sinal de alta baseado nessa metodologia:
5. Código
//+------------------------------------------------------------------+ //| RSI Deep Three Move.mq5 | //| Javier S. Gastón de Iriarte Cabrera | //| https://https://www.mql5.com/en/users/jsgaston/news | //+------------------------------------------------------------------+ #property copyright "Javier S. Gastón de Iriarte Cabrera" #property link "https:/https://www.mql5.com/en/users/jsgaston/news" #property version "1.01" #property script_show_inputs #include <GetIndicatorBuffers.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\PositionInfo.mqh> #include <Trade\AccountInfo.mqh> //--- CPositionInfo m_position; // object of CPositionInfo class CTrade m_trade; // object of CTrade class CSymbolInfo m_symbol; // object of CSymbolInfo class CAccountInfo m_account; // object of CAccountInfo class CTrade trade; CTrade Ctrade; input string Expert_Title ="RSI Deep Three Move Strategy"; // Document name enum ENUM_LOT_TYPE { LOT_TYPE_FIX = 0, // fix lot LOT_TYPE_RISK = 1, // risk % }; //--- input parameters input ENUM_LOT_TYPE inp_lot_type = LOT_TYPE_FIX; // type of lot input double inp_lot_fix = 0.01; // fix lot input double inp_lot_risk = 0.01; input bool InpPrintLog = false; // Print log ulong Expert_MagicNumber =11777; bool Expert_EveryTick =false; input ENUM_TIMEFRAMES my_timeframe=PERIOD_CURRENT; // Timeframe input ENUM_APPLIED_PRICE Inp_RSI_applied_price = PRICE_CLOSE; // RSI: type of price input int InpPeriodRSI=8; // Period of the signal for the RSI inside custom int handle_iCustom; input int ptsl = 5000; // points for stoploss input int pttp = 5000; // points for takeprofit string Orden; double sl2; double tp2;
Este é um trecho de código bastante complexo escrito em linguagem MQL5. Trata-se de uma estratégia de negociação que utiliza o Índice de Força Relativa (RSI) para identificar oportunidades de negociação potenciais. O código inclui o uso de diversas classes, como CPositionInfo, CTrade, CSymbolInfo e CAccountInfo. Também incorpora vários parâmetros de entrada, como tipo de lote, lote fixo, percentual de risco, nome do EA, número mágico, período de tempo, período de suavização do RSI, tipo de preço e níveis de stop loss e take profit. O código também faz uso de variáveis como handle_iRSI2, handle_iCustom, Orden, sl e tp. O objetivo do código é identificar oportunidades de negociação com base no indicador RSI.
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- handle_iCustom=iCustom(_Symbol,my_timeframe,"\\Indicators\\Examples\\RSI",InpPeriodRSI); if(handle_iCustom==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d", _Symbol, EnumToString(my_timeframe), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); }
O código faz parte da função de inicialização de um EA em linguagem MQL5. Ele é usado para criar o descritor do indicador iCustom para o símbolo e período de tempo especificados. Além disso, ele cria descritores para o indicador iRSI com os parâmetros definidos. Se a criação do descritor iCustom falhar, uma mensagem de erro é exibida e o indicador é interrompido. Se o descritor for criado com sucesso, a inicialização é bem-sucedida.
void OnTick() { MqlTick tick; double last_price = tick.ask; SymbolInfoTick(_Symbol,tick); int total = PositionsTotal(); //--- // Retrieve the current value MqlTradeResult result; MqlRates rates[]; //--- double array_rsi[]; ArraySetAsSeries(array_rsi,true); int start_pos=0,count=5; if(!iGetArray(handle_iCustom,0,start_pos,count,array_rsi)) return; string text=""; for(int i=0; i<count; i++) text=text+IntegerToString(i)+": "+DoubleToString(array_rsi[i],Digits()+1)+"\n"; //--- Comment(text); { if(array_rsi[0] < array_rsi[1] && array_rsi[1] < array_rsi[2] && array_rsi[2] < array_rsi[3] && array_rsi[3] < 20.0 && array_rsi[4] > 20.0) { Print("Open Order Buy"); Alert(" Buying"); Orden="Buy"; sl=NormalizeDouble(tick.ask - ptsl*_Point,_Digits); tp=NormalizeDouble(tick.bid + pttp*_Point,_Digits); trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,get_lot(tick.bid),tick.bid,sl,tp,"Buy"); return; } } { if(array_rsi[0] > array_rsi[1] && array_rsi[1] > array_rsi[2] && array_rsi[2] > array_rsi[3] && array_rsi[3] > 80.0 && array_rsi[4] < 80.0) { Print("Open Order Sell"); Alert(" Selling"); Orden="Sell"; sl=NormalizeDouble(tick.bid + ptsl*_Point,_Digits); tp=NormalizeDouble(tick.ask - pttp*_Point,_Digits); trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,get_lot(tick.ask),tick.ask,sl,tp,"Sell"); return; } } if(total>0) { if(Orden=="Sell" && array_rsi2[0]<20.0) { trade.PositionClose(_Symbol,5); Print("cerró sell"); return; } if(Orden=="Buy" && array_rsi2[0]>80.0) { trade.PositionClose(_Symbol,5); Print("cerró buy"); return; } } }Esse fragmento de código mostra a função Expert Tick no MQL5. Ele é usado para abrir e fechar posições no mercado. Primeiro, ela extrai o valor atual do símbolo e o armazena em MqlTick, que é a variável de ticks. Em seguida, extrai o número total de posições e o armazena na variável total. Após isso, extrai os valores de RSI da função iCustom e os armazena em array_rsi e na variável. Em seguida, verifica se os valores de RSI estão abaixo de 20 para uma ordem de venda e acima de 80 para uma ordem de compra e, em caso afirmativo, abre uma posição com os parâmetros apropriados. Por fim, ele verifica se os valores de RSI estão acima do limite de 20 ou 80 e, em caso afirmativo, fecha a posição.
bool iGetArray(const int handle,const int buffer,const int start_pos, const int count,double &arr_buffer[]) { bool result=true; if(!ArrayIsDynamic(arr_buffer)) { //if(InpPrintLog) PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__); return(false); } ArrayFree(arr_buffer); //--- reset error code ResetLastError(); //--- fill a part of the iBands array with values from the indicator buffer int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer); if(copied!=count) { //--- if the copying fails, tell the error code //if(InpPrintLog) PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d", __FILE__,__FUNCTION__,count,copied,GetLastError()); //--- quit with zero result - it means that the indicator is considered as not calculated return(false); } return(result); }
Este código é usado para copiar valores do buffer do indicador para um array. A função aceita cinco parâmetros: o descritor do indicador, o buffer do indicador, a posição inicial no buffer, a quantidade de valores a serem copiados e o array para armazenar os valores. Em seguida, ele verifica se o array é dinâmico e, se for o caso, define um código de erro e copia os valores do buffer para o array. Se a cópia falhar, uma mensagem de erro é exibida e a função retorna false. Caso contrário, retorna true.
double get_lot(double price) { if(inp_lot_type==LOT_TYPE_FIX) return(normalize_lot(inp_lot_fix)); double one_lot_margin; if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,one_lot_margin)) return(inp_lot_fix); return(normalize_lot((AccountInfoDouble(ACCOUNT_BALANCE)*(inp_lot_risk/100))/ one_lot_margin)); } double normalize_lot(double lt) { double lot_step = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP); lt = MathFloor(lt / lot_step) * lot_step; double lot_minimum = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN); lt = MathMax(lt, lot_minimum); return(lt); }
Este código é usado para calcular o tamanho do lote para uma negociação. A primeira função, get_lot(), recebe o preço da negociação como argumento e verifica o tipo de lote (fixo ou baseado em risco). Se o lote for do tipo fixo, a função normalize_lot() é chamada para normalizar o tamanho do lote. Se o lote for baseado em risco, a função OrderCalcMargin() é usada para calcular a margem necessária para a negociação, e a função AccountInfoDouble() é usada para obter o saldo da conta. Em seguida, o tamanho do lote é calculado dividindo o saldo da conta pela margem e multiplicando pelo percentual de risco. Em seguida, a função normalize_lot() é chamada para normalizar o tamanho do lote. A função normalize_lot() recebe o tamanho do lote como argumento e calcula o tamanho do passo e o tamanho mínimo do lote para o símbolo. Em seguida, o tamanho do lote é arredondado para o passo mais próximo e, se necessário, o tamanho mínimo do lote é aplicado.
6. Resultados
EURUSD, períodos de 30 minutos e 900 pontos para o SL (não esqueça de usar 8 períodos para o RSI) em 2023, do primeiro de janeiro até o final de junho.
7. Considerações finais
Certamente, nem todos os métodos são perfeitos. Você inevitavelmente encontrará alguns sinais ruins, especialmente em períodos de tendência. Como você pode ter notado, durante tendências sérias, o método não funciona adequadamente.
A estratégia precisa ser otimizada para ser aplicável nos mercados, mas a ideia é apresentar uma abordagem de análise de mercado com base no retorno à média.
Abaixo estão os resultados lucrativos para todos os símbolos do meu corretor em uma conta de centavos com um período de 30 minutos até o final de junho de 2023.
Traduzido do Inglês pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/en/articles/12846
![Desenvolvendo um agente de Aprendizado por Reforço em MQL5 com Integração RestAPI (Parte 4): Organizando Funções em Classes no MQL5](https://c.mql5.com/2/64/RestAPIs_em_MQL5_Logo.png)
![Operações de negociação Estruturas das solicitações e das resposta, descrição e registro](https://c.mql5.com/2/57/printformat_trading_transactions_avatar.png)
![Teoria das Categorias em MQL5 (Parte 15): Funtores com grafos](https://c.mql5.com/2/57/Category-Theory-p15-avatar.png)
![Desenvolvendo um sistema de Replay (Parte 40): Iniciando a segunda fase (I)](https://c.mql5.com/2/64/Neural_networks_made_easy_sPart_727_Predicting_trajectories_in_the_presence_of_noise_LOGO__UPSACALE.png)
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- 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