Discusión sobre el artículo "Gestión de errores y logging en MQL5"

 

Artículo publicado Gestión de errores y logging en MQL5:

Este artículo se centra en aspectos generales sobre el manejo de los errores de software. Explicaremos qué significa el término logging mediante algunos ejemplos implementados con herramientas de MQL5.

Durante la ejecución de los programas pueden suceder errores de vez en cuando. Gestionarlos bien contribuye a mejorar la calidad del programa, y también hace que se pueda mantener más fácilmente. Este artículo explica varios métodos de gestión de errores, proporciona algunas recomendaciones, y enseña a utilizar la herramienta de logging de MQL5.

El tema de la gestión de los errores es relativamente complicado y controvertido. Hay muchas formas de arreglar los errores, cada una de las cuales tiene sus ventajas y sus inconvenientes. Algunos de estos métodos pueden utilizarse juntos; no hay ninguna fórmula universal, cada tarea requiere una aproximación adecuada.

Logging con herramientas MQL5

Los programas suelen crear archivos de log que facilitan la vida a los programadores. Estos archivos contienen los errores generados para que los programadores puedan buscarlos y sean capaces de evaluar las condiciones del sistema en un momento determinado. Además de todo esto, el logging también sirve para analizar el rendimiento del software (profiling).

Niveles de logging

Los mensajes generados en los archivos de log contienen mucha información y por tanto exigen diferentes niveles de atención. Los niveles de logging se aplican a los mensajes por separado para clasificarlos por niveles críticos; se puede personalizar el nivel de importancia de los mensajes. Normalmente se implementan varios niveles de logging:

  • Debug: mensajes de depuración. Este nivel de registro es para las etapas de desarrollo, depuración y puesta en marcha.
  • Info: mensajes informativos. Estos mensajes informativos registran la actividad del sistema, por ejemplo, el inicio/fin de una operación, la apertura/cierre de una orden, etc. No suelen requerir ninguna interacción pero ayudan a analizar las cadenas de eventos producidos, que derivan en los errores de las operaciones.
  • Warning: mensajes de advertencia. Este nivel describe las situaciones de error que no requieren intervención por parte del usuario. Por ejemplo, si una cantidad determinada es menor que el mínimo, y el programa la corrige automáticamente, esto se puede registrar en el log con el nivel «Warning».
  • Error: mensajes de error que requieren intervención. Este nivel de logging se utiliza típicamente en errores relacionados con el almacenamiento de algún archivo, apertura, modificación, etc. En otras palabras, este nivel incluye aquellos errores que el programa no puede solucionar por sí mismo y, por lo tanto, requieren la intervención de una persona: el usuario o el programador.
  • Fatal: mensajes de error críticos que impiden que el programa pueda continuar operando. Estos mensajes se tienen que tratar instantáneamente. En este nivel suele enviarse alguna notificación vía email, o algún SMS, al usuario o al programador. Pronto le enseñaremos a utilizar las notificaciones PUSH en MQL5.
2015.09.23 09:02:10, USDCAD (D1), INFO: 
2015.09.23 09:02:10, USDCAD (D1), INFO: ---------- OnInit() -----------
2015.09.23 09:02:10, USDCAD (D1), DEBUG: Ejemplo de mensaje de depuración (LoggerTest.mq5; int OnInit(); Line: 36)
2015.09.23 09:02:10, USDCAD (D1), INFO: Ejemplo de mensaje de información (LoggerTest.mq5; int OnInit(); Line: 38)
2015.09.23 09:02:10, USDCAD (D1), WARNING: Ejemplo de mensaje de advertencia (LoggerTest.mq5; int OnInit(); Line: 40)
2015.09.23 09:02:10, USDCAD (D1), ERROR: Ejemplo de mensaje de error (LoggerTest.mq5; int OnInit(); Line: 42)
2015.09.23 09:02:10, USDCAD (D1), FATAL: Ejemplo de mensaje fatal (LoggerTest.mq5; int OnInit(); Line: 44)

Autor: Sergey Eremin

 

Buenas tardes

¿Por qué no consideró la pregunta "Procesamiento de los códigos de retorno del servidor de comercio"?

Esto es mucho más IMPORTANTE que todo en su artículo.

 
Михаил:

Buenas tardes

¿Por qué no consideró la pregunta "Procesamiento de los códigos de retorno del servidor de comercio"?

Esto es mucho más IMPORTANTE que todo en su artículo.

En primer lugar, lea todo el artículo. Si no lo entiende, léalo una y otra vez hasta que lo entienda completamente. Sólo entonces te darás cuenta de que tu mensaje no tiene nada que ver con el tema tratado en el artículo.
 
Karputov Vladimir:
En primer lugar, lea todo el artículo. Si no lo entiendes, léelo una y otra vez hasta que lo entiendas del todo. Sólo entonces te darás cuenta de que tu mensaje no tiene nada que ver con el tema del artículo.

El artículo debería haberse llamado no"Tratamiento de errores y registro en MT5",

¡sino "Procesamiento de errores PROPIOS y registro en MT5"!

 
Михаил:

Buenas tardes

¿Por qué no consideró la pregunta "Procesamiento de los códigos de retorno del servidor de comercio"?

Es mucho más IMPORTANTE que todo en su artículo.

Mikhail, ¿por qué no escribes un artículo así? ¡Es un tema ya hecho! :)

No pensé que este tema es más importante que todo en el artículo. Si lo crees, hazlo, ¿por qué me regañas por no hacerlo?


De hecho, no traté de considerar este punto en detalle, porque quería tocar temas más generales. Así que podemos entrar en una consideración detallada de los códigos de error devueltos por las funciones estándar del lenguaje. Por ejemplo, como otro tema del articulo - "Manejo de errores que ocurren al trabajar con objetos graficos en MQL5".

Mi objetivo no era el mismo. Pero sí, un mes después de escribir el artículo, veo que resultó "más o menos". Bueno, voy a tratar de ser mejor en el futuro.

 
Sergey Eremin:

¿Por qué no escribes un artículo como éste? ¡Es un tema ya hecho! :)

De hecho, no quería tratar este punto en detalle, porque quería tocar temas más generales. Así que podemos entrar en una consideración detallada de los códigos de error devueltos por las funciones estándar del lenguaje. Por ejemplo, como otro tema del articulo - "Manejo de errores que ocurren al trabajar con objetos graficos en MQL5".

Mi objetivo no era el mismo. Pero sí, un mes después de escribir el artículo, veo que resultó "más o menos". Bueno, voy a tratar de ser mejor en el futuro.

¡Sergei!

Está bien, pero yo llamaría al artículo

"Métodos avanzados de depuración de Asesores Expertos en MT5 con logging".

Porque cuando se depura el Asesor Experto, ya no hay errores,

pero los códigos de retorno del servidor de comercio puede estar lleno de errores,

que necesitan ser procesados sólo en el modo normal del Asesor Experto.

 
Михаил:

¡Sergei!

Todo está bien, pero yo llamaría al artículo

"Métodos avanzados de depuración de Asesores Expertos en MT5 con logging".

Pero el tratamiento de errores no es depuración :)

¿O quieres decir que, por ejemplo, procesar el error "fondos insuficientes" (que se menciona en el artículo como ejemplo) es depuración?

 
Sergey Eremin:

Pero el tratamiento de errores no es depuración :)

¿O quieres decir que, por ejemplo, tratar el error "fondos insuficientes" (que es el ejemplo mencionado en el artículo) es depuración?

"Fondos insuficientes" no es un error, sino un mensaje para usted (para el experto sobre el estado de su cuenta) y

esta es una situación que se maneja ESTÁNDARMENTE. Y un desarrollador normal DEBE, antes de hacer una transacción o realizar un pedido.

verificar la disponibilidad de fondos.

//+------------------------------------------------------------------+
//| Función Expert Check money|
//+------------------------------------------------------------------+ 
bool CheckMoney( const long volume )
{
  double a_go = SymbolInfoDouble( _Symbol, SYMBOL_MARGIN_INITIAL ) * double(volume);
  double free_margin = ( AccountInfoDouble( ACCOUNT_FREEMARGIN ) / 100 ) * 90;
//--- 
  if ( a_go <= free_margin )
  {
    return( true );
  }
  Print( "Cheque de dinero: ¡No hay fondos suficientes!" );
  return( false );
}
 
Михаил:

"Fondos insuficientes" no es un error, sino un mensaje para usted (para el Asesor Experto sobre el estado de su cuenta) y

se trata de una situación de procesamiento ESTÁNDAR.

Pero tampoco es un momento de depuración. Llámalo como quieras, pero debe ser procesado (y según yo lo veo, en esto estamos de acuerdo). A mi entender, es una situación errónea en relación con el curso normal de las cosas. Al fin y al cabo, el experto puede suponer que los medios son suficientes. Y si no se comprueba y procesa de alguna manera, resultará que no es nada.

Al igual que, por ejemplo, el error de abrir un archivo debido a su ausencia - por un lado es una situación estándar que necesita ser tratada, pero por otro lado es un error de asumir que el archivo está ahí y podemos trabajar con él.


Y una vez más: en este artículo he intentado considerar cuestiones de gestión de errores en el proceso de funcionamiento del programa más que cuestiones de depuración de software. Este es otro tema completamente distinto y se correlaciona con el artículo sólo dentro del marco del registro (y eso sólo parcialmente).
Y no era mi objetivo considerar errores específicos (ya sean códigos de retorno del servidor de comercio o, como dije antes, por ejemplo, posibles errores al trabajar con objetos gráficos). Sólo métodos generales que son aplicables a errores (o situaciones estándar, si lo prefiere) que son devueltos por el servidor de comercio también.

Lo siento si mi mensaje quedó poco claro. Espero que ahora todo encaje.

 
Михаил:

esta es una situación que se maneja de forma ESTÁNDAR. Y un desarrollador normal DEBE, antes de hacer una transacción o hacer un pedido.

o hacer un pedido, verificar la disponibilidad de fondos.

Ay, tengo que preguntar: ¿leíste el artículo o sólo lo leíste y juzgaste? Yo hablé de las comprobaciones previas en el artículo (me arrepiento, no hablé específicamente de comprobar los fondos, pero creí que quedaba claro). Y no es mala idea manejar un posible error "fondos insuficientes" incluso después de intentar abrir una operación, aunque hayamos hecho esta comprobación antes. Cualquier cosa puede pasar en el tiempo que transcurre entre la comprobación "antes" y el intento inmediato de apertura.

 
Sergey Eremin:

Ay, tengo que preguntar: ¿leíste el artículo, o sólo lo leíste y juzgaste? Hablé de comprobaciones preliminares en el artículo (me arrepiento, no hablé específicamente de comprobar fondos, pero creí que quedaba claro). Y manejar un posible error "fondos insuficientes" incluso después de intentar abrir una operación no es la peor idea, aunque hayamos hecho esta comprobación antes. Cualquier cosa puede pasar en el tiempo entre la comprobación "antes" y el intento inmediato de abrir.

Sergey.

Así son los códigos de retorno del servidor de operaciones para estas situaciones.

Ejemplo: Usted ha comprobado la disponibilidad de fondos libres y ha recibido un resultado afirmativo.

Usted envía una orden, pero no fue aceptada (como usted dijo: "Lo que puede suceder"),

por lo que el servidor de negociación le dará el error "Fondos insuficientes" en el código de retorno.

Y resulta que "da igual" cuántas veces compruebe el error.

¡entre su cheque (CheckMoney) y el código de retorno del servidor de comercio!