Alerta e comentários para indicadores externos
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_TIME1 | 0 | datetime | Recebe/define a primeira coordenada de tempo |
OBJPROP_PRICE1 | 1 | duplo | Recebe/define a primeira coordenada de preço |
OBJPROP_TIME2 | 2 | datetime | Recebe/define a segunda coordenada de tempo |
OBJPROP_PRICE2 | 3 | duplo | Recebe/define a segunda coordenada de preço |
OBJPROP_TIME3 | 4 | datetime | Recebe/define a terceira coordenada de tempo |
OBJPROP_PRICE3 | 5 | duplo | Recebe/define a terceira coordenada de preço |
OBJPROP_COLOR | 6 | cor | Recebe/define a cor de um objeto |
OBJPROP_STYLE | 7 | int | Recebe/define a estilo de linha de um objeto |
OBJPROP_WIDTH | 8 | int | Recebe/define a largura de linha de um objeto |
OBJPROP_BACK | 9 | bool | Recebe/define a bandeira de representação de antecedente de um objeto |
OBJPROP_RAY | 10 | bool | Recebe/define a bandeira de propriedades de raio para objetos do tipo OBJ_TREND e similares |
OBJPROP_ELLIPSE | 11 | bool | Recebe/define a bandeira de exibição de elipse completa para OBJ_FIBOARC |
OBJPROP_SCALE | 12 | duplo | Recebe/define o valor de uma escala de objeto |
OBJPROP_ANGLE | 13 | duplo | Recebe/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_TIMEFRAMES | 15 | int | Recebe/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_DEVIATION | 16 | duplo | Recebe/define o valor de desvio para OBJ_STDDEVCHANNEL |
OBJPROP_FONTSIZE | 100 | int | Recebe/define o tamanho de fonte para OBJ_TEXT e OBJ_LABEL |
OBJPROP_CORNER | 101 | int | Recebe/define o número de ângulo de vinculação para OBJ_LABEL. Consegue valores de 0 a 3 |
OBJPROP_XDISTANCE | 102 | int | Recebe/define a distância da coordenada X em pixels com relação ao ângulo de vinculação para OBJ_LABEL |
OBJPROP_YDISTANCE | 103 | int | Recebe/define a distância da coordenada Y em pixels com relação ao ângulo de vinculação para OBJ_LABEL |
OBJPROP_FIBOLEVELS | 200 | int | Recebe/define o número de níveis do objeto Fibonacci. Pode ser de 1 a 32 |
OBJPROP_LEVELCOLOR | 201 | cor | Recebe/define a cor da linha do nível do objeto |
OBJPROP_LEVELSTYLE | 202 | int | Recebe/define o estilo da linha do nível do objeto |
OBJPROP_LEVELWIDTH | 203 | int | Recebe/define a largura da linha do nível do objeto |
OBJPROP_FIRSTLEVEL+n | 210+n | int | Recebe/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
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso