Como desenvolver sistemas baseados em médias móveis
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:


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:
- Definição de média móvel
- Tipos de médias móveis
- Estratégia 1: cruzamento de uma média móvel
- Estratégia 2: cruzamento de duas médias móveis
- Estratégia 3: cruzamento de três médias móveis
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.

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:

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:

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:


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):

Logo,

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:


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:

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:


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:

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:


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:

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");
}
}
//+------------------------------------------------------------------+


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
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.
Desenvolvendo um EA de negociação do zero (Parte 17): Acessando dados na WEB (III)
Como desenvolver um sistema de negociação baseado no indicador Momentum
- 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
O testador de estratégia será útil. Ao parametrizar o comportamento incerto, o testador de estratégia pode revelar descobertas inesperadas que ajudam a melhorar uma estratégia.