Discusión sobre el artículo "Interfaces gráficas X: Gestión ampliada de las listas y tablas. Optimización de código (build 7)" - página 3

 

Tol, me doy cuenta de que este no es el tema adecuado, pero desde la última actualización....

En general: me di cuenta hace tiempo, pero estaba esperando a que saliera esta actualización (por si se arreglaba, pero no...).

Si hay una ventana con un gráfico (CStandartChart), y hay una ventana situada encima del subgráfico, entonces, si se pierde la conexión con el servidor, y luego se restablece, el objeto-gráfico queda más alto que las otras ventanas.

Sería necesario redibujar la ventana superior de alguna manera. Está claro que puedes seguir esto en tu CPrograma, pero me parece que la librería debería hacer estas cosas.

(Se ralentiza mucho, pero esto es probablemente debido a la grabación en tiempo real).


 
Artyom Trishkin:

...

Si hay una ventana con un gráfico (CStandartChart), y hay una ventana situada en la parte superior del sub-gráfico, entonces si la conexión con el servidor se pierde y luego se restablece, el objeto gráfico pasa a estar más arriba que las otras ventanas.

Sería necesario redibujar la ventana situada más arriba de alguna manera. Está claro que puedes seguir esto en tu CPrograma, pero me parece que la librería debería hacer estas cosas.

(Se ralentiza mucho, pero eso es probablemente debido a la grabación en tiempo real).

Ok, gracias por el mensaje. Todavía no he probado con desconectar/reconectar. Veré lo que puedo hacer.

¿Por qué van tan mal los frenos? ¿Con qué programa se graba? Es muy lento. Parece como si el procesador estuviera cargado al 100%? He probado a grabar con Fast Stone Capture y a usar activamente la GUI de la aplicación MQL. Todo es normal, nada se ralentiza así.

 
Anatoli Kazharski:

Vale, gracias por el mensaje. Todavía no he probado con desconectar/reconectar. Veré lo que puedo hacer.

¿A qué se debe la ralentización? ¿Con qué programa se está grabando? Es muy lento. Parece como si el procesador estuviera cargado al 100%. He probado a grabar con Fast Stone Capture y a utilizar activamente la GUI de la aplicación MQL. Todo va bien, nada se ralentiza así.

Versión gratuita de oCam. Pero yo, por cierto, sin grabación en tiempo real se ralentiza también. Hay muchos objetos. Y en el temporizador tiene que escanear muchos símbolos para los niveles de cruce de precios, que para cada símbolo - su propia, respectivamente, y la lista de símbolos es dinámico, y también necesita ser monitoreado por los cambios. Una cosa es buena - después de la actualización no tuve que volver a hacerlo como la última vez ;))).
 

Artyom Trishkin:
...

Pero, por cierto, también estoy ralentizando sin grabación en tiempo real.

Hay un montón de objetos.

Y el temporizador tiene que escanear muchos símbolos para los niveles de cruce de precios, que son diferentes para cada símbolo, y la lista de símbolos es dinámica, y también necesita ser monitoreado por los cambios.

...
¿Y con qué frecuencia se hacen estas comprobaciones?
 
Anatoli Kazharski:
¿Con qué frecuencia se realizan estas comprobaciones?

Temporizador:

//+------------------------------------------------------------------+
//| Temporizador|
//+------------------------------------------------------------------+
void CProgram::OnTimerEvent(void)
  {
   CWndEvents::OnTimerEvent();
//---
   static int count=0;
   if(count<500)
     {
      count+=TIMER_STEP_MSC;
      return;
     }
//--- Poner a cero el contador
   count=0;
//--- Capta el cambio en la Vigilancia del Mercado
   if(IsChangeSymbolListInMW()) {
      UpdateAllDataAndTables();
      }
//--- Captar la aparición de nuevas barras
   bool need_update=false;
   for(int i=0; i<ArraySize(m_array_new_bar); i++) {
      if(m_array_new_bar[i].isNewBar()>0) {
         string sy=m_array_new_bar[i].GetSymbol();
         ENUM_TIMEFRAMES timeframe=m_array_new_bar[i].GetPeriod();
         Print("Nuevo Bar".,sy," en ",GetNameTF(timeframe));
         if(timeframe==PERIOD_D1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_d1); j++) delete m_array_symbols_new_sig_d1[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_d1);
            }
         if(timeframe==PERIOD_W1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_w1); j++) delete m_array_symbols_new_sig_w1[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_w1);
            }
         if(timeframe==PERIOD_MN1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_mn); j++) delete m_array_symbols_new_sig_mn[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_mn);
            }
         need_update=true;
         }
      }
   if(need_update) {
      UpdateAllDataAndTables();
      }
//--- Cambio de los textos de valor en la ventana principal
   short row=(short)m_table_base_symbol_list.SelectedItem();
   ChangeTextData(row);

//--- Buscando criterios de notificación D1, W1, MN1
   GetNotify(m_sorted_struct_symbols_d1,m_array_symbols_new_sig_d1,PERIOD_D1);
   GetNotify(m_sorted_struct_symbols_w1,m_array_symbols_new_sig_w1,PERIOD_W1);
   GetNotify(m_sorted_struct_symbols_mn,m_array_symbols_new_sig_mn,PERIOD_MN1);
//--- Redibujar el gráfico
   m_chart.Redraw();
  }
//+------------------------------------------------------------------+
Paso del temporizador (TIMER_STEP_MSC) 16
 
Artyom Trishkin:

Temporizador:

...
paso del temporizador (TIMER_STEP_MSC) 16

¿Es necesario hacer este tipo de comprobación de condiciones exactamente en el temporizador?

Si es en el temporizador, ¿por qué tan a menudo?

Puedes intentar reducir el paso y establecer un intervalo diferente para cada grupo de condiciones. He añadido la clase CTimeCounter para este propósito. Lea el artículo de nuevo para entender cómo usar esto. Sección: Aplicación para el test de ítems

 
Anatoli Kazharski:

¿Es necesario comprobar las condiciones de este tipo en el temporizador?

Si es en el temporizador, ¿por qué tan a menudo?

Puedes intentar reducir el paso y establecer un intervalo diferente para cada grupo de condiciones. Para ello he añadido la clase CTimeCounter. Lea el artículo de nuevo para entender cómo usar esto. Sección: aplicación de prueba de elementos

Sí, ya estoy pensando en esto.

La comprobación de una nueva barra se puede hacer con menos frecuencia, por supuesto - no es crítico. Pero la comprobación de los precios que cruzan los niveles en algunos símbolos (su lista cambia dinámicamente, respectivamente, y las instancias de la clase de trabajo con los ticks son dinámicamente añadidos / eliminados) debe hacerse con la suficiente frecuencia para ser capaz de determinar los hechos de cruces en el tiempo.

Cuando leí que ahora es posible tener un intervalo diferente para diferentes eventos, inmediatamente pensé en tal necesidad.

 
Artyom Trishkin:

... Pero la comprobación de cruce por precios de niveles en algunos símbolos (su lista cambia dinámicamente, respectivamente, y las instancias de la clase de trabajo con ticks se añaden/eliminan dinámicamente) debe hacerse con la suficiente frecuencia para poder determinar los hechos de cruces a tiempo.

Por lo tanto, si se trabaja con ticks, es mejor hacer estas comprobaciones en OnTick(). ¿Por qué se debe cincelar el temporizador cada 16 ms?
 
Anatoli Kazharski:
Así que, si trabajas con ticks, es mejor hacer estas comprobaciones en OnTick(). ¿Por qué hay que cincelar el temporizador cada 16 ms?
Es multidivisa. ¿Qué OnTick()?
 
Artyom Trishkin:
Es multidivisa. ¿Qué OnTick()?

A través de eventos, entonces. Pero no a través de un temporizador con esa frecuencia. En general, los frenos están de tu lado, no del lado de la librería o de la grabación de vídeo. No tengo más preguntas.