Questions des débutants MQL5 MT5 MetaTrader 5 - page 742

 
Klimenko_a_e:

Dans le code réel, la fonction renvoie un objet.

Je pense que le constructeur de copie devrait créer une copie temporaire dans ce cas.

Le code fonctionne correctement dans MQL5 build 1545.

Dans la nouvelle version, le constructeur de copie ne peut même pas redimensionner un tableau unidimensionnel : erreur 4007.

Je pense que ce n'est pas correct.

Il m'est difficile de faire une déclaration définitive dans ce cas. Il y a de très bons experts pour votre question, je vous recommande donc d'adresser cette question àhttps://www.mql5.com/ru/forum/1111.

Avec mes modifications, le code fonctionne comme il le devrait. Sans elle, il n'y a rien. Mais si oui ou non votre code devrait fonctionner, c'est mieux à la branche au lien ci-dessus.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
Klimenko_a_e:

Dans le code réel, la fonction renvoie un objet.

Le constructeur de copie, à mon avis, devrait créer une copie temporaire dans ce cas.

Le code fonctionne correctement dans MQL5 build 1545.

Dans la nouvelle version, le constructeur de copie ne peut même pas redimensionner un tableau unidimensionnel : erreur 4007.

Cela n'est pas correct à mon avis.


L'erreur a été corrigée dans la build 1580, merci, tout fonctionne comme il se doit).
 
fxsaber:

Il m'est difficile de dire quoi que ce soit de définitif dans ce cas. Il y a de très bons experts pour répondre à votre question, je vous recommande donc de vous adresser à la branchehttps://www.mql5.com/ru/forum/1111.

Avec mes modifications, le code fonctionne comme il le devrait. Sans elle, il n'y a rien. Mais pour savoir si votre code devrait fonctionner ou non, il est préférable de se diriger vers la branche au lien ci-dessus.


Merci pour le lien.
 

Peut-être que quelqu'un peut me donner un indice.

Je n'arrive pas à trouver comment interrompre l'exécution de l'EA après avoir modifié manuellement les paramètres d'entrée.

1) Exécutez le code EA comme ceci sur le graphique :

#property version   "1.00"

input int Setting_ = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   Print ("OnInit:",Setting_);
   
   return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Print ("OnDeinit(",reason,"):",Setting_);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

2) Ouvrez la fenêtre des paramètres et changez le paramètre "Setting_" en 1.

3) Et appliquer les changements.

Ainsi, pour commencer à appliquer les changements, OnInit doit être exécuté, mais OnInit ne sera pas exécuté tant que les calculs dans OnTick (ou tout autre) ne s'arrêteront pas.

Pour autant que je sache, il n'y a qu'un contrôle pourarrêter le programme à travers _StopFlag - drapeau pour arrêter le programme mql5, mais c'est seulement pour une sortie complète. Mais je ne sais pas comment comprendre que les paramètres d'entrée ont changé pour arrêter les calculs.

Peut-être quelqu'un a-t-il été confronté à une telle situation ? Il y a peut-être un hack secret ?

 
Marat Sultanov:

Peut-être que quelqu'un peut me donner un indice.

Je n'arrive pas à trouver comment interrompre l'exécution de l'EA après avoir modifié manuellement les paramètres d'entrée.

1) Exécutez le code EA comme ceci sur le graphique :

2) Ouvrez la fenêtre des paramètres et changez le paramètre "Setting_" en 1.

3) Et appliquer les changements.

Ainsi, pour commencer à appliquer les changements, OnInit doit être exécuté, mais OnInit ne sera pas exécuté tant que les calculs dans OnTick (ou tout autre) ne s'arrêteront pas.

Pour autant que je sache, il n'y a qu'un contrôle pourarrêter le programme à travers _StopFlag - drapeau pour arrêter le programme mql5, mais c'est seulement pour une sortie complète. Mais je ne sais pas comment comprendre que les paramètres d'entrée ont changé pour arrêter les calculs.

Peut-être quelqu'un a-t-il été confronté à une telle situation ? Il y a peut-être un hack secret ?

Vérifier le code de désinitialisation dans OnInit()

Raisons de la désinitialisation

Les codes de raison de désinitialisation de l'Expert Advisor retournés par UninitializeReason(). Ils peuvent avoir l'une des valeurs suivantes :

Constant .

Valeur

Description

REASON_PROGRAMME

0

Expert a arrêté son travail en appelant ExpertRemove()

REASON_REMOVE

1

Programme retiré du tableau

RAISON_RECOMPILATION

2

Programme recompilé

RAISON_CHARTCHANGE

3

Le symbole ou la période du graphique a été modifié

RAISON_CHARTCLOSE

4

La carte est fermée

PARAMÈTRES_DE_RAISON

5

Les paramètres d'entrée ont été modifiés par l'utilisateur

REASON_ACCOUNT

6

Un autre compte a été activé ou reconnecté au serveur commercial parce que les paramètres du compte ont été modifiés.

MODÈLE DE RAISON

7

Un autre modèle de graphique a été appliqué

RAISON_INITFAITE

8

Un signe que le gestionnaire OnInit() a retourné une valeur non nulle.

REASON_CLOSE

9

Le terminal était fermé

 
Artyom Trishkin:

Vérifier le code de désinitialisation dans OnInit()

...

Hum... Vous me comprenez mal :)

Vous devez savoir à l'intérieur de la fonction (par exemple dansOnTick), que l'utilisateur a modifié les paramètres d'entrée, c'est-à-dire savoir qu'il est temps de conclure et de laisser le programme passer à OnDeinit.

 
Marat Sultanov:

Hum... Vous me comprenez mal :)

Vous devez savoir à l'intérieur de la fonction (par exemple dansOnTick) que l'utilisateur a modifié les paramètres d'entrée, c'est-à-dire savoir qu'il est temps d'en finir et de laisser le programme sortir vers OnDeinit.

Dès qu'un utilisateur appelle la fenêtre des paramètres de l'EA (F7) et y appuie sur le bouton OK, OnDeinit() est immédiatement appelé et celui-ci, à son tour, écrit la valeur REASON_PARAMETERS dans le code de désinitialisation. Ensuite, OnInit() est appelé, où en utilisantUninitializeReason() vous pouvez vérifier le code de désinitialisation et, si sa valeur est égale àREASON_PARAMETERS, décider de ce qu'il faut faire ensuite.
 
Artyom Trishkin:
Dès qu'un utilisateur appelle la fenêtre des paramètres de l'EA (F7) et clique sur le bouton OK, OnDeinit() est immédiatement appelé, ce qui, à son tour, écrit dans le code de désinitialisation la valeur de REASON_PARAMETERS. Ensuite, OnInit() est appelé, où en utilisant UninitializeReason() vous pouvez vérifier le code de désinitialisation et, si sa valeur est égale àREASON_PARAMETERS, décider de ce qu'il faut faire ensuite.

Très bien.

S'il vous plaît :

1) Exécutez d'abord mon code, que j'ai donné dans mon premier message. Je ne l'ai pas mis là pour le plaisir de la beauté... Vous pouvez l'exécuter sur n'importe quel graphique.

2) Appelez la fenêtre des paramètres de l'EA.

3) Modifiez le paramètre et appuyez sur OK.

Si vous regardez attentivement mon code, le résultat ne vous surprendra pas : OnDeinit() ne sera pas appelé.

 

En plus de cela, j'ai ajouté une impression dans le deinit, à la fois la raison et le paramètre, afin que vous puissiez vous assurer que l'expert n'atteint PAS le deinit.

Veuillez noter la pièce la plus importante du code :

void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

Il s'agit d'une émulation claire d'un long calcul qui ne sera pas interrompu par un changement des paramètres d'entrée. Et je dois l'interrompre et la question est comment ? :)

Je veux juste m'assurer que je ne manque rien dans MQL5 et il n'y a vraiment rien d'autre dans le langage que_StopFlag, qui malheureusement ne résout pas cette situation.

En gros, j'ai besoin d'attraper le moment où les paramètres d'entrée changent pendant un calcul lourd.

 
Marat Sultanov:

En plus de cela, j'ai ajouté une impression dans le deinit, à la fois la raison et le paramètre, afin que vous puissiez vous assurer que l'expert n'atteint PAS le deinit.

Veuillez noter la pièce la plus importante du code :

Il s'agit d'une émulation claire d'un long calcul qui ne sera pas interrompu par un changement des paramètres d'entrée. Et je dois l'interrompre et la question est comment ? :)

Je veux juste m'assurer que je ne manque rien dans MQL5 et il n'y a vraiment rien d'autre dans le langage que_StopFlag, qui malheureusement ne résout pas cette situation.

En gros, j'ai besoin d'attraper le moment où les paramètres d'entrée changent pendant un calcul lourd.

En gros, relisez attentivement ce que je vous ai écrit et supprimez la boucle infinie de votre code.

Êtes-vous sûr que placer le conseiller expert dans une boucle infinie est la bonne solution ?

Raison: