English Русский 中文 Español Deutsch 日本語
Crie o seu próprio Indicador técnico

Crie o seu próprio Indicador técnico

MetaTrader 5Exemplos | 25 novembro 2022, 09:26
860 0
Aleksej Poljakov
Aleksej Poljakov

Introdução

Qualquer indicador técnico é baseado em um determinado algoritmo para processar as informações de mercado. Como regra, os preços são usados como dados iniciais. Falando na linguagem da matemática, o indicador é uma função que converte os preços em algum resultado final. Neste artigo, eu considerarei as funções lineares que podem ser usadas para construir um indicador.


Regra #1

A ideia por trás de todos os indicadores lineares é bastante simples e se resume a quatro etapas:

  1. Fazer um número predeterminado de leituras de preço;
  2. Multiplicar por algumas razões;
  3. Somar os resultados obtidos;
  4. Exibir o valor resultante em um gráfico.

É intuitivamente claro que o resultado final e o comportamento de tal indicador dependem das razões. Quais valores devem ser essas razões? Elas podem ter valores arbitrários ou estar sujeitos a algumas restrições?

Os indicadores que são definidos no gráfico principal podem ser expressos por uma equação simples (neste caso, nós usamos números inteiros como proporções):

Nós precisamos fazer uma transformação simples para converter as razões em números reais:

Então, a regra principal para tais indicadores é reduzida a uma afirmação simples: "A soma das proporções deve ser igual a um". Em outras palavras:

A equação do indicador parece bastante simples. Mas há grandes oportunidades por trás disso. Vamos tentar criar vários indicadores por conta própria, seguindo esta regra.

Como base para os nossos experimentos, eu usarei um indicador bem comum. Sua única diferença será o parâmetro de entrada - uma variável do tipo string que deve armazenar a sequência de razões. Essa abordagem nos permitirá testar um grande número de opções usando um modelo.

input string InpCoefficient="1,1,1,1,1";//variable for indicator ratios

Nós usaremos uma vírgula como separador entre as proporções.

Executamos as seguintes etapas dentro da função OnInit() (o código também possui um 'centro' misterioso, nós descobriremos sua finalidade mais tarde):

   string s[];                                                  //array for substrings with ratios
   size=StringSplit(InpCoefficient,StringGetCharacter(",",0),s);//get substrings and their number
   
   ArrayResize(coeff,size);  //prepare the array for indicator ratios
   double denom=0,center=0;  //variables for normalizing values and calculating the center of the indicator
   for(int i=0; i<size; i++) // set the ratios
     {
      coeff[i]=StringToDouble(s[i]);
      denom=denom+coeff[i];
     }

   if(denom==0) //if the normalization term is 0, then something is wrong
     {
      Alert("Wrong odds!");
      return(INIT_FAILED);
     }

   for(int i=0; i<size; i++) //normalize the ratios and calculate the indicator center
     {
      coeff[i]=coeff[i]/denom;
      center=center+coeff[i]*(i+1);
     }

   Print((int)MathRound(center));//display the count closest to the center of the indicator

Agora vamos considerar alguns exemplos.

A primeira sequência. Vamos fazer cinco leituras de preços com as mesmas proporções: 1,1,1,1,1. Esta é uma média móvel simples. A equação do indicador neste caso é  (price[0] + price[1] + price[2] + price[3] + price[4])/5.

A segunda sequência. Para obter essa sequência, nós pegaremos as cinco médias móveis com períodos de um a cinco e encontraremos a sua média. Isso significa que nossos dados iniciais serão os seguintes:

price[0]/1 +
(price[0] + price[1])/2 +
(price[0] + price[1] + price[2])/3 +
(price[0] + price[1] + price[2] + price[3])/4 +
(price[0] + price[1] + price[2] + price[3] + price[4])/5.

Somando-os, nós teremos as razões de nossa sequência – 137,77,47,27,12.

A terceira sequência. Para esta sequência, nós vamos pegar cinco médias móveis com o deslocamento de um passo para trás. Em seguida, nós encontraremos a média deles. Em outras palavras, nós obteremos a média de várias médias móveis como resultado. Dados de abertura:

(price[0] + price[1] + price[2] + price[3] + price[4])/5 +
(price[1] + price[2] + price[3] + price[4] + price[5])/5 +
(price[2] + price[3] + price[4] + price[5] + price[6])/5 +
(price[3] + price[4] + price[5] + price[6] + price[7])/5 +
(price[4] + price[5] + price[6] + price[7] + price[8])/5.

O resultado é uma janela triangular com as razões – 1,2,3,4,5,4,3,2,1.

Várias sequências matemáticas podem ser usadas como razões indicadoras. Abaixo estão os exemplos de mais alguns indicadores. Um deles é baseado nos números de Fibo: 34,21,13,8,5,3,2,1,1. Outro indicador também é construído com os números de Fibo, mas uma construção simétrica é construída a partir deles: 1,1,2,3,5,3,2,1,1. O terceiro indicador é baseado na série do triângulo de Pascal: 1,8,28,56,70,56,28,8,1.

As razões para o indicador também podem ser encontradas na Encyclopedia of Integer Sequences. Em 2014, foi realizado um concurso para a nova sequência mais bonita. As sequências A229037, A235265 e A235383 foram declaradas vencedoras. Uma dessas sequências até ganhou seu próprio nome - "forest fire". Essa sequência é interessante porque ela evita tendências lineares. Aqui está a aparência dos indicadores construídos em sua base.

As palavras também podem ser convertidas em índices de indicadores. Vamos usar o nome da plataforma de negociação mais famosa, a MetaTrader 5. Nós tomaremos o número ordinal de cada letra como razões. Nesse caso, nós obtemos a sequência: 13,5,20,1,20,18,1,4,5,18,5.
Esta plataforma de negociação é lançada pela MetaQuotes Software Corp. Se omitirmos os espaços e o ponto, nós obtemos a sequência: 13,5,20,1,17,21,15,20,5,19,19,15,6,20,23,1,18,5, 3,15,18,16.

Os indicadores baseados nessas sequências se parecem com isso.

Finalmente, vamos criar outro indicador e nomeá-lo... Ah bem... Não vou nomeá-lo assim, caso contrário, o artigo estará sujeito a restrições de idade. Que ele seja simplesmente nomeado como "Crazy". A principal característica deste indicador é que nós usamos razões aleatórias a cada nova chamada.

Conhecendo as razões do indicador, nós podemos obter uma de suas características importantes. Para fazer isso, nós precisamos calcular em qual referência o centro de peso do indicador cai. Para fazer isso, nós precisamos substituir o número de referência na equação do indicador:

Dependendo do centro e período do indicador, nós podemos atribuí-lo a um dos três tipos. Seja 'períod' o período do indicador.

  • Trend:            center < period/3
  • Smoothing:      period/3 <  center < 2*period/3
  • Countertrend:    2*period/3 <  center

    Regra #1a

    Como nós podemos ver, seguir a regra #1 sempre produz um indicador técnico totalmente funcional. Mas aqui surge a pergunta: pode haver índices negativos no indicador? Aqui entra em jogo uma regra adicional, que soa assim: o valor absoluto de qualquer razão deve ser menor que sua soma. Ou, na forma simbólica para razões inteiras e reais:

    Essa limitação está relacionada à estabilidade do indicador. Por exemplo, vamos pegar várias sequências obtidas de uma média móvel linear ponderada: 5,4,3,2,1 - linha azul, 5,4,3,2,-1 - verde, 5,4,3,-2, -1 - amarelo e 5,4,-3,-2,-1 - vermelho.

    Como nós podemos ver, a última opção se comporta de maneira bastante livre em relação às anteriores — o indicador perdeu estabilidade. Portanto, caso haja índices negativos no indicador, é necessário verificar o cumprimento da regra 1a.


    Pequena pausa

    A regra das razões nos permite não apenas criar os novos indicadores, mas também modificar as opções padrão. Vamos pegar uma média móvel exponencial como exemplo. Sua equação é simples e conhecida de todos:

    Este é um exemplo do indicador recursivo onde o seu valor atual depende do anterior. Se nós expandirmos a recursão, a equação da média exponencial ficará assim:

    Aqui nós temos uma progressão geométrica de tamanho infinito.

    Uma observação rápida: o que nós chamamos coloquialmente de período EMA é, na verdade, um período da média móvel simples cujo centro corresponde ao centro da EMA.

    Vamos tentar limitar a duração da progressão. Então nós obtemos um filtro, que eu chamarei de geométrico. A característica mais interessante deste filtro é que seu comportamento depende tanto do fator de suavização quanto do seu período. Ao mesmo tempo, à medida que o período aumenta, o filtro geométrico torna-se cada vez mais semelhante a EMA padrão. Por exemplo, vamos considerar a taxa de suavização exponencial igual a a = 0.1. Então o período da EMA pode ser calculado da seguinte forma:

    Agora vamos comparar o comportamento da EMA e do filtro geométrico com a mesma taxa de suavização, mas com o período igual a 10.

    Se nós aumentarmos gradativamente o período do filtro geométrico, nós veremos como ele se aproxima gradativamente da EMA.

    Além de uma progressão geométrica, há também uma aritmética. Na plataforma MetaTrader, a progressão aritmética é implementada como uma média ponderada linearmente. Vamos fazer pequenas alterações nela introduzindo um passo de progressão aritmética. Isso nos permitirá obter um indicador com os valores de SMA para LWMA.

    Agora resta dar mais um passo combinando as duas opções para obter como resultado uma progressão aritmética-geométrica. Vou me desviar um pouco da forma canônica e permitir que diferentes progressões tenham diferentes períodos. Como resultado, nós obtemos um indicador cujo comportamento pode mudar em uma faixa bastante ampla. Pelo menos, as opções padrão (SMA, LWMA e EMA) não conseguem mostrar a mesma flexibilidade do nosso novo indicador.


    Funções da janela para principiantes

    Nós podemos usar as funções de janela aplicadas no tratamento de sinais digitais como indicadores de razões. Vejamos uma opção bastante universal — a janela da soma dos cossenos. A equação generalizada para as proporções de tal janela se parece como a seguir:

    Vamos tentar construir a nossa própria solução com base nesta janela, que pode ser usada em indicadores técnicos. Para fazer isso, nós escreveremos um script que calculará as razões do indicador.

    Todas as funções da janela padrão são simétricas em relação ao centro. Nós podemos nos dar ao luxo de mover o centro da função da janela para o início ou fim do indicador. Então, com base na mesma função, nós podemos obter um indicador de tendência, suavização ou contratendência. Essa solução, embora implicitamente, é usada em indicadores convencionais: por exemplo, LWMA é a metade de uma janela triangular e a EMA é uma janela de Laplace truncada.

    Seja iPeriod o período do nosso indicador futuro. Então, o centro do indicador pode assumir valores de 1 a iPeriod com um passo igual a 0.5. Em outras palavras, o iCenter pode assumir os valores 1, 1.5, 2, ... iPeriod.

       int period=MathMax(2,iPeriod),     //check indicator length for min. acceptable value
           step=(int)MathRound(2*iCenter);//number of steps to the center of the indicator by 0.5
    
       double center=0.5*step;      //indicator center
       if(center<1 || center>period)//check if the center has a valid value
          center=0.5*(period+1);
    
    

    Agora nós só temos que determinar o tamanho da janela e encontrar o seu deslocamento. Este deslocamento nos permite igualar o centro do indicador e o centro da função da janela.

       int width=(int)(2*center),//window function width
           shift=1;              //offset to match the centers of the indicator and the window
    
       if(2*center<=period)//if the center is shifted to the beginning of the indicator
         {
          width=2*period-(int)(2*center)+2;
          shift=period-(int)(2*center)+2;
         }
    

    Vamos nos restringir a uma janela de quinta ordem. Então nós precisamos configurar até cinco razões C1 - C5. Quaisquer números podem ser usados como razões. Nesse caso, a condição deve necessariamente ser atendida - cada próxima razão deve ser menor que a anterior. Em outras palavras, C1 > C2 > C3 > C4 > C5. O cumprimento desta condição é necessário para o correto cálculo do valor de normalização.

    Se todas as proporções da função da janela forem iguais a zero, nós obtemos uma janela retangular (SMA). Algumas outras opções estão listadas abaixo (proporções com valores zero omitidos).

    Janela de Hann: C1 = 1.

    Janela da queda linear da razão: C1 = 5, C2 = 4, C3 = 3, C4 = 2, C5 = 1.

    Janela de Fibo: C1 = 8, C2 = 5, C3 = 3, C4 = 2, C5 = 1.

    Nós podemos obter as funções de janela com valores parcialmente negativos no caso de alguns valores da razão. Isso faz com que pareçam uma janela horizontal padrão: C1 = 3, C2 = 2.

    Funções da janela para usuários avançados

    Nós podemos usar um polinômio adaptativo generalizado para construir as funções da janela. Sua equação fica assim:

    Uma característica distintiva deste polinômio é que todos os parâmetros são independentes uns dos outros. A única exceção é que o parâmetro C0 não deve ser menor que a soma de todas as outras razões. As razões devem ser pelo menos zero e os expoentes devem ser maiores (se o expoente for zero, então uma janela retangular é obtida, o que pode ser obtido usando a razão C0 de qualquer maneira).

    Usando este polinômio, você pode obter as funções da janela já conhecidas e algo incomum. Por exemplo, com C0 = 1, nós obtemos uma janela retangular (SMA).

    Janela triangular: C0 = 1, C1 = 1, P1 = 1.

    Janela Welch: C0 = 1, C1 = 1, P1 = 2.

    Além disso, você pode obter algo incomum. Janela com números de Fibo e crescimento linear do grau (a relação C0 é deixada livre, então ela assumirá o valor): C1 = 8, P1 = 1, C2 = 5, P2 = 2, C3 = 3, P3 = 3, C4 = 2, P4 = 4, C5 = 1, P5 = 5.


    Regra #2

    Até agora, nós consideramos os indicadores que são colocados no gráfico principal e esquecemos completamente os osciladores. A regra subjacente a todos os osciladores é muito simples: a soma das proporções do oscilador é zero.

    Um oscilador é mais fácil de fazer quando ele é baseado em dois indicadores. Então a equação do oscilador será:

    Nesse caso, os indicadores devem ser diferentes. Por exemplo, é assim que um oscilador baseado em janelas retangulares e triangulares se parece: 1,1,1,1,1 e 1,2,3,2,1.

    Você também pode usar a mesma função de janela, mas com tamanhos diferentes: 1,2,3,2,1 e 1,2,3,4,5,4,3,2,1.

    Também pode ser o mesmo indicador deslocado alguns passos para trás: 5,4,3,2,1 e 0,0,0,5,4,3,2,1 (os zeros na segunda sequência realizam um deslocamento de três passos):

    Os osciladores são frequentemente usados em estratégias de negociação. Por exemplo, todas as estratégias que usam a interseção de dois indicadores como sinais podem ser reduzidas a um oscilador.
    Por exemplo, vamos escrever um EA simples. Vários pares de indicadores servirão como fontes de sinais:

    • duas médias móveis simples;
    • média ponderada linearmente e janela triangular;
    • Indicador da MetaQuotes com ambas as plataformas de negociação (vamos comparar qual delas é mais lucrativa);
    • e claro, o Crazy.

    O EA abrirá posições de compra quando a linha do indicador com um pequeno período cruzar a linha de outro indicador para cima. As posições de venda serão abertas no cruzamento para baixo. A abertura de uma posição em uma direção leva ao fechamento de posições na direção oposta. Essas condições parecerão uma mudança no sinal do oscilador com base nos indicadores correspondentes. 

    Parâmetros para o teste: EURUSD H1, 01.01.2021 - 31.12.2021.
    Os resultados do teste são exibidos na tabela. No caso do Crazy, eu fiz 5 testes considerando as suas funcionalidades.

    TypeInd Lucro Líquido Total
    Lucro bruto
    Perda Bruta
    Total de Negociações
    SMA -112.15
    338.69
    -450.84
    340
    TMA 4.64
    422.06
    -417.42
    372
    MT4 -39.43
    402.26
    -441.69
    444
    MT5 -45.27
    395.20
    -440.47
    438
    Crazy 1 -82.13
    432.68
    -514.81
    640
    Crazy 2 -91.15 469.24   -560.39 662
    Crazy 3  -57.01 454.13   -511.14 612
    Crazy 4  -39.16 487.40 -526.56  673
    Crazy 5 -21.45 471.97 -493.42 666

    Como podemos ver, nenhuma das opções apresentou resultados impressionantes. Embora o Crazy fosse relativamente bom. A diferença entre o melhor e o pior negócio é 4. Este indicador é realmente louco.

    Vamos ver se nós podemos melhorar a nossa estratégia. Vejamos o gráfico - aqui está um exemplo de duas interseções, quando formalmente a linha vermelha cruzava a azul na mesma direção.

    Mas o comportamento da linha azul parece diferente. Vamos adicionar dois osciladores adicionais ao principal, que rastrearão as mudanças nos valores dos próprios indicadores. Em seguida, o EA poderá classificar algumas entradas. Vamos ver que resultado essa complicação pode render.

    TypeInd Lucro Líquido Total
    Lucro bruto
    Perda Bruta
    Total de Negociações
    SMA 45.64
    325.11
    -279.47
    138
    TMA 156.03
    466.26
    -310.23
    306
    MT4 -133.56
    296.25
    -429.81
    212
    MT5 -192.40
    273.05
    -465.45
    203
    Crazy 1 114.30
    564.00
    -449.70
    409
    Crazy 2 -93.57 421.01    -514.58 413
    Crazy 3  -31.83 445.27    -477.10 446
    Crazy 4  3.87 451.39 -447.52  431
    Crazy 5 -8.04 458.58 -466.62 409

    Como nós podemos ver, a adição de novos osciladores teve um efeito positivo em alguns casos. Em outros, o resultado piorou. Talvez seja necessário levar em conta não apenas os parâmetros qualitativos, mas também os quantitativos para tais estratégias. De qualquer forma, estratégias desse tipo requerem um estudo mais aprofundado.

    Conclusão

    Como você pode ver, desenvolver um indicador técnico pode ser uma experiência emocionante. Os anexos:

    1. Base Indicator — um modelo que permite construir indicadores com base em suas razões.
    2. OEIS — um indicador baseado nas mais belas sequências. Todas as sequências têm restrições de período.
    3. Crazy — um indicador que usa razões aleatórias.
    4. Arithmetic Geometric Filter — um indicador baseado em progressões aritméticas e geométricas.
    5. Window Functions for Dummies — um script que permite calcular uma função da janela baseada em um polinômio do cosseno. O script salva as proporções obtidas em um arquivo de texto na pasta Files.
    6. Window Functions for Advanced — um script que calcula as razões dos indicadores usando um polinômio adaptativo generalizado. O resultado do cálculo também é salvo em um arquivo.
    7. Basic Oscillator — template para um oscilador baseado em dois indicadores.
    8. EA Indicator — um EA que abre as posições usando os osciladores. O parâmetro Control determina o número de osciladores a serem analisados.


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

    Como desenvolver um sistema de negociação baseado no indicador VIDYA Como desenvolver um sistema de negociação baseado no indicador VIDYA
    Bem-vindo a um novo artigo da nossa série sobre como desenvolver um sistema de negociação pelos indicadores técnicos mais populares, neste artigo aprenderemos sobre uma nova ferramenta técnica e aprenderemos como desenvolver um sistema de negociação pelo Variable Index Dynamic Average (VIDYA).
    Ciência de Dados e Aprendizado de Máquina — Redes Neurais (Parte 02): Arquitetura das Redes Neurais Feed Forward Ciência de Dados e Aprendizado de Máquina — Redes Neurais (Parte 02): Arquitetura das Redes Neurais Feed Forward
    Há detalhes a serem abordadas na rede neural feed-forward antes de finalizarmos este assunto, a arquitetura é uma delas. Vamos ver como nós podemos construir e desenvolver uma rede neural flexível para as nossas entradas, o número de camadas ocultas e os nós para cada rede.
    Algoritmos de otimização populacional Algoritmos de otimização populacional
    Este é um artigo introdutório sobre a classificação do algoritmo de otimização (OA). O artigo tenta criar um banco de teste (um conjunto de funções), que deve ser usado para comparar os OAs e, talvez, identificar o algoritmo mais universal de todos os que são amplamente conhecidos.
    A matemática do mercado: lucro, prejuízo e custos A matemática do mercado: lucro, prejuízo e custos
    Neste artigo, eu mostrarei como calcular o lucro ou prejuízo total de qualquer negociação, incluindo comissão e swap. Eu fornecerei o modelo matemático mais preciso e o usarei para escrever o código e compará-lo com o padrão. Além disso, eu também tentarei entrar na função principal da MQL5 para calcular o lucro e chegar ao fundo de todos os valores necessários da especificação.