English Русский 中文 Español Deutsch 日本語 한국어 Français Italiano Türkçe
preview
Como desenvolver um sistema de negociação baseado no indicador OBV

Como desenvolver um sistema de negociação baseado no indicador OBV

MetaTrader 5Negociação | 12 agosto 2022, 08:34
949 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Introdução

Neste novo artigo, nós conheceremos um novo indicador técnico que pode trabalhar com o volume e nos ajudar a ver uma perspectiva diferente: nós falaremos detalhadamente sobre o indicador On-Balance Volume (OBV) para cobrir esse tópico interessante. Saiba como usar este indicador técnico a nosso favor. A seguir estão os tópicos que abrangerão este indicador:

  1. Definição de OBV
  2. Estratégia do OBV
  3. Esquema da estratégia do OBV
  4. Sistema de negociação do OBV
  5. Conclusão

Através do tópico da definição do OBV, nós conheceremos detalhadamente o indicador OBV: nós identificaremos o que ele é, como ele é medido e como nós podemos calculá-lo, além de ver um exemplo do seu cálculo. Depois disso, nós podemos identificar e conhecer profundamente esse indicador para saber como nós podemos usá-lo corretamente. Nós aprenderemos como usar o indicador OBV usando estratégias simples baseadas no conceito do indicador – isso será através do tópico da estratégia do OBV. Depois de nós identificarmos como usá-lo com base nas estratégias simples, nós projetaremos um plano para as estratégias simples que nos ajudarão a escrever o código em MQL5 dessas estratégias, pois esse plano nos ajudará a racionalizar e organizar as nossas etapas para criar o Expert Advisor. Após projetar o esquema da estratégia, nós estaremos prontos para escrever o nosso código em MQL5 e para criar um Expert Advisor e, em seguida, usá-lo na MetaTrader 5 para a sua execução de forma automática e precisa.

Nós usaremos neste artigo a linguagem MQL5 (MetaQuotes Language) para escrever e criar os nossos Expert Advisors. Em seguida, nós vamos executá-los na plataforma de negociação MetaTrader 5. Se você quiser aprender como obter a MetaTrader 5 e como encontrar o Editor de Linguagem MetaQuotes, você pode verificar o tópico Escrevendo o código em MQL5 no MetaEditor dos meus artigos anteriores. Eu recomendo aplicar o que você lê sozinho se quiser dominar o que aprende, pois a prática é uma ferramenta muito importante para dominar qualquer coisa.

Ressalva: Qualquer informação fornecida aqui é apenas para fins educacionais e sem fins comerciais ou de aconselhamento. As informações não garantem nenhum tipo de resultado. Se você optar por usar esses materiais em qualquer uma de suas contas de negociação, você fará isso por sua conta e risco, sendo o único responsável.

Agora, vamos explorar este artigo para aprender uma nova ferramenta e adicioná-la ao nosso kit de ferramentas para uma experiência de negociação aprimorada.


Definição de OBV

Nesta parte, nós aprenderemos com mais detalhes sobre o indicador On-balance Volume (OBV). Mas primeiro, vamos falar sobre o volume, pois esse indicador é um dos indicadores de volume. Portanto, o volume é o número de ações ou contratos negociados durante um período específico de tempo. Quando nós vemos um volume alto, significa que há negociação ativa em um instrumento e vice-versa, se nós vemos um volume baixo, significa que o instrumento não está sendo negociado ativamente.

O conceito de volume é muito importante porque se houver um instrumento que se move para cima ou para baixo acompanhado de um alto volume, ele será mais forte do que se esse movimento for acompanhado de baixo volume. O volume tem que se mover com a tendência quando temos uma tendência de alta, é melhor ver que o volume aumenta com o movimento de alta e diminui com as correções para baixo e vice-versa quando temos uma tendência de baixa, nós podemos descobrir que o volume aumenta com movimentos de queda e diminui com correções para cima.

O volume também confirma se os rompimentos são reais ou são apenas falsos: quando os rompimentos são feitos com alto volume, isso será um sinal de que esses rompimentos continuarão. 

Se essa relação entre a tendência e o volume continuar o mesmo que eu mencionei, será um sinal de força para a tendência atual e se ela mudar, isso será um sinal de fraqueza. Se você não sabe qual é a tendência, você pode ler o tópico da definição de tendência de um artigo anterior.

O On-balance volume (OBV) foi desenvolvido por Joseph Granville. Ele mede o fluxo de volume positivo e negativo. Agora nós precisamos saber como nós podemos calculá-lo. As etapas de cálculo são as seguintes:

  1. Verificamos o preço de fechamento - se é de alta ou de baixa.
  2. Adicionamos o volume de dias úteis ao valor do OBV anterior.
  3. Subtraímos o volume de dias de baixa do valor OBV anterior.
  4. Se o fechamento de hoje for igual ao fechamento de ontem, o valor do OBV de hoje será igual ao valor do OBV de ontem.

Vamos ver um exemplo dessas etapas e calcular o indicador OBV. Suponha que nós temos os seguintes dados para um instrumento:

Dia Fechamento Volume
1 54
2 55 10000
3 60 15000
4 65 20000
5 60 10000
6 55 5000
7 60 7000
8 50 7500
9 48.75 8000
10 49 5000
11 48 6000
12 47.75 7500
13 48 9000
14 47.50 10000
15 48 7000
16 47 7500
17 46 6000
18 44 5000
19 45 15000

Para calcular o indicador OBV a partir dos dados anteriores:

Nós vamos verificar os preços de fechamento e decidir se ele é superior ao preço de fechamento anterior ou não. Se ele for maior que o dia de fechamento anterior, nós adicionaremos ao lado "Positivo" para referir que este dia tem movimento de alta. Se ele for inferior ao dia de fechamento anterior, nós adicionaremos ao lado "Negativo" para referir que este dia tem movimento de baixa.

Cálculo do OBV 1

Em seguida, nós adicionaremos o volume dos dias positivos ao valor do OBV anterior e subtrairemos o volume dos dias negativos do valor do OBV anterior.

Cálculo do OBV 2

Agora nós temos os valores de OBV calculados e ele aparece como uma curva para medir o fluxo volumétrico positivo e negativo. Felizmente, nós não precisamos calcular este indicador manualmente, pois você pode encontrá-lo entre os indicadores integrados na MetaTrader 5. A figura a seguir mostra como inserir este indicador no gráfico:

Inserção do OBV

Depois de selecionar o indicador, a seguinte janela de parâmetros do indicador será aberta:

Inserção do OBV1

1 - o tipo de Volumes.

2 - a cor da curva do OBV.

3 - o estilo da curva do OBV.

4 - a espessura da curva do OBV.

Após definir os parâmetros desejados e clicar em OK, o indicador será anexado ao gráfico:

OBV anexado


Estratégia do OBV

Nesta parte, nós aprenderemos a usar o indicador OBV com base em seu conceito. Vamos dar uma olhada nas estratégias simples. No entanto, observe que essas estratégias podem não agradar a todos. Portanto, você deve testar qualquer estratégia antes de usá-la para saber o quanto ela será útil para você. Aqui nós consideramos todas essas estratégias com o objetivo principal de aprender o básico do indicador OBV e ver como ele funciona.

  • Estratégia um: movimento do OBV simples

De acordo com essa estratégia, nós precisamos identificar a direção da curva do OBV comparando com o valor atual do OBV com o valor anterior do OBV e ver se o valor atual é maior que o anterior, o que significa que o OBV está aumentando. Se o valor atual for menor que o anterior, o OBV está diminuindo.

Você pode alterar o tamanho dos dados necessários para comparar o OBV atual com mais dados anteriores, mas aqui nós apenas compartilhamos a ideia de como nós podemos usar o indicador e como podemos codificá-lo em MQL5. Mais tarde, você pode otimizá-lo de acordo com as suas preferências.

OBV atual > OBV anterior --> OBV está subindo

OBV atual < OBV anterior --> OBV está diminuindo

  • Estratégia dois: força do OBV simples

De acordo com essa estratégia, nós precisamos identificar a força do valor atual do OBV ao compará-lo com a média dos quatro valores anteriores do OBV. Se o valor do OBV atual for maior que a média dos quatro valores anteriores do OBV, o OBV é forte e vice-versa, se o valor do OBV atual for menor que a média dos quatro valores anteriores do OBV, então o OBV é fraco.

Você também pode aumentar o tamanho da média para compará-la com os dados atuais, mas o objetivo aqui é ver como usar o indicador. Então você pode ajustar o que quiser de acordo com suas preferências e resultados de testes. 

OBV atual > AVG dos quatro valores anteriores do OBV --> OBV é forte

OBV atual < AVG dos quatro valores anteriores do OBV --> OBV é fraco

  • Estratégia três: OBV simples - tendência de alta

Durante a tendência de alta, como nós já sabemos, é melhor ver o volume se mover com a tendência. Assim, o OBV deve aumentar com o movimento ascendente. Então essa estratégia permite avaliar se o movimento é forte ou não. Nós vamos comparar com o valor atual do OBV e o anterior e comparar a alta atual com a alta anterior. Quando o valor do OBV atual for maior que o valor anterior do OBV anterior e a alta atual for maior que a alta anterior, o movimento de alta é forte durante a tendência de alta.

OBV atual > OBV anterior e a alta atual > a alta anterior --> Movimento forte durante a tendência de alta

  • Estratégia quatro: OBV simples - tendência de baixa

Durante a tendência de baixa, é melhor ver o volume se mover com a tendência. O OBV deve aumentar com o movimento de baixa. Isso permite entender se o movimento é forte ou não. Vamos comparar o valor atual do OBV com o valor anterior do OBV e comparar ao mesmo tempo com a mínimia atual e a mínima anterior. Quando o valor atual do OBV for menor que o valor anterior do OBV e a mínima atual for menor que a mínima anterior, o movimento de baixa é forte durante a tendência de baixa.

OBV atual < OBV anterior e a mínima atual < a mínima anterior --> Movimento forte durante a tendência de baixa


Esquema da estratégia do OBV

Nesta parte, nós projetaremos um esquema para cada estratégia. Ele fornecerá uma descrição passo a passo clara de como projetar um sistema de negociação para cada estratégia mencionada. Primeiro, nós precisamos projetar um OBV simples para mostrar um comentário no gráfico com o valor atual do OBV. Aqui está o esquema para isso:

Esquema do OBV simples

  • Estratégia um: Movimento do OBV simples:

Nesta estratégia, nós precisamos conhecer a direção da curva do OBV com base no valor atual do OBV e no valor anterior do OBV. Assim, para cada tick, nós precisamos verificar o valor do OBV atual e o valor do OBV anterior e quando o valor atual for maior que o anterior, isso será um sinal de que o OBV está subindo e vice-versa, quando o valor atual for menor que o anterior, isso será um sinal de que o OBV está em queda.

A seguir encontramos um esquema passo a passo para esta estratégia para nos ajudar a projetar um sistema de negociação para ela:

Esquema do movimento do OBV simples

  • Estratégia dois: Força do OBV simples:

Nesta estratégia, nós precisamos medir a força do OBV atual comparando-o com a média dos quatro valores anteriores. Se o OBV atual for maior que a média dos quatro valores anteriores do OBV, o OBV é forte e vice-versa, se o OBV atual for menor que a média dos quatro valores anteriores do OBV, o OBV é fraco.

A seguir encontramos um esquema passo a passo para criar este sistema de negociação:

Esquema da força do OBV simples

  • Estratégia três: OBV simples - tendência de alta:

Nessa estratégia, nós precisamos aproveitar um dos indicadores de volume que é o OBV para medir o movimento atual dos preços. Portanto, durante a tendência de alta, nós precisamos verificar o valor atual do OBV e compará-lo com o valor anterior do OBV. Se o valor atual for maior que o valor anterior, nós precisamos verificar a máxima atual do preço e compará-la com a máxima anterior do preço. Se o valor atual for maior que o valor anterior, isso será um sinal de que o movimento ascendente atual é forte durante a tendência de alta porque nós temos o OBV atual maior que o OBV anterior e a máxima atual maior que a máxima anterior.

Veja a seguir um esquema passo a passo para codificar essa estratégia:

OBV simples - esquema da tendência de alta

  • Estratégia quatro: OBV simples - tendência de baixa:

Nesta estratégia, durante a tendência de baixa, nós precisamos verificar o valor atual do OBV e compará-lo com o valor anterior do OBV. Se o valor atual for menor que o valor anterior, nós precisamos verificar a mínima atual do preço e compará-lo com a mínima anterior do preço. Se o valor atual for menor que o valor anterior, isso será um sinal de que o movimento atual de baixa é forte durante a tendência de baixa porque nós temos o OBV atual menor que o OBV anterior e a mínima atual menor que a mínima anterior.

Veja a seguir um esquema passo a passo para codificar essa estratégia:

OBV simples - esquema da tendência de baixa


Sistema de negociação do OBV

Nesta parte interessante, nós aprenderemos como criar um sistema de negociação para cada estratégia mencionada para aproveitar a programação e a MQL5, pois a programação é uma ferramenta mágica que pode nos ajudar a facilitar nossa vida criando um sistema que pode fazer o que fazemos manualmente. Este não é o único benefício disso, pois ele executará e fará o que precisamos com precisão e rapidez, há muitos benefícios que nós podemos nos beneficiar da programação.

Agora, nós vamos começar a criar um sistema de negociação para cada estratégia. Primeiro, nós criaremos um sistema de negociação do OBV simples para gerar um comentário no gráfico com o valor atual do OBV.

  • Criamos um vetor para o OBV usando a função "double", o "double" é um tipo real ou tipo de ponto flutuante que representa os valores com uma parte fracionária. Para a sua informação, existem dois tipos de ponto flutuante e eles são do tipo double e float. O tipo "double" representa números com a precisão dupla do tipo float:
double OBVArray[];
  • Ordenamos o vetor OBV usando a função "ArraySetAsSeries" que retorna true ou false:
ArraySetAsSeries(OBVArray,true);

  • Definimos o OBV usando a função "iOBV" após criar uma variável inteira para o OBVDef e a função "iOBV" retorna o manipulador do indicador On Balance Volume, seus parâmetros são (símbolo, período, volume aplicado):
int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
  • Preenchemos OBVArray com o OBVDef usando a função "CopyBuffer" que retorna a contagem dos dados copiados, seus parâmetros são (manipulador do indicador, número do buffer, horário de início, horário de fim, buffer):
CopyBuffer(OBVDef,0,0,3,OBVArray);
  • Calculamos o valor atual do OBV após criar uma variável dupla para o OBVValue:
double OBVValue=OBVArray[0];
  • Criamos um comentário usando a função "comment" para exibir um comentário no gráfico com o valor atual do OBV:
Comment("OBV Value is: ",OBVValue);

A seguir está o código completo para o sistema de negociação anterior que exibe um comentário com o valor atual do OBV:

//+------------------------------------------------------------------+
//|                                                   Simple OBV.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"
//+------------------------------------------------------------------+
void OnTick()
  {
   //creating an array for OBV
   double OBVArray[];
   
   //sorting the array from the current data
   ArraySetAsSeries(OBVArray,true);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
   
   //defining EA, buffer, sorting in array
   CopyBuffer(OBVDef,0,0,3,OBVArray);
   
   //calculating current OBV value
   double OBVValue=OBVArray[0];
   
   //creating a comment with OBV value
   Comment("OBV Value is: ",OBVValue);  
  }
//+------------------------------------------------------------------+

Depois de compilar este código, nós podemos encontrá-lo no navegador da MetaTrader 5 da mesma forma que o seguinte:

OBV nav1

Se nós quisermos executá-lo, nós vamos clicar duas vezes no arquivo ou arrastá-lo e soltá-lo no gráfico, nós encontraremos a seguinte janela:

Janela do OBV simples

Após pressionar "OK", nós descobriremos que o expert advisor será anexado ao gráfico da mesma forma que a imagem a seguir:

OBV simples anexado

Então, nós podemos encontrar o sinal gerado igual ao seguinte exemplo de teste:

Sinal de teste do OBV simples

Se nós quisermos ter certeza de que nós obteremos o mesmo valor que o indicador On Balance Volume embutido da MetaTrader 5, nós podemos fazer isso inserindo o indicador On Balance Volume da mesma forma que mencionamos antes, após anexar nosso expert advisor criado, então nós descobriremos que os valores serão os mesmos, a seguir é um exemplo disso:

OBV simples mesmo sinal do indicador

 Agora, nós precisamos criar um sistema de negociação para cada estratégia mencionada, segue como nós podemos fazer isso.

  • Estratégia um: Movimento do OBV simples:

De acordo com essa estratégia, nós precisamos comparar com o valor atual do OBV e com o valor anterior do OBV, e decidir se o valor atual é maior que o valor anterior. Nós precisamos de um sinal que apareça como um comentário no gráfico que diz "OBV está subindo", o valor atual do OBV e o valor anterior do OBV. Segue o código completo para criar esse tipo de estratégia:

//+------------------------------------------------------------------+
//|                                          Simple OBV movement.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"
//+------------------------------------------------------------------+
void OnTick()
  {
//creating an two arrays for OBV
   double OBVArray1[];
   double OBVArray2[];

//sorting the array from the current data
   ArraySetAsSeries(OBVArray1,true);
   ArraySetAsSeries(OBVArray2,true);

//defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

//defining EA, buffer, sorting in array
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
   CopyBuffer(OBVDef,0,0,3,OBVArray2);

//getting the value of current and previous OBV
   double OBVCurrentValue=NormalizeDouble(OBVArray1[0],5);
   double OBVPrevValue=NormalizeDouble(OBVArray2[1],5);

//creating conditions of rising and declining OBV based on its values   
   if(OBVCurrentValue>OBVPrevValue)
     {
      Comment("OBV is rising","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
     }

   if(OBVCurrentValue<OBVPrevValue)
     {
      Comment("OBV is declining","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
     }

  }
//+------------------------------------------------------------------+
  • Diferenças neste código:
 Criação dos dois vetores para o OBV:
double OBVArray1[];
double OBVArray2[];

Ordenação desses dois vetores dos dados atuais:

ArraySetAsSeries(OBVArray1,true);
ArraySetAsSeries(OBVArray2,true);

Preenchimento desses dois vetores:

CopyBuffer(OBVDef,0,0,3,OBVArray1);
CopyBuffer(OBVDef,0,0,3,OBVArray2);

Obtemos os valores do OBV atual e do anterior usando a função "NormalizeDouble" que retorna o valor do tipo double, com precisão predefinida, após a criação de uma variável do tipo double para OBVCurrentValue e OBVPrevValue. Os parâmetros do "NormalizeDouble" são (valor e dígitos), o valor será o OBVArray e os dígitos serão 5 que é o número casa decimais após a vírgula:

double OBVCurrentValue=NormalizeDouble(OBVArray1[0],5);
double OBVPrevValue=NormalizeDouble(OBVArray2[1],5);

Definimos as condições do OBV ascendente e descendente usando a função "if":

if(OBVCurrentValue>OBVPrevValue)
   {
    Comment("OBV is rising","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
   }

if(OBVCurrentValue<OBVPrevValue)
   {
    Comment("OBV is declining","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
   }

Após a compilação, o EA aparecerá na janela do navegador entre a pasta "Expert Advisors" na plataforma de negociação MetaTrader 5 da mesma forma que a seguir:

OBV nav2

Ao clicar duas vezes no arquivo do EA, a seguinte janela será exibida:

Janela de movimento do OBV simples

Ao pressionar "OK", o EA será anexado ao gráfico da mesma forma que a seguir:

Movimento OBV simples anexado

A seguir estão os exemplos de testes para os sinais gerados de acordo com esta estratégia,

OBV crescente:

Sinal de alta do movimento do OBV simples

OBV em queda:

Sinal de queda do movimento OBV simples

  • Estratégia dois: Força do OBV simples:

De acordo com essa estratégia, nós precisamos comparar com o valor atual do OBV e com a média dos 4 valores anteriores do OBV, e decidir se o valor atual é maior que o valor da média. Isso significa que o OBV é forte e vice-versa, se o valor atual for menor que a média, isso significa que o OBV é fraco. Segue o código completo para criar esse tipo de estratégia:

//+------------------------------------------------------------------+
//|                                          Simple OBV Strength.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"
//+------------------------------------------------------------------+
void OnTick()
  {
   //creating an six arrays for OBV
   double OBVArray0[];
   double OBVArray1[];
   double OBVArray2[];
   double OBVArray3[];
   double OBVArray4[];
   
   //sorting arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);
   ArraySetAsSeries(OBVArray2,true);
   ArraySetAsSeries(OBVArray3,true);
   ArraySetAsSeries(OBVArray4,true);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
   
   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,5,OBVArray0);
   CopyBuffer(OBVDef,0,0,5,OBVArray1);
   CopyBuffer(OBVDef,0,0,5,OBVArray2);
   CopyBuffer(OBVDef,0,0,5,OBVArray3);
   CopyBuffer(OBVDef,0,0,5,OBVArray4);
   
   //getting the value of current OBV & previous 5 values
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue1=NormalizeDouble(OBVArray1[1],5);
   double OBVPrevValue2=NormalizeDouble(OBVArray2[2],5);
   double OBVPrevValue3=NormalizeDouble(OBVArray3[3],5);
   double OBVPrevValue4=NormalizeDouble(OBVArray4[4],5);
   
   //calculating average of previous OBV value
   double OBVAVG=((OBVPrevValue1+OBVPrevValue2+OBVPrevValue3+OBVPrevValue4)/4);
   
   if(OBVCurrentValue>OBVAVG)
   {
      Comment("OBV is strong","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ", 
      "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
   }
   
   if(OBVCurrentValue<OBVAVG)
   {
      Comment("OBV is weak","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ",
      "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
   }
   
  }
//+------------------------------------------------------------------+
  • Diferenças neste código:

Criação de cinco vetores para os valores do OBV:

double OBVArray0[];
double OBVArray1[];
double OBVArray2[];
double OBVArray3[];
double OBVArray4[];

Ordenação desses vetores criados a partir dos dados atuais:

ArraySetAsSeries(OBVArray0,true);   
ArraySetAsSeries(OBVArray1,true);
ArraySetAsSeries(OBVArray2,true);
ArraySetAsSeries(OBVArray3,true);
ArraySetAsSeries(OBVArray4,true);

Preenchimento com OBVDef definido:

CopyBuffer(OBVDef,0,0,5,OBVArray0);
CopyBuffer(OBVDef,0,0,5,OBVArray1);
CopyBuffer(OBVDef,0,0,5,OBVArray2);
CopyBuffer(OBVDef,0,0,5,OBVArray3);
CopyBuffer(OBVDef,0,0,5,OBVArray4);

Obtenção dos valores do OBV atual e dos quatro anteriores:

double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
double OBVPrevValue1=NormalizeDouble(OBVArray1[1],5);
double OBVPrevValue2=NormalizeDouble(OBVArray2[2],5);
double OBVPrevValue3=NormalizeDouble(OBVArray3[3],5);
double OBVPrevValue4=NormalizeDouble(OBVArray4[4],5);

Cálculo da média dos quatro valores anteriores do OBV após a criação de uma variável do tipo double para o OBVAVG:

double OBVAVG=((OBVPrevValue1+OBVPrevValue2+OBVPrevValue3+OBVPrevValue4)/4);

Definição de condições do OBV forte e fraco com o comentário:

if(OBVCurrentValue>OBVAVG)
{
 Comment("OBV is strong","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ", 
  "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
}
   
if(OBVCurrentValue<OBVAVG)
{
 Comment("OBV is weak","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ",
  "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
}

Após a compilação, nós encontraremos o EA igual à seguinte janela do navegador:

OBV nav3

Segue a janela do EA após escolher o arquivo a ser executado na MetaTrader 5:

Janela da força do OBV simples

Após clicar em "OK", o EA será anexado ao gráfico igual a imagem a seguir:

Força do OBV simples anexada

A seguir encontramos os exemplos de testes dos sinais:

OBV forte:

Sinal forte de força do OBV simples

OBV fraco:

Sinal fraco de força do OBV simples

  • Estratégia três: OBV simples - tendência de alta:

De acordo com essa estratégia, durante a tendência de alta, precisamos verificar se temos uma máxima de preço maior e, ao mesmo tempo, se nós temos um valor do OBV mais alto. Portanto, nós precisamos verificar se o valor atual do OBV é maior que o valor anterior do OBV e se a máxima atual do preço é maior que a máxima anterior do preço, então, nós temos um sinal de "movimento forte durante a tendência de alta". Segue o código completo para criar esse tipo de estratégia:

//+------------------------------------------------------------------+
//|                                         Simple OBV - Uptrend.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"
//+------------------------------------------------------------------+
void OnTick()
  {
   //creating a string variable for signal
   string signal="";
   
   //creating two OBV arrays for OBV
   double OBVArray0[];
   double OBVArray1[];
   
   //creating two price arrays
   MqlRates PriceArray0[];
   MqlRates PriceArray1[];
   
   //sorting OBV arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);   
   
   //sorting Price arrays from the current data
   ArraySetAsSeries(PriceArray0,true);
   ArraySetAsSeries(PriceArray1,true);     
      
   //fill arrays with price data
   int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
   int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,3,OBVArray0);
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
            
   //getting the value of current & the previous OBV
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
   //getting the value of current high & the previous high
   double CurrentHighValue=NormalizeDouble(PriceArray0[0].high,5);         
   double PrevHighValue=NormalizeDouble(PriceArray1[1].high,5); 
      
   //strong move signal
   //if OBVCurrentValue>OBVPrevValue && current high> previous high
   if(OBVCurrentValue > OBVPrevValue && PriceArray0[0].high>PriceArray0[1].high)
   {
      signal="Strong move during uptrend";
   }

   //comment with the signal
   Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
   "\n","OBVPrevValue is :", OBVPrevValue,"\n","Current high is :",CurrentHighValue,"\n","Previous high is :",PrevHighValue);            
  }
//+------------------------------------------------------------------+

Diferenças neste código:

Criação de uma variável de string do tipo "signal" usando a função do tipo "string" que armazena as strings de texto atribuídas a vazio, já que nós a calcularemos mais tarde:

string signal="";

Criação de dois vetores para o OBV usando a função do tipo "double" e dois vetores para os preços usando a função "MqlRates" que armazena as informações dos preços, volume e spread:

//creating two OBV arrays for OBV
double OBVArray0[];
double OBVArray1[];
   
//creating two price arrays
MqlRates PriceArray0[];
MqlRates PriceArray1[];1[];

Classificação desses vetores dos dados atuais:

//sorting OBV arrays from the current data
ArraySetAsSeries(OBVArray0,true);   
ArraySetAsSeries(OBVArray1,true);   
   
//sorting Price arrays from the current data
ArraySetAsSeries(PriceArray0,true);
ArraySetAsSeries(PriceArray1,true);

Preenchendo o vetor de preços com os dados de preços usando a função "CopyRates" que obtém os dados históricos da estrutura "MqlRates" após a criação das variáveis inteiras para Data0 e Data1 para cada array:

int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);

Definição do OBV e preenchimento dos dois OBVArrays com ele:

int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

CopyBuffer(OBVDef,0,0,3,OBVArray0);
CopyBuffer(OBVDef,0,0,3,OBVArray1);

Obtendo os valores do OBV e suas máximas:

//getting the value of current & the previous OBV
double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
//getting the value of current high & the previous high
double CurrentHighValue=NormalizeDouble(PriceArray0[0].high,5);         
double PrevHighValue=NormalizeDouble(PriceArray1[1].high,5); 

Configuração das condições do "Movimento forte durante a tendência de alta" e o comentário:

Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
"\n","OBVPrevValue is :", OBVPrevValue,"\n","Current high is :",CurrentHighValue,"\n","Previous high is :",PrevHighValue); 

Se nós compilarmos o código, nós encontraremos o EA na janela do navegador:

OBV nav4

A janela do EA após escolher o arquivo a ser executado na MetaTrader 5 será a mesma que a seguir:

OBV simples - janela de tendência de alta.

Após clicar em "OK", o EA será anexado ao gráfico igual a imagem a seguir:

OBV simples - tendência de alta anexada

A seguir estão os exemplos de testes dos sinais,

Sinal com a janela de dados para os dados atuais:

Sinal de tendência de alta do OBV simples com a janela de dados atual

Sinal com a janela de dados para os dados anteriores:

OBV simples - sinal de tendência de alta com a janela de dados anterior

  • Estratégia quatro: OBV simples - tendência de baixa:

De acordo com essa estratégia, será o inverso do OBV simples - estratégia de tendência de alta, pois nós precisamos verificar se temos um preço baixo mais baixo e, ao mesmo tempo, temos um valor mais baixo do OBV. Portanto, nós precisamos verificar se o valor atual do OBV é menor que o valor anterior do OBV e se a mínima atual do preço é menor que a mínima atnerior do baixo anterior, temos um sinal de "movimento forte durante a tendência de baixa". Segue o código completo para criar esse tipo de estratégia:


//+------------------------------------------------------------------+
//|                                       Simple OBV - Downtrend.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"
//+------------------------------------------------------------------+
void OnTick()
  {
   //create a string variable for signal
   string signal="";
   
   //creating two OBV arrays
   double OBVArray0[];
   double OBVArray1[];
   
   //creating two price arrays
   MqlRates PriceArray0[];
   MqlRates PriceArray1[];
   
   //sorting OBV arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);   
   
   //sorting Price arrays from the current data
   ArraySetAsSeries(PriceArray0,true);
   ArraySetAsSeries(PriceArray1,true);     
      
   //fill array with price data
   int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
   int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,3,OBVArray0);
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
            
   //getting the value of current OBV & the previous value
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
   //getting the value of current OBV & the previous value
   double CurrentLowValue=NormalizeDouble(PriceArray0[0].low,5);         
   double PrevLowValue=NormalizeDouble(PriceArray1[1].low,5); 
       
   //strong move signal
   //if OBVCurrentValue>OBVPrevValue && current low> previous low
   if(OBVCurrentValue < OBVPrevValue && PriceArray0[0].low<PriceArray0[1].low)
   {
      signal="Strong move during downtrend";
   }

   //comment with the signal
   Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
   "\n","OBVPrevValue is :", OBVPrevValue,"\n","Current low is :",CurrentLowValue,"\n","Previous low is :",PrevLowValue);            
  }
//+------------------------------------------------------------------+
  • Diferenças neste código:

Condição de configuração do "Movimento forte durante a tendência de baixa" e o comentário:

Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
"\n","OBVPrevValue is :", OBVPrevValue,"\n","Current low is :",CurrentLowValue,"\n","Previous low is :",PrevLowValue); 

Agora, nós vamos compilá-lo, então nós podemos encontrá-lo na janela do navegador da mesma forma que a seguir:

OBV nav5

Ao arrastar e soltar o arquivo no gráfico, a seguinte janela aparecerá:

OBV simples - janela de tendência de baixa

Ao pressionar o botão "OK", o EA será anexado da mesma forma que a imagem a seguir:

OBV simples - tendência de baixa anexada

Segue um exemplo dos sinais gerados para os testes,

Sinal com janela de dados atual:

OBV simples - sinal de tendência de baixa com a janela de dados atual

Sinal com a janela de dados anterior:

OBV simples - sinal de tendência de baixa com a janela de dados anterior


Conclusão

Na conclusão deste artigo, nós aprendemos um novo indicador técnico que usa o volume em seu cálculo para ver outra perspectiva no gráfico e aprimorar as nossas decisões de negociação. este indicador é o On Balance Volume (OBV), nós aprendemos em detalhes como o que é o indicador OBV, o que ele mede, como nós podemos calculá-lo manualmente para saber o que está escondido além do básico. Nós aprendemos também, como nós podemos usá-lo de acordo com os seus fundamentos e aprendemos algumas estratégias simples que podem ser úteis ou podem nos ajudar a realizar novas ideias que podem ser lucrativas, esse é o principal objetivo deste artigo e de outros artigos desta série. Nós desenvolvemos um esquema para cada estratégia mencionada para nos ajudar a escrever o código de cada estratégia e criar um sistema de negociação para elas. Em seguida, criamos um Expert Advisor para cada estratégia mencionada via MQL5 (MetaQuotes Language) para executá-los na plataforma de negociação MetaTrader 5 para gerar sinais de forma automática e precisa de acordo com as condições e regras pré-definidas de cada estratégia.

Uma das coisas mais benéficas na análise técnica é que podemos ver mais de uma perspectiva sobre o instrumento financeiro de acordo com a ferramenta que nós usamos. Nós podemos combinar mais de uma ferramenta ou indicador, principalmente quando nós usamos algumas ferramentas para visualizar a imagem completa do instrumento financeiro e poder tomar a decisão adequada com clareza, essa abordagem nos ajuda a criar um sistema de negociação confiável. Então, deixe essa abordagem na sua frente enquanto você lê ou aprende qualquer coisa para poder perceber qual ferramenta pode ser combinada com outra para lhe dar insights mais claros e melhores resultados.

Este artigo e os outros desta série são apenas para fins educacionais e projetados para iniciantes aprenderem a raiz das coisas e perceberem o que nós podemos fazer programando, especialmente via MQL5 e o quanto isso nos ajuda para facilitar e melhorar o nosso negócio comercial. Você deve testar qualquer estratégia antes de usá-la, pois não há nada que possa atender a todas as pessoas e você deve fazer seu trabalho testando e validando qualquer coisa para ver se ela é útil para você ou não. Eu aconselho que você aplique tudo neste artigo sozinho, pois ele desenvolverá suas habilidades rapidamente e lhe fornecerá uma compreensão profunda do tópico.

Eu espero que você tenha achado este artigo útil e que tenha aprendido algo sobre o tópico deste artigo ou sobre qualquer tópico relacionado no mundo da negociação. Se você achou este artigo útil e deseja ler artigos semelhantes, você pode ler meus artigos anteriores desta série para aprender como desenvolver um sistema de negociação com base nos indicadores técnicos populares.

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

Redes neurais de maneira fácil (Parte 16): Uso prático do agrupamento Redes neurais de maneira fácil (Parte 16): Uso prático do agrupamento
No artigo anterior, construímos uma classe para agrupamento de dados. Hoje eu gostaria de compartilhar com vocês as formas mediante as quais os resultados podem ser usados para resolver problemas práticos de negociação.
Redes neurais de maneira fácil (Parte 15): Agrupamento de dados via MQL5 Redes neurais de maneira fácil (Parte 15): Agrupamento de dados via MQL5
Continuamos a estudar o método de agrupamento. Neste artigo, criaremos uma nova classe CKmeans para implementar um dos métodos de agrupamento k-médias mais comuns. Com base nos resultados dos testes, podemos concluir que o modelo é capaz de identificar cerca de 500 padrões.
Vídeo: Negociação automatizada simples, como criar um EA simples mediante MQL5 Vídeo: Negociação automatizada simples, como criar um EA simples mediante MQL5
A maioria dos alunos dos meus cursos achava que a linguagem MQL5 era difícil de entender. Naquele momento, eles estavam procurando maneiras simples de automatizar alguns processos. Neste artigo, você aprenderá como começar a trabalhar logo em MQL5 mesmo sem conhecimentos de programação e mesmo que já tenha tentado, sem sucesso, dominar este tópico.
Ciência de Dados e Aprendizado de Máquina (Parte 03): Regressões Matriciais Ciência de Dados e Aprendizado de Máquina (Parte 03): Regressões Matriciais
Desta vez nossos modelos estão sendo feitos por matrizes, o que permite flexibilidade ao mesmo tempo que nos permite fazer modelos poderosos que podem manipular não apenas cinco variáveis independentes, mas também muitas variáveis, desde que permaneçamos dentro dos limites de cálculos de um computador, este artigo será uma leitura interessante, isso é certo.