English Русский 中文 Español Deutsch 日本語
Alerta e comentários para indicadores externos

Alerta e comentários para indicadores externos

MetaTrader 4Exemplos | 8 fevereiro 2016, 14:23
1 377 0
Vladimir
Vladimir

Introdução

A prática mostra que os desenvolvedores de indicadores nem sempre incluem a possibilidade de exibir alertas ou comentário em um código de indicador o que resulta em pedidos para adicionar a possibilidade de mostrar os sinais em um indicador.

As possibilidades de MQL4 para mostrar as informações de indicadores

As possibilidades da linguagem de programação MQL4 não inclui o uso estendido de buffers de indicador, por exemplo estendê-los adicionando a exibição de comentários ou alertas, que podem ser uma vantagem simplificando a criação do código de um programa. Por outro lado, o MQL4 permite a leitura do local de qualquer objeto e a obtenção de suas características completas.

Neste artigo, eu gostaria de mostrar o método de obtenção de dados em um sinal de um indicador anexado a um gráfico e mostrar seus comentários, alertas ou sua criação de uma variável global para o uso adicional para fins informacionais, por exemplo, para passá-los para um Expert Advisor.

Todas as marcas desenhadas em um gráfico usam códigos Wingdings e de seta. É por isso que não é difícil conseguir informações sobre uma marca desenhada em um gráfico. A propósito, se o autor de um indicador inclui uma boa descrição de informações do objeto OBJ_ARROW, um usuário pode identificar facilmente um sinal. Um exemplo é a descrição de marcas dada por criadores dos clássicos candlesticks japoneses. No desempenho padrão do seu indicador, um usuário precisa apenas colocar o cursor do mouse sobre a marca para receber uma janela pop-up de ajuda com um texto correspondente.



Exibição padrão de um sinal.


Em MQL4, é possível usar opções integradas para ter formas mais informativas de apresentação de dados.

Entre os comandos de linguagem da função

double ObjectGet (string name, int prop_id)

retorna o valor de uma propriedade de objeto especificado. Para obter dados de um erro, chame a função GetLastError().
Consulte também ObjectSet().

Parâmetros:
name - nome do objeto.
prop_id - identificador das propriedades do objeto. Pode ser qualquer valor da lista de propriedades de objeto.

Os identificados de propriedades de objeto são usados em funções ObjectGet() e ObjectSet(). Podem ser qualquer um dos valores abaixo:

Constante Valor Tipo Descrição
OBJPROP_TIME10datetimeRecebe/define a primeira coordenada de tempo
OBJPROP_PRICE11duploRecebe/define a primeira coordenada de preço
OBJPROP_TIME22datetimeRecebe/define a segunda coordenada de tempo
OBJPROP_PRICE23duploRecebe/define a segunda coordenada de preço
OBJPROP_TIME34datetimeRecebe/define a terceira coordenada de tempo
OBJPROP_PRICE35duploRecebe/define a terceira coordenada de preço
OBJPROP_COLOR6corRecebe/define a cor de um objeto
OBJPROP_STYLE7intRecebe/define a estilo de linha de um objeto
OBJPROP_WIDTH8intRecebe/define a largura de linha de um objeto
OBJPROP_BACK9boolRecebe/define a bandeira de representação de antecedente de um objeto
OBJPROP_RAY10boolRecebe/define a bandeira de propriedades de raio para objetos do tipo OBJ_TREND e similares
OBJPROP_ELLIPSE11boolRecebe/define a bandeira de exibição de elipse completa para OBJ_FIBOARC
OBJPROP_SCALE12duploRecebe/define o valor de uma escala de objeto
OBJPROP_ANGLE13duploRecebe/define o valor do ângulo em graus para OBJ_TRENDBYANGLE

OBJPROP_ARROWCODE

14

int

Recebe/define o código de seta de OBJ_ARROW. Pode ser um dos símbolos wingdings ou um dos códigos de seta predefinidos

OBJPROP_TIMEFRAMES15intRecebe/define a representação de objeto em vários períodos. Pode ser uma das constantes de visibilidade de objeto ou uma combinação de várias delas
OBJPROP_DEVIATION16duploRecebe/define o valor de desvio para OBJ_STDDEVCHANNEL
OBJPROP_FONTSIZE100intRecebe/define o tamanho de fonte para OBJ_TEXT e OBJ_LABEL
OBJPROP_CORNER101intRecebe/define o número de ângulo de vinculação para OBJ_LABEL. Consegue valores de 0 a 3
OBJPROP_XDISTANCE102intRecebe/define a distância da coordenada X em pixels com relação ao ângulo de vinculação para OBJ_LABEL
OBJPROP_YDISTANCE103intRecebe/define a distância da coordenada Y em pixels com relação ao ângulo de vinculação para OBJ_LABEL
OBJPROP_FIBOLEVELS200intRecebe/define o número de níveis do objeto Fibonacci. Pode ser de 1 a 32
OBJPROP_LEVELCOLOR201corRecebe/define a cor da linha do nível do objeto
OBJPROP_LEVELSTYLE202intRecebe/define o estilo da linha do nível do objeto
OBJPROP_LEVELWIDTH203intRecebe/define a largura da linha do nível do objeto
OBJPROP_FIRSTLEVEL+n210+nintRecebe/define o número de nível do objeto, em que n é o índice de nível instalado/recebido. Pode ser de 0 a 31

É por isso que vamos usar o parâmetro de uso OBJPROP_ARROWCODE para encontrar um objeto necessário e recebermos a lista de todos os objetos. Depois disso, vamos selecionar os objetos necessários na série e mostrar as informações nelas no formulário exigido.

Em seguida, vamos criar um código para receber as informações sobre nomes de candlesticks para o indicador "japão". Obteremos o seguinte código:

int    obj_total=ObjectsTotal(); // Define the total number of objects on a chart
  for(int i=0;i<obj_total;i++) // Loop of going through all objects with the purpose of finding necessary ones
    {
            if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE) // reading the code

Primeiro, devemos definir como vamos lidar com Wingdings e configurar correspondentemente os parâmetros no código do programa. Neste exemplo, vamos tratar da parte da tabela de Wingdings que começa em 100.

if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE)>100&&
                     ObjectGet(ObjectName(i),OBJPROP_TIME1)>Time[ExtBars])

A variável ExtBars é usada para definir o número das últimas barras para encontrar o desenho do objeto no gráfico.

Agora, vamos mostrar Alertas e (ou) Comentários.

       if (ExtAlert==true){
                        Alert(Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                              TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                              TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                              ObjectName(i));}
       if (ExtComment==true){
                        Comment("\n","\n","\n",
                              Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                               TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                                TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                                ObjectName(i));}

Na linha do comentário

("\n","\n","\n",

é usado para mostrar as informações na terceira linha de uma tela.

Se necessário, é possível incluir o envio de informações para variáveis globais para usá-las em um Expert Advisor. Dessa forma, eliminando a quebra de direitos autorais dos autores de indicador, temos a oportunidade de usar informações em alertas para nossos próprios objetivos e não precisamos pedir aos autores para modificar seus códigos.

Usando a abordagem descrita, conseguimos o seguinte resultado.


Resultado de operação do indicador mostrando informações externas.


De forma análoga, o código funciona com o indicador ExCandles2. Esse é o segundo indicado publicado na base MQL4; ele foi testado junto com o código publicado.

Conclusão

Aqui está o código fonte do indicador para mostrar informações sobre a aparição de sinais de indicadores:

//+------------------------------------------------------------------+
//|                                                  AlertSignal.mq4 |
//|                                  Copyright © 2009, WWW.FIBOOK.RU |
//|                                                 http://fibook.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, FIBOOK.RU"
#property link      "http://fibook.ru"

#property indicator_chart_window
extern int ExtBars=10;        // Number of last bars for calculation
extern int ExtArrow=100;      // Code number in the "wingdings" table for the count start
extern bool ExtAlert=true;    // Switch of Alerts displaying
extern bool ExtComment=true;  // Switch of Comments displaying
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   if (per == Time[0]) return; // Correct once per a period
      per = Time[0];

   int cod=0;
//----

int    obj_total=ObjectsTotal();
  for(int i=0;i<obj_total;i++)
    {
            if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE)>ExtArrow&&
                     ObjectGet(ObjectName(i),OBJPROP_TIME1)>Time[ExtBars])
                {
                  if (ExtAlert==true){
                        Alert(Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                              TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                              TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                              ObjectName(i));}
                  if (ExtComment==true){
                        Comment("\n","\n","\n",
                              Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                               TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                                TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                                ObjectName(i));}
                }
     }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

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

Arquivos anexados |
AlertSignal.mq4 (6.31 KB)
Kit do trader: Indicadores de decoração Kit do trader: Indicadores de decoração
Neste artigo, você encontrará tarefas principais ao decorar indicadores, suas soluções e automatização.
Interação entre o MеtaTrader 4 e a máquina MATLAB (Máquina virtual MATLAB) Interação entre o MеtaTrader 4 e a máquina MATLAB (Máquina virtual MATLAB)
O artigo contém considerações sobre a criação da biblioteca DLL - empacotador que permitirá a interação do pacote matemático da área de trabalho MetaTrader 4 e do MATLAB. Ele descreve as "armadilhas" e formas de superá-las. O artigo destina-se a programadores de C/C++ preparados que usem o compilador Borland C++ Builder 6.
Sobreposição e interferência de valores mobiliários financeiros Sobreposição e interferência de valores mobiliários financeiros
Quanto mais fatores influenciarem o comportamento de um par de moedas, mais difícil será avaliar seu comportamento e criar previsões futuras. Assim, se conseguirmos extrair componentes de um par de moeda, valores de uma moeda nacional que mudam com o tempo, poderemos delimitar consideravelmente a liberdade do movimento da moeda nacional em comparação ao par de moeda com esta moeda, assim como os fatores que influenciam seu comportamento. Como resultado, aumentaríamos a precisão da estimativa do seu comportamento e de previsões futuras. Como podemos fazer isso?
Canais. Modelos avançados. Wolfe Waves Canais. Modelos avançados. Wolfe Waves
O artigo descreve as regras para marcar padrões de Wolfe Waves. Você encontrará mais detalhes sobre a construção e as regras de marcação precisa, o que ajuda a encontrar as formações corretas de ondas de forma rápida e correta.