Prueba CGraphic - preguntas y sugerencias - página 10

 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategia

FAQ de principiantes MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin, 2019.02.17 06:56

He decidido repetir el experimento de nuevo, aquí está el código

      //--- отключим показ ценового графика
      ChartSetInteger(0,CHART_SHOW,false);
      long chart=ChartID();

      CGraphic graphic;
         Print("0 Тут ошибка ",GetLastError()," ",cLng::CodeDescription(GetLastError()));
         ResetLastError();
      if(ObjectFind(chart,name)<0)
        {
         Print("1 Тут ошибка ",GetLastError()," ",cLng::CodeDescription(GetLastError()));
         ResetLastError();
         graphic.Create(chart,name,0,0,0,pix_X,pix_Y);//Создает графический ресурс, привязанный к объекту чарта 
         Print("2 Тут ошибка ",GetLastError()," ",cLng::CodeDescription(GetLastError()));
         ResetLastError();
        }

Y aquí está el resultado

2019.02.17 08:55:19.845 Test_4G_CB (Si Splice,H1)       0 Тут ошибка 0 Операция выполнена успешно
2019.02.17 08:55:19.860 Test_4G_CB (Si Splice,H1)       1 Тут ошибка 4202 Графический объект не найден
2019.02.17 08:55:19.860 Test_4G_CB (Si Splice,H1)       2 Тут ошибка 4202 Графический объект не найден
¿Alguna idea de la causa del error?
Me han informado de que el error está en la biblioteca, ¿se solucionará?
 
Aleksey Vyazmikin:
Me han informado de que hay un error en la biblioteca, ¿se corregirá?

Los telépatas están de vacaciones. Y para la gente común necesitamos:

  1. código mínimo (del que se ha desechado toda la basura innecesaria) que reproduce el problema.
  2. una descripción clara de lo que está mal (lo que quiere obtener, lo que obtiene y por qué cree que es un error)
  3. especificaciones del sistema operativo, construcción del terminal, nombre del servidor comercial

 
Aleksey Vyazmikin:
Me han informado de que hay un error en la biblioteca, ¿se corregirá?

¿Dónde se le dijo que había un error? Te lo dije - busca el punto en la biblioteca donde se puede escribir en la variable _LastError. No es necesariamente que el código con el error haya funcionado. Porque podría buscar un objeto (y si está ausente, el código de error se escribirá en la variable) y crearlo. Pero si el objeto no se crea, es un error, pero se creará y todo funcionará. Pero después de la comprobación, el código de error (el objeto estaba ausente antes de la creación) se escribirá en una variable, que luego leerá en su código.

 
Vladimir Karputov:

Los telépatas están de vacaciones. Y para la gente común, lo que se necesita:

  1. código mínimo (del que se ha desechado toda la basura innecesaria) que reproduce el problema.
  2. una descripción clara de lo que está mal (lo que quería obtener, lo que obtuvo al final y por qué cree que es un error)
  3. especificaciones del sistema operativo, construcción del terminal, nombre del servidor comercial

1. Código

//+------------------------------------------------------------------+
//|                                              CB_Model_Analiz.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string name="Name";
   long chart=ChartID();

   CGraphic graphic;
   Print("0 Тут ошибка ",GetLastError());
   ResetLastError();
   if(ObjectFind(chart,name)<0)
     {
      Print("1 Тут ошибка ",GetLastError());
      ResetLastError();
      graphic.Create(chart,name,0,0,0,100,100);//Создает графический ресурс, привязанный к объекту чарта 
      Print("2 Тут ошибка ",GetLastError());
      ResetLastError();
     }
   graphic.Destroy();
  }
//+------------------------------------------------------------------+

2. No se esperan mensajes de error en el registro

2019.02.17 10:37:46.326 CB_Model_Analiz (Si Splice,H1)  1 Тут ошибка 4202
2019.02.17 10:37:46.326 CB_Model_Analiz (Si Splice,H1)  2 Тут ошибка 4202

3. Windows 7 Home 32 bit, build 1940, no conectado al servidor durante las pruebas - broker Discovery.

 
Artyom Trishkin:

¿Dónde le han dicho que hay un error? Te lo dije - busca un fragmento en la biblioteca donde pueda estar escrito en la variable _LastError. No es necesariamente que el código con el error haya funcionado. Porque podría buscar un objeto (y si está ausente, el código de error se escribirá en la variable) y crearlo. Pero si el objeto no se crea, es un error, pero se creará y todo funcionará. Pero después de la comprobación, el código de error (el objeto estaba ausente antes de la creación) se escribirá en una variable, que luego leerá en su código.

La biblioteca debe producir un error cuando hay un error real, o manejar correctamente la situación y no producir un error donde no lo hay. Si mi uso de la biblioteca no está descrito en la clase al comprobar los errores, debe especificarlo. En cualquier caso, no es razonable que el usuario edite las bibliotecas del fabricante del producto.

 
Aleksey Vyazmikin:

La biblioteca debe producir un error cuando hay un error real, o manejar correctamente la situación y no producir un error donde no lo hay. Si mi uso de la biblioteca no está descrito en la clase al comprobar los errores, debe especificarlo. En cualquier caso, no es razonable que el usuario edite las bibliotecas del fabricante del producto.

No hay ningún error ahí, léelo de nuevo:

¿Dónde se le dijo que había un error? Te lo dije - busca un fragmento en la biblioteca donde pueda estar escrito en la variable _LastError. No es necesariamente que el código con el error haya funcionado. Porque podría buscar un objeto (y si está ausente, el código de error se escribirá en la variable) y crearlo. Pero si el objeto no se crea, es un error, pero se creará y todo funcionará. Pero después de comprobar el código de error (el objeto estaba ausente antes de la creación) se escribirá en una variable que luego leerá en su código.

Así que sólo te interesa saber por qué lees el error después de la ejecución normal del código. Lo que no entiendes es que la presencia de código distinto de cero en la variable _LastError no significa necesariamente que haya un error en el código de CGraphic y no sólo en él. En este caso, podría ser un simple resultado de la búsqueda de la existencia de un objeto, que se ejecutó dentro del CGraphic en SB. Hubo una solicitud de un objeto por nombre, el resultado devolvió -1 y se escribió el código 4202 en _LastError. Entonces se creó el objeto, todo funcionó y se devolvió al programa llamante. Y allí se lee inmediatamente el código de error y se obtiene. Pero no hay ningún error - se ve el resultado de las consultas dentro de la SB.

Sólo estoy sugiriendo una posible razón para lo que usted está reportando.

Por lo tanto, si realmente quieres encontrar un error real y reportarlo, tienes que ir a través de todo el código CGraphic en el depurador y atrapar el error real que conducirá a la lógica y los fallos de rendimiento, en lugar de simplemente afirmar que lees el código de error y por lo tanto - está definitivamente allí.

 
Artyom Trishkin:

No hay ningún error ahí, léelo de nuevo:

Por lo tanto - es sólo su interés para saber por qué usted está leyendo el error después de la ejecución del código normal. Probablemente no entienda que el contenido de la variable _LastError, que no es cero, no significa necesariamente que haya un error en el código CGraphic, y no sólo en él. En este caso, podría ser un simple resultado de la búsqueda de la existencia de un objeto, que se ejecutó dentro del CGraphic en SB. Hubo una solicitud de un objeto por nombre, el resultado devolvió -1 y se escribió el código 4202 en _LastError. Entonces se creó el objeto, todo funcionó y se devolvió al programa llamante. Y allí se lee inmediatamente el código de error y se obtiene. Pero no hay ningún error: se ve el resultado de las consultas dentro de la SB.

Sólo estoy sugiriendo una posible razón para lo que reportas.

Así que si usted realmente quiere encontrar el verdadero error y reportarlo, entonces usted necesita ir a través de todo el código CGraphic en el depurador y atrapar el verdadero error que causará la lógica y la operación a fallar, en lugar de simplemente afirmar que usted lee el código de error y por lo tanto - es definitivamente allí.

Usted mismo dijo en su razonamiento lógico que podría haber un error en el código, y se expresa en no restablecer el error. que se recibió debido a la falta de un objeto antes de que se creó.

No, no tengo la competencia para buscar un error en un código complejo y luego obtener la respuesta de que estaba previsto así.

¿Pueden decirme si este mensaje es un error del usuario o no?

2019.02.17 11:08:42.901 Test_4G_CB (Si Splice,H1)       invalid pointer access in 'Test_4G_CB.mq5' (909,7)

El código que señala esto esD.PointsFill(false);

      CCurve *D=graphicT.CurveAdd(X_04,Y_04,ColorToARGB(DarkOrange,256),CURVE_POINTS,Interval_04);//Создает и добавляет кривую на график
      D.PointsFill(false);//Устанавливает флаг, указывающий, нужно ли выполнять заливку для точек, определяющих кривую при отрисовке точками. 
      D.PointsType(POINT_VERTICAL_DASH);//Устанавливает флаг, указывающий на тип точек, использующихся при отрисовке кривой точками.
 
Aleksey Vyazmikin:

Usted mismo ha indicado en su razonamiento lógico que puede haber un error en el código, y se expresa al no restablecer el error. que se recibió debido a la ausencia del objeto antes de ser creado.

No, no tengo la competencia para buscar un error en un código complejo y luego obtener la respuesta de que estaba previsto así.

¿Pueden decirme si este mensaje es un error del usuario o no?

Señala este código -D.PointsFill(false);

No entiendo en absoluto el significado de la frase.

Me parece que ya te he descrito todo con detalle.

No lo sé. No hay mucha información.

 
Artyom Trishkin:

No entiendo en absoluto el significado de la frase.

Me parece que ya le he explicado todo con detalle.

No lo sé. No hay mucha información.

No entiendes que si tu código está construido para reaccionar ante un error (creamos un objeto en caso de error), entonces después de arreglar el error(crear un objeto) es lógico resetear este error, lo que según tu razonamiento lógico no se hace en la librería.

Aquí tampoco tengo información de cómo reaccionar ante este error...

 
Aleksey Vyazmikin:

No entiendes que si el código se construye en base a la respuesta al error (en caso de error creamos un objeto), entonces después de la corrección del error(creación del objeto), es lógico reiniciar este error, lo que según tu razonamiento lógico no se hace en la biblioteca.

Aquí no tengo información sobre cómo reaccionar ante este error...

Debe saber que no es el código en _LastError que no es igual a cero lo que es un error, sino el resultado devuelto por la función que indica la ejecución errónea de esta función. Y _LastError contiene código que apunta exactamente a ese error que hace que la función se ejecute por error. Así que es dudoso que pueda utilizar la descripción del código de error almacenado en la variable de servicio en lugar de utilizar el código de retorno de la función directamente. Si la función devolvió -1 o false o 0 (para cada función su código de error se describe en la ayuda), bien - sólo el análisis del resultado devuelto por la función debe ser manejado por usted, no el código en _LastError, que no indica el error, pero se utiliza para indicar la causa de la devolución de algún resultado devuelto por la función.

La función de búsqueda de objetos devuelve un valor menor que cero en caso de que no exista un objeto con el nombre dado. ¿Es un error? Se trata de una respuesta estándar de la función, en base a la cual se toma la decisión de crear un objeto con el nombre dado. El código contenido en _LastError dice explícitamente que "Un objeto con el nombre solicitado no existe" - puede crearlo.

Bueno, estoy cansado de explicártelo. Quien quiera, lo entenderá.

Razón de la queja: