Discussion de l'article "Le MQL5 Cookbook : Commandes de la sous-fenêtre d'indicateur - Boutons" - page 4

 
DC2008:

Et le fait que "les fonctions des boutons sont placées dans la fonction OnInit" est très drôle !

Cependant, peut-être ne comprenez-vous pas de quoi nous parlons ? Si vous appuyez sur un bouton, une fonction utilisateur doit être déclenchée pour effectuer une micro-tâche.

 
DC2008:

D'accord, rions un peu. L'article a été écrit par vous, "personne ne vous a tiré la langue".

Ainsi, l'explication sous forme de citations de l'inexplicable est pour le moins irrespectueuse pour vos lecteurs. Les réponses aux questions doivent être accompagnées d'exemples et de liens vers des sources primaires.

Un code confus et surchargé de fonctions inutiles ne fait qu'induire en erreur les "débutants".

Et le fait que "les fonctions des boutons sont placées dans la fonction OnInit" est très drôle !

Personne ne vous a tiré par la langue. Allez-vous me donner des preuves ? Ou plutôt, une réfutation de mon affirmation ? Pour votre information, tout n'est pas encore décrit dans le manuel. Je veux dire que le travail sur le manuel est en cours, des ajouts et des corrections sont effectués. Vous devriez toujours tout vérifier par vous-même.

Croyez-moi, le code de votre article est beaucoup plus "déroutant" pour les débutants et pas seulement, comme on peut le voir dans la discussion de votre article.

Cependant, peut-être ne comprenez-vous pas de quoi nous parlons ? Si vous cliquez sur un bouton, une fonction utilisateur doit être déclenchée pour effectuer une micro-tâche.

Oui, je l'ai pris au pied de la lettre. Posez vos questions avec plus de précision. Mais je m'attends à ce que vous ridiculisiez ma réponse, puisque vous semblez disposer d'une telle fonction aujourd'hui.

Dans ce cas, la "micro-tâche" consistait à changer la couleur du bouton. J'ai fait exprès de ne pas ajouter de fonctions supplémentaires pour ne pas avoir quelque chose de superflu. Juste pour éviter de surcharger le code.

En fait, le sujet de l'article ne se limite pas aux boutons. La plus grande partie de l'article concerne les événements graphiques. Il existe peu d'exemples de ce type, j'ai donc décidé d'en écrire un.

 

Cher auteur de l'article, vous ne l'avez pas écrit pour moi, mais pour les débutants. En effet, vos solutions ne m'intéressent pas, mais nous parlons de ceux qui commencent à connaître la langue. De quels "autres programmes" parlons-nous ? Et comment la fonction OnDeinit d' un programme peut-elle affecter les fonctions d'autres programmes ?

Nous discutons d'un article et pourquoi êtes-vous si indigné ?

Essayez de répondre à ces questions non pas pour moi, mais pour les débutants - afin qu'ils comprennent le pourquoi et le comment.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
DC2008:

Cher auteur de l'article, vous ne l'avez pas écrit pour moi, mais pour les débutants.

C'est tout à fait exact.

En effet, vos solutions ne m'intéressent pas, mais nous parlons de ceux qui commencent à connaître la langue.

Mais vous posez des questions.

De quels "autres programmes" parlons-nous ?

De ceux-là mêmes dont vous avez donné les liens précédemment. Et vous essayez de réfuter mon affirmation par des allusions sans donner de preuve.

Et comment la fonction OnDeinit d' un programme peut-elle affecter les fonctions d'autres programmes ?

C'est le cas. J'ai écrit à ce sujet. L'éditeur qui a publié l'article l'a confirmé. Vous pouvez également vérifier et voir par vous-même.

Nous discutons de l'article et qu'est-ce qui vous déplaît tant ?

Rien. J'attends une réfutation de mon affirmation. )

Essayez de répondre aux questions non pas pour moi, mais pour les nouveaux arrivants - afin qu'ils comprennent pourquoi et comment.

Jusqu'à présent, les nouveaux arrivants n'ont posé aucune question. Et il ne peut y avoir de questions. Tout est très clair et chaque ligne de code est commentée en détail.

 

Nous bloquons ceci en premier :

void OnTimer()
  {
//--- Vérifier si le suivi des événements de la souris est activé
   //CheckChartEventMouseMove() ;

  }

c'est-à-dire que maintenant nous ne suivons pas les événements de la souris, n'est-ce pas ?

Exécutez votre code sur le graphique :

Nous exécutons maintenant un "autre programme", c'est-à-dire votre code à nouveau :

Je suppose que quelque chose n'a pas fonctionné, ou est-ce ce que nous sommes censés faire ?

Nous supprimons maintenant l'un des indicateurs et, selon l'auteur du code, nous avons perdu le "suivi de la souris", mais ce n'est pas le cas :

 
C-4:

Si vous ne remplissez pas les conditions requises, je ne sais pas qui les remplit. Danald Knuth ? Bill Gates ?

J'essayais juste d'obtenir un compliment. Ça a marché).

C-4:
Je vois. Mais ce qui n'est pas clair, c'est que les produits phares du marché que vous avez créés ne vous appartiennent pas. N'est-ce pas dommage ?

1. Ce n'est pas encore le soir)

2. Mon artisanat est aussi constamment dans le top, bien qu'il ne soit pas en comparaison avec le panel.

3. Le succès du panneau est largement dû aux efforts de l'auteur de l'idée, il est donc incorrect de dire que c'est mon produit.

4. Je n'ai pas travaillé gratuitement)

 
DC2008:

...

Nous supprimons maintenant l'un des indicateurs et, selon l'auteur du code, nous avons perdu le "suivi de la souris", mais ce n'est pas le cas :

Vérifiez maintenant si l'événement OnDeinit() est déclenché dans les indicateurs. C'est le point intéressant que j'ai mentionné précédemment. :) A savoir que dans OnDeinit(), dans l'exemple de l'article, l'événement de suivi de mouvement est désactivé. Depuis une certaine version, il semble que OnDeinit() ne fonctionne plus du tout dans les indicateurs. Il s'agit d'un bug et nous devrions en informer les développeurs.

De plus, pour s'assurer que ma déclaration est correcte, nous devons créer un Expert Advisor vierge (la fonction OnDeinit() fonctionne dans les Expert Advisors), dans lequel il suffit d'ajouter cette ligne de code (surlignée) :

//+------------------------------------------------------------------+
//|TEST.mq5 |
//| Copyright 2013, MetaQuotes Software Corp.
//| http ://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Désactiver le suivi des événements de la souris
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
//| OnTick|
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+

//---

Et maintenant, si vous supprimez l'Expert Advisor lorsque l'indicateur de l'article est sur le graphique, le suivi de l'événement de mouvement sera désactivé dans l'indicateur également.

A propos de celui-ci, quelque chose a dû mal se passer ?

quelque chose a dû mal se passer ? ou c'est ainsi que c'est conçu ?

C'est connu. Il n'est pas conçu de cette manière, c'est simplement que cet article n'en tient pas compte. L'article, comme toujours, est un simple exemple, pas une solution toute faite pour tous les cas. )

 
Sergey, ne fais pas d'histoires. Par exemple, je n'ai pas compris pourquoi il fallait utiliser un minuteur. Mais en quelques instants, j'ai trouvé une explication dans l'article et j'ai immédiatement tout compris. Je n'ai pas vérifié cette affirmation dans la pratique, mais je fais confiance à l'auteur, conscient qu'il a écrit l'article pour une raison, et que si la minuterie a été introduite, c'est qu'il y avait des raisons à cela.
 
void OnDeinit(const int reason)
  {
//--- Désactiver le suivi des événements de la souris
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }

D'une manière générale, ce code semble très problématique. Il n'y a aucune raison de désactiver le suivi des mouvements de la souris lors de la désactivation de l'Expert Advisor/indicateur. Si vous voulez vous donner autant de mal, vous devriez rétablir l'état qui existait avant le lancement de l'Expert Advisor :

bool mouseStatus;
void OnInit()
  {
  mouseStatus = ChartGetInteger(0,CHART_EVENT_MOUSE_MOVE);
  }

void OnDeinit(const int reason)
  {
   //--- Désactiver le suivi des événements de la souris
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,mauseStatus);
  }
 
C-4:

D'une manière générale, ce code semble assez problématique. Il n'y a pas de véritable raison de désactiver le suivi des mouvements de la souris lors de la désactivation du conseiller/indicateur expert.

Non, vous vous trompez. Il y a de vraies raisons de désactiver le suivi de la souris. Et je vais le prouver maintenant. )

Par exemple, vous avez deux programmes qui tournent sur un graphique. Le conseiller expert, dans lequel vous devez suivre le mouvement de la souris. Et un indicateur dans lequel vous n'avez pas besoin de suivre le mouvement de la souris, mais vous avez besoin de suivre d'autres événements graphiques.

Exécutez maintenant le code de l'Expert Advisor :

#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Activer le suivi des événements de la souris
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Désactiver le suivi des événements de la souris
   //ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false) ;
  }
//+------------------------------------------------------------------+
//| OnTick|
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+
//| Fonction ChartEvent|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Suivi des mouvements de la souris et des pressions sur le bouton gauche de la souris
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static int count=1;
      Print("CHARTEVENT_MOUSE_MOVE; EXPERT; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

Dans ce code, lors de l'initialisation, dans la fonction OnInit(), le suivi du mouvement de la souris est activé. Mais la ligne de la fonction OnDeinit(), où ce suivi devrait être désactivé, est intentionnellement commentée.

Chargez également l'indicateur sur le graphique. Voici son code :

#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Fonction d'itération de l'indicateur personnalisée
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- valeur de retour de prev_calculated pour l'appel suivant
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Fonction ChartEvent|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Suivi des mouvements de la souris et des pressions sur le bouton gauche de la souris
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static long count=1;
      Print("CHARTEVENT_MOUSE_MOVE; INDICATOR; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

Le premier et le deuxième programme impriment un message dans le journal indiquant que l'événement a été reçu. Retirez maintenant l'Expert Advisor du graphique. Supposons que vous ayez effectué quelques calculs avec son aide et que vous n'en ayez plus besoin. Après son retrait, comme l'événement de suivi du mouvement de la souris n'a pas été désactivé, l'indicateur continue de recevoir cet événement. Et vous n'en avez pas besoin.

Êtes-vous d'accord maintenant ? )