Erreurs, bugs, questions - page 2297

 

Je demande à MQL de vérifier la fonction OnTimer().

Pour une raison quelconque, cela ne fonctionne pas dans le testeur de stratégie pour MT4 (pas d'erreurs, mais rien à l'intérieur de cette fonction n'est exécuté), alors qu'en ligne c'est OK.

Pour MT5, la fonction fonctionne à la fois dans le testeur et en ligne.

Merci !

 
Beaucoup de temps est passé sur Incorrect-Init
Core 1  pass 114 tested with error "incorrect input parameters" in 0:00:00.218

Dans OnInit, seuls deux nombres sont comparés, et il faut plus de temps pour une passe incorrecte que pour une passe complète ! Comment cela se fait-il ?


Exécutons ce conseiller expert sur une optimisation complète.

input int Range = 0; // задать Оптимизацию 1 .. 10000

int OnInit() { return(INIT_PARAMETERS_INCORRECT); }


Nous obtenons le résultat du travail de 8 agents

Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 24 seconds


Voici notre conseiller expert maintenant

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() {}
Tester  optimization finished, total passes 10000
Statistics      optimization done in 0 minutes 31 seconds


Enfin, comme celui-ci

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() { ExpertRemove(); }
Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 19 seconds


Deux sorties

  1. Incorrect-Init et ExpertRemove sont identiques en termes de vitesse.
  2. Une exécution à vide est ~5 fois plus rapide qu'une sortie de OnInit.


Sur le deuxième point, il y a clairement une sorte d'erreur. Il est plus avantageux en termes de temps d'effectuer une exécution à vide, plutôt que de sortir de OnInit. Veuillez le corriger car les avantages de Incorrect-Init et ExpertRemove seront presque entièrement perdus.

 

L'onglet des favoris avec les EAs/indicateurs/scripts et comptes n'est mémorisé qu'après avoir quitté le terminal. De ce fait, une sortie anormale (mise hors tension) réinitialise cet onglet. Est-il possible de l'enregistrer lorsqu'on le modifie ?

Parfois, il est clairement entendu qu'il serait très pratique d'ajouter des dossiers aux favoris.

 
A100:
Alors essayez comme ceci :

Résultat :

1:POINTEUR_AUTOMATIQUE
1:POINTEUR_DYNAMIQUE
2:POINTEUR_DYNAMIQUE
2:POINTEUR_AUTOMATIQUE

Merci ! Une sacrée solution.

Mais il est probablement préférable que le compilateur ne jure pas :

class B  { public:
                     B(void *b) {d=b;}
                    ~B() { delete d; }
   void             *d; };

C'est un bug ou quoi ?
Lorsque vous créez une instance d'une classe via new , celle-ci n'appelle pas le destructeur.

Est-ce la seule solution de créer une classe spéciale pour appeler le destructeur ? Ou peut-on s'en passer ?

 
Andrey Barinov:

Créer avec nouveau et supprimer avec supprimer

La question est de mettre delete dans un destructeur, mais lors de la création d'une instance d'une classe via new (A *a=newA ;) le destructeur n'est pas appelé.

 
aleger:

Est-il possible, et si oui, comment, de dériver dans n'importe quel indicateur ZigZag les valeurs correspondantes des extremums de prix High et Low,

assurant leur liaison stable et leur proximité avec les sommets et les creux formés ?

Voir l'exemple deOBJ_TEXT

 

Merci.
C'est exactement ce qui est dit ici.

Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). 
Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". 
Можно объявить несколько переменных и всем им присвоить указатель одного объекта.
Если динамически создаваемый объект имеет конструктор, то этот конструктор будет вызван в момент выполнения оператора new. Если объект имеет деструктор, 
то деструктор будет вызван в момент выполнения оператора delete.

Il ne s'agit donc pas d'un bug, mais d'une fonctionnalité qui entraîne un cercle vicieux.
Si je veux automatiser le processus de suppression d'un objet dynamique, le destructeur n'est appelé que lors de la suppression, il est donc inutile de mettre delete dans le destructeur lui-même.
Mais l'automatisation peut être mise en œuvre par le biais d'une autre instance d'une autre classe, comme @A100 l'a suggéréici.

 
aleger:

Merci pour le conseil. Je suis déjà épuisé de lire et d'essayer et d'essayer et de lire. J'aimerais voir un exemple de fonctionnement du ZigZag...

Comme sur mon avatar avec un zigzag, mais avec une liaison DROITE de l'extrema supérieur, parce que la liaison de l'extrema inférieur est OK !

La façon de lier avec k=(WindowPriceMax()-WindowPriceMin())/30 ne fonctionne pas lorsque la taille de la fenêtre change beaucoup, j'aimerais quelque chose d'autre...


Dans l'exempleOBJ_TEXT, le haut et le bas sont liés. Suivez le lien, exécutez l'exemple ...

 
Nikolai Semko:

Il ne s'agit donc pas d'un bug, mais d'une fonctionnalité, ce qui entraîne un cercle vicieux.

On vous a déjà dit précédemment que le moyen de résoudre le contrôle des ressources allouées ingérables est d'utiliser des pointeurs intelligents. L'analogie complète avec C++.
Le problème est peut-être que la solution n'a pas été présentée sur un plateau d'argent, désolé.


Tout le monde peut taper "shared_ptr" dans la recherche du site et suivre le premier résultat, ce n'est pas difficile, je recommande fortement d'essayer.

 
Sergey Dzyublik:

Tout le monde peut taper "shared_ptr" dans la recherche du site et suivre le premier résultat, ce n'est pas difficile, je recommande fortement d'essayer.

on découvre alors qu'aucun des pointeurs intelligents standard n'est correctement implémenté dans mql, car il n'y a pas de références, de déréférencement et de flèche.