Discussão do artigo "Como desenvolver um sistema de negociação baseado no indicador ADX" - página 2

 
Olá. Comecei a aprender sobre adx e dmi há alguns meses e gostaria que houvesse um EA para isso. Como esse é um indicador de atraso, talvez o período M15 seja mais adequado.
 

Olá Mohamed,

Em vez de:

   double ADXArray0[];
   double ADXArray1[];
...
   double ADXValue=NormalizeDouble(ADXArray0[0],2);
   double ADXValueLast=NormalizeDouble(ADXArray1[1],2);

Não seria suficiente?

      double ADXArray[];
...
      double ADXValue=NormalizeDouble(ADXArray[0],2);
      double ADXValueLast=NormalizeDouble(ADXArray[1],2);

Atenciosamente,

Juan Luis

Learn how to design a trading system by ADX
Learn how to design a trading system by ADX
  • www.mql5.com
In this article, we will continue our series about designing a trading system using the most popular indicators and we will talk about the average directional index (ADX) indicator. We will learn this indicator in detail to understand it well and we will learn how we to use it through a simple strategy. By learning something deeply we can get more insights and we can use it better.
 
Juan Luis De Frutos Blanco #:

Olá, Mohamed,

Em vez de:

Would't it be enough ?

Atenciosamente,

Juan Luis

Olá, Juan,

Você está correto, pode ser como o que você mencionou também.


Atenciosamente,

 
Bom artigo: uma das pernas do EA que estou criando no momento.
Obrigado, Mohamed. 🏅🏅🏅

 
Tenho a ideia de que quando a linha ADX está acima de 25 e o dmi plus cruza o dmi minus, a cor da vela se torna verde, indicando que a tendência é de alta e vice-versa.
 
1
 

Excelente artigo, mas encontrei um erro em um dos artigos e também uma oportunidade para uma dica. O erro está nos CopyBuffers e no uso do mesmo índice de buffer para o mesmo identificador. Um identificador de indicador em MQL5 só pode acessar um buffer específico usando seu índice de buffer exclusivo correspondente em uma chamada à função CopyBuffer().


Portanto, quando você coloca:

CopyBuffer(ADXDef,0,0,3,ADXArray0);
CopyBuffer(ADXDef,0,0,2,ADXArray1);
CopyBuffer(ADXDef,1,0,3,PDIArray);
CopyBuffer(ADXDef,2,0,3,NDIArray);


Deveria ser:

CopyBuffer(ADXDef,0,0,3,ADXArray0);
CopyBuffer(ADXDef,1,0,2,ADXArray1);
CopyBuffer(ADXDef,2,0,3,PDIArray);
CopyBuffer(ADXDef,3,0,3,NDIArray);


Os pontos principais relacionados aos identificadores de código e aos buffers são:
  • Indexação exclusiva: Cada identificador de indicador gerencia um conjunto de buffers internos, cada um identificado por um índice exclusivo (a partir de 0).
  • Um identificador, um índice: Quando você usa CopyBuffer(handle, buffer_index, ...) , está especificando dequal buffer único associado a esse handle você deseja copiar os dados.
  • Várias chamadas: Se um indicador tiver vários buffers de dados (por exemplo, uma banda alta e uma banda baixa de um canal), você deverá chamar CopyBuffer() várias vezes, usando o mesmo identificador, mas com índices de buffer diferentes (por exemplo, índice 0 para a banda superior, índice 1 para a banda inferior).
Não é possível ter duas chamadas CopyBuffer separadas para o mesmo índice de buffer dentro do mesmo identificador que, de alguma forma, apontam para dados diferentes, pois o índice é o identificador exclusivo da série de dados dentro desse identificador


Suponho que tenha sido um erro de digitação, mas achei que deveria apontá-lo para o caso de mais alguém se confundir. Estava correto no código completo, mas não no exemplo.


Agora vamos à pequena dica...

Não é nada demais, mas com certeza pouparia alguns toques de tecla desnecessários quando você escrevesse:


 Comment("Simple ADX System - Signal is ",signal,"\n""ADX Value is ", ADXValue,
   "\n""ADX Value Last is ", ADXValueLast, "\n""+DI Value is ", PDIValue,
   "\n""-DI Value is ", NDIValue);


Há algumas aspas extras que não são necessárias. Para simplificar, você poderia fazer isso:


 Comment("Simple ADX System - Signal is ",signal,"\nADX Value is ", ADXValue,
   "\nADX Value Last is ", ADXValueLast, "\n+DI Value is ", PDIValue,
   "\n-DI Value is ", NDIValue);


Fora isso, achei o artigo muito informativo e detalhado.


 

A única outra coisa que eu acrescentaria aqui é o tratamento de erros em OnInit() e DeOnit(), e a alteração do nome da variável de ADXDef para h_ADXDef (ou handle_ADXDef), para que fique mais claro ao ler o código e para que seja um identificador melhor que mostre sua finalidade específica.

Em OnInit():


  if(h_ADXDef == INVALID_HANDLE)
   {
      Print("Error creating indicator handles: ", GetLastError());
      return(INIT_FAILED);
   }


E, em DeOninit():


if(h_ADXDef != INVALID_HANDLE) IndicatorRelease(h_ADXDef);