Test de CGraphic - questions et suggestions - page 10

 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégie

FAQ des débutants MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin, 2019.02.17 06:56

J'ai décidé de répéter l'expérience à nouveau, voici le code

      //--- отключим показ ценового графика
      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();
        }

Et voici le résultat

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 Графический объект не найден
Une idée de la cause de l'erreur ?
J'ai été informé que l'erreur se trouve dans la bibliothèque - sera-t-elle corrigée ?
 
Aleksey Vyazmikin:
J'ai été informé qu'il y a une erreur dans la bibliothèque - sera-t-elle corrigée ?

Les télépathes sont en vacances. Et pour les gens ordinaires, nous avons besoin :

  1. un code minimal (dont tous les déchets inutiles ont été éliminés) qui reproduit le problème.
  2. une description claire de ce qui ne va pas (ce que vous voulez obtenir, ce que vous obtenez et pourquoi vous pensez que c'est un bug)
  3. spécifications du système d'exploitation, construction du terminal, nom du serveur commercial

 
Aleksey Vyazmikin:
J'ai été informé qu'il y a une erreur dans la bibliothèque - sera-t-elle corrigée ?

Où vous a-t-on dit qu'il y avait une erreur ? Je vous l'ai dit - cherchez le point dans la bibliothèque où il peut être écrit dans la variable _LastError. Ce n'est pas nécessairement que le code avec l'erreur a fonctionné. Parce qu'il pourrait rechercher un objet (et s'il est absent, le code d'erreur sera écrit dans la variable) et le créer. Mais si l'objet n'est pas créé, alors c'est une erreur, mais il sera créé et tout se passera bien. Mais après vérification, le code d'erreur (l'objet était absent avant la création) sera écrit dans une variable, que vous lirez ensuite dans votre code.

 
Vladimir Karputov:

Les télépathes sont en vacances. Ce qu'il faut pour les gens ordinaires, c'est :

  1. un code minimal (dont tous les déchets inutiles ont été éliminés) qui reproduit le problème.
  2. une description claire de ce qui ne va pas (ce que vous vouliez obtenir, ce que vous avez obtenu au final et pourquoi vous pensez qu'il s'agit d'une erreur)
  3. spécifications du système d'exploitation, construction du terminal, nom du serveur commercial

1. Code

//+------------------------------------------------------------------+
//|                                              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. Pas de prévision de messages d'erreur dans le journal

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, non connecté au serveur pendant les tests - broker Discovery.

 
Artyom Trishkin:

Où vous a-t-on dit qu'il y avait une erreur ? Je vous l'ai dit - cherchez un fragment dans la bibliothèque où il peut être écrit dans la variable _LastError. Ce n'est pas nécessairement que le code avec l'erreur a fonctionné. Parce qu'il pourrait rechercher un objet (et s'il est absent, le code d'erreur sera écrit dans la variable) et le créer. Mais si l'objet n'est pas créé, c'est une erreur, mais il sera créé et tout se passera bien. Mais après vérification, le code d'erreur (l'objet était absent avant la création) sera écrit dans une variable, que vous lirez ensuite dans votre code.

La bibliothèque doit soit produire une erreur lorsqu'il y a une erreur réelle, soit gérer correctement la situation et ne pas produire d'erreur lorsqu'il n'y en a pas. Si mon utilisation de la bibliothèque n'est pas décrite dans la classe lors de la vérification des erreurs, vous devez le préciser. En tout état de cause, il est déraisonnable pour l'utilisateur de modifier les bibliothèques du fabricant du produit.

 
Aleksey Vyazmikin:

La bibliothèque doit soit produire une erreur lorsqu'il y a une erreur réelle, soit gérer correctement la situation et ne pas produire d'erreur lorsqu'il n'y en a pas. Si mon utilisation de la bibliothèque n'est pas décrite dans la classe lors de la vérification des erreurs, vous devez le préciser. En tout état de cause, il est déraisonnable pour l'utilisateur de modifier les bibliothèques du fabricant du produit.

Il n'y a pas d'erreur, relisez-le :

Où vous a-t-on dit qu'il y avait une erreur ? Je vous l'ai dit - cherchez un fragment dans la bibliothèque où il peut être écrit dans la variable _LastError. Ce n'est pas nécessairement que le code avec l'erreur a fonctionné. Parce qu'il pourrait rechercher un objet (et s'il est absent, le code d'erreur sera écrit dans la variable) et le créer. Mais si l'objet n'est pas créé, c'est une erreur, mais il sera créé et tout se passera bien. Mais après vérification, le code d'erreur (l'objet était absent avant la création) sera écrit dans une variable que vous lirez ensuite dans votre code.

Il est donc de votre intérêt de savoir pourquoi vous lisez l'erreur après l'exécution normale du code. Ce que vous ne comprenez probablement pas, c'est qu'avoir un code différent de zéro dans la variable _LastError ne signifie pas nécessairement qu'il y a une erreur dans le code de CGraphic et pas seulement dans celui-ci. Dans ce cas, il pourrait s'agir d'un simple résultat de la recherche de l'existence d'un objet, qui a été exécuté à l'intérieur du CGraphique en SB. Il y a eu une requête pour un objet par son nom, le résultat a retourné -1 et le code 4202 a été écrit dans _LastError. Puis l'objet a été créé, tout a fonctionné et a été renvoyé au programme appelant. Et là, vous lisez immédiatement le code d'erreur et vous l'obtenez. Mais il n'y a pas d'erreur - vous voyez le résultat des requêtes à l'intérieur du SB.

Je ne fais que suggérer une raison possible pour ce que vous rapportez.

Ainsi, si vous voulez vraiment trouver une erreur réelle et la signaler, vous devez parcourir l'ensemble du code CGraphic dans le débogueur et attraper l'erreur réelle qui causera des échecs de logique et de performance, plutôt que de simplement prétendre que vous avez lu le code d'erreur et donc - qu'il est bien là.

 
Artyom Trishkin:

Il n'y a pas d'erreur, relisez-le :

Il est donc dans votre intérêt de savoir pourquoi vous lisez l'erreur après l'exécution normale du code. Vous ne comprenez probablement pas que le contenu de la variable _LastError, qui n'est pas nul, ne signifie pas nécessairement qu'il y a une erreur dans le code CGraphic, et pas seulement dans celui-ci. Dans ce cas, il pourrait s'agir d'un simple résultat de la recherche de l'existence d'un objet, qui a été exécuté à l'intérieur du CGraphique en SB. Il y a eu une requête pour un objet par son nom, le résultat a retourné -1 et le code 4202 a été écrit dans _LastError. Puis l'objet a été créé, tout a fonctionné et a été renvoyé au programme appelant. Et là, vous lisez immédiatement le code d'erreur et vous l'obtenez. Mais il n'y a pas d'erreur du tout - vous voyez le résultat des requêtes à l'intérieur du SB.

Je ne fais que suggérer une raison possible pour ce que vous rapportez.

Donc, si vous voulez vraiment trouver l'erreur réelle et la signaler, vous devez parcourir l'ensemble du code graphique dans le débogueur et attraper l'erreur réelle qui fera échouer la logique et l'opération, plutôt que de simplement prétendre que vous avez lu le code d'erreur et donc - qu'il est bien là.

Vous avez vous-même dit dans votre raisonnement logique qu'il pouvait y avoir une erreur dans le code, et elle s'exprime en ne réinitialisant pas l'erreur. qui a été reçue en raison de l'absence d'un objet avant sa création.

Non, je n'ai pas la compétence nécessaire pour chercher une erreur dans un code complexe et obtenir une réponse disant que c'était prévu ainsi.

Pouvez-vous me dire si ce message est une erreur de l'utilisateur ou non ?

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

Le code qui indique cela estD.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:

Vous avez vous-même indiqué dans votre raisonnement logique qu'il peut y avoir une erreur dans le code, et elle s'exprime en ne réinitialisant pas l'erreur. qui a été reçue en raison de l'absence de l'objet avant sa création.

Non, je n'ai pas la compétence nécessaire pour chercher une erreur dans un code complexe et obtenir une réponse disant que c'était prévu ainsi.

Pouvez-vous me dire si ce message est une erreur de l'utilisateur ou non ?

Il pointe vers ce code -D.PointsFill(false) ;

Je ne comprends pas du tout le sens de cette phrase.

Il me semble que je vous ai déjà tout décrit en détail.

Je ne sais pas. Pas beaucoup d'informations.

 
Artyom Trishkin:

Je ne comprends pas du tout le sens de cette phrase.

Il me semble que je vous ai déjà tout expliqué en détail.

Je ne sais pas. Pas beaucoup d'informations.

Vous ne comprenez pas que si votre code est construit pour réagir à une erreur (nous créons un objet en cas d'erreur), alors après avoir réparé l'erreur(création d'un objet), il est logique de réinitialiser cette erreur, ce qui selon votre raisonnement logique n'est pas fait dans la bibliothèque.

Ici, je n'ai pas non plus d'informations sur la manière de réagir à cette erreur...

 
Aleksey Vyazmikin:

Vous ne comprenez pas que si le code est construit sur la réponse à l'erreur (en cas d'erreur nous créons un objet), alors après la correction de l'erreur(création de l'objet), il est logique de réinitialiser cette erreur, ce qui selon votre raisonnement logique n'est pas fait dans la bibliothèque.

Ici, je n'ai aucune information sur la façon de réagir à cette erreur...

Vous devez être bien conscient que ce n'est pas le code dans _LastError qui n'est pas égal à zéro qui constitue une erreur, mais le résultat renvoyé par la fonction qui indique une exécution erronée de cette fonction. Et _LastError contient le code qui pointe exactement vers cette erreur qui fait que la fonction s'exécute par erreur. Il est donc douteux que vous puissiez utiliser la description du code d'erreur stockée dans la variable de service au lieu d'utiliser directement le code de retour de la fonction. Si la fonction a retourné -1 ou false ou 0 (pour chaque fonction, le code d'erreur est décrit dans l'aide), eh bien - seule l'analyse du résultat retourné par la fonction doit être traitée par vous, pas le code dans _LastError, qui n'indique pas l'erreur, mais est utilisé pour indiquer la cause du retour d'un certain résultat par la fonction.

La fonction de recherche d'objet renvoie une valeur inférieure à zéro dans le cas où un objet portant le nom donné n'existe pas. Est-ce une erreur ? Non. Il s'agit d'une réponse standard de la fonction, sur la base de laquelle vous prenez la décision de créer un objet avec le nom donné. Le code contenu dans _LastError dit explicitement que "Un objet avec le nom demandé n'existe pas" - vous pouvez le créer.

Eh bien, je suis fatigué de vous l'expliquer. Celui qui le veut, comprendra.

Raison: