English Русский 中文 Español Deutsch 日本語 한국어 Français Italiano Türkçe
Indicadores técnicos e filtros digitais

Indicadores técnicos e filtros digitais

MetaTrader 5Integração | 26 março 2014, 13:50
1 870 0
GT788
[Excluído]

Introdução

Por vários anos a Base de código tem acumulado um grande número de indicadores. Muitas destas são cópias de algumas outras, com apenas leves modificações. Após muitas horas de comparação visual de indicadores no gráfico, não poderíamos deixar de perguntar: "É possível encontrar uma forma mais objetiva e eficiente de comparação?" De fato, é. Devemos admitir que um indicador é um filtro digital. Vamos consultar a Wikipédia.

Filtro (química), um dispositivo (geralmente uma membrana ou camada), que é projetada para bloquear fisicamente certos objetos ou substâncias ao deixar outras passarem.

Você concorda que os indicadores permitam bloquear alguns objetos "desnecessários" e focar em objetos que sejam críticos? Agora vamos ver o que é um filtro digital.

Em eletrõnica, na ciência da computação e na matemática um filtro digital é um sistema que realiza operações matemáticas em um sinal de tempo discreto de amostra para reduzir ou aumentar certos aspectos desse sinal.

Em outras palavras, um filtro digital é um filtro de processamento de sinais discretos. Os preços que vemos no terminal podem ser tratados como sinais discretos, pois os seus valores são registrados não continuamente, mas ao longo de um determinado período de tempo. Por exemplo, o valor de preço é registrado a cada hora no gráfico H1, enquanto isso é feito uma vez a cada 5 minutos no M5. Muitos dos indicadores podem ser tratados como filtros lineares. Este é exatamente o tipo de indicadores que são discutidos no presente artigo. 

Agora, ao descobrirmos que estamos lidando com filtros digitais, vamos examinar a teoria, a fim de definir quais parâmetros devem ser comparados.


1. Frequências e períodos

Antes de tudo, devo mencionar que qualquer curva pode ser representada como uma soma das ondas seno.

Período de vibração é o intervalo de tempo entre dois passos sucessivos de um corpo por meio da mesma posição e na mesma direção. Este valor é recíproco à frequência.

Esta definição pode ser mais facilmente compreendida utilizando uma onda senoidal. Vamos considerar um período igual a contagem de 10. Desempenharemos cálculos em barras para ficar mais simples.

Fig. 1 

 Fig. 1. Sinal periódico de amostra

Como podemos ver, a linha completa o ciclo inteiro dentro de contagens de 10, enquanto a décima primeira barra é o primeiro ponto do novo ciclo.

Qual é a frequência da onda seno? A definição afirma que período é um valor recíproco à frequência. Então, se o período for igual a 10 (barras), a frequência será 1/10=0.1 (1/barras).

Na física, os períodos (T) são medidos em segundos (s), enquanto as frequências (f) - em Hertz (Hz). Se estivermos lidando com um período de tempo de minuto, então T=60*10=600 segundos, enquanto f=1/Т=1/600=0.001667 Hz. Hertz e segundos são usados na maioria dos filtros analógicos. Nos digitais, as contagens são geralmente usadas (da forma que usamos as barras). Se necessário, eles são multiplicados pela quantia de segundos.

Você pode pensar, o que isso tem a ver com ondas seno? Ondas seno são necessárias para explicar o significado físico de filtros e o deslocamento para as frequências, pois este conceito é utilizado nos trabalhos adequados. Agora, vamos pegar 7 ondas seno ao invés de uma com períodos de 10 até 70 e um passo de 10 barras. Barras na sub-janela posterior na figura 2 serve como uma guia para estimar visualmente o número de contagens.

Fig. 2 

 Fig. 2. Sete ondas seno que tenham a mesma amplitude com períodos de 10, 20, ... 70 barras.

A escala é ampla o suficiente, mas ainda é possível ficar confuso. E é mais fácil se confundir, se tivermos muito mais ondas seno.

A soma das ondas seno é exibida abaixo:

Fig. 3  

Fig. 3. A soma das sete ondas seno é mostrada na figura 2.

As frequências são mostradas na seguinte forma:

 Fig. 4 

Fig. 4. O espectro da soma das ondas seno (em frequências)

de contagens 7 são suficientes para exibir 7 ondas seno. Preste atenção às cores, elas correspondem à figura anterior. Ondas seno lentas são seguidas por ondas rápidas. A frequência mais baixa possível é 0 (componente constante), enquanto a mais alta é de 0,5 (1/barras). O caso será oposto para períodos.

 Fig. 5

 Fig. 5. O espectro da soma  das ondas seno (em períodos)

Lembramos que a frequência é igual a 1/período. Então, o período deve estar dentro do intervalo de 2 até ao infinito. Por que 0,5 e 2? Uma onda seno pode ser descrita por pelo menos duas contagens (ver Teorema de amostragem de Nyquist–Shannon). Para restaurar o sinal analógico (contínuo), precisamos de duas ou mais contagens por uma onda seno (0,5 é recebido a partir de 1/2).

Vamos considerar a tabela a seguir para evitar confusão com períodos e frequências:

Período
  
 100     50
   16
  10
   4
   2
Frequência
0
 0,01 
 0,02 
0,0625
  0,1 
 0,25 
  0,5 

 

Examinamos os conceitos de período e frequência, uma vez que estas são as coisas básicas. Todas as informações extras estão associadas a estes termos.

 

2. Filtros digitais

Então, finalmente estamos prontos para discutir sobre os filtros. Suponha que tenhamos que remover as ondas seno tendo um período inferior a 50.

Fig. 6 

 Fig. 6. Componentes baixos (baixa frequência) da soma de ondas seno (períodos de 50, 60 e 70 barras)

É tudo relativamente fácil quando conhecemos componentes iniciais. Mas e se conhecemos apenas a soma? Neste caso, precisamos de um filtro de baixa passagem (LPF), com uma frequência de corte de 1/45 (1/barras).

O resultado da filtração aparecerá como segue:

Fig. 7 

 Fig. 7. O resultado da soma de filtração das ondas seno (linha azul) usando LPF

Agora, vamos deixar apenas as ondas seno com os períodos de 10, 20 e 30. Para fazer isso, devemos usar um filtro de alta passagem (HPF), com uma frequência de corte de 1/35 (1/barras). 

Fig. 8 

 Fig. 8. Componentes altos (de alta frequência) de soma de ondas seno (períodos de 10, 20 e 30 barras)

Fig. 9 

Fig. 9. O resultado da soma de filtração das ondas seno (linha azul) usando HPF

Para deixar os períodos de 30, 40 e 50, precisamos de um filtro de largura de faixa (BF) com frequências de corte de 1/25 e 1/55 (1/barras). 

Fig. 10 

 Fig. 10. Linhas seno com períodos de 30, 40 e 50 barras

 

Fig. 11 

Fig. 11. Resultado da soma de filtragem da largura de faixa das ondas seno (30-50 barras)

Se desejarmos remover os períodos de 30, 40 e 50, precisamos de um filtro rejeita-faixa (de rejeição) com as mesmas frequências de corte de 1/25 e 1/55 (1/barras). 

Fig. 12 

Fig. 12. Ondas seno com períodos de 10, 20, 60 e 70 barras

 

Fig. 13 

Fig. 13. O resultado da operação do filtro de rejeição (30-50 barras) dependendo da soma das ondas seno

Vamos resumir os resultados intermediários na imagem abaixo: 

Fig. 14
 

Fig. 14. Os parâmetros de frequência dos filtros ideais: as frequências mais baixas (LPF), frequências superiores (HPF), largura de faixa (BF) e os de rejeição (RF).

Os filtros acima examinados são ideais. A realidade é muito mais diferente.

 Fig. 15 

Fig. 15. Faixa de transição em filtros

Há uma faixa de transição entre faixas de aceitação e de atenuação. Seu declive é medido em dB/oitavo ou dB/múltiplo de dez. Oitavo é um segmento entre o valor de frequência aleatório e o seu valor duplo. Múltiplo de dez é um segmento entre o valor de frequência aleatório e o seu valor vezes dez. Formalmente, a faixa de transição está localizada entre a frequência de corte e faixa de atenuação. Olhando para o futuro, eu diria que a frequência de corte pelo espectro é mais frequentemente definida pelo nível de 3 dB.

A rejeição da faixa externa é a supressão de frequências na faixa de atenuação medida em decibéis.

As batidas são detectadas na faixa de aceitação. Como estamos lidando com filtros reais, por exemplo, as distorções na faixa de aceitação, algumas frequências são maiores por sua amplitude, enquanto algumas são mais baixas. O valor é medido em decibéis.

A tabela abaixo pode ajudá-lo a processar o valor em dB:

dB
Taxa de amplitude
0,5    
1,06
1
1,12
3
1,41
6 2
10
3,16
20 10
30 31,6
40
100
60  1000

 

Por exemplo, se quisermos receber o resultado por 60 dB, podemos encontrar os valores de 20 e 40 dB e multiplicá-los.

Agora que sabemos os parâmetros básicos do filtro, vamos voltar para a parte prática do artigo.


3. Pesquisa pelo núcleo

Podemos dizer que o filtro digital é completamente descrito por sua resposta ao impulso (núcleo). Resposta ao impulso é uma resposta de um filtro a um único impulso. Os filtros podem ser de IIR (resposta infinita ao impulso, por exemplo, de Média móvel exponencial, EMA) e de FIR (resposta finita ao impulso, por exemplo, dos tipos de Média móvel simples, SMA). 

Agora, podemos concentrar a nossa atenção no MetaEditor. Primeiro, vamos criar um único impulso. Será um indicador muito simples que exibirá apenas uma contagem igual a um. No MetaEditor, clique em Novo, selecione "Indicador personalizado" e clique em Próximo:

Fig. 16
 

Fig. 16. Criação de um indicador personalizado no Assistente MQL5

Especifique "impulso" como um nome:

Fig. 17
 

Fig. 17. Propriedades gerais do indicador

Selecione o gerenciador de evento:

Fig. 18
 

 Fig. 18. Gerenciadores de evento do indicador

Agora, devemos adicionar a linha indicadora e exibir em uma janela separada. Está tudo pronto.

 Fig. 19

 Fig. 19. Propriedades de desenho do indicador

O código do indicador parece com o seguinte aspecto:

//+------------------------------------------------------------------+
//|                                                      Impulse.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters

//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ArraySetAsSeries(Label1Buffer,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
              const int prev_calculated,
              const int begin,
              const double &price[])
  {
//---
   ArrayInitialize(Label1Buffer,0.0);
   Label1Buffer[1023]=1.;
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Adicione o seguinte à função OnInit():

ArraySetAsSeries(Label1Buffer,true);

para que a correção do índice seja desempenhada do final da matriz.

Em OnCalculate():

ArrayInitialize(Label1Buffer,0.0);
Label1Buffer[1023]=1.;

Vamos zerar todos os valores e adicionar 1 a 1023ª célula da matriz do indicador.

Compile (F7) e receba o seguinte resultado: 

Fig. 20 

 Fig. 20. Indicador de impulso

Agora, se aplicarmos algum indicador, somos capazes de ver a sua resposta ao impulso até 1024 contagens (ver exemplos).

Claro, é ótimo para ver o núcleo do filtro, mas mais dados podem ser obtidos apenas a partir da representação de domínio da frequência. Para fazer isso, precisamos criar um analisador de espectro ou usar uma solução pronta, sem muito esforço. Vamos selecionar a segunda opção e utilizar indicador SpecAnalyzer descrito no artigo "Construção de um analisador de espectro".

O indicador é mostrado abaixo:

Fig. 21 

Fig. 21. SpecAnalyzer

Alguns trabalhos preparatórios são necessários antes de usá-lo. Todos os passos necessários estão descritos abaixo.


4. Adaptação para analisador de espectro

O botão "Dados externos" permite a utilização de dados do indicador SAInpData.

O original contém a matriz que representa o núcleo do filtro. Vamos refazer o arquivo, de modo que seja possível passar quaisquer indicadores gráficos ao analisador de espectro. Os modos automático e manual são para serem fornecidos no indicador modificado. No modo automático, o primeiro indicador gráfico a ser encontrado é usado. No modo manual, os usuários podem definir um índice de sub-janela e índice indicador na lista. Neste caso, o indicador de impulso deve ser adicionado manualmente ao gráfico. Depois disso, o indicador necessário é aplicado para receber o núcleo.

Vamos começar. Devemos criar um novo indicador de acordo com o mesmo algoritmo, como com impulso. Adicione os parâmetros de entrada:

input bool Automatic=true; // Autosearch
input int  Window=0;       // Subwindow index
input int  Indicator=0;    // Indicator index

Se automático=verdadeiro, o modo automático é utilizado, enquanto outros parâmetros de entrada são ignorados. Se automático=falso, o modo manual com sub-janela e índice indicador é usado.

Em seguida, devemos adicionar variáveis de números inteiros sobre o nível global para armazenar os indicadores.

int Impulse=0; // single impulse's handle
int Handle=0;  // required indicator's handle
int Kernel=0;  // filter kernel's handle

O indicador de impulso está para ser armazenado em Impulso. O identificador do indicador, o núcleo do qual desejamos visualizar no analisador de espectro, está para ser armazenado no Indicador. O Identificador do indicador alvo, que é construído com base no Indicador de impulso ou em outras palavras, o núcleo do indicador alvo, está para ser armazenado no Núcleo.

Função OnInit():

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,DataBuffer,INDICATOR_DATA);

   Impulse=iCustom(NULL,0,"SpecAnalyzer\\Impulse");//get the single impulse handle
   if(Impulse==INVALID_HANDLE)
     {
      Alert("Impulse initialization failed"); 
       return(INIT_FAILED);
     }
//---
   return(0);
  }

Desde que o indicador de impulso não é alterado durante a operação do programa, o identificador do indicador deve ser recebido na função OnInit(). O recebimento de erro do gerenciador também deve ser verificado. Em caso de falha, a mensagem de "Inicialização de impulso falhou" deve ser exibida e a operação do indicador é interrompida com a tecla INIT_FAILED.

Função OnDeinit():

void OnDeinit(const int reason)
  {
//--- delete the indicators
   IndicatorRelease(Impulse);
   IndicatorRelease(Handle);
   IndicatorRelease(Kernel);
  }

Os indicadores utilizados são excluídos na função OnDeinit().

Função OnCalculate():

static bool Flag=false;        //error flag
if(Flag) return(rates_total); //exit in case of the flag

Variável estática Flag é adicionada no início da função. Se erros ocorrerem durante a execução do programa, a Flag é igual a verdadeira e todas as mais repetições de funções OnCalculate() são interrompidas bem do começo.

Abaixo está a parte do código associado com o modo manual:

   string Name;  //short name of the required indicator
   if(!Automatic)//in case of the manual mode
     {
      if(ChartIndicatorsTotal(0,Window)>0)//if an indicator is present
        {
         Name=ChartIndicatorName(0,Window,Indicator);//search for its name
         Handle=ChartIndicatorGet(0,Window,Name);//search for the handle
        }
      else//otherwise
        {
         Alert("No indicator");
         Flag=true;
         return(rates_total);
        }

      if(Handle==INVALID_HANDLE)//in case of a handle receiving error
        {
         Alert("No indicator");
         Flag=true;
         return(rates_total);
        }

      CopyBuffer(Handle,0,0,1024,DataBuffer);//display the kernel on the chart
      return(rates_total);
     }

Se automático=falso, o modo manual será liberado. A presença do indicador é verificada. Em caso de sucesso, começamos a procurar um nome e um identificador, verificando erros, copiando os dados para o buffer do indicador. No caso de falha, a mensagem "nenhum indicador" será exibida, Flag é alterada para verdadeira, a execução da função OnCalculate() é interrompida.

A parte do modo automático é muito mais interessante. Ela consiste em pesquisar por um indicador no gráfico e criar um núcleo.

Então, vamos considerar a pesquisa por um indicador. O objetivo principal é receber um identificador.

   if(ChartIndicatorsTotal(0,0)>0)//if the indicator is in the main window
     {
      Name=ChartIndicatorName(0,0,0);//search for its name
      if(Name!="SpecAnalyzer")//if it is not SpecAnalyzer
         Handle=ChartIndicatorGet(0,0,Name);//look for a handle
      else
        {
         Alert("Indicator not found");
         Flag=true;
         return(rates_total);
        }
     }
   else//otherwise
   if(ChartIndicatorsTotal(0,1)>0)//if the indicator is in the first subwindow
     {
      Name=ChartIndicatorName(0,1,0);//search for its name
      if(Name!="SAInpData")//if it is not SAInpData
         Handle=ChartIndicatorGet(0,1,Name);//look for a handle
      else//otherwise
        {
         Alert("Indicator not found");
         Flag=true;
         return(rates_total);
        }
     }

   if(Handle==INVALID_HANDLE)//in case of a handle receiving error
     {
      Alert("No indicator");
      Flag=true;
      return(rates_total);
     }

Em primeiro lugar, procuramos por um indicador na sub-janela principal do gráfico e nos certificamos de que não seja o SpecAnalyzer. Se nenhum indicador for encontrado na janela principal, o procuramos na próxima sub-janela (considerando que talvez haja SAInpData aqui). Todas as outras ações são semelhantes no modo manual.

Vamos criar um indicador. Devemos receber os parâmetros do indicador obtido e criar um indicador semelhante com base no impulso:

   ENUM_INDICATOR indicator_type;//obtained indicator's type
   MqlParam parameters[];      //parameters
   int parameters_cnt=0;      //number of parameters

//--- receive the indicator's type, parameter values and amount
   parameters_cnt=IndicatorParameters(Handle,indicator_type,parameters);
//--- define that a single impulse is to be sent to the indicator's input
   parameters[parameters_cnt-1].integer_value=Impulse;
//--- receive the indicator's handle from the single impulse - filter's kernel
   Kernel=IndicatorCreate(NULL,0,indicator_type,parameters_cnt,parameters);

   if(Kernel==INVALID_HANDLE)//in case of a handle receiving error
     {
      Alert("Kernel initialization failed");
      Flag=true;
      return(rates_total);
     }

   CopyBuffer(Kernel,0,0,1024,DataBuffer);//display the kernel on the chart

indicator_type - a variável do tipo enumerado especial ENUM_INDICATOR . A variável designada para receber o tipo de indicador.

parâmetros[] - a matriz do tipo MqlParam, estrutura especial para armazenar e transferir os parâmetros do indicador. 

A funçãoParâmetros do indicador permite receber dados do indicador do gráfico. Então, implementamos leves mudanças à matriz dos parâmetros. Identificador de indicador de impulso é incluso na última célula onde o nome da série de tempo (fechar, baixar, identificador, etc.) é armazenado no campo integer_value. Em seguida, utilizamos a função IndicatorCreate para criar um novo indicador que também seja um núcleo. Agora, devemos verificar o identificador e exibir o núcleo no gráfico.

O indicador SpecAnalyzer também foi ligeiramente alterado. Os seguintes parâmetros de entrada foram adicionados:

input bool Automatic=true; //Autosearch
input int Window=0;        //Subwindow index
input int Indicator=0;    //Indicator index

A chamada SAInpData também foi alterada:

ExtHandle=iCustom(NULL,0,"SpecAnalyzer\\SAInpData",Automatoc,Window,Indicator);

A SAInpData pode ser utilizada sozinha para visualizar a resposta ao impulso.

 

5. Exemplos

Para fazer que as coisas funcionem, colar a pasta SpecAnalyzer em MetaTrader 5\MQL5\Indicators. Execute o Meta Trader 5, abra um novo gráfico EURUSD:

Fig. 22

Fig. 22. Abertura de um novo gráfico EURUSD

Agora, aplicamos o indicador necessário, por exemplo, MA(16):

Fig. 23

Fig. 23. Aplicação do indicador de média móvel ao gráfico EURUSD

Executar SpecAnalyzer:

Fig. 24

Fig. 24. Executar SpecAnalyzer

A janela de parâmetros aparece:

Fig. 25

Fig. 25. Parâmetros do indicador SpecAnalyzer

Para o modo automático, só clicar OK. No modo manual, verdadeiro deve ser substituído por falso e o local do indicador necessário deve ser especificado.

Em seguida, clicamos OK. Clique em "Dados externos" na janela mais recente que aparece do Analisador de espectro:

Fig. 26

Fig. 26. Seleção de dados de entrada para o indicador SpecAnalyzer

Agora, vamos considerar trabalhar no modo manual. Primeiro, devemos adicionar o indicador de Impulso ao gráfico:

Fig. 27

Fig. 27. Adição do Indicador de impulso

Em seguida, devemos utilizar este indicador para gerar o indicador alvo. Para fazer isso, devemos arrastar o indicador pelo mouse para a janela Impulso e selecionar os dados de indicador anteriores no campo de parâmetros "Apply to" (Aplicar para):

Fig. 28

Fig. 28. Criação de indicador de média móvel utilizando dados do indicador de impulso

O seguinte resultado deve ser conseguido:

Fig. 29 

Fig. 29. Resultado de cálculo do indicador de média móvel em um único impulso

Agora, clique no lado direito do mouse para ver a lista de indicadores:

Fig. 30

Fig. 30. Indicadores na lista

Nosso indicador está localizado na sub-janela 1 e possui o número de série 1 (não esqueça que as partidas de correção do índice são a partir de zero, não de um). Agora, vamos executar o SpecAnalyzer. Ajuste em falso, 1, 1. Clique em "Dados externos".

As propriedades do indicador podem ser alteradas em tempo real. Tente alterar o período usando a lista de indicadores e veja como o analisador de espectro responde. 

Antes de irmos aos exemplos, é necessário mencionar um recurso do indicador SpecAnalyzer. As leituras sobre sua escala não são períodos, mas marcas de grade de frequência. O analisador de espectro trabalha com o núcleo que tem o comprimento de até 1024 leituras. Isso significa que a inclinação da frequência de rede é igual a 1/1024=0,0009765625. Assim, o valor de 128 na escala corresponde à frequência de 0,125 ou o período de 8.

Escala
Período
16   64
32   32
64   16
128
8
256
4
384
2,67
512
2

SMA (16)

 Fig. 31

Fig. 31. Resposta ao impulso do indicador de média móvel simples (filtro FIR)

Fig. 32 

Fig. 32. Resposta de frequência do indicador de média móvel simples

Podemos ver que este é um filtro de passa-baixas, pois baixas frequências prevalecem. A supressão na faixa de atenuação é ruim.

  

EMA (16)

Fig. 33

Fig. 33. Resposta ao impulso do indicador de média móvel exponencial (filtro IIR)

Fig. 34 

Fig. 34. Resposta de frequência do indicador de média móvel exponencial

O indicador de média móvel exponencial é também um filtro de passa-baixas. A linha é bem suave, mas ao contrário do indicador anterior, a faixa de transição é mais ampla. A supressão é aproximadamente a mesma.

Agora, vamos examinar os resultados do Filtro digital universal.

Filtro passa-baixas

Fig. 35

Fig. 35. A resposta de impulso (núcleo) do filtro passa-baixas

Fig. 36

Fig. 36. A resposta de frequência do filtro passa-baixas

Filtro passa-altas

 Fig. 37 

Fig. 37. A resposta de impulso (núcleo) do filtro passa-altas

 

 Fig. 38 

Fig. 38. A resposta de frequência do filtro passa-altas

 

Filtro passa-faixas

 Fig. 39 

Fig. 39. A resposta de impulso (núcleo) do filtro passa-faixa

 

Fig. 40 

  Fig. 40. A resposta de frequência do filtro passa-faixa


Conclusão

Em conclusão, deve-se notar que os parâmetros de filtro estão fortemente interligados. Melhorar alguns deles implica na deterioração de outros. Portanto, os parâmetros devem ser selecionados com base na tarefa em mãos.

Por exemplo, se você deseja o aumento da supressão de frequências na faixa de atenuação, você precisa sacrificar inclinação da curva descendente. Se ambos os parâmetros devem ser bons, então precisamos aumentar o comprimento do núcleo, que por sua vez afeta a lacuna entre o indicador e o preço ou aumentar as distorções na faixa de aceitação.

Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/736

Arquivos anexados |
specanalyzer.zip (9.68 KB)
Estendendo a biblioteca padrão do MQL5 e reutilizando o código Estendendo a biblioteca padrão do MQL5 e reutilizando o código
A biblioteca padrão do MQL5 torna mais fácil a sua vida como desenvolvedor. No entanto, ela não implementa todas as necessidades de todos os desenvolvedores no mundo, então, se você achar que precisa de mais algum material de customização, você pode dar um passo a mais e estender. Este artigo o orienta através da integração do indicador técnico Zig-Zag MetaQuotes' na biblioteca padrão. Ficamos inspirados pela filosofia de design MetaQuotes' para alcançar o nosso objetivo.
Eleve os seus sistemas de negociação lineares ao poder Eleve os seus sistemas de negociação lineares ao poder
O artigo de hoje mostra a programadores MQL5 intermediários como eles podem obter mais lucro de seus sistemas de negociação lineares (Fixed Lot) facilmente implementando a chamada técnica de exponenciação. Isto é porque o crescimento de curva de capital resultante é, em seguida, geométrico, ou exponencial, tendo a forma de uma parábola. Especificamente, implementaremos uma variante MQL5 prática do dimensionamento da posição fracionária fixa desenvolvida por Ralph Vince.
Guia prático do MQL5: Salvando resultados de otimização de um Expert Advisor baseado em critérios especificados Guia prático do MQL5: Salvando resultados de otimização de um Expert Advisor baseado em critérios especificados
Continuamos as séries de artigos sobre a programação do MQL5. Desta vez, veremos como obter resultados de cada etapa de otimização durante a otimização do parâmetro do Expert Advisor. A implementação será feita de modo a garantir que, se forem atingidas as condições especificadas nos parâmetros externos, os valores das etapas correspondentes serão gravados em um arquivo. Além dos valores de teste, também salvaremos os parâmetros que levaram a tais resultados.
Surpreenda seus clientes MQL5 com um coquetel prático de tecnologias! Surpreenda seus clientes MQL5 com um coquetel prático de tecnologias!
O MQL5 fornece programadores com um conjunto muito completo de funções e IPA baseado em objetos graças aos quais eles podem fazer tudo o que quiserem dentro do ambiente MetaTrader. No entanto, Tecnologia Web é uma ferramenta extremamente versátil hoje em dia que pode vir para o resgate em algumas situações quando você precisa fazer algo muito específico, seja para surpreender seus clientes com algo diferente ou simplesmente por você não ter tempo suficiente para dominar uma parte específica da Biblioteca Padrão MT5. O exercício de hoje o leva através de um exemplo prático de como você pode gerenciar a duração de desenvolvimento, ao mesmo tempo que você também cria um coquetel tecnológico incrível.