Discusión sobre el artículo "MQL5 para principiantes, protección antivandálica de los objetos gráficos"

 

Artículo publicado MQL5 para principiantes, protección antivandálica de los objetos gráficos:

¿Qué haría si de repente se borraran los paneles gráficos de control, o alguien los modificara? En este artículo enseñamos a evitar las situaciones donde el gráfico se puede quedar con objectos sin dueño. Las controlaremos cuando, tras eliminar la aplicación, los objetos se renombran o se borran programáticamente.

Una de las ventajas del lenguaje de programación MQL5 es que las funciones estándar permiten realizar muchas tareas distintas; por otro lado, usted puede alcanzar los objetivos que se plantee con la ayuda del terminal de trading MetaTrader 5.

Este artículo está escrito con un lenguaje sencillo y contiene dos variantes, a modo de ejemplo, que implementan la respuesta del programa al cambio o eliminación de objetos gráficos. Vamos a asegurarnos de que después de eliminar el programa no quedan objetos sin dueño en el gráfico porque si algo o alguien les cambia el nombre, esta situación puede hacer que el programa pierda el control.

Este ejemplo ilustra un panel de control antes y después de cambiar manualmente las propiedades de sus objetos

Fig. 1. Apariencia del panel de control de ejemplo, antes y después de cambiar manualmente las propiedades de sus objetos

Las acciones de respuesta a las interferencias externas del código que describimos en este artículo no son redundantes en aquellos casos donde, por ejemplo, se lanza un programa externo en el gráfico, y, no estando diseñado expresamente para su limpieza, utiliza una función que borra los objetos (ObjectsDeleteAll () o una función que usted mismo puede crear), operando con los parámetros establecidos en el mismo:

  • la eliminación completa de todos los tipos de objetos gráficos en la misma ventana/subventana, creados manualmente o con otros programas;
  • o la eliminación completa del tipo de objeto que también está presente en el panel de control del programa;
  • o la eliminación, por prefijo, que coincide con el prefijo de los objetos del programa.
Estas opciones también son relevantes para el correcto funcionamiento del programa. Proporcionan acciones para la eliminación accidental o intencionada de los objetos del panel de control, así como para los cambios manuales de las propiedades realizados en el código. Este artículo también servirá de ayuda a los programadores que están aprendiendo a manejar los eventos en la función OnChartEvent().

Autor: Dina Paches

 

Muy buen artículo, yo protejo los programas de tal vandalismo de una manera ligeramente diferente ...

Creo todos los objetos necesarios con un prefijo fuera de la visibilidad del gráfico en una función especial como CREATE_OBJECTS(),

luego compruebo el error 4202 ERR_OBJECT_DOES_NOT_EXIST El objeto no existe, y si hay tal error, llamo de nuevo a la función CREATE_OBJECTS().

El resto de las propiedades del objeto se modifican según sea necesario en el gráfico.

 

Bien hecho. El artículo es bueno. Los ejemplos no están mal.

Pero parece que hay una manera simple de comprobar la existencia de un objeto y siempre se puede restaurar si es necesario.

 
Victor Nikolaev:

Pero parece que hay una forma sencilla de comprobar la existencia de un objeto y siempre se puede restaurar si es necesario.

El truco consiste en reducir el número de comprobaciones al mínimo en lugar de realizar comprobaciones sin interrupciones. Para ello están vinculados a un evento específico. Si he entendido bien. Es una lástima que todo esto no está vinculado a la biblioteca estándar
 

Gracias a todos por los comentarios.

Victor Nikolaev:

Bien hecho. El artículo es bueno. Los ejemplos no están mal.

Pero parece que hay una manera simple de comprobar la existencia de un objeto y siempre se puede restaurar si es necesario.

¡Gracias, Victor!

Por si acaso, diré que las variantes dadas no se oponen a las formas habituales habituales (simples o no tan simples).

Es sólo que las formas habituales habituales (simples o no tan simples) no siempre son "oportunas". Sobre todo porque no se han cancelado las mismas "manos traviesas" diversas. Incluyendo, y tal vez en algunos casos la nuestra o la del usuario.

Es decir, si, por ejemplo, los objetos del panel de control del programa se eliminan accidentalmente a través de la" Lista deobjetos " junto con otras selecciones a través de Shift o por un programa de terceros, donde se puede utilizar la función para borrar objetos(ObjectsDeleteAll() o creado de forma independiente), que realiza de acuerdo con los parámetros establecidos en el mismo:
.

  • borrado total de todos los tipos de objetos gráficos en la misma ventana/subventana donde se encuentran los objetos creados manualmente o con ayuda de otros programas;
  • o borrado total de objetos del tipo que también están presentes en el panel de control de su programa;
  • o borrado mediante un prefijo que coincide con el prefijo de los objetos de su programa,

entonces las opciones descritas en este artículo pueden resultar útiles, respondiendo a la situación según se presente. Incluso, en algunos casos, liberándole de algunos "movimientos" propios innecesarios. Estas opciones, creo, se pueden referir a universal y, si es necesario, se pueden combinar con otros "sin dolor y sin conflicto".

De alguna manera.

Es decir, para la "protección" de los objetos del programa, por supuesto, se pueden aplicar diferentes opciones, métodos y sus combinaciones.

Y las que se describen en el artículo no son algunas obligatorias para cada código, sino las que pueden no ser superfluas en algunos casos.

Alexander Puzanov:
El truco consiste en reducir el número de comprobaciones al mínimo en lugar de realizar comprobaciones sin interrupciones. Para ello se atan a un evento concreto. Si he entendido bien.

Sí, gracias, eso es correcto, reducir el número de procesamiento durante los controles es uno de los chips allí.

 

Este artículo está totalmente obsoleto.

1. Definitivamente no es para principiantes

2. No es MQL5 - ¡es MQL4!

3. La forma de codificación es totalmente complicado y - en vista de MQL5 - totalmente equivocado de todos modos.

Si uno piensa que es un problema, que otro EA o indicador podría destruir objetos, esto se puede hacer mucho más eficiente y elegante:

- Definir un objeto MQL para cada objeto gráfico, como ya hace la librería estándar Control. Cada objeto MQL representa un objeto gráfico y contiene todos sus datos - estilo MQL5 normal.

- Empaquetar todos los objetos en un contenedor maestro

- Sólo el contenedor maestro comprueba, si un objeto gráfico ha sido borrado, ya sea de vez en cuando o por el correspondiente chart-event durante OnChartEvent().

- Añada una función miembro .ReCreate() a CWnd, y una función virtual OnRecreate() a todos los objetos que implementen esta funcionalidad.

- Si el contenedor maestro detecta algún tipo de "vandalismo", envía una función .ReCreate() a todos sus objetos hijos.

Listo.

 

Entiendo poco de inglés. No leí la versión de este artículo en inglés.

Perdona, pero... ¿hasleído este artículo en su totalidad?

¿Habla ruso?

Si hablas ruso, entonces tú y yo podemos hablar de forma más constructiva en la discusión en la versión rusa de este artículo.


Doerk Hilger:

Este artículo está totalmente obsoleto.

Se equivoca.

Doerk Hilger:

1. Definitivamente no es para principiantes

¿Por qué piensas así? Dígamelo, por favor, con más detalles.

Doerk Hilger:

2. No es MQL5 - ¡es MQL4!

Usted está equivocado.

Pero los esquemas descritos en este artículo se pueden utilizar no sólo para MQL5, sino también para MQL4.

Doerk Hilger:

3. La forma de codificar es totalmente complicada y - en vista de MQL5 - totalmente errónea de todos modos.

Пожалуйстапрочитайте эту статью "MQL5 для начинающих: Антивандальная защита графических объектов" ещё раз внимательно. И пожалуйста не торопитесь с выводами. Если и после этого ваше мнение не изменится, то напишите более конкретно непонятные для вас моменты.

Por favor, lea este artículo "MQL5 para principiantes:Protección antivandálica de objetos gráficos" de nuevo con atención. Y por favor, no se apresure a sacar conclusiones. Si después de esto no va a cambiar su opinión, escribir más momentos particularmente difíciles para usted.


Doerk Hilger:

Si uno piensa que es un problema, que otro EA o indicador podría destruir los objetos, esto se puede hacer mucho más eficiente y elegante:

- Definir un objeto MQL para cada objeto gráfico, como ya hace la librería estándar Control. Cada objeto MQL representa un objeto gráfico y contiene todos sus datos - estilo MQL5 normal.

- Empaquetar todos los objetos en un contenedor maestro

- Sólo el contenedor maestro comprueba, si un objeto gráfico ha sido borrado, ya sea de vez en cuando o por el correspondiente chart-event durante OnChartEvent().

- Añada una función miembro .ReCreate() a CWnd, y una función virtual OnRecreate() a todos los objetos que implementen esta funcionalidad.

- Si el contenedor maestro detecta algún tipo de "vandalismo", envía una función .ReCreate() a todos sus objetos hijos.

Hecho.

В статье "MQL5 для начинающих: Антивандальная защита графических объектов" рассматриваются схемы только двух вариантов (способов) из множества возможных. Но различных вариантов (способов) конечно может быть много.
Применять или не применять схемы из этой статьи - это зависит только от ваших решений.


Скажутолько, что эти две схемы из статьи "MQL5 для начинающих: Антивандальная защита графических объектов" обладают следующими положительными качествами:

  • экономно используют ресурсы компьютера и торгового терминала;
  • имеютвысокий уровень своевременности срабатывания ( невсе другие обычные привычные способы могутбыть своевременными);
  • могутбыть применены совместно со многими другими вариантами (способами).

Эти схемы из данной статьи сконструированы в процедурном стиле. В том числе, чтобы они были более понятны, наглядны и могли послужить идеями для каких-то других вариантов.

Если вам не нравятся эти схемы или они не подходят вам по каким-то другим причинам, вы конечно можете использовать другие схемы. И, естественно, в том стиле программирования, что для вас привычен.

Применять эти схемы из статьи или не применять - это ваше личное дело и право.


En el artículo"MQL5 para principiantes: Protección antivandálica de objetos gráficos" se consideran sólo dos opciones esquemas (métodos) de muchas posibles. Pero las opciones (metodos) pueden ser muchas.
Usar o no usar los esquemas de este articulo - solo depende de tus decisiones.

Solo puedo decir que estos dos esquemas del articulo"MQL5 para principiantes: Protección antivandálica de objetos gráficos" tienen las siguientes cualidades positivas
  • economizan los recursos del ordenador y del terminal comercial
  • tienen un alto nivel de puntualidad de respuesta (no todas las demás formas habituales pueden ser puntuales);
  • pueden utilizarse conjuntamente con muchas otras formas.

Los esquemas de este artículo se han realizado en un estilo procedimental. En particular, para hacerlos más comprensibles, visibles y que puedan servir como ideas para algunas otras opciones.

Si no te gustan estos esquemas o no se adaptan a ti por alguna otra razón, por supuesto, puedes utilizar otros esquemas. Y, por supuesto, en el estilo de programación que más te guste.

Usar o no usar los esquemas de este artículo - depende de tus decisiones.


Perdón por mi inglés.


P./S.: Пожалуйста прочитайте эту статью ещё раз внимательно. И пожалуйста не торопитесь с выводами. Если у вас затем будут конструктивные вопросы или предложения, то пишите, пожалуйста. Я смогу ответить вам скорее всего только после новогодних каникул. Это через пять дней.

Por favor, vuelva a leer este artículo con atención. Y por favor, no se apresure a sacar conclusiones. Si usted tendrá alguna pregunta y sugerencias específicas, por favor escriba. Puedo responder a usted probablemente sólo después de las vacaciones de Año Nuevo. Es en cinco días.

P./S.: Сегодня у нас праздник Нового года. ¡Поэтому и вас поздравляю с наступающим новым 2016-м годом!

Hoy tenemos las vacaciones de Año Nuevo. ¡ Por lo tanto usted Feliz Año Nuevo 2016 !

 

Al compilar en MetaEditor Versión 5.00 build 1241 los códigos de prueba adjuntos al artículo con los nombres:

  • test_count_click_0.mq5
  • test_count_click_1.mq5
  • test_count_click_2.mq5

Al igual que antes, funcionan correctamente en lo que respecta a las funciones antivandalismo. Sin embargo, al compilar en la nueva build, he encontrado un problema con una función que no pertenece a las medidas antivandálicas del artículo. Hice una petición al Service Desk (#1379624), pero es festivo, así que naturalmente no espero obtener una respuesta o una solución desde allí.

A continuación se muestra la descripción del problema, la forma de su solución y los archivos con la solución del problema, en lugar de adjuntar al artículo:

Pero en primer lugar me gustaría hacer hincapié de nuevo que las funciones relacionadas con el vandalismo trabajado y trabajar correctamente al compilar en la nueva construcción.

La incorrección de los códigos de prueba nombrados se manifiesta en el hecho de que al hacer clic en los objetos del panel de control de estos códigos de prueba, ya no se muestra el número de clics, excepto los primeros. Es decir, no importa cuántos botones se pulsen, los números serán los mismos:

Sin embargo, estos mismos códigos de prueba, compilados en versiones anteriores, siguen funcionando correctamente en la nueva compilación1241 , si no están compilados en ella. Es decir, al hacer clic en los objetos de estos códigos de prueba hay un recuento normal de clics:

Hedescubierto que el problema detectado está relacionado con la aplicación de la función ArrayFill() en el bloque de procesamiento de eventos CHARTEVENT_OBJECT_CLICK en OnChartEvent().

               count=countClick[index]+count;
               int summ=countClick[NUMBER_ALL]+1;
               //---
               ArrayFill(countClick,index,1,count);
               ArrayFill(countClick,NUMBER_ALL,1,summ)

Sin embargo, si se antepone la impresión de datos o ChartRedraw() a esta función, los códigos nombrados del artículo empiezan a funcionar correctamente después de la compilación:

               count=countClick[index]+count;
               int summ=countClick[NUMBER_ALL]+1;
               //---
               //TEST_PRINT_TWO(count,summ);
               ChartRedraw();
               //---
               ArrayFill(countClick,index,1,count);
               ArrayFill(countClick,NUMBER_ALL,1,summ);

En los tres ficheros con correcciones que se adjuntan a continuación, así como en sus versiones del mismo nombre adjuntas al artículo, estas secciones, así como la corrección del problema en los códigos de abajo, son idénticas. Es decir

  • en el fichero test_count_click_0.mq5 - no se aplican las medidas de protección antivandálicas;
  • en el archivo test_count_click_1.mq5 - una variante de "autoborrado" del programa del gráfico en caso de interferencia no autorizada con sus objetos en el gráfico;
  • en el archivo test_count_click_2.mq5 - una variante de "auto-recuperación" de los objetos del programa en caso de su modificación o eliminación no autorizada.

P./S.: Para el correcto funcionamiento de los códigos adjuntos a continuación es necesario tener el archivo objectcreateandset.mqh en la carpeta "Include" , adjunta al artículo, donde se adjuntan los códigos, en base a los cuales he encontrado un funcionamiento incorrecto de la función nombrada. También este archivo se puede descargar de Code Base

Archivos adjuntos:
 
Por cierto, ya que ha pasado, me gustaría añadir para aquellos que están empezando a estudiar el procesamiento de eventos en la función MQL5 OnChartEvent(), que los esquemas de variantes de protección dados en el artículo utilizan los recursos del ordenador y del terminal de trading con moderación. Por lo tanto, si usted lee este artículo, preste atención en los esquemas de ejemplo que allí se dan a los filtros de comprobación que allí se proporcionan para reducir el número de procesamiento.

Por ejemplo, puede ser útil familiarizarse con los filtros de comprobación basados en la función StringFind() en los esquemas de ejemplo del artículo. Porque los filtros con la ayuda de esta función, si es necesario, pueden minimizar significativamente el número de búsquedas de nombres de objetos cuando se reciben notificaciones sobre cualquier evento con objetos en el gráfico en los programas donde se aplican. Es decir, pueden ser útiles, si es necesario, no sólo al construir cualquier variante antivandálica. Y añadiré, por si acaso, que el ámbito de aplicación de los filtros de comprobación basados en esta función puede ampliarse, si es necesario, utilizando su tercer parámetro de entrada.

 
Dina Paches:

Entiendo poco de inglés. No leí la versión de este artículo en inglés.

Perdona, pero... ¿hasleído este artículo en su totalidad?


+1

Muy buena respuesta.

 
Doerk Hilger:

- Definir un objeto MQL para cada objeto gráfico, como ya hace la librería Control estándar. Cada uno de estos objetos MQL representa un objeto gráfico y contiene todos sus datos - al estilo normal de MQL5.

- Empaquetar todos los objetos en un contenedor maestro

- Sólo el contenedor maestro comprueba, si un objeto gráfico ha sido borrado, ya sea de vez en cuando o por el correspondiente chart-event durante OnChartEvent().

- Añada una función miembro .ReCreate() a CWnd, y una función virtual OnRecreate() a todos los objetos que implementen esta funcionalidad.

- Si el contenedor maestro detecta algún tipo de "vandalismo", envía un .ReCreate() a todos sus objetos hijos.

Este artículo ofrece un ejemplo de solución lista para implementar en cualquier código fuente - OOP o procedimental. Entonces, la tarea es: encontrar una corbata que combine con el traje

Su solución: comprar un nuevo traje OOP. Ah, y no te olvides de comprar una corbata para tu nuevo traje.

PS En cuanto a la Librería Estándar: desafortunadamente la Librería de Control es la peor parte de esta librería - demasiados bugs y opciones no realizadas o no accesibles. Como resultado - a veces esta libreria es una fuente de problemas (basura en el grafico), referido en este articulo