Auto-apprentissage du langage MQL5 à partir de zéro - page 43

 
Реter Konow:
Vous avez certainement fait un grand pas en avant dans le sujet principal - vous avez maîtrisé et commencé à utiliser les fonctions, et félicitations à vous, bien sûr !)

A ce rythme, vous serez bientôt à la traîne...

Je consolide la matière que j'ai apprise jusqu'à présent, et j'ai commencé à étudier pour et pendant les boucles. Le suivi, bien que dans un avenir lointain, mais c'est une partie obligatoire de mon plan d'auto-apprentissage.

Salutations, Vladimir.

 
MrBrooklin:

...

Dans l'ensemble, le script est écrit correctement. Il ne tient pas compte de la valeur nulle de Period_learning, mais sinon, il est bon.

Nous devons ajouter des arguments et des calculs aux fonctions afin de "saturer" leur travail, car maintenant elles substituent une variable à une autre ou se contentent de renvoyer une valeur sans rien en faire. En tant qu'exemple d'utilisation de fonctions, cette option est parfaite, mais en réalité, le script doit avoir une tâche soluble, ce qui n'est pas le cas dans cet exemple.

Par conséquent, je suggère soit d'étendre ce script et de le rendre plus complexe, soit d'inventer et d'écrire un nouveau script plus significatif, rempli de calculs dans des fonctions et avec un petit arbre de conditions if-else.

Réfléchissez au type de problème qu'il pourrait résoudre.



 
Реter Konow:
Dans l'ensemble, le script est écrit correctement. Il ne prend pas en compte la valeur nulle de Period_learning, mais sinon c'est bon.

Nous devons ajouter des arguments et des calculs aux fonctions pour les rendre "significatives", parce que maintenant elles remplacent une variable par une autre ou renvoient simplement une valeur sans rien en faire. En tant qu'exemple d'utilisation de fonctions, cette option est parfaite, mais en réalité, le script doit avoir une tâche soluble, ce qui n'est pas le cas dans cet exemple.

Par conséquent, je suggère soit d'étendre et de compliquer ce script, soit d'en concevoir et d'en écrire un nouveau qui soit plus significatif, rempli de calculs dans des fonctions et doté d'un petit arbre de conditions if-else.

Pensez au genre de problème qu'il pourrait résoudre.

Ok, Peter, je vais réfléchir à comment compliquer le script et appliquer une condition if-else à l'intérieur de la fonction.

Salutations, Vladimir.

 

Bonne journée et bonne humeur à tous !

Je continue à étudier le langage de programmation MQL5. En tenant compte des conseils de Peter Konov, je colle le code finalisé du script qui est la continuation d'une des tâches des participants de ce fil. Le script a été testé dans tous les modes. Aucun problème détecté. Pour commencer, j'ai appliqué le nombre minimal de paramètres d'entrée. Le code du script est écrit en anglais, les commentaires du code sont en russe, pour faciliter le processus d'apprentissage. Comme je l'ai promis plus tôt, j'ai essayé de décrire le script d'une manière compréhensible pour un élève de la première classe de l'école de programmation.

Meilleures salutations, Vladimir.

//+------------------------------------------------------------------+
//|                                                Learning_MQL5.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2020, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property description "Скрипт подводит итог обучения языку программирования MQL5. В зависимости от"
#property description "входных параметров печатает во вкладке \"Эксперт\" торгового терминала два"
#property description "сообщения на русском языке: \"Я выучу язык MQL5!\" или \"Я не выучу язык MQL5!\""
#property description "Код скрипта написан на основе примера, приведенного Valeriy Yastremskiy на сайте"
#property description "MQL5, в теме \"Самообучение языку MQL5 с полного нуля\"."
#property description "======================================================"
#property description "Ссылка на пример https://www.mql5.com/ru/forum/352460/page30#comment_18646826"
//---
#property version     "1.00"              //версия скрипта 1.00
//---
#property script_show_inputs              //выводить окно со свойствами перед запуском скрипта 
//--- Зададим входные параметры скрипта:
input ushort Period_learning=500;         //Полный период обучения (в днях)
input ushort Days_passed=10;              //Сколько дней прошло с начала обучения (в днях)
input bool   Patience=true;               //Терпение (true - достаточно; false - не достаточно)
//--- Зададим глобальные переменные:
//переменная enough_time (достаточно времени), где bool - логическое значение: истина (true) или ложь (false)
bool enough_time;
//переменная enough_patience (достаточно терпения), где bool - логическое значение: истина (true) или ложь (false)
bool enough_patience;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() //старт работы скрипта
  {
   /* Зададим условие для работы скрипта. Если:
      1. значение функции "имею время" будет равно значению истина (true)
      2. и значение функции "имею терпение" будет равно значению истина (true)
   */
   if(have_time()==true && have_patience()==true)
     {
      Print("Я выучу язык MQL5!");    //выводим сообщение "Я выучу язык MQL5!"
     }
   else //в противном случае
     {
      Print("Я не выучу язык MQL5!"); //выводим сообщение "Я не выучу язык MQL5!"
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Функция "имею_время"
bool have_time()                 //создаём функцию "имею_время" и присвоим тип данных bool
  {
   /* Если:
      1. значение входного параметра Period_learning больше нуля
      2. и значение входного параметра Days_passed больше или равно значения входного параметра Period_learning
   */
   if(Period_learning>0 && Days_passed>=Period_learning)
      enough_time=true;          //то тогда значение enough_time (достаточно времени) будет равно истине (true)
   return(enough_time);          //возвращаем значение "достаточно времени" в функцию "имею время"
  }
//--- Функция "имею_терпение"
bool have_patience()             //создаём функцию "имею_терпение" и присвоим тип данных bool
  {
   enough_patience=Patience;     //задаём для переменной enough_patience (достаточно терпения) значение равное
                                 //входному параметру "Терпение" (Patience): истина или ложь
   return(enough_patience);      //возвращаем значение "достаточно терпения" в функцию "имею терпение"
  }
//+------------------------------------------------------------------+
 
MrBrooklin:

Bonne journée et bonne humeur à tous !

Je continue à étudier le langage de programmation MQL5. En tenant compte des conseils de Peter Konov, je colle le code finalisé du script qui est la continuation d'une des tâches des participants de ce fil. Le script a été testé dans tous les modes. Aucun problème détecté. Pour commencer, j'ai appliqué le nombre minimal de paramètres d'entrée. Le code du script est écrit en anglais, les commentaires du code sont en russe, pour faciliter le processus d'apprentissage. Dans ce script, j'ai essayé de décrire la situation comme je l'ai promis plus tôt, d'une manière accessible à un étudiant de 1ère classe de l'école de programmation.

Salutations, Vladimir.

Corrigez une erreur en une fois et ce sera parfait.

Le fait est qu'il y a une erreur structurelle dans la fonction have_time(). Voici un indice :

Si le corps d'une condition n'est pas entouré de crochets, la condition elle-même ne fait référence qu'à la première ligne qui la suit. Comme le corps de votre condition ne contient pas de parenthèses, l'entrée dans le corps de enough_time =true ; n'est pas liée à l'extension return suivante qui renverra toujours la dernière valeur de enough_time. Ainsi, même si la condition est fausse mais que la variable a obtenu la valeur true auparavant, return retournera true.

Pensez à la façon de le réparer.

P.S. Même s'il s'agit d'un script et qu'il ne fonctionnera qu'une seule fois, il y a toujours une erreur.

P.S.S. Et aussi, les variables globales devraient être initialisées avec une valeur initiale, et vous avez 2 variables non initialisées. Il s'agit d'une "semi-erreur".
 
Реter Konow:
Corrigez une erreur et ce sera parfait.

Le fait est qu'il y a une erreur structurelle dans have_time(). Voici un indice :

Si le corps de la condition n'est pas entouré de crochets, la condition elle-même est liée uniquement à la première ligne qui la suit. Comme le corps de votre condition ne contient pas de parenthèses, l'entrée dans le corps de enough_time =true ; n'est pas liée à l'extension return suivante qui renverra toujours la dernière valeur de enough_time. Ainsi, même si la condition est fausse mais que la variable a obtenu la valeur true auparavant, return retournera true.

Pensez à la façon de le réparer.

P.S. Même s'il s'agit d'un script et qu'il ne fonctionnera qu'une seule fois, il y a toujours une erreur.

P.S.S. Et aussi, les variables globales devraient être initialisées avec une valeur initiale, et vous avez 2 variables non initialisées. Il s'agit d'une "semi-erreur".

À propos de la fonction, je suppose que c'est ainsi que le code aurait dû être écrit :

//--- Функция "имею_время"
bool have_time()                //создаём функцию "имею_время" и присвоим тип данных bool
  {
   /* Если:
      1. значение входного параметра Period_learning больше нуля
      2. и значение входного параметра Days_passed больше или равно значения входного параметра Period_learning
   */
   if(Period_learning>0 && Days_passed>=Period_learning)
     {
      enough_time=true;         //то значение enough_time (достаточно времени) будет равно истине (true)
     }
   else                         //в противном случае 
     {
      enough_time=false;        //значение enough_time (достаточно времени) будет равно ложь (false)
     }
   return(enough_time);         //возвращаем значение "достаточно времени" в функцию "имею время"
  }
Sincèrement, Vladimir.
 
MrBrooklin:

À propos de la fonction, je suppose que c'est ainsi que le code aurait dû être écrit :

Sincèrement, Vladimir.
C'est ça !
 
Реter Konow:
Il suffit de corriger une seule erreur pour que tout soit parfait.

Le fait est qu'il y a une erreur structurelle dans have_time(). Voici un indice :

Si le corps de la condition n'est pas entouré de crochets, la condition elle-même est liée uniquement à la première ligne qui la suit. Puisque le corps de votre condition ne contient pas de parenthèses, l'entrée dans le corps de enough_time =true ; n'est pas liée au retour - il retournera toujours la dernière valeur de enough_time. Ainsi, même si la condition est fausse mais que la variable a obtenu la valeur true auparavant, return retournera true.

Pensez à la façon de le réparer.

P.S. Même s'il s'agit d'un script et qu'il ne fonctionnera qu'une seule fois, il y a toujours une erreur.

P.S.S. Et aussi, les variables globales devraient être initialisées avec une valeur initiale, et vous avez 2 variables non initialisées. Il s'agit d'une "semi-erreur".

Les objets globaux, sont initialisés par défaut par le constructeur. Pour les types primitifs (dans notre cas, tous sauf les chaînes de caractères), c'est 0. Mais pour la mémoire (lire les variables) allouée sur la pile, elle n'est pas initialisée. C'est pourquoi les variables globales peuvent ne pas être initialisées, rappelez-vous que dans ce cas elles seront égales à zéro. Mais l'absence d'initialisation (en même temps, habituez-vous à éviter immédiatement les avertissements générés par le compilateur, à moins que vous ne sachiez exactement ce que vous faites) est un problème sérieux, car la lecture d'une variable non initialisée entraîne un comportement indéfini. Par exemple, ce code se comporte différemment dans les versions release et debug et personne ne peut garantir que lorsque vous changez la version du compilateur ou les paramètres d'optimisation, son comportement ne changera pas aussi :

int Test(bool condition,int in){
   int ret;
   if (condition) ret=in;
   return ret;
}

void OnStart()
{
   for(int i=0;i<5;Print(Test(false,i++)));
}
 
Реter Konow:

"...P.S.S. Et aussi, les variables globales devraient être initialisées avec une valeur initiale et vous avez 2 variables non initialisées. C'est une 'semi-erreur'..."

Peter, au sujet des variables globales, je n'ai pas encore trouvé dans la littérature que les variables globales doivent être prédéfinies. Avez-vous un lien vers la source pour améliorer vos connaissances en la matière ? La référence MQL5 ne contient pas de référence explicite à l'initialisation :

Le type bool est conçu pour stocker les valeurs booléennes true ou false, dont la représentation numérique est respectivement 1 ou 0 .

Exemples :

bool a =true;
bool b =false;
bool c =1;

La représentation interne est un nombre entier de 1 octet. Il convient de noter que dans les expressions booléennes, il est acceptable d'utiliser d'autres types entiers ou réels ou des expressions de ces types à la place de bool, et le compilateur ne générera pas d'erreur. Dans ce cas, le zéro sera interprété comme faux et toutes les autres valeurs comme vraies.

Sincèrement, Vladimir.
 
Vladimir Simakov:

Les objets globaux, sont initialisés avec le constructeur par défaut. Pour les types primitifs (dans notre cas, tous sauf les chaînes de caractères), c'est 0. Mais pour la mémoire (lire les variables) allouée sur la pile, elle n'est pas initialisée. C'est pourquoi les variables globales peuvent ne pas être initialisées, rappelez-vous que dans ce cas elles seront égales à zéro. Mais l'absence d'initialisation (en même temps, habituez-vous à éviter immédiatement les avertissements générés par le compilateur, à moins que vous ne sachiez exactement ce que vous faites) est un problème sérieux, car la lecture d'une variable non initialisée entraîne un comportement indéfini. Par exemple, ce code se comporte différemment dans les versions release et debug et personne ne peut garantir que lorsque vous changez la version du compilateur ou les paramètres d'optimisation, son comportement ne changera pas aussi :

Ceci est certainement informatif, mais les variables globales devraient être initialisées explicitement pour plus de clarté. Par exemple, dans mql4, les variables/réseaux peuvent n'être initialisés nulle part lors de leur déclaration, et ils obtiennent toujours le zéro initial. ))