English Русский 中文 Español Deutsch 日本語
preview
Indicadores adaptativos

Indicadores adaptativos

MetaTrader 5Exemplos | 20 janeiro 2023, 10:36
511 0
Aleksej Poljakov
Aleksej Poljakov

Introdução

Provavelmente, todo operador sonhou com um indicador capaz de se adaptar às condições do mercado em constante mudança, pensando que ele pudesse determinar lateralizações e tendências sem perder de vista as variações reais de preço. Os indicadores técnicos convencionais, no entanto, utilizam coeficientes constantes ao processar as entradas, o que significa que esses coeficientes não se adaptam às características da entrada e às suas variações ao longo do tempo.

Esses indicadores se destacam pelo uso de feedback entre as entradas e saídas, o que permite que eles se adaptem de forma autônoma para processar séries temporais financeiras de forma eficiente. Em outras palavras, um indicador adaptativo é semelhante a um indicador linear convencional, mas possui coeficientes que se alteram de acordo com as condições atuais do mercado.

Os algoritmos adaptativos são variados e a escolha de um específico depende do objetivo do indicador. No entanto, muitos algoritmos são baseados em diferentes métodos de mínimos quadrados. Vamos explorar alguns exemplos de como desenvolver um indicador adaptativo.


Primeira tentativa

Vamos tentar construir um indicador adaptativo. Um método comum para adaptar um indicador é considerar seus erros recentes. Vamos ver como isso pode ser implementado.

Considere Indicator[i] como o valor do indicador na i-ésima barra. Logo, o erro pode ser calculado como:  Error[i] = price[i] - Indicator[i].

Este erro pode ser usado para ajustar os valores do indicador na próxima contagem. Além disso, existem várias formas de lidar com erros, como calcular a média dos erros recentes ou aplicar suavização exponencial.

Vamos observar como essa abordagem afeta o gráfico. Vamos utilizar o modelo descrito no artigo sobre indicadores técnicos como base, mas faremos algumas modificações. Primeiramente, definimos o número de erros para

double sum=0;       for(int j=0; j<size; j++)          sum=sum+coeff[j]*price[i+j];//Calculate the indicator value       if(i>0)         {         double cur_error=price[i]-sum;//Current error          if(NumErrors==0)             cur_error=(error+cur_error)/2;          if(NumErrors==1)             error=cur_error/2;          if(NumErrors>1)            {             for(int j=NumErrors-1; j>0; j--)                errors[j]=errors[j-1];             errors[0]=cur_error;             cur_error=0;             for(int j=0; j<NumErrors; j++)                cur_error=cur_error+errors[j];             error=cur_error/NumErrors;            }         }       buffer[i]=sum+error;//Indicator value considering the error

Nosso novo indicador ficará assim em comparação com a média móvel simples (linha vermelha).


A imagem parece boa, mas nosso indicador é adaptável? A resposta, infelizmente, é negativa. Na verdade, temos um indicador linear comum, mas seus coeficientes de peso são definidos implicitamente.

Vamos pegar, por exemplo, uma média móvel simples com um período de 3 e a média dos últimos três erros. Vamos calcular os erros primeiro:

Error[1] = price[1] - (price[1] + price[2] + price[3])/3

Error[2] = price[2] - (price[2] + price[3] + price[4])/3

Error[3] = price[3] - (price[3] + price[4] + price[5])/3

Então a fórmula do indicador será:

Indicator[0] = (price[0] + price[1] + price[2])/3+(Error[1] + Error[2] + Error[3])/3 =>

Indicator[0] = (3*price[0] + 5*price[1] + 4*price[2] + 0*price[3] - 2*price[4] - 1*price[5])/9

Como resultado, obtivemos um indicador linear comum. A partir disso, podemos concluir que apenas um tratamento de erros não torna o indicador adaptável.


Nascer do sol

O problema formulado por Pierre-Simon Laplace, conhecido como "o problema do nascer do sol", pergunta sobre a confiança que temos de que o sol nascerá novamente após testemunharmos o nascer do sol durante 1 000 dias. Vamos analisá-lo com relação à negociação: imagine que você tenha realizado nove negociações, das quais seis foram lucrativas. Com base nessa informação, qual é a probabilidade de uma próxima negociação ser lucrativa?

Vamos refletir juntos. A probabilidade é geralmente definida como a relação entre o número de negociações lucrativas e o número total de negociações realizadas.


No nosso exemplo, a probabilidade de uma negociação ser lucrativa é 6/9. No entanto, vamos avaliar a probabilidade de uma negociação futura ser lucrativa. O denominador da fração aumentará em um, independentemente do resultado. Mas, quanto ao numerador, temos duas possibilidades: uma negociação futura pode ser lucrativa ou não lucrativa. Em outras palavras, temos duas opções possíveis:


Vamos calcular a média desses valores. Então, a nossa estimativa da probabilidade de ganhar será:


O que é ligeiramente menor do que o valor original de 6/9. Este método é conhecido como suavização de Laplace. Ele pode ser aplicado em dados categóricos, onde as variáveis podem assumir vários valores predefinidos, como "sucesso ou fracasso" no nosso exemplo.

Vamos tentar aplicar essa suavização no indicador. Para isso, faremos uma pequena suposição, assumindo que existe outro preço oculto no fluxo de preços (que chamaremos de "imaginário"), que também afetará as leituras do indicador.

Vamos ver como a fórmula do indicador se altera neste caso. A fórmula da média móvel simples é a seguinte:


E a mesma média com um preço imaginário será:


À primeira vista, tudo parece ótimo. Mas, há algumas coisas ruins aqui. Primeiro, o próprio preço imaginário será instável:


Em segundo lugar, se movermos o preço imaginário para o próximo ponto da série temporal, nosso indicador será simplificado:


Esta simplificação não nos ajudou a tornar o indicador estável (o coeficiente no price[1] é igual a 1). No entanto, essa falha pode servir de base para outro indicador.

Primeiro, definimos o período do indicador, iPeriod. Em seguida, encontramos os valores de SL para todos os N, com valores de 1 a iPeriod. O próximo passo é calcular a média da soma de todos os SL. Como resultado, temos um indicador que mostra um valor de preço estável. Este indicador pode ser descrito da seguinte maneira: uma previsão ingênua (o que foi será), mais uma tendência linear levemente suavizada.


Bem, temos um indicador. No entanto, a adaptação não foi alcançada. Outra tentativa e outro fracasso. Vamos fazer uma pausa curta e, em seguida, tentar criar um indicador adaptativo. Caso contrário, talvez seja necessário mudar o título do artigo.


Pôr da lua

Kozma Prutkov observou uma vez com muita sabedoria: “Se você for perguntado: o que é mais útil, o sol ou a lua? - responda: a lua. Pois o sol brilha durante o dia, quando já está claro; e a lua à noite." Vamos ver como esse ditado pode ser traduzido para o mundo das negociações.

Na suavização de Laplace, usamos valores de preço com os mesmos coeficientes de peso. Mas e se atribuirmos pesos diferentes aos preços? Nas funções de janela, os coeficientes de ponderação dependem da distância entre a leitura dada e o centro de ponderação do indicador. Agora, vamos tentar algo diferente. Primeiro, escolheremos um valor de preço específico como o valor central, que terá o maior peso. Os coeficientes de ponderação dos demais preços dependerão da distância entre esse valor e o preço atual - quanto maior a distância, menor será o peso. Em outras palavras, criaremos uma função janela não no domínio temporal, mas no domínio do preço. Vejamos como esse algoritmo funcionaria na prática.

      double value=price[i+center],//Price value at the center              max=_Point;           //Maximum deviation       for(int j=0; j<period; j++)//Calculate price deviations from the central one and the max deviation         {          weight[j]=MathAbs(value-price[i+j]);          max=MathMax(max,weight[j]);         }       double width=(period+1)*max/period,//correct the maximum deviation from the center so that there are no zeros at the ends              sum=0,              denom=0;       for(int j=0; j<period; j++)//calculate weight ratios for each price         {          if(Smoothing==Linear)//linear smoothing             weight[j]=1-weight[j]/width;          if(Smoothing==Quadratic)//quadratic smoothing             weight[j]=1-MathPow(weight[j]/width,2);          if(Smoothing==Exponential)//exponential smoothing             weight[j]=MathExp(-weight[j]/width);          sum=sum+weight[j]*price[i+j];          denom=denom+weight[j];         }       buffer[i]=sum/denom;//indicator value

Nosso indicador aparece no gráfico assim.


Mesmo que os pesos deste indicador mudem, não podemos chamá-lo de adaptável. Seria mais correto dizer que este indicador se ajusta à situação atual do mercado. Não conseguimos um indicador adaptativo, mas demos o primeiro passo para o sucesso.


Segunda tentativa

Vamos tomar como base a função de janela retangular, porém, com pequenas alterações - os coeficientes no início e no final da janela podem mudar. Então a fórmula do indicador fica assim:


Onde N é o período do indicador e C1 e C2 são coeficientes adaptativos.

Vamos supor que já temos os valores desses coeficientes. Um novo valor de preço aparece. E junto com ele, o erro do indicador pode mudar.


Para reduzir o erro, precisamos corrigir cada coeficiente com base em um ajuste R:


Nosso objetivo é garantir que as alterações nos coeficientes sejam eficazes na redução do erro do indicador a um valor próximo de zero. Além disso, também exigiremos que as correções de R sejam moderadas. Se conseguirmos atender a essas duas condições, podemos esperar que os valores dos coeficientes adaptativos fiquem próximos dos valores ideais (se existirem).

Assim, precisamos encontrar uma solução para o seguinte problema:


Para encontrar as correções R , usaremos o método dos mínimos quadrados. Os cálculos podem ser feitos em várias etapas. Primeiro, calculamos o fator de convergência:


Então, os valores de correção serão iguais a: R = price*Error*M.

Assim, as fórmulas para atualização dos coeficientes serão as seguintes:


Nosso indicador ficará assim em comparação com uma média móvel simples (linha vermelha).



Adaptação

Conseguimos lidar com dois coeficientes. É possível criar um indicador com todos os coeficientes adaptativos? Sim, esse indicador é possível. Os cálculos dos coeficientes de tal indicador são semelhantes aos que consideramos no caso anterior. A única diferença é o cálculo do fator de convergência:


O parâmetro P permite ajustar a taxa de variação dos coeficientes em cada etapa. Seu valor deve ser no mínimo 1. Com um P pequeno, os coeficientes do indicador atingem rapidamente seus valores ideais. No entanto, as mudanças nos coeficientes do indicador podem ser excessivas. Com um grande valor de P , os coeficientes do indicador mudarão lentamente. Em outras palavras, quanto maior for P, mais suave será o indicador. Por exemplo, os indicadores com P = 1 e P = 1000 ficam assim.


Recomendação geral: é importante estabelecer o valor inicial do parâmetro do indicador como o período do indicador e, em seguida, ajustá-lo na direção desejada até obter o resultado desejado.

Os indicadores adaptativos podem ser instáveis, uma de suas características importantes. A soma dos coeficientes desses indicadores não é igual a um e pode variar com base nos dados de entrada. Como exemplo, vamos usar a média exponencial. A fórmula clássica é: .

Já a fórmula EMA adaptativa é: .

Além disso, os coeficientes C1 e C2 não são dependentes um do outro. Os coeficientes são atualizados da mesma forma que o indicador anterior, mas no cálculo, além dos preços, são usados os valores anteriores do próprio indicador.


Então, os coeficientes atualizados são:


O EMA adaptativo com diferentes valores do parâmetro P tem esse aspeto:


Algoritmos de adaptação também podem ser aplicados a funções de janela. No entanto, o resultado não será tão impressionante, pois a adaptação ocorrerá devido a uma mudança no coeficiente de normalização.

Vamos tomar como base o indicador LWMA com um período de 5. Sua fórmula pode ser escrita assim: .

Onde C é algum fator de normalização. O valor desse coeficiente costuma ser constante e pode ser calculado antecipadamente. Agora vamos permitir que mude em uma direção ou outra.

Primeiro, precisamos calcular a soma ponderada: .

Então, o valor ajustado do coeficiente de normalização pode ser encontrado pela fórmula:


Essa abordagem pode ser útil para indicadores com um período curto. Para períodos longos, a influência da adaptação e do parâmetro P será quase imperceptível.


Os indicadores adaptativos permitem a criação de uma variedade de osciladores. O indicador adaptativo CCI é um exemplo disso.



Previsão linear

A construção de um indicador adaptativo é semelhante à resolução de um problema de previsão linear em muitos aspectos. Se utilizarmos a diferença entre o valor do indicador e o preço futuro (em relação ao próprio indicador) como um erro, o indicador adaptativo se torna preditivo.

Por exemplo, se considerarmos os preços open, a fórmula do indicador e o valor do erro serão:


Todos os outros cálculos são realizados de acordo com as fórmulas que já conhecemos. A única coisa que adicionaremos a este indicador é o cálculo do erro médio de previsão. Como resultado, obteremos o valor previsto do preço de abertura de uma barra com índice -1.



Previsão probabilística linear

A tarefa de previsão linear também pode ser expressa em termos da equação de movimento de preços. No mundo físico, tudo parece bastante simples: se a posição atual de um ponto, sua velocidade e aceleração forem conhecidas, é possível prever sua posição no próximo momento com facilidade. No entanto, no caso do movimento de preços, as coisas são um pouco mais complexas.

Sabemos o valor do preço. Velocidade e aceleração, na linguagem matemática, são as primeira e segunda derivadas. Vamos substituí-las por seus equivalentes discretos - diferenças divididas da ordem correspondente. Os coeficientes das diferenças divididas podem ser obtidos a partir da reta correspondente do triângulo de Pascal, bastando apenas alternar os sinais na frente de cada coeficiente Então, teremos:

1*open[0] -1*open[1] – analógico discreto de velocidade;

1*open[0] -2*open[1] +1*open[2] – analógico discreto da aceleração.

Já a equação de movimento de preços pode ser expressa da seguinte forma:

open[0] + (open[0] – open[1]) + (open[0] – 2*open[1] + open[2]).

Adicionamos coeficientes adaptativos a esta equação e, como resultado, obtemos:

open[-1] = open[0] + c1*(open[0] – open[1]) + c2*(open[0] – 2*open[1] + open[2]).

Abrimos os colchetes e agrupamos os coeficientes. Então a equação tem a forma:

open[-1] = (1 + с1 + с2)*open[0] + (-c1 – 2*с2)*open[1] + c2*open[2].

Lembre-se de que os coeficientes de um indicador estável devem estar na faixa de -1 a +1. Assim, precisamos resolver o seguinte sistema de inequações:


Como resultado, temos três possíveis opções:


Agora podemos selecionar os valores dos coeficientes e utilizá-los no indicador.


Obviamente, o uso de diferenças de ordem superior dará mais opções possíveis e afetará favoravelmente a aparência do indicador.


Considerações finais

O uso de algoritmos adaptativos permite obter indicadores bastante incomuns. Sua principal vantagem é a capacidade de se ajustar automaticamente às condições atuais do mercado. Entretanto, as desvantagens incluem um aumento no número de parâmetros de controle, cuja seleção pode tomar algum tempo. Por outro lado, os indicadores adaptativos podem mudar em uma faixa ampla, o que pode proporcionar novas abordagens à análise técnica.

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

Arquivos anexados |
First_try.mq5 (3.21 KB)
Sunrise.mq5 (2.51 KB)
Moonset.mq5 (2.93 KB)
Second_try.mq5 (2.56 KB)
Adaptation.mq5 (2.65 KB)
Adaptive_EMA.mq5 (2.41 KB)
Adaptive_LWMA.mq5 (2.47 KB)
Adaptive_CCI.mq5 (3.67 KB)
First_try.mq4 (4.23 KB)
Sunrise.mq4 (3.5 KB)
Moonset.mq4 (4 KB)
Second_try.mq4 (3.94 KB)
Adaptation.mq4 (3.85 KB)
Adaptive_EMA.mq4 (3.54 KB)
Adaptive_LWMA.mq4 (3.58 KB)
Adaptive_CCI.mq4 (4.89 KB)
Explorando a magia dos períodos de negociação com o auxílio do Frames Analyzer Explorando a magia dos períodos de negociação com o auxílio do Frames Analyzer
Bem, o Frames Analyzer é uma ferramenta para analisar quadros de otimização durante o processo de otimização de parâmetros quer seja no testador de estratégia ou fora do mesmo. Ele permite ler arquivos MQD ou bancos de dados criados após a otimização de parâmetros e compartilhar esses resultados com outros usuários da ferramenta. Ele é projetado para auxiliar a melhorar estratégias de negociação conjuntamente. Adicionalmente, é bom mencionar que quadro de otimização é um conjunto de dados que contém informações sobre as condições de mercado em um determinado momento, como preços, volumes, indicadores técnicos, entre outros, que são usados para avaliar e comparar a eficácia de diferentes estratégias de negociação.
DoEasy. Controles (Parte 23): apurando os objetos WinForms TabControl e SplitContainer DoEasy. Controles (Parte 23): apurando os objetos WinForms TabControl e SplitContainer
Neste artigo, incluiremos novos eventos de mouse relacionados aos limites das áreas de trabalho dos objetos WinForms e corrigiremos algumas falhas na funcionalidade dos controles TabControl e SplitContainer.
Aprendendo a construindo um Expert Advisor que opera de forma automática (Parte 11): Automação (III) Aprendendo a construindo um Expert Advisor que opera de forma automática (Parte 11): Automação (III)
Um sistema automático sem segurança não irá dar certo. Mas segurança não nasce sem que entendamos adequadamente algumas coisas. Neste artigo vamos entender é tão difícil alcançar a segurança máxima em sistemas automáticos.
Funcionalidades do assistente MQL5 que você precisa conhecer (Parte 03): Entropia de Shannon Funcionalidades do assistente MQL5 que você precisa conhecer (Parte 03): Entropia de Shannon
O trader de hoje é um filomata que está quase sempre procurando novas ideias, experimentando-as, escolhendo modificá-las ou descartá-las; um processo exploratório que deve custar uma quantidade razoável de diligência. Esta série de artigos proporá que o assistente MQL5 deve ser um esteio para os traders.