Discusión sobre el artículo "Cómo crear un panel informativo para mostrar datos en indicadores y asesores" - página 3

 
Denis Kirichenko #:
Hasta ahora he descubierto que así es como se maneja el evento CHARTEVENT_CHART_CHANGE(9).

Así que es natural - cuando se quita el foco de la ventana del gráfico, sus tamaños se vuelven diferentes.

Este es el proceso:

//--- Si se cambia el horario
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      //--- Obtener el número de la subventana del gráfico (puede cambiar al eliminar la ventana de cualquier indicador)
      this.m_wnd=this.GetSubWindow();
      //--- Obtener las nuevas dimensiones del gráfico
      int w=(int)::ChartGetInteger(this.m_chart_id,CHART_WIDTH_IN_PIXELS,this.m_wnd);
      int h=(int)::ChartGetInteger(this.m_chart_id,CHART_HEIGHT_IN_PIXELS,this.m_wnd);
      //--- Determinar si el tamaño del panel está fuera de la ventana del gráfico
      this.m_higher_wnd=this.HigherWnd();
      this.m_wider_wnd=this.WiderWnd();
      //--- Si la altura del gráfico ha cambiado - ajuste la posición vertical del panel
      if(this.m_chart_h!=h)
        {
         this.m_chart_h=h;
         int y=this.m_y;
         if(this.m_y+this.m_h>h-1)
            y=h-this.m_h-1;
         if(y<1)
            y=1;
         this.Move(this.m_x,y);
        }
      //--- Si la anchura del gráfico ha cambiado - ajuste la posición horizontal del panel
      if(this.m_chart_w!=w)
        {
         this.m_chart_w=w;
         int x=this.m_x;
         if(this.m_x+this.m_w>w-1)
            x=w-this.m_w-1;
         if(x<1)
            x=1;
         this.Move(x,this.m_y);
        }
     }

Debería intentar controlar el foco del gráfico y no reaccionar a los cambios en caso de que la ventana del gráfico esté desenfocada. O algo por el estilo. Desgraciadamente, todavía no puedo ejecutarlo y probarlo para determinar las causas exactas y el método para solucionarlo.

 

He revisado el foro. El problema ya se ha discutido. Por ejemplo. He añadido dicha comprobación al código:

//--- Si se cambia el horario
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      //--- Obtener el número de la subventana del gráfico (puede cambiar al eliminar la ventana de cualquier indicador)
      this.m_wnd=this.GetSubWindow();
      l ong value;
      //--- restablecer el valor de error
      ::ResetLastError();
      //--- obtener el valor de la propiedad
      if(!::ChartGetInteger(m_chart_id, CHART_BRING_TO_TOP, m_wnd, value))
         {
         //--- envía el mensaje de error al registro de "Expertos".
         Print(__FUNCTION__ + ", Error Code = ", ::GetLastError());
         return;
         }
      // si no muestra un gráfico encima de todos los demás - exit
      if(value == 0)
         return;
      //--- Obtener las nuevas dimensiones del gráfico
      int w=(int)::ChartGetInteger(this.m_chart_id,CHART_WIDTH_IN_PIXELS,this.m_wnd);
      int h=(int)::ChartGetInteger(this.m_chart_id,CHART_HEIGHT_IN_PIXELS,this.m_wnd);
      //--- Determinar si el tamaño del panel está fuera de la ventana del gráfico
      this.m_higher_wnd=this.HigherWnd();
      this.m_wider_wnd=this.WiderWnd();
      //--- Si la altura del gráfico ha cambiado - ajuste la posición vertical del panel
      if(this.m_chart_h!=h)
        {
         this.m_chart_h=h;
         int y=this.m_y;
         if(this.m_y+this.m_h>h-1)
            y=h-this.m_h-1;
         if(y<1)
            y=1;
         this.Move(this.m_x,y);
        }
      //--- Si la anchura del gráfico ha cambiado - ajuste la posición horizontal del panel
      if(this.m_chart_w!=w)
        {
         this.m_chart_w=w;
         int x=this.m_x;
         if(this.m_x+this.m_w>w-1)
            x=w-this.m_w-1;
         if(x<1)
            x=1;
         this.Move(x,this.m_y);
        }
     }


El error parece haber desaparecido.


Проблема с CHARTEVENT_CHART_CHANGE - Отлавливаю момент, когда изменяется размер окна графика. При переключении окон происходит событие CHARTEVENT на размер окна предыдущих установок
Проблема с CHARTEVENT_CHART_CHANGE - Отлавливаю момент, когда изменяется размер окна графика. При переключении окон происходит событие CHARTEVENT на размер окна предыдущих установок
  • 2021.12.25
  • satorifx
  • www.mql5.com
чтобы она была в зоне видимости не вылазила за пределы окна графика CHANGE так же срабатывает. 26 11 при переключении окон ресурс не удаляется при переключении окон происходит событие CHARTEVENT CHANGE
 

Otro problema. El despliegue de la ventana del panel no se procesa después de que el indicador haya sido retirado del gráfico, y el panel haya sido minimizado, y luego iniciado de nuevo en el gráfico.




Mañana voy a tratar de averiguar cuál es el error....

 

Artem, otro ejemplo del artículo posterior sobre osciladores también falla al minimizar la ventana y luego borrar el programa del gráfico. No es un indicador, sino un Asesor Experto. Aquí:



 
Denis Kirichenko #:

Otro problema. El despliegue de la ventana del panel no se gestiona después de que el indicador se haya retirado del gráfico, y el panel se haya minimizado y vuelto a lanzar en el gráfico.

Mañana voy a tratar de averiguar cuál es el error....

Aquí puedes comprobar la causa de la desinicialización y no guardar el estado del panel en las variables globales del terminal al quitar un Asesor Experto (o indicador) del gráfico. Esto no es una solución al problema, sino su ocultación. No es bueno, por supuesto. Pero servirá para una solución rápida.

O usted necesita mirar en este comportamiento. Por desgracia, tengo poco tiempo por ahora.

 
Denis Kirichenko #:

He revisado el foro. El problema ya se ha discutido. Por ejemplo. He añadido una comprobación de este tipo en el código:

El error parece haber desaparecido.

Gracias. Añadiré esta clase de panel a mis códigos más adelante. Por cierto, de un artículo a otro, en los que se utilizaba este panel, había todo tipo de mejoras. Creo que este es el último artículo en el que se utilizó el panel. Pero no recuerdo si ya lo he perfeccionado.
He adjuntado el código de la clase panel aquí.

Цветные буферы в мультисимвольных мультипериодных индикаторах
Цветные буферы в мультисимвольных мультипериодных индикаторах
  • www.mql5.com
В статье пересмотрим структуру индикаторного буфера в мультисимвольных мультипериодных индикаторах и организуем вывод на график цветных буферов этих индикаторов.
Archivos adjuntos:
Dashboard.mqh  219 kb
 

Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading

Discusión del artículo "Hacer un panel de información para mostrar datos en indicadores y Asesores Expertos"

Denis Kirichenko, 2024.09.23 22:26

Otro problema. No maneja el despliegue de la ventana del panel, después de que el indicador se eliminó por primera vez desde el gráfico, y el panel se minimizó, y luego se inició de nuevo en el chart....


Sí, en la última versión de Dashboard.mqh no hay tal error. Funciona.

 
Denis Kirichenko #:

Sí, en la última versión de Dashboard.mqh no existe ese error. Funciona.

Muy bien.
 

El nuevo dorsal también tiene un error. Si inicias el panel en un gráfico, y luego juegas con el tamaño de la ventana del gráfico, el panel se pega a la parte inferior cuando se restaura la ventana. Y no quiere salir de ahí ((


 

Artem, tengo una pregunta. En el método void CDashboard::Move(int x, int y) existe tal cosa:

if(!m_higher_wnd)
     {
      if(y + h > m_chart_h - 2)
         y = m_chart_h - h - 2;
      if(y < 1)
         y = 1;
     }
   else
     {
      if(y > 1)
         y = 1;
      if(y < m_chart_h - h - 2)
         y = m_chart_h - h - 2;
     }


En concreto, me interesa este bloque. Es decir, si la altura del panel es menor que la ventana del gráfico, y si su punto Y (esquina superior izquierda) es menor que la diferencia entre la altura de la ventana y la altura del panel, corregida en 2 píxeles, entonces al punto superior del panel se le asignará el valor de esta diferencia. ¿Por qué es así, a qué se debe?

En resumen, es debido al método CDashboard::Move(int x, int y) que se produce el atasco. Cuando se intenta mover el panel después de cambiar el tamaño del gráfico, éste corrige constantemente las coordenadas y no permite mover la ventana del panel libremente...