English Русский 中文 Español Deutsch 日本語
Alertas sonoros em indicadores

Alertas sonoros em indicadores

MetaTrader 4Negociação | 18 fevereiro 2016, 16:02
12 893 0
Andrey Khatimlianskii
Andrey Khatimlianskii

Introdução

Embora a negociação automatizada esteja se tornando cada vez mais populares, muitos traders ainda praticam negociações manuais. Em situações nas quais um expert advisor demora alguns milissegundos para avaliar a situação de mercado atual, um humano irá gastar muito mais tempo, força e - o que é o mais importante - atenção.


Como há alguns anos, muitos traders utilizam um ou mais indicadores técnicos. Algumas estratégias consideram os valores de indicadores em relação a vários períodos de tempo simultaneamente.


Então, como é possível "captar" um sinal importante? Há diversas opções:

  • escrever um expert advisor que analisaria o mercado e alertaria sobre eventos importantes;
  • sentar em frente ao monitor e, alternando entre dezenas de gráficos, tentar analisar todas as informações contidas neles;
  • adicionar um sistema de alerta em todos os indicadores usados.

A primeira opção é, na minha opinião, a melhor. Mas ela exige habilidades de programação ou dinheiro para pagar pela sua execução. A segunda maneira consome muito tempo, é cansativa e ineficiente. A terceira opção é uma mistura entre as duas últimas. É preciso muito menos habilidades e tempo para implementá-la, mas ela pode realmente melhorar a situação do usuário que realiza as transações manualmente.

O artigo tratará da implementação da terceira opção. Depois de tê-lo lido, todos os traders serão capazes de adicionar alertas convencionais em seus indicadores.



Tipos de alertas

Existem várias maneiras de se interpretar indicadores. As pessoas podem entender de formas diferentes até mesmo o significado dos indicadores do terminal do cliente do MetaTrader 4, sem falar nos vários indicadores personalizados...


Alguém compra quando a linha principal do MACD toca a linha de sinal, outro trader espera até que ela se tenha uma intersecção com a linha zero, e alguém abre uma posição longa quando o MACD é inferior a 0 e começa a subir. Eu não me considero capaz de contar todas as possíveis variações de interpretação, então vou apenas descrever os princípios de como um bloco de alerta pode ser adicionado a um indicador. Então você será capaz de adicionar qualquer tipo de alerta a praticamente todos os indicadores, de acordo com o seu gosto.


Os alertas mais possíveis estão listados abaixo:

  • intersecção de duas linhas de um indicador (como no exemplo a seguir: a linha principal e a linha de sinal do MACD);
  • intersecção da linha indicadora e um certo nível (por exemplo, a linha principal do MACD e a linha zero, estocástica e níveis 70 e 30, CCI e níveis de -100 e 100);
  • movimento inverso do indicador (por exemplo, AC e AO, MA normal);
  • locais alterados em direção ao preço (Parabolic SAR);
  • seta exibida acima ou abaixo do valor de preço (fractais).

Provavelmente existem outras interpretações sobre as quais estou esquecendo ou que sequer conheço, então descreverei as cinco listadas acima.



Modos de alerta

O MetaTrader 4 e o MQL4 permitem a implementação de diversos modos de alerta visual e sonoro:

  • uma tela de mensagem comum (função "Comment", "comentar");
  • um registro no log (função "Print", "imprimir");
  • uma janela de mensagem mais um som (função "Alert", "alerta");
  • um som especial, um arquivo a ser selecionado e executado (função "PlaySound", "tocar som").

Além disso, há funções para enviar um arquivo ao servidor FTP (função "SendFTP()", "enviar FTP"), exibir uma caixa de mensagem/diálogo ("MessageBox()", "caixa de mensagens"), e enviar correio ("SendMail()", "enviar correio"). A função SendFTP() raramente será usada por um usuário comum, a função MessageBox() não é adequada para uso em um indicador, pois ela para a sua operação até que a caixa de mensagens seja fechada, a função SendMail(), embora seja adequada para o envio de SMS, é bastante "perigosa" no uso: após desenhar alguns indicadores do gráfico, vocês irão criar para si mesmos um fluxo de mensagens infinito e descontrolado. A função pode ser usada, mas seria melhor usá-la a partir de um EA, por exemplo, enviando a mensagem quando um alerta ocorre em vários indicadores simultaneamente, e prestando muita atenção nele.


Neste artigo, nós vamos considerar somente os modos sonoros e visuais de alerta no terminal do cliente MetaTrader 4.

Um dos mais convenientes e simples de todos é a função Alert que contém tanto texto quanto som. Além disso, o terminal armazena o histórico de alertas, então é possível ver qual sinal chegou uma hora atrás.

Mas as pessoas tem gostos diferentes, como se sabe. Então eu farei um tipo de preparação para todos os métodos mencionados acima (exceto para SendFTP, MessageBox e SendMail), e você poderá escolher a que lhe for mais adequada.



Filtro de frequência de alerta

Caso você já tenha usado alertas em indicadores, você certamente teve que lidar com a sua sobre-frequência, especialmente em períodos de tempo relativamente curtos. Há algumas maneiras de resolver este problema:

  • Definir os alertas em barras já formadas. Esta solução seria a mais adequada.
  • Alternar alertas: venda depois da compra e vice-versa (também seria uma solução bastante lógica, que poderia ser usada em conjunto com outras).
  • Fazer uma pausa entre os alertas (não é uma boa ideia).
  • Fazer somente um alerta por linha (esta limitação é uma limitação bastante afetada).
Utilizar ou não alertas de uma barra zero, ainda não formada, é uma opção pessoal. Eu, por exemplo, acredito que este é um erro. Mas há indicadores que precisam de respostas instantâneas: uma barra é demais para eles. Então nós vamos permitir aos usuários fazerem sua escolha. A presença de vários alertas para compra não faria sentido, então nós vamos alternar todos os alertas. Creio que não vamos introduzir nenhuma pausa artificial. Caso elas sejam realmente necessárias, este fato será observado nos comentários deste artigo.

Portanto, vamos iniciar a realização.

Alerta um - Intersecção de duas linhas de um indicador

Vamos começar com o MACD que foi fornecido nos exemplos acima.


Nossa tarefa principal é tentar detectar em quais matrizes as linhas do indicador estão armazenadas. Para isso, vamos observar o código:

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Silver
#property  indicator_color2  Red
#property  indicator_width1  2
//---- indicator parameters
extern int FastEMA = 12;
extern int SlowEMA = 26;
extern int SignalSMA = 9;
//---- indicator buffers
double MacdBuffer[];
double SignalBuffer[];

Por favor, observe o comentário dos "buffers de indicador", estamos procurando por ele. Tais matrizes geralmente tem nomes intuitivamente compreensíveis (MacdBuffer é o buffer de valor da linha principal do MACD, SignalBuffer é o buffer da linha de sinal) e estão sempre localizados no exterior das funções init, deinit, start.

Caso existam várias matrizes e for difícil ver quais delas são necessárias, observe a função init - todas as matrizes exibidas no gráfico são ancoradas a um certo número através do uso da função SetIndexBuffer:

int init()
  {
//---- drawing settings
   SetIndexStyle(0, DRAW_HISTOGRAM);
   SetIndexStyle(1, DRAW_LINE);
   SetIndexDrawBegin(1, SignalSMA);
   IndicatorDigits(Digits + 1);
//---- indicator buffers mapping
   SetIndexBuffer(0, MacdBuffer);
   SetIndexBuffer(1, SignalBuffer);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("sMACD(" + FastEMA + "," + SlowEMA + "," + SignalSMA + ")");
   SetIndexLabel(0, "sMACD");
   SetIndexLabel(1, "sSignal");
//---- initialization done
   return(0);
  }

Esta é a sequência (de 0 a 7), na qual os valores da linha do indicador são mostrados na DataWindow (janela de informação). Os nomes mostrados ali são dados pela função SetIndexLabel - este é o terceiro método de identificação.


Quando nós sabemos onde a informação necessária está armazenada, podemos iniciar a realização do bloco de alerta. Para isso, vamos até o final da função start - exatamente acima do retorno do operador anterior:


   for(i = 0; i < limit; i++)
       SignalBuffer[i] = iMAOnArray(MacdBuffer, Bars,S ignalSMA, 0, MODE_SMA, i);
//---- done
 
// we will add our code here
 
   return(0);
  }
//+------------------------------------------------------------------+

O bloco de alerta nunca deverá ser adicionado ao ciclo de cálculo do indicador: isto retardaria a execução e não causaria nenhum efeito positivo.

Então, vamos começar a escrever a nossa "composição":

    //---- Static variables where the last bar time
    //---- and the last alert direction are stored
    static int PrevSignal = 0, PrevTime = 0;
 
    //---- If the bar selected to be analyzed is not a zero bar, 
    //     there is no sense to check the alert
    //---- several times. If no new bar starts to be formed, quit.
    if(SIGNAL_BAR > 0 && Time[0] <= PrevTime ) 
        return(0);
    //---- Mark that this bar was checked
    PrevTime = Time[0];

Sempre que a função start for executada, o nosso código também será executado. Variáveis normais são "zeroizadas" depois de cada execução da função. Então nós declaramos duas variáveis estáticas para armazenar o alerta mais recente e o número calculado da barra.
Em seguida, ocorre uma verificação simples: nós verificamos se uma nova barra começou (funciona apenas caso SIGNAL_BAR for superior a 0).

Por sinal, nós declaramos a própria variável SIGNAL_BAR anteriormente, antes da função init:

double     SignalBuffer[];
 
//---- Bar number the alert to be searched by
#define SIGNAL_BAR 1
 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {

Por favor, observe a diretiva #define (definir): o compilador simplesmente vai substituir a variável SIGNAL_BAR com o valor fornecido (1) em todo o código.

Abaixo temos o próprio código de alerta:

    //---- If the preceding alert was SELL or this is the first launch (PrevSignal=0)
    if(PrevSignal <= 0)
      {
        //---- Check whether the lines have met in the preceding bar:
        if(MacdBuffer[SIGNAL_BAR] - SignalBuffer[SIGNAL_BAR] > 0 && 
           SignalBuffer[SIGNAL_BAR+1] - MacdBuffer[SIGNAL_BAR+1] >= 0)
          {
            //---- If yes, mark that the last alert was BUY
            PrevSignal = 1;
            //---- and display information:
            Alert("sMACD (", Symbol(), ", ", Period(), ")  -  BUY!!!");
//            Print("sMACD (", Symbol(), ", ", Period(), ")  -  BUY!!!");
//            Comment("sMACD (", Symbol(), ", ", Period(), ")  -  BUY!!!");
//            PlaySound("Alert.wav");
          }
      }

Ele também é bastante simples. Caso o alerta anterior tenha sido SELL (venda), verifique a intersecção de linhas:
caso o valor da linha principal do MACD na barra #1 exceda aquele da linha de sinal na barra #1
E
o valor de linha de sinal na barra #2 exceda aquele da linha MACD na barra #2,
então
as linhas se encontraram.

Registre o fato de que o último alerta foi BUY (comprar) e exiba a mensagem informativa. Observe as três linhas comentadas: estas são mais três variações de alertas. Você pode retirar o comentário ou deletar qualquer uma delas ou todas. Eu configurei Alert por padrão por ser a mais conveniente.
Na função PlaySound, pode-se especificar qual arquivo wave deve ser executado. O arquivo deve estar localizado no diretório MetaTrader 4\sounds\ e ter extensão wav. Por exemplo, um som especial pode ser designado para o alerta BUY, outro para o alerta SELL, ou pode haver sons diferentes para indicadores diferentes, etc.

O alerta SELL é absolutamente igual:


    //---- Completely the same for the SELL alert
    if(PrevSignal >= 0)
      {
        if(SignalBuffer[SIGNAL_BAR] - MacdBuffer[SIGNAL_BAR] > 0 && 
           MacdBuffer[SIGNAL_BAR+1] - SignalBuffer[SIGNAL_BAR+1] >= 0)
          {
            PrevSignal = -1;
            Alert("sMACD (", Symbol(), ", ", Period(), ")  -  SELL!!!");
//            Print("sMACD (", Symbol(), ", ", Period(), ")  -  SELL!!!");
//            Comment("sMACD (", Symbol(), ", ", Period(), ")  -  SELL!!!");
//            PlaySound("Alert.wav");
          }
      }


Outros alertas

Agora que nós conhecemos o código do indicador, será muito mais fácil escrever os blocos de alerta. Somente a "fórmula" será aletrada, o resto do código será simplesmente copiado e colado.

O alerta que sinaliza o toque de um certo nível é muito similar ao das intersecções de linhas. Eu o adicionei ao estocástico, mas você pode criar um sinal similar para qualquer um de seus indicadores:

    if(PrevSignal <= 0)
      {
        if(MainBuffer[SIGNAL_BAR] - 30.0 > 0 && 
           30.0 - MainBuffer[SIGNAL_BAR+1] >= 0)
          {
            PrevSignal = 1;
            Alert("sStochastic (", Symbol(), ", ", Period(), ")  -  BUY!!!");
          }
      }
    if(PrevSignal >= 0)
      {
        if(70.0 - MainBuffer[SIGNAL_BAR] > 0 && 
           MainBuffer[SIGNAL_BAR+1] - 70.0 >= 0)
          {
            PrevSignal = -1;
            Alert("sStochastic (", Symbol(), ", ", Period(), ")  -  SELL!!!");
          }
      }

Como você pode ver, se a linha %K (MainBuffer) encontrar o nível 30 de baixo para cima, o indicador irá dizer "compre", mas ele dirá "venda" se o nível 70 for atingido de cima pra baixo.

O terceiro tipo de alerta é o alerta que informa sobre a alteração na direção do movimento. Nós iremos considerá-lo em relação ao exemplo do AC. Observe que cinco buffers são usados neste indicador:


//---- indicator buffers
double     ExtBuffer0[];
double     ExtBuffer1[];
double     ExtBuffer2[];
double     ExtBuffer3[];
double     ExtBuffer4[];

ExtBuffer3 e ExtBuffer4 são usados para cálculos intermediários, ExtBuffer0 sempre armazena o valor do indicador, ExtBuffer2 e ExtBuffer3 "colorem" as colunas com 2 cores. Já que precisamos de apenas um valor de indicador, usaremos o ExtBuffer0:

    if(PrevSignal <= 0)
      {
        if(ExtBuffer0[SIGNAL_BAR] - ExtBuffer0[SIGNAL_BAR+1] > 0 &&
           ExtBuffer0[SIGNAL_BAR+2] - ExtBuffer0[SIGNAL_BAR+1] > 0)
          {
            PrevSignal = 1;
            Alert("sAC (", Symbol(), ", ", Period(), ")  -  BUY!!!");
          }
      }
    if(PrevSignal >= 0)
      {
        if(ExtBuffer0[SIGNAL_BAR+1] - ExtBuffer0[SIGNAL_BAR] > 0 &&
           ExtBuffer0[SIGNAL_BAR+1] - ExtBuffer0[SIGNAL_BAR+2] > 0)
          {
            PrevSignal = -1;
            Alert("sAC (", Symbol(), ", ", Period(), ")  -  SELL!!!");
          }
      }

Caso o valor do indicador estivesse caindo e depois começasse a crescer, nós daríamos o alerta BUY. E, no caso contrário, o alerta SELL.

O quarto tipo de alerta, que informa sobre alterações na localização em relação ao preço, é bastante raro.
Mas ele surge às vezes, por exemplo, em "Parabolic". Escreveremos a "fórmula" usando-o como exemplo:
    if(PrevSignal <= 0)
      {
        if(Close[SIGNAL_BAR] - SarBuffer[SIGNAL_BAR] > 0)
          {
            PrevSignal = 1;
            Alert("sParabolic Sub (", Symbol(), ", ", Period(), ")  -  BUY!!!");
          }
      }
    if(PrevSignal >= 0)
      {
        if(SarBuffer[SIGNAL_BAR] - Close[SIGNAL_BAR] > 0)
          {
            PrevSignal = -1;
            Alert("sParabolic Sub(", Symbol(), ", ", Period(), ")  -  SELL!!!");
          }
      }

É tudo muito simples: nós iremos comparar o valor do indicador ao preço de fechamento da barra. Observe que, caso o SIGNAL_BAR seja definido como 0, cada toque de preço da "Parabolic" será acompanhado de um alerta.

O último alerta informa sobre o surgimento de uma seta no gráfico. Ela aparece muito raramente em indicadores padrão, mas É muito popular em "indicadores de pivô" personalizados. Eu irei considerar este tipo de alerta usando o indicador "Fractals" (o seu código fonte escrito no MQL4 pode ser encontrado na base de códigos: Fractals).


Esses indicadores têm uma característica comum: eles não são iguais 0 (ou EMPTY_VALUE) naqueles lugares onde são desenhados em um gráfico. Em todos os outros bars seus buffers estão vazios. Isso significa que , você só precisa comparar o valor de buffer para zero, a fim de determinar o sinal:

    if(PrevSignal <= 0 )
      {
        if(ExtDownFractalsBuffer[SIGNAL_BAR] > 0)
          {
            PrevSignal = 1;
            Alert("sFractals (", Symbol(), ", ", Period(), ")  -  BUY!!!");
          }
      }
    if(PrevSignal >= 0)
      {
        if(ExtUpFractalsBuffer[SIGNAL_BAR] > 0)
          {
            PrevSignal = -1;
            Alert("sFractals (", Symbol(), ", ", Period(), ")  -  SELL!!!");
          }
      }

Mas, se você anexar um indicador com um código do tipo ao gráfico, você nunca irá receber nenhum alerta. Os fractais possuem uma característica especial: eles usam 2 barras futuras para análises, então as setas aparecem somente na barra#2 (a terceira barra começando com a barra zero). Então, para que os alertas comecem a funcionar é necessário definir SIGNAL_BAR como 2:


//---- Bar number to search an alert by
#define SIGNAL_BAR 2

Apenas isso, e os alertas começarão a funcionar!



Conclusão

O artigo fornece uma descrição de vários métodos usados para adicionar aletras sonoros em indicadores. Termos como método de interpretação de alerta (tipo de alerta), modo de alerta e filtro de frequência de alerta são definidos.

Os seguintes tipos de alerta são definidos e realizados:

  • intersecção de duas linhas de um indicador
  • intersecção de uma linha indicadora e um certo nível;
  • movimento inverso do indicador;
  • locais alterados em direção ao preço;
  • aparecimento de seta acima ou abaixo do valor de preço.
As seguintes funções são selecionadas com relação a alertas:
  • Comment() - exibir uma mensagem comum;
  • Print() - exibir uma mensagem no log;
  • Alert() - exibir a mensagem em uma janela especial e um alerta de som;
  • PlaySound() - executar qualquer arquivo wav.
Para reduzir a frequência de alertas:
  • use barras já formadas ao determinar um alerta;
  • todos os alertas se alternam - somente comprar depois de vender, e vice-versa.

Eu usei cinco indicadores que correspondem com cinco tipos de alertas para estudar os seus blocos de alerta. Você pode fazer o download dos indicadores resultantes, eles estão anexados ao artigo.

Eu espero você tenha compreendido que não há nada de complicado na adição de blocos de alerta a indicadores: todos são capazes de fazê-lo


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

Arquivos anexados |
sAccelerator.mq4 (4.38 KB)
sFractals.mq4 (7.4 KB)
sMACD.mq4 (4.25 KB)
sParabolic_Sub.mq4 (8.46 KB)
sStochastic.mq4 (5.22 KB)
Funcionamento do MetaTrader 4 na presença de anti-vírus e firewalls Funcionamento do MetaTrader 4 na presença de anti-vírus e firewalls
A maioria dos traders utiliza programas especiais para proteger os seus PCs. Infelizmente, estes programas não somente protegem os computadores contra invasões, vírus e trojans, mas também consomem uma quantidade significativa de recursos. Isto tem a ver com o tráfego da rede, antes de tudo, que é completamente controlado por vários anti-vírus e firewalls inteligentes. O motivo da escrita deste artigo foram as reclamações dos traders com relação ao funcionamento lento do terminal de cliente do MetaTrader 4 na preseça do firewall "Outpost". Nós decidimos realizar a nossa própria pesquisa usando o Kaspersky Antivirus 6.0 e o Outpost Firewall Pro 4.0.
Como desenvolver uma estratégia de negociação lucrativa Como desenvolver uma estratégia de negociação lucrativa
Este artigo fornece uma resposta à seguinte questão: "É possível formular uma estratégia de negociação automatizada baseada em dados do histórico com redes neurais?".
Algoritmos de média eficiente com lag mínimo: Uso em indicadores Algoritmos de média eficiente com lag mínimo: Uso em indicadores
O artigo descreve funções personalizadas de alta qualidade de cálculo da média desenvolvidas pelo autor: JJMASeries(), JurXSeries(), JLiteSeries(), ParMASeries(), LRMASeries(), T3Series(). O artigo também trata da aplicação das funções acima em indicadores. O autor apresenta uma rica biblioteca de indicadores com base no uso dessas funções.
O que é um martingale? O que é um martingale?
Uma breve descrição das várias ilusões que surgem quando as pessoas realizam negociações usando estratégias de aposta martingale ou utilizam mal o surgimento de picos e outras abordagens.