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

 
tol64:

Não necessariamente a cada segundo, há uma alternativa em outro evento (já discutido). Por favor, me dê um exemplo de como eu fiz isso aqui. ) A partir da condição de que o Expert Advisor precisa desse evento, mas o indicador não. Dessa forma, ficará mais claro.

P.S. Correção. Eu cometi um erro. )) Sua variante não está mais correta. Ela não se encaixa de forma alguma. Portanto, é melhor dar um exemplo com base na condição acima.

Se o indicador não precisar desse evento, ele simplesmente não o processará. Além disso, o Expert Advisor não deve desativar eventos de que não precisa. Ele pode ativá-los, mas não desativá-los. Porque não é da conta dele quais eventos passam por sua janela e quem pode precisar deles.

 
C-4:

Se o indicador não precisar desse evento, ele simplesmente não o processará. Além disso, o Expert Advisor não deve desativar eventos de que não precisa. Ele pode ativá-los, mas não desativá-los. Porque não é da conta dele quais eventos passam por sua janela e quem pode precisar deles.

A questão é que esse evento pode não ser processado (simplesmente esqueça-o). Mas isso não significa que a fila de eventos na função OnChartEvent() não será preenchida com coisas que não são necessárias em um determinado momento.

E isso significa milhares de eventos desnecessários por minuto. E se houver vários programas no gráfico? Não é um argumento?

Muito menos recursos serão desperdiçados se você verificar a cada segundo se um evento está ativado e ativá-lo se ele não estiver ativado no momento, mas for necessário. Também não é um argumento? Então faça do seu jeito.

Não tenho mais argumentos. ) Manterei minha opinião, pois não ouvi nada que me faça mudar de ideia.

Bom. Então, tenho uma pergunta para aqueles que acham que esse evento não precisa ser desativado pelo programa que o ativou.

Por quê? )

Isso é:

1. Por que deixar algo que não é necessário (milhares de eventos por minuto)?

2. (em outra formulação) Por que gastar mais recursos quando se pode gastar menos?

Opções como "se um evento não for necessário, simplesmente não o processe" não me agradam nem um pouco. Você não pode desativar um, não pode desativar o outro, e o que você ganhará com isso?

 

Caro autor do artigo, é inútil não explicar as contradições internas de seus produtos, que você está tentando combater e ensinar aos "iniciantes".

Portanto, o autor mostrou os momentos escorregadios que podem atrapalhar o funcionamento correto de seu indicador. Ótimo, agora está claro para o "iniciante" que:

  1. Ao excluir qualquer programa do gráfico, você deve pensar em não prejudicar outros programas.
  2. Em nenhum caso você deve colocar programas conflitantes em um gráfico, mas é melhor colocá-los em outras janelas do gráfico do símbolo em questão. Se alguém não souber disso, então um símbolo pode abrir um número suficiente de janelas de gráfico.
  3. Cada gráfico tem suas próprias propriedades inerentes. Portanto, ao alterá-las, você pode atrapalhar o trabalho correto de outros programas. Isso não deve ser feito em hipótese alguma!
  4. É preciso ser "à prova de idiotas". Ou seja, se um vírus na forma de um indicador ou outro programa tentar alterar as propriedades de um gráfico que você usa em seus programas, é preciso verificar. E se isso acontecer regularmente, remova o vírus!
  5. Os erros em programas para mercados financeiros geralmente levam a grandes perdas. Lembre-se disso!
 
tol64:

1. Por que deixar o que não é necessário (milhares de eventos por minuto)?

2. (em outra formulação) Por que gastar mais recursos quando se pode gastar menos?

Opções como "se um evento não for necessário, simplesmente não o processe" não me agradam nem um pouco. Você não pode desativar um, não pode desativar o outro e o que você ganha com isso?

Você terá um código totalmente controlado.

Você enfatiza o desempenho, mas será que ele cai tanto com esse evento ativado? Para responder a essa pergunta, escrevi especialmente um Expert Advisor simples para testar esse evento. Depois de testar diferentes combinações, obtive a seguinte tabela:

Modo
% de carga da CPU
EVENT_MOVE_MOUSE está ativado, o processamento desse evento no Expert Advisor está ativado.9%
EVENT_MOVE_MOUSE está ativado, o processamento desse evento no Expert Advisor está desativado.
6%
EVENT_MOVE_MOUSE está desativado, o processamento desse evento no Expert Advisor está desativado.
5-6%
O Expert Advisor está desativado. O gráfico está fechado. Basta mover o mouse sobre a janela do MetaTrader.
5-6%

Como você pode ver, a carga real aumenta apenas quando ocorre o processamento real desse evento. É digno de nota que, a julgar pela carga da CPU, o MetaTrader rastreia a posição do mouse independentemente de a assinatura desse evento estar ativada ou não. Em geral, verifica-se que é inútil economizar recursos hipotéticos, porque o rastreamento do mouse será realizado em qualquer caso.

Teste o código do Expert Advisor:

//+------------------------------------------------------------------+
//|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 de especialista|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ObjectCreate(0, "Edit", OBJ_EDIT, 0, 0, 0);
   ObjectSetInteger(0, "Edit", OBJPROP_XSIZE, 400);
   /Ativar e desativar o evento conforme acharmos adequado
   ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, false);
   
//---
   return(INIT_SUCCEEDED);
  }
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   //Comente o bloco se não for necessário processar o evento de entrada.
   if(id == CHARTEVENT_MOUSE_MOVE)
   {
      string label = (string)lparam + " " + (string)dparam + " " + sparam;
      //printf(sparam);
      ObjectSetString(0, "Edit", OBJPROP_TEXT, label);
      ChartRedraw(0);
   }
}
Знакомство с MQL5: написание простого советника и индикатора
Знакомство с MQL5: написание простого советника и индикатора
  • 2010.03.16
  • Denis Zyatkevich
  • www.mql5.com
В этой статье проведен краткий обзор языка MQL5, приведен пример написания советника и индикатора. Данная статья ориентирована как на читателей, знакомых с программированием на языке MQL4, так и на тех, кто только начинает знакомство с программированием торговых систем и индикаторов.
 

1. Você deve sempre considerar o caso de um evento ser perdido na pilha. Se algo crítico puder acontecer no caso de um evento ser perdido, isso é muito ruim.

2. Personalizar o gráfico para se adequar a si mesmo é ruim. É quase o mesmo que negociar em uma máquina de negociação automatizada sem um mágico.

 
DC2008:

Caro autor do artigo, é inútil não explicar as contradições internas de seus produtos, que você está tentando combater e ensinar aos "iniciantes".

Portanto, o autor mostrou os momentos escorregadios que podem atrapalhar o funcionamento correto de seu indicador. Ótimo, agora está claro para um "iniciante" que:

...

Você pode criar mais 20 regras para justificar seu senso de autoimportância e, então, com certeza se confundirá e "ajudará" os iniciantes. As contradições e os mal-entendidos, nesse caso, foram observados por você. )

C-4:

Você obterá um código totalmente controlado.

...

Ele será controlado quando você o controlar. Nesse caso, você propõe deixar tudo desmarcado, ou seja, deixar um evento que não é necessário no momento e que pode ser reproduzido com muita frequência. Em exemplos simples, isso pode não ser perceptível. Talvez você veja a necessidade de desativar tudo o que não é necessário em programas mais complexos.

 
TheXpert:

1. Você deve sempre considerar o caso de um evento ser perdido na pilha. Se algo crítico puder acontecer no caso de um evento ser perdido, isso é muito ruim.

...

Como quando a fila de eventos transborda, por exemplo?
 

tol64:

Desculpe-me, por acaso estou distraindo-o de escrever outro tutorial ou receita?

Se não, vamos continuar discutindo seu artigo sobre controle na subjanela do indicador. Então, você oferece uma solução em massa (ou uma ideia) de como criar um menu conveniente em um indicador. Ótimo, o objetivo do artigo é muito válido! Mas como um programador "iniciante" pode usar todo esse arsenal? Onde colocar as funções personalizadas? Demonstre isso com um exemplo. E, ao mesmo tempo, explique o que você precisa corrigir no código para usar, por exemplo, 5 botões? Considere isso como uma pergunta de iniciante.

 
tol64:
Como quando a fila de eventos transborda?
Sim.
 
DC2008:
Você tem certeza de que tudo em seu artigo é perfeito?