Erreurs, bugs, questions - page 1177

 

Dans la continuité de mon précédent post, j'ai réussi à trouver la zone problématique à l'origine du bug en utilisant la méthode scientifique.

Nous avons une telle bibliothèque avec la fonction :

//---- testbuglib.mq5 ------

#property library

class A { }; class B   { private:    A* a; public:    A* b; }; int Test() export {   return 0; }

Voici le fichier principal :

#include <Files\File.mqh>  // тут можно указать любой файл mqh

#import "testbuglib.ex5"
  int Test();
#import  

int OnInit() {  Test(); return 0; }

Le conseiller expert résultant ne fonctionne pas et affiche dans le journal : "EX5 loading failed".

Dossiers :
TestBug.mq5  1 kb
 
svds75:

Bonjour. Pouvez-vous me dire pourquoi la variable res est toujours vraie lorsque l'on demande les propriétés de la ligne de tendance, même si j'ai réglé manuellement le drapeau pour qu'il n'affiche que W1, ou que MN1 ?

Je veux qu'il ne soit affiché que sur l'une des moitiés.

Le nombre de paramètres est incorrect, vous appelez la fonction comme une option et vous devriez l'appeler comme 2 ou comparer le résultat.
 
TheLiteShadow:
C'est vrai, mais cela signifie-t-il qu'à chaque nouvelle barre, tous les derniers "index" des tampons définis doivent être "nettoyés" ? La question est de savoir pourquoi. Dans MT4 il n'y avait pas une telle situation, je comprends, pendant l'initialisation je l'avais nettoyé, mais alors il devrait être fait par MT lui-même, par la même occasion, dans l'initialisation il devrait être fait par MT et pas par le programmeur, pour quel but le tampon de l'indicateur est simplement une allocation de mémoire je ne comprends pas bien....
Lorsque j'ai posé cette question il y a quelques années, on m'a répondu que cela était fait à des fins d'optimisation. Vous initialisez exactement la quantité dont vous avez besoin. Et si vous remplissez tout de suite certaines données de calcul, vous n'avez pas du tout besoin de préécrire des zéros. MT5 est différent de MT4 à bien des égards.
 
marketeer:
Lorsque j'ai posé cette question il y a quelques années, on m'a répondu que c'était à des fins d'optimisation. Vous initialisez exactement ce dont vous avez besoin. Et si vous remplissez immédiatement certaines données de calcul, il n'est pas nécessaire de pré-écrire des zéros. MT5 est différent de MT4 à bien des égards.
Le fait que MT4 soit différent de MT5 est compris par tout le monde, mais je ne serais pas d'accord sur l'optimisation, et le programmeur a trop de choses à suivre en plus, non comparable aux langages de bas niveau, mais pour moi c'est inutile, en général, c'est clair, merci....
 
TheLiteShadow:
Le nombre de paramètres est incorrect, vous appelez la fonction comme une option et vous devriez l'appeler comme 2 ou comparer le résultat.
Je l'ai aussi essayé de cette façon. Bien que les drapeaux fonctionnent réellement (la ligne ne s'affiche qu'une seule fois), et le conseiller expert voit que les deux drapeaux sont activés.
long res;
ObjectGetInteger(0,"line",OBJPROP_TIMEFRAMES,OBJ_PERIOD_W1|OBJ_PERIOD_MN1,res);
if((bool)res) Alert("линия line показывается на OBJ_PERIOD_W1 и OBJ_PERIOD_MN1");
 
svds75:
Je l'ai essayé comme ça. Bien que les drapeaux réels fonctionnent (la ligne n'est affichée que sur une seule période), le conseiller expert voit que les deux drapeaux sont activés.

Que voulez-vous vraiment ? Vous demandez une visibilité sur des périodes hebdomadaires OU mensuelles. Le programme retournera donc vrai si au moins l'un d'entre eux est allumé.

Demandez-le séparément en 2 appels.

 
svds75:
Je l'ai aussi essayé de cette façon. Bien que les drapeaux réels fonctionnent (la ligne ne s'affiche que sur une moitié) et que l'EA voit que les deux drapeaux sont activés.

Vous devez donc peut-être définir la visibilité directement ?

 ObjectSetInteger(0,"line",OBJPROP_TIMEFRAMES,OBJ_PERIOD_W1);
 
svds75:

Bonjour. Pouvez-vous me dire pourquoi la variable res est toujours vraie lorsque l'on demande les propriétés de la ligne de tendance, même si j'ai réglé manuellement le drapeau pour qu'il n'affiche que W1, ou que MN1 ?

Je veux qu'il ne soit affiché que sur l'une des moitiés.

Comme la ligne existe toujours, elle lit toujours la valeur. Une ligne invisible ne signifie pas qu'il n'y a pas de ligne.
 
barabashkakvn:

Vous devez donc peut-être définir la visibilité directement ?

Non, je dois définir la visibilité manuellement et la vérifier par programme.
 
svds75:
Non, je dois le définir manuellement et le vérifier par programme.
Ensuite, je dois lire le drapeau de visibilité et faire un & logique avec la constante.