Discussão do artigo "Guia prático do MQL5: Controles de sub-janela indicadora - botões" - página 4

 
DC2008:

E o fato de que "as funções de botão são colocadas na função OnInit" é muito engraçado!

No entanto, talvez você não entenda do que estamos falando? Se você pressionar um botão, alguma função de usuário deverá ser acionada para executar alguma microtarefa.

 
DC2008:

Muito bem, vamos rir um pouco. O artigo foi escrito por você, "ninguém puxou sua língua".

Portanto, a explicação na forma de citações para o inexplicável é, no mínimo, desrespeitosa com seus leitores. As perguntas devem ser respondidas com exemplos e links para fontes primárias.

Um código confuso e sobrecarregado com funções desnecessárias apenas engana os "iniciantes".

E o fato de que "as funções de botão são colocadas na função OnInit" é muito engraçado!

Ninguém o puxou pela língua. Você vai me dar provas? Ou melhor, uma refutação de minha declaração? Para sua informação, nem tudo está descrito no Manual ainda. Quero dizer, o trabalho no manual está em andamento, adições e correções estão sendo feitas. Você deve sempre verificar tudo por conta própria.

Acredite em mim, o código de seu artigo é muito mais "confuso" para iniciantes e não só, o que pode ser visto na discussão de seu artigo.

Entretanto, talvez você não entenda do que estamos falando? Se você clicar em um botão, alguma função de usuário deverá ser acionada para executar alguma microtarefa.

Sim, eu interpretei literalmente. Faça suas perguntas com mais precisão. Mas prevejo que minha resposta será ridicularizada por você, já que você parece ter essa função hoje.

Nesse caso, a "microtarefa" era alterar a cor do botão. Propositadamente, não adicionei nenhum recurso extra para não ter nada supérfluo. Apenas para evitar sobrecarregar o código.

Na verdade, o tópico do artigo não se limita apenas aos botões. A maior parte é sobre eventos de gráficos. Há poucos exemplos desse tipo, então decidi escrever um.

 

Caro autor do artigo, você o escreveu não para mim, mas para iniciantes. Na verdade, não estou interessado em suas soluções, mas estamos falando de pessoas que estão começando a conhecer o idioma. De que "outros programas" estamos falando? E como a função OnDeinit de um programa pode afetar as funções de outros programas?

Estamos discutindo um artigo e por que você está tão indignado?

Tente responder às perguntas não para mim, mas para os iniciantes, para que eles entendam por que e como.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
DC2008:

Caro autor do artigo, você não o escreveu para mim, mas para iniciantes.

Exatamente isso.

Na verdade, não estou interessado em suas soluções, mas estamos falando de pessoas que estão começando a conhecer o idioma.

Mas você faz perguntas.

De que "outros programas" estamos falando?

Dos mesmos programas para os quais você forneceu links anteriormente. E você tenta refutar minha declaração por meio de dicas sem fornecer uma prova.

E como a função OnDeinit de um programa pode afetar as funções de outros programas?

Ela afeta. Eu escrevi sobre isso. O editor que publicou o artigo confirmou isso. Você também pode conferir e ver por si mesmo.

Estamos discutindo o artigo e do que você se ressente tanto?

Nada. Estou aguardando uma refutação à minha afirmação. )

Tente responder às perguntas não para mim, mas para os novatos, para que eles entendam por que e como.

Até o momento, não houve perguntas de novatos. E não pode haver perguntas. Tudo é muito claro e cada linha de código é comentada em detalhes.

 

Nós bloqueamos isso primeiro:

void OnTimer()
  {
//--- Verificar se o rastreamento de eventos do mouse está ativado
   //CheckChartEventMouseMove();

  }

Ou seja, agora não rastreamos os eventos do mouse, certo?

Vamos executar seu código no gráfico:

agora executamos "outro programa", que seja seu código novamente:

Acho que algo deu errado... Ou é isso que devemos fazer?

agora excluímos um dos indicadores e, de acordo com o autor do código, perdemos o "rastreamento do mouse", mas isso não acontece:

 
C-4:

Se você não se qualifica, então não sei quem se qualifica? Danald Knuth? Bill Gates?

Eu estava apenas tentando receber um elogio. Funcionou).

C-4:
Entendo. Mas o que não está claro é que os principais produtos do mercado criados por você não lhe pertencem. Isso não é uma pena?

1. Ainda não é noite)

2. Meu artesanato também está constantemente no topo, embora não esteja em nenhuma comparação com o painel.

3. O sucesso do painel se deve em grande parte aos esforços do autor da ideia, portanto, é incorreto dizer que ele é meu produto.

4. Eu não trabalhei de graça)

 
DC2008:

...

Agora excluímos um dos indicadores e, de acordo com o autor do código, perdemos o "rastreamento do mouse", mas isso não acontece:

Agora, verifique se o evento OnDeinit() é acionado nos indicadores. Esse é o ponto interessante que mencionei anteriormente. :) Ou seja, no OnDeinit(), no exemplo do artigo, o evento de rastreamento de movimento está desativado. Desde algumas compilações, parece que OnDeinit() parou de funcionar nos indicadores, o que é um bug e devemos informar os desenvolvedores.

Além disso, para ter certeza de que minha declaração está correta, precisamos criar um Expert Advisor em branco (a função OnDeinit() funciona em Expert Advisors), no qual basta adicionar esta linha de código (destacada):

//+------------------------------------------------------------------+
//|TESTE.mq5 |
//| Copyright 2013, MetaQuotes Software Corp.
//| http://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Função de desinicialização do especialista
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Desativar o rastreamento de eventos do mouse
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
//| OnTick|
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+

//---

E agora, se você remover o Expert Advisor quando o indicador do artigo estiver no gráfico, o rastreamento do evento de movimento também será desativado no indicador.

Sobre isso:

Alguma coisa deve ter dado errado? Ou é assim que ele foi projetado?

Isso é conhecido. Ele não foi projetado dessa forma, apenas não foi levado em consideração neste artigo. O artigo, como sempre, é um exemplo simples, não uma solução pronta para todos os casos. )

 
Sergey, não faça alarde. Por exemplo, não estava claro para mim por que usar um cronômetro. Mas, em alguns instantes, encontrei uma explicação no artigo e entendi tudo imediatamente. Não verifiquei essa declaração na prática, mas confio no autor, sabendo que ele escreveu o artigo por um motivo e que, se o cronômetro foi introduzido, havia motivos para isso.
 
void OnDeinit(const int reason)
  {
//--- Desativar o rastreamento de eventos do mouse
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }

Em geral, esse código parece ser muito problemático. Não há motivo real para desativar o rastreamento do movimento do mouse ao desativar o Expert Advisor/indicador. Se quiser se preocupar tanto, restaure o estado que existia antes de o Expert Advisor ser iniciado:

bool mouseStatus;
void OnInit()
  {
  mouseStatus = ChartGetInteger(0,CHART_EVENT_MOUSE_MOVE);
  }

void OnDeinit(const int reason)
  {
   //--- Desativar o rastreamento de eventos do mouse
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,mauseStatus);
  }
 
C-4:

Em geral, esse código parece ser bastante problemático. Não há motivo real para desativar o rastreamento do movimento do mouse ao desativar o Expert Advisor/indicador.

Não, você está errado. Há motivos reais para desativar o rastreamento do mouse. E vou provar isso agora. )

Por exemplo, você tem dois programas em execução em um gráfico. O Expert Advisor, no qual é necessário rastrear o evento de movimento do mouse. E um indicador no qual você não precisa rastrear o evento de movimento do mouse, mas precisa rastrear alguns outros eventos do gráfico.

Agora, execute esse código do Expert Advisor:

#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Ativar o rastreamento de eventos do mouse
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Função de desinicialização do especialista
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Desativar o rastreamento de eventos do mouse
   //ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
//| OnTick|
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+
//| Função ChartEvent|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Rastreamento do movimento do mouse e pressionamento do botão esquerdo do mouse
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static int count=1;
      Print("CHARTEVENT_MOUSE_MOVE; EXPERT; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

Nele, durante a inicialização, na função OnInit(), o rastreamento do evento de movimento do mouse está ativado. Mas a linha na função OnDeinit(), onde esse rastreamento deve ser desativado, foi intencionalmente comentada.

Carregue também o indicador no gráfico. Aqui está seu código:

#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função de desinicialização do especialista
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizado
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- valor de retorno de prev_calculated para a próxima chamada
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Função ChartEvent|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Rastreamento do movimento do mouse e pressionamento do botão esquerdo do mouse
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static long count=1;
      Print("CHARTEVENT_MOUSE_MOVE; INDICATOR; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

Tanto o primeiro quanto o segundo programa imprimem uma mensagem no registro de que o evento foi recebido. Agora, remova o Expert Advisor do gráfico. Vamos supor que você tenha feito alguns cálculos com a ajuda dele e que não precise mais dele. Após sua remoção, como o evento de rastreamento do movimento do mouse não foi desativado, o indicador continua a receber esse evento. E você não precisa dele.

Você concorda agora? )