English Русский 中文 Español Deutsch 日本語 한국어 Français Italiano Türkçe
Como desenvolver sistemas baseados em médias móveis

Como desenvolver sistemas baseados em médias móveis

MetaTrader 5Negociação | 6 junho 2022, 09:46
929 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Introdução

Acho que, independentemente da experiência, muitos de nós provavelmente já ouvimos a frase "a tendência é nossa amiga". Se ainda não, eu explico. Os preços ou tendências podem tomar diferentes direções dentro do mercado, isto é:

  • Durante a tendência de alta, o preço faz mínimos e máximos mais altos.
  • Durante a tendência de baixa, o preço faz mínimos e máximos mais baixos, quer dizer, é o oposto da tendência de alta.
  • Durante o movimento lateral, o preço faz qualquer movimento que não pode ser atribuído nem a uma tendência de alta nem a uma tendência de baixa.

As figuras abaixo mostram gráficos de uma tendência de alta e de uma tendência de baixa:

Tendência de alta

Tendência de baixa

Agora que analisamos o que é uma tendência, resta responder à pergunta: «por que essa tendência é amiga?».

A seguir, falaremos apenas sobre a tendência de alta e a de baixa, pois elas têm um movimento claramente identificável para cima ou para baixo, e, portanto, nos permitem ver quem atualmente domina o mercado e movimenta os preços. Durante uma tendência de alta, o mercado é dominado por compradores que elevam os preços independentemente da oferta, tal mercado é chamado de touros. Por outro lado, durante uma tendência de baixa, o mercado é dominado por vendedores que empurram os preços para baixo, tal mercado é chamado de mercado de ursos.

Porém, às vezes podemos ver um movimento de dentes de serra com reversões e falsos rompimentos no mercado. Tais falsas rupturas podem fazer muito mal. Abaixo veremos como exatamente elas podem fazer mal, mas primeiro vamos tentar entender o que significa um falso rompimento.

Um falso rompimento é uma situação em que um sinal para uma determinada ação tomada por nós é acionado, mas tal situação sofre um revés. Naturalmente, o resultado de tais ações acaba se revelando negativo. Existem diferentes maneiras de filtrar ditos falsos rompimentos. Uma delas é utilizando as médias móveis. Neste artigo aprenderemos a usar estratégias baseadas em médias móveis e desenvolveremos sistemas automatizados para negociação algorítmica que facilitem o trabalho com as mesmas.

Neste artigo, abordaremos os seguintes tópicos:

Observação: todo o conteúdo deste artigo é destinado apenas para fins de treinamento e não é destinado a qualquer outro propósito. Qualquer coisa que você coloque em prática com base neste artigo será por sua própria conta e risco, o autor não garante nenhum resultado. Em qualquer caso, quaisquer estratégias devem ser testadas e otimizadas minuciosamente. Mais uma vez, o artigo e os exemplos nele contidos são apenas para fins meramente informativos.

Vamos escrever todos os códigos em MQL5 e testá-los na plataforma MetaTrader 5.

Existem muitas maneiras diferentes de filtrar os sinais gerados por qualquer estratégia. Provavelmente, a mais simples delas consiste no uso de uma média móvel. Vamos falar sobre isso neste artigo. Veremos estratégias baseadas em médias móveis e aprenderemos a programar uma estratégia de negociação algorítmica. O objetivo do artigo é ensinar aos leitores como criar seus próprios sistemas de negociação automatizados.


Definição de média móvel


O indicador de média móvel é muito comum na análise técnica. É calculado como o valor médio do preço durante um determinado período de tempo. O indicador suaviza os dados de preços e reduz o impacto de movimentos e flutuações aleatórios de curto prazo no gráfico.

Existem diferentes tipos de médias móveis. A principal diferença está no método de cálculo, mas falaremos sobre isso na próxima seção. Por enquanto, basta entender que existem muitos tipos diferentes e que podemos usar variadas opções de cálculo para obter os melhores resultados em situações específicas.

A média móvel é um indicador de tendência baseado na análise de preços. Quer dizer, se o preço se mover em uma determinada direção, a média móvel seguirá o preço na mesma direção.

É um indicador que tarda a reagir porque vai atrás do preço, ou seja, o preço aparece primeiro e depois a média é calculada com base em seu valor. Sem o valor do preço, não haverá nada para calcular.

Pela natureza da média móvel, pode-se determinar que este indicador:

  • Mostra o valor médio
  • Funciona melhor em um mercado de tendências
  • Confirma dada tendência e ajuda a identificá-la
  • Remove o ruído do movimento do preço
  • Ajuda a identificar falsos rompimentos
  • E muito mais…

Eis os tipos de médias móveis:


Existem variadíssimas médias móveis. As mais comuns são:

  • média móvel simples;
  • média móvel ponderada;
  • média móvel exponencial.

A principal diferença entre elas está nos métodos de cálculo.

A seguir, vamos examinar cada um delas e aprender como usá-las em MQL5.

Média móvel simples:

Este é o tipo mais simples de média móvel, muitas vezes referido como SMA (Simple Moving Average).

É calculada como a média aritmética de um determinado conjunto de valores durante o período de tempo selecionado. Ou seja, os valores de um determinado número de preços são somados e, em seguida, o resultado é dividido por esse número.

SMA

Por exemplo, vamos tomar cinco dias de negociação. Os preços de fechamento para esses cinco dias foram:

  • Dia 1 = 10
  • Dia 2 = 15
  • Dia 3 = 20
  • Dia 4 = 30
  • Dia 5 = 35

O valor de SMA para esses cinco dias é calculado da seguinte forma:


SMA example

Média móvel ponderada

A média móvel ponderada (Weighted Moving Average, WMA) também reflete o valor médio do preço para o período selecionado, contudo mais peso é dado aos dados mais recentes. Ou seja, se calcularmos o WMA para 10 dias, todos esses dados de preços terão pesos diferentes e os dados posteriores terão mais peso.

A média móvel ponderada é calculada usando a seguinte fórmula:

WMA


Exemplo:

Vamos pegar os mesmos 5 dias de negociação com os mesmos preços de fechamento:

  • Dia 1 = 10
  • Dia 2 = 15
  • Dia 3 = 20
  • Dia 4 = 30
  • Dia 5 = 35

A média móvel ponderada para esses cinco dias pode ser calculada usando a fórmula:

Exemplo de WMA


Exemplo de WMA


Média móvel exponencial

A média móvel exponencial (Exponential Moving Average, EMA) é caracterizada por um cálculo que leva em consideração o período anterior ao período de cálculo. Ou seja, ao calcular o valor médio de 10 dias, também será levado em consideração o período anterior.

O WMA é calculado usando a seguinte fórmula:

Primeiro, calculamos K (o expoente para calcular o peso do intervalo) e n (o número de intervalos):

EMA

Logo,

EMA

Exemplo:

Vamos pegar os mesmos 5 dias de negociação com os mesmos preços de fechamento:

  • Dia 1 = 10
  • Dia 2 = 15
  • Dia 3 = 20
  • Dia 4 = 30
  • Dia 5 = 35
  • Dia 6 = 40

O EMA médio de cinco dias é calculado da seguinte forma:

Exemplo de EMA


Exemplo de EMA

Observe que o primeiro dia do cálculo da média móvel exponencial é o dia 6 e, nos cinco dias anteriores, era calculada a média simples (22).


Já sabemos a definição de média móvel e seus tipos. Agora vamos para a parte mais interessante. Falaremos sobre estratégias baseadas em médias móveis e aprenderemos a criar sistemas de negociação algorítmicos baseados nelas.


Estratégia 1: Cruzamento de uma média móvel

Para os propósitos deste artigo, vamos trabalhar com exemplos que usam a média móvel simples (SMA). No entanto, podemos escolher qualquer tipo de média móvel que se adeque ao nosso código.

Para esta estratégia, verificaremos a interseção entre o preço e o SMA a cada tick:

  • Preço > SMA: sinal de compra, mostraremos este sinal como um comentário no gráfico.
  • Preço < SMA: sinal de venda, mostraremos este sinal como um comentário no gráfico.
  • Em todos os outros casos, não fazemos nada.

A figura abaixo mostra como funciona estratégia baseada na interseção de média móvel:

1MA Blueprint


O código da estratégia ficará assim:

//+------------------------------------------------------------------+
//|                                            One SMA crossover.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //create an array for several prices
   double myMovingAverageArray1[];
   
   //define Ask, Bid
   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
   
   //define the properties of  MAs - simple MA 24
   int movingAverage1 = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE);
   
   //sort the price arrays current candle
   ArraySetAsSeries(myMovingAverageArray1,true);
   
   //Defined MA - one line - currentcandle, 3 candles - store result
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   
   //Check if we have a buy entry signal
   if (
      (Ask>myMovingAverageArray1[0])
      )
         {
         Comment("BUY");
         }
    
   //Checking for a sell entry signal      
   if (
      (Bid 0])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+


Uma vez iniciada a estratégia, os seguintes sinais serão gerados no gráfico:

1MA - sinal de compra

MA - sinal de venda

Estratégia 2: Cruzamento de duas médias móveis

Para esta estratégia, usaremos duas médias móveis. O período da média móvel curta será 24 e o da longa, 50.

Neste caso, verificaremos a posição de duas médias móveis a cada tick:

  • SMA com período de 24 > SMA com período de 50: sinal de compra, mostraremos este sinal como um comentário no gráfico.
  • SMA com período de 24 < SMA com período de 50: sinal de venda, mostraremos este sinal como um comentário no gráfico.
  • Em todos os outros casos, não fazemos nada.

A figura abaixo mostra como essa estratégia baseada em duas médias móveis simples funciona:

2MA Blueprint


O código da estratégia ficará assim:

//+------------------------------------------------------------------+
//|                                            Two SMA crossover.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //create an array for several prices
   double myMovingAverageArray1[], myMovingAverageArray2[];
   
   //define the properties of  MAs - simple MA, 1st 24 / 2nd 50
   int movingAverage1 = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE);
   int movingAverage2 = iMA(_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE);
   
   //sort the price arrays 1, 2 from current candle
   ArraySetAsSeries(myMovingAverageArray1,true);
   ArraySetAsSeries(myMovingAverageArray2,true);
   
   //Defined MA1, MA2 - one line - currentcandle, 3 candles - store result
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2);
   
   //Check if we have a buy entry signal
   if (
      (myMovingAverageArray1[0]>myMovingAverageArray2[0])
   && (myMovingAverageArray1[1] 1])
      )
         {
         Comment("BUY");
         }
    
   //Checking for a sell entry signal      
   if (
      (myMovingAverageArray1[0] 0])
   && (myMovingAverageArray1[1]>myMovingAverageArray2[1])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+


Uma vez iniciada a estratégia, os seguintes sinais serão gerados no gráfico:

2MA - sinal de compra


2MA - sinal de venda


Estratégia 3: Cruzamento de três médias móveis

Nesta estratégia, usaremos três médias móveis, isto é: uma curta com período de 10, uma média com período de 24 e outra longa com período de 48.

Em dado caso, verificaremos a posição de três médias móveis a cada tick:

  • Se 10 SMA > 24 SMA, 10 SMA > 48 SMA e 24 SMA > 48 SMA: sinal de compra, mostraremos este sinal como um comentário no gráfico.
  • Se 10 SMA < 24 SMA, 10 SMA < 48 SMA e 24 SMA < 48 SMA: sinal de venda, mostraremos este sinal como um comentário no gráfico.
  • Em todos os outros casos, não fazemos nada.

A figura abaixo mostra como essa estratégia baseada em três médias móveis simples funciona:

3MA Blueprint


O código da estratégia ficará assim:

//+------------------------------------------------------------------+
//|                                          Three SMA crossover.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //create an array for several prices
   double myMovingAverageArray1[], myMovingAverageArray2[],myMovingAverageArray3[];
   
   //define the properties of  MAs - simple MA, 1st 10 / 2nd 24, 3rd 48
   int movingAverage1 = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE);
   int movingAverage2 = iMA(_Symbol,_Period,24,0,MODE_SMA,PRICE_CLOSE);
   int movingAverage3 = iMA(_Symbol,_Period,48,0,MODE_SMA,PRICE_CLOSE);
   
   //sort the price arrays 1, 2, 3 from current candle
   ArraySetAsSeries(myMovingAverageArray1,true);
   ArraySetAsSeries(myMovingAverageArray2,true);
   ArraySetAsSeries(myMovingAverageArray3,true);
   
   //Defined MA1, MA2, MA3 - one line - currentcandle, 3 candles - store result
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2);
   CopyBuffer(movingAverage3,0,0,3,myMovingAverageArray3);
   
   //Check if we have a buy entry signal
   if (
      (myMovingAverageArray1[0]>myMovingAverageArray2[0])
   && (myMovingAverageArray1[1] 1])
   && (myMovingAverageArray1[0]>myMovingAverageArray3[0])
   && (myMovingAverageArray1[1] 1])
   && (myMovingAverageArray2[0]>myMovingAverageArray3[0])
   && (myMovingAverageArray2[1] 1])
      )
         {
         Comment("BUY");
         }
    
   //Checking for a sell entry signal      
   if (
      (myMovingAverageArray1[0] 0])
   && (myMovingAverageArray1[1]>myMovingAverageArray2[1])
   && (myMovingAverageArray1[0] 0])
   && (myMovingAverageArray1[1]>myMovingAverageArray3[1])
   && (myMovingAverageArray2[0] 0])
   && (myMovingAverageArray2[1]>myMovingAverageArray3[1])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+


Uma vez iniciada a estratégia, os seguintes sinais serão gerados no gráfico:

3MA - sinal de compra


3MA - sinal de venda


Epílogo

Neste artigo, analisamos um dos indicadores mais populares e úteis, a média móvel, e conhecemos os diferentes tipos de médias. Também vimos como utilizar este indicador e como escrever três estratégias diferentes com base nele. Se você quiser usar estas estratégias, certifique-se de testá-las e otimizá-las cuidadosamente.



Traduzido do Inglês pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/en/articles/3040

Gráficos na biblioteca DoEasy (Parte 96): Trabalhando com eventos do rato/gráfico em objetos-formas Gráficos na biblioteca DoEasy (Parte 96): Trabalhando com eventos do rato/gráfico em objetos-formas
Neste artigo desenvolveremos recursos para manusear os eventos do mouse em objetos-formas e adicionaremos novas propriedades de rastreamento ao objeto símbolo. Além disso, hoje modificaremos a classe do objeto símbolo, porque desde que foi escrito, os símbolos do gráfico têm novas propriedades que é desejável levar em conta e acompanhar a nível de suas mudanças.
Desenvolvendo um EA de negociação do zero (Parte 17): Acessando dados na WEB (III) Desenvolvendo um EA de negociação do zero (Parte 17): Acessando dados na WEB (III)
Como obter dados da WEB para serem usados em um EA. Então vamos por as mãos na massa, ou melhor começar a codificar um sistema alternativo.
Como desenvolver um sistema de negociação baseado no indicador Momentum Como desenvolver um sistema de negociação baseado no indicador Momentum
No meu artigo anterior, eu mencionei a importância de identificar a tendência que é a direção dos preços. Neste artigo, eu compartilharei um dos conceitos e indicadores mais importantes que é o indicador Momentum. Eu compartilharei como desenvolver um sistema de negociação com base no indicador Momentum.
Gráficos na biblioteca DoEasy (Parte 95): Controles de objetos gráficos compostos Gráficos na biblioteca DoEasy (Parte 95): Controles de objetos gráficos compostos
Neste artigo, consideraremos ferramentas para gerenciar objetos gráficos compostos, nomeadamente controles de um objeto gráfico padrão estendido. Hoje vamos nos desviar um pouco do tópico anterior, que era mover um objeto gráfico composto. Em vez disso, vamos fazer um manipulador de eventos de alteração de gráfico que tem algum objeto gráfico composto, e vamos lidar com os objetos de controle do objeto gráfico composto.