- Mensajes de logging (registro)
- Alertas
- Visualización de mensajes en la ventana de gráficos
- Cuadro de diálogo de mensajes
- Alertas sonoras
Visualización de mensajes en la ventana de gráficos
Como hemos visto en las secciones anteriores, MQL5 permite enviar mensajes al registro o a la ventana de alertas. El primer método es principalmente para información técnica y no puede garantizar que el usuario vea el mensaje (porque la ventana de registro puede estar oculta). Al mismo tiempo, el segundo método puede parecer demasiado intrusivo si se utiliza para mostrar estados de programas que cambian con frecuencia. Una opción intermedia ofrece la función Comment.
void Comment(argument, ...)
La función muestra un mensaje compuesto por todos los argumentos pasados en la esquina superior izquierda del gráfico. El mensaje permanece allí hasta que este u otro programa lo elimina o lo sustituye por otro.
La ventana sólo puede contener un comentario: en cada llamada de Comment, el contenido antiguo (si existe) se sustituye por el nuevo.
Para borrar un comentario, basta con llamar a la función con una cadena vacía: Comment("").
El número de parámetros no debe ser superior a 64. Sólo se admiten argumentos de tipo integrado. Los conceptos de formación de la cadena resultante a partir de los valores pasados son similares a los descritos para la función Print.
La longitud total del mensaje mostrado está limitada a 2045 caracteres. Si se supera el límite, se cortará el final de la línea.
El contenido actual de un comentario es una de las propiedades de cadena del gráfico, que puede encontrarse llamando a la función ChartGetString(NULL, CHART_COMMENT). Hablaremos de ésta y otras propiedades de los gráficos (no sólo de los de cadenas) en un capítulo independiente.
Al igual que en las funciones Print, PrintFormat y Alert, los argumentos de cadena pueden contener un carácter de nueva línea ('\n' o '\r\n'), que hará que el mensaje se divida en el número apropiado de cadenas. Para Comment esta es la única manera de mostrar un mensaje multilínea. Si puede llamarlas varias veces para obtener el mismo efecto utilizando las funciones print y signal, con Comment no podrá hacerlo, ya que cada llamada sustituirá la cadena antigua por la nueva.
Un ejemplo de trabajo de la función Comment se muestra en la imagen de la ventana con el script de bienvenida del primer capítulo, en la sección Salida de datos.
Además, desarrollaremos una clase y funciones simplificadas para mostrar comentarios multilínea basados en un búfer circular de un tamaño determinado. El script de prueba (OutputComment.mq5) y el archivo de encabezado con el código de la clase (Comments.mqh) están incluidos en el libro.
class Comments
|
El trabajo principal se realiza mediante el método add.
void Comments::add(const string line)
|
Si es necesario, el comentario y el búfer de texto pueden borrarse mediante el método clear, o llamando a add(NULL).
void Comments::clear()
|
Dada una clase de este tipo, se puede definir un objeto con la capacidad de búfer y la dirección de salida requeridas y, a continuación, utilizar sus métodos.
Comments c(30/*capacity*/, true/*order*/);
|
No obstante, para simplificar la generación de comentarios al estilo funcional habitual, por analogía con la función Comment, se implementan un par de funciones de ayuda.
void MultiComment(const string line = NULL)
|
Sólo se diferencian en la dirección de la salida del búfer. MultiComment muestra las filas en orden cronológico inverso, es decir, las más recientes en la parte superior, como en un tablón de anuncios. Esta función se recomienda para una visualización episódica de información de duración indefinida con preservación de la historia. ChronoComment muestra las filas en orden de avance, es decir, las nuevas se añaden al final. Esta función se recomienda para la salida por lotes de mensajes multilínea.
Por defecto, el número de líneas del búfer es N_LINES (10). Si define esta macro con un valor diferente antes de incluir el archivo de encabezado, se redimensionará.
El script de prueba contiene un bucle en el que se generan mensajes periódicamente.
void OnStart()
|
Cada diez iteraciones se borra el comentario. En cada tercera iteración se crea un mensaje a partir de dos líneas (para el resto, a partir de una). Un retardo de 1 segundo permite ver la dinámica en acción.
He aquí un ejemplo de la ventana mientras se ejecuta el script (en modo «nuevos mensajes en la parte superior»).
Comentarios de varias líneas en el gráfico
La visualización de información multilínea en un comentario tiene unas posibilidades bastante limitadas. Si necesita organizar la salida de datos por columnas, resaltar con colores o fuentes diferentes, reaccionar a los clics del ratón o ubicaciones arbitrarias en el gráfico, debe utilizar objetos gráficos.