Discusión sobre el artículo "Guía práctica de MQL5: Controles de la subventana del indicador: Botones" - página 4

 
DC2008:

Y el hecho de que "las funciones de los botones se colocan en la función OnInit" ¡es muy gracioso!

Sin embargo, ¿quizás no entiendes de lo que estamos hablando? Si pulsas un botón, alguna función de usuario debería dispararse para realizar alguna micro-tarea.

 
DC2008:

Muy bien, vamos a reírnos. El artículo lo escribiste tú, "nadie te tiró de la lengua".

Así que la explicación en forma de citas de lo inexplicable es, como mínimo, una falta de respeto a tus lectores. Las preguntas deben responderse con ejemplos y enlaces a fuentes primarias.

El código confuso y sobrecargado con funciones innecesarias sólo induce a error a los "principiantes".

Y lo de que "las funciones de los botones se colocan en la función OnInit" ¡es muy gracioso!

Nadie te ha tirado de la lengua. ¿Me vas a dar pruebas? ¿O más bien una refutación de mi afirmación? Para tu información, todavía no está todo descrito en el Manual. Quiero decir que se está trabajando en el manual, se están haciendo adiciones y correcciones. Debería comprobarlo todo usted mismo.

Créeme, el código de tu artículo es mucho más "confuso" para los principiantes y no sólo, lo que se puede ver en la discusión de tu artículo.

Sin embargo, tal vez usted no entiende lo que estamos hablando? Si haces click en un botón, alguna función de usuario debería ser disparada para realizar alguna micro-tarea.

Sí, lo he entendido literalmente. Formule sus preguntas con más precisión. Pero preveo que mi respuesta será ridiculizada por ti, ya que parece que hoy en día tienes una función de este tipo.

En este caso la "microtarea" era cambiar el color del botón. A propósito no añadí ninguna función extra para no tener nada superfluo. Sólo para evitar sobrecargar el código.

En realidad, el tema del artículo no se limita sólo a los botones. La mayor parte trata sobre eventos de gráficos. Hay pocos ejemplos de este tipo, así que decidí escribir uno.

 

Estimado autor del artículo, no lo ha escrito para mí, sino para los principiantes. De hecho, no estoy interesado en sus soluciones, pero estamos hablando de aquellos que están empezando a conocer el lenguaje. ¿De qué "otros programas" estamos hablando? ¿Y cómo puede afectar la función OnDeinit de un programa a las funciones de otros programas?

Estamos discutiendo un artículo y ¿por qué te indignas tanto?

Intenta responder a las preguntas no por mí, sino por los principiantes, para que entiendan por qué y cómo.

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

Estimado autor del artículo, no lo ha escrito para mí, sino para los principiantes.

Exactamente.

De hecho, no me interesan sus soluciones, sino que estamos hablando de aquellos que están empezando a conocer el idioma.

Pero haces preguntas.

¿De qué "otros programas" estamos hablando?

De los mismos a los que diste enlaces antes. Y tratas de refutar mi afirmación por alusiones sin dar una prueba.

¿Y cómo puede la función OnDeinit de un programa afectar a las funciones de otros programas?

Afecta. Yo escribí sobre ello. El editor que publicó el artículo lo confirmó. También puedes comprobarlo por ti mismo.

Estamos discutiendo el artículo y ¿qué te molesta tanto?

Nada. Estoy esperando una refutación a mi afirmación. )

Intenta responder a las preguntas no para mí, sino para los recién llegados, para que entiendan por qué y cómo.

Hasta ahora no ha habido preguntas de los recién llegados. Y no puede haber preguntas. Todo está muy claro y cada línea de código está comentada en detalle.

 

Atascamos esto primero:

void OnTimer()
  {
//--- Comprueba si el seguimiento de eventos del ratón está activado
   //CheckChartEventMouseMove();

  }

es decir, ahora no rastreamos los eventos del ratón, ¿verdad?

Ejecuta tu código en el gráfico:

ahora ejecutamos "otro programa", que sea tu código otra vez:

¿Supongo que algo salió mal? ¿O es lo que se supone que debemos hacer?

ahora borramos uno de los indicadores y según el autor del código hemos perdido el "seguimiento del ratón", pero no ocurre:

 
C-4:

Si tú no cumples los requisitos, entonces no sé quién los cumple. ¿Danald Knuth? ¿Bill Gates?

Sólo intentaba conseguir un cumplido. Funcionó).

C-4:
Ya veo. Pero lo que no queda claro es que los productos líderes del Mercado creados por usted no le pertenecen. ¿No es una pena?

1. Todavía no es de noche)

2. Mi artesanía también está constantemente en el top, aunque no está en ninguna comparación con el panel.

3. El éxito del panel se debe en gran parte a los esfuerzos del autor de la idea, por lo que es incorrecto decir que es mi producto.

4. No he trabajado gratis)

 
DC2008:

...

ahora borramos uno de los indicadores y según el autor del código hemos perdido el "seguimiento del ratón", pero esto no ocurre:

Ahora comprueba si se dispara el evento OnDeinit() en los indicadores. Este es el punto interesante que mencioné antes. :) Concretamente en OnDeinit(), en el ejemplo del artículo, se desactiva el evento de seguimiento de movimiento. Desde alguna build parece que OnDeinit() ha dejado de funcionar en los indicadores en absoluto. Esto es un bug y deberíamos informar a los desarrolladores.

Además, para asegurarnos de que mi afirmación es correcta, tenemos que hacer un Asesor Experto en blanco (la función OnDeinit() funciona en los Asesores Expertos), en el que basta con añadir esta línea de código (resaltada):

//+------------------------------------------------------------------+
//|TEST.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"
//+------------------------------------------------------------------+
//| Función de inicialización del indicador personalizada |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Función de desinicialización del experto ||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Desactivar el seguimiento de eventos del ratón
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
//| OnTick|
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+

//---

Y ahora, si quitas el Asesor Experto cuando el indicador del artículo está en el gráfico, el seguimiento del evento de movimiento se desactivará también en el indicador.

Sobre esto

¿algo debe haber salido mal? ¿o es así como está diseñado?

Ya se sabe. No está diseñado así, simplemente no se tiene en cuenta en este artículo. El artículo, como siempre, es un simple ejemplo, no una solución preparada para todos los casos. )

 
Sergey, no armes jaleo. Por ejemplo, no me quedaba claro por qué utilizar un temporizador. Pero en un momento encontré una explicación en el artículo e inmediatamente lo entendí todo. No he comprobado esta afirmación en la práctica, pero en esto confío en el autor, consciente de que lo escribió por una razón, y si se introdujo el temporizador, había razones para ello.
 
void OnDeinit(const int reason)
  {
//--- Desactivar el seguimiento de eventos del ratón
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }

En general, este código parece ser muy problemático. No hay ninguna razón real para desactivar el seguimiento del movimiento del ratón al desactivar el Asesor Experto/indicador. Si quiere molestarse tanto, debería restaurar el estado que existía antes de que se iniciara el Asesor Experto:

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

void OnDeinit(const int reason)
  {
   //--- Desactivar el seguimiento de eventos del ratón
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,mauseStatus);
  }
 
C-4:

En general, este código parece ser bastante problemático. No hay ninguna razón real para desactivar el seguimiento del movimiento del ratón al desactivar el Asesor Experto/indicador.

No, usted está equivocado. Hay razones reales para desactivar el seguimiento del ratón. Y voy a demostrarlo ahora. )

Por ejemplo, usted tiene dos programas que se ejecutan en un gráfico. El Asesor Experto, en el que usted necesita para realizar un seguimiento del evento de movimiento del ratón. Y un indicador en el que no es necesario realizar un seguimiento del movimiento del ratón, pero es necesario realizar un seguimiento de algunos otros eventos del gráfico.

Ahora ejecute este código del Asesor Experto:

#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Función de inicialización del indicador personalizada |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Activar el seguimiento de eventos del ratón
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Función de desinicialización del experto ||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Desactivar el seguimiento de eventos del ratón
   //ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
//| OnTick|
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+
//| Función ChartEvent|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Seguimiento del movimiento del ratón y de la pulsación del botón izquierdo del ratón
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static int count=1;
      Print("CHARTEVENT_MOUSE_MOVE; EXPERT; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

En él, durante la inicialización, en la función OnInit(), se habilita el seguimiento del evento de movimiento del ratón. Pero la línea en la función OnDeinit(), donde este seguimiento debe ser desactivado, está intencionalmente comentada.

Cargue también el indicador en el gráfico. Aquí está su código:

#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Función de inicialización del indicador personalizada |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Función de desinicialización del experto ||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizada |
//+------------------------------------------------------------------+
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_calculado para la siguiente llamada
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Función ChartEvent|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Seguimiento del movimiento del ratón y de la pulsación del botón izquierdo del ratón
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static long count=1;
      Print("CHARTEVENT_MOUSE_MOVE; INDICATOR; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

Tanto el primer programa como el segundo imprimen un mensaje en el registro de recepción del evento. Ahora quite el Asesor Experto del gráfico. Supongamos que ha realizado algunos cálculos con su ayuda y ya no lo necesita. Después de quitarlo, como no se ha desactivado el evento de seguimiento del movimiento del ratón, el indicador sigue recibiendo este evento. Y no lo necesitas.

¿Estás de acuerdo? )