Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 156

 

1) pourquoi ne pas initialiser immédiatement en déclarant int err=0 ?

2) Je n'ai pas vérifié, mais selon la documentation, err est stocké dans une variable, qui est automatiquement remise à zéro lors de l'utilisation de la fonction GetLastError(),

et change aussi toujours lors de l'utilisation de certaines fonctions (principalement celles du terminal)

3) C'est pourquoi GetLastError() a donné une valeur de 0 après avoir fait référence à un numéro de ticket inexistant dans OrderSelect:

"Les autres fonctions ne modifient en aucun cas la valeur de la variable last_error. ................., OrderSelect, ...................."

 
hoz:

Souvent, je déclarais une variable comme celle-ci à l'intérieur des fonctions :

Plus loin, à une certaine condition, je l'appelle déjà pour voir s'il y a une erreur. Eh bien, ce n'est pas seulement moi, mais de nombreux autres endroits du code que j'ai rencontrés. Pour ainsi dire, c'est une situation typique. J'ai pensé aujourd'hui qu'il n'est pas logique de déclarer la même variable à chaque fois dans chaque fonction où l'on veut contrôler les erreurs. J'y ai réfléchi et j'en suis arrivé à la conclusion qu'il serait plus facile de déclarer globalement une fois et de l'initialiser dans le init. C'est comme ça :

Et encore, lorsque vous devez appeler la variable err dans des fonctions utilisateur, sachant qu'elle a déjà une valeur. En fait, GetLastError() sort le code de la dernière erreur, donc si cette variable err est appelée dans chaque fonction à la fin de tous les calculs, qui est responsable de la sortie du code d'erreur, et appelle GetLastError(), alors tout sera correct, non ?

Mais si vous n'appelez pas cette variable à la fin d'une fonction (en suivant la chaîne d'exécution du code), elle ne sera pas réinitialisée, et il pourrait y avoir une erreur d'exécution, dans le cas où il y avait une erreur dans la chaîne d'exécution précédente, mais pas dans la chaîne actuelle, mais le code d'erreur est retourné en dernier... Et pour la réinitialiser, vous devez appeler cette fonction GetLastError(). C'est-à-dire qu'ici tout dépend du fait qu'il ait été appelé ou non. Si vous n'êtes pas sûr qu'il sera partout, il est plus facile de le réassurer et de le remettre à zéro à chaque fois, non ?

Vous pouvez err le déclarer globalement, puis dans start() avant d'appeler GetLastError() le réinitialiser, par ex :

int err;
//------------------
int init() 
{
  // ...
  return(0);
}
//------------------
int start() 
{ 
  // ...
  RefreshRates();
  OrderClose(...);
  err=0;     // обнуление
  err=GetLastError();
  SomeErrFunction(err);
  // ...
return(0);
}
 
ALXIMIKS:

1) pourquoi ne pas initialiser immédiatement en déclarant int err=0 ?


Essayez-le! :) Ça n'a pas marché pour moi. Si j'ai bien compris, l'initialisation par des fonctions spéciales dans des variables globales n'est pas autorisée. Bien que la documentation ne semble pas en parler.
ALXIMIKS:

2) Je n'ai pas vérifié, mais selon la documentation, err est stocké dans une variable, qui est automatiquement remise à zéro lors de l'utilisation de la fonction GetLastError(),

et change aussi toujours lors de l'utilisation de certaines fonctions (principalement celles du terminal)

A propos de la mise à zéro, j'ai écrit plus haut, mais voilà, si après la valeur entre dans la variable LastError(), alors pour la réinitialiser, nous devons appeler la fonction GetLastError() pour retourner le code de la dernière erreur et réinitialiser la variable LastError . Sinon, le code de la dernière erreur sera stocké de manière permanente jusqu'à ce que vous appeliez GetLastError() et, par conséquent, il peut renvoyer le code de la dernière erreur si celle-ci n'existe plus. (c'est-à-dire dans une autre fonction pour rendre plus difficile la lecture du journal ou l'impression).
ALXIMIKS:

3) C'est pourquoi GetLastError() a donné une valeur de 0 après avoir fait référence à un numéro de ticket inexistant dans OrderSelect:

"Les autres fonctions ne modifient en aucun cas la valeur de la variable last_error. ................., OrderSelect, ...................."

Il est fort probable que ce ne soit pas à cause de OrderSelect(), mais qu'il y ait un autre problème (à proximité dans la même fonction). En particulier, elle est souvent affectée par de nombreuses autres choses.
 
paladin80:

Vous pouvez déclarer err globalement, puis le mettre à zéro dans start() avant d'appeler GetLastError(), par exemple

Si vous le déclarez au départ et qu'il y a ensuite plus d'une erreur dans le code, alors la logique est déjà déréglée. À moins que GetLastError() ne soit constamment appelé (théoriquement à la fin de chaque fonction utilisateur).
 
hoz:
alors il y a déjà un problème de logique. À moins que GetLastError() ne soit constamment appelé(théoriquement à la fin de chaque fonction utilisateur).

Parfois, vous devez l'appeler plus souvent
 

Victor (hoz), je ne comprends pas votre acharnement sur la dernière erreur.

Déclarez une fonction pour la gestion des erreurs et appelez-la si nécessaire. Tout sera local et pourra être utilisé partout.

// Объявление:
void CommentError(int nLastCodeError, string sComment)
 {
  if (nLastCodeError != 0) Print(sComment, "  ", ErrorDescription(nLastCodeError));
 }

// Вызов:
void start()
 {
  CommentError(GetLastError(), "Ошибка в функции start()!");
 }
 
Zhunko:

Victor (hoz), je ne comprends pas votre acharnement sur la dernière erreur.

Déclarez une fonction pour la gestion des erreurs et appelez-la si nécessaire. Tout sera local et pourra être utilisé partout.


C'est compréhensible. Mais cette fonction sera appelée quand j'en aurai besoin, c'est-à-dire quand je voudrai vérifier s'il y a une erreur. Mais s'il y a eu une erreur quelque part auparavant et qu'il n'y a pas d'erreur en ce moment, il retournera l'erreur précédente... Parce que dans votre fonction Vadim, la variable LastError n'est pas remise à zéro , en appelant GetLastError(). Voilà le truc...
 
hoz:

C'est compréhensible. Mais cette fonction sera appelée quand j'en aurai besoin, c'est-à-dire quand je voudrai vérifier s'il y a une erreur. Mais s'il y avait une erreur quelque part auparavant, et qu'à ce moment-là il n'y a pas d'erreur, il retournera l'erreur précédente... Parce que dans votre fonction Vadim, la variable LastError n'est pas remise à zéro , en appelant GetLastError(). C'est le but...

Il ne doit pas être remis à zéro. Il faut prendre l'habitude de vérifier les erreurs partout après les fonctions. Vous devez également rendre l'appel désactivable. Pour qu'il ne ralentisse pas en mode combat. C'est-à-dire qu'il s'agit d'un débogueur.

L'exception, bien sûr, concerne les erreurs qui doivent être analysées, pour prendre une décision.

 
hoz:

C'est compréhensible. Mais cette fonction sera appelée quand j'en aurai besoin, c'est-à-dire quand je voudrai vérifier s'il y a une erreur. Mais s'il y a eu une erreur quelque part auparavant et qu'il n'y a pas d'erreur en ce moment, il retournera l'erreur précédente... Parce que dans votre fonction Vadim, la variable LastError n'est pas remise à zéro , en appelant GetLastError(). Voici le point...
Qu'est-ce qui l'empêche de mettre d'abord à zéro (err=0 ;), puis d'appeler l'action, puis d'assigner err=GetLastError(), de la traiter, et err=0 à nouveau.
 
Comment calculer le facteur de profit avec différents t/p et s/l. C'est clair, si le take et le stop sont de 20 pips chacun, calculons le nombre de transactions rentables et déficitaires et divisons-les. Comment calculer si je prends un TP de 40 pips et le stop de 30 pips ? Nous l'utiliserons de la même manière que nous l'utilisons au même endroit.