Die Sprache MQL5 von Grund auf selbst erlernen - Seite 43

 
Реter Konow:
Sie haben sicherlich einen großen Schritt nach vorne im Hauptthema gemacht - Sie haben Funktionen gemeistert und begonnen, sie zu benutzen, und ich gratuliere Ihnen natürlich!)

Wenn das so weitergeht, bist du bald im Rückstand...

Ich bin dabei, den bisher gelernten Stoff zu festigen und habe begonnen, für und während der Schleifen zu lernen. Trailing, wenn auch in ferner Zukunft, aber es ist ein obligatorischer Teil meines Selbststudienplans.

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin:

...

Im Großen und Ganzen ist das Drehbuch korrekt geschrieben. Der Nullwert von Period_learning wird nicht berücksichtigt, aber ansonsten ist es gut.

Wir müssen den Funktionen Argumente und Berechnungen hinzufügen, um ihre Arbeit zu "sättigen", denn jetzt ersetzen sie eine Variable durch eine andere oder geben nur einen Wert zurück, ohne etwas damit zu tun. Als Beispiel für die Verwendung von Funktionen ist diese Option in Ordnung, aber in Wirklichkeit sollte das Skript eine lösbare Aufgabe haben, die in diesem Beispiel nicht vorhanden ist.

Daher schlage ich vor, entweder dieses Skript zu erweitern und komplexer zu machen oder ein neues Skript zu erfinden und zu schreiben, das sinnvoller ist, voller Berechnungen in Funktionen und mit einem kleinen Wenn-dann-Bedingungsbaum.

Überlegen Sie, welche Art von Problem damit gelöst werden könnte.



 
Реter Konow:
Im Großen und Ganzen ist das Drehbuch korrekt geschrieben. Es berücksichtigt nicht den Nullwert von Period_learning, aber sonst ist es gut.

Wir müssen den Funktionen Argumente und Berechnungen hinzufügen, um sie "sinnvoll" zu machen, denn jetzt ersetzen sie eine Variable durch eine andere oder geben einfach einen Wert zurück, ohne etwas damit zu tun. Als Beispiel für die Verwendung von Funktionen ist diese Option in Ordnung, aber in Wirklichkeit sollte das Skript eine lösbare Aufgabe haben, die in diesem Beispiel nicht vorhanden ist.

Daher schlage ich vor, entweder dieses Skript zu erweitern und zu verkomplizieren oder ein neues Skript zu entwickeln und zu schreiben, das sinnvoller ist, voller Berechnungen in Funktionen und mit einem kleinen if-else-Bedingungsbaum.

Überlegen Sie, welche Art von Problem damit gelöst werden könnte.

Ok, Peter, ich werde darüber nachdenken, wie ich das Skript verkomplizieren und eine if-else-Bedingungsanweisung innerhalb der Funktion anwenden kann.

Mit freundlichen Grüßen, Vladimir.

 

Guten Tag und gute Laune an alle!

Ich lerne weiter die Programmiersprache MQL5. Unter Berücksichtigung der Tipps von Peter Konov füge ich hier den fertigen Code des Skripts ein, das eine Fortsetzung einer der Aufgaben der Teilnehmer dieses Threads ist. Das Skript wurde in allen Modi getestet. Keine Probleme festgestellt. Zunächst habe ich die minimale Anzahl von Eingabeparametern verwendet. Der Skriptcode ist auf Englisch geschrieben, die Kommentare zum Code sind auf Russisch, um den Lernprozess zu erleichtern. Wie ich vorhin versprochen habe, habe ich versucht, das Skript so zu beschreiben, dass es für einen Schüler der 1. Klasse der Programmierschule verständlich ist.

Mit freundlichen Grüßen, 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:

Guten Tag und gute Laune an alle!

Ich lerne weiter die Programmiersprache MQL5. Unter Berücksichtigung der Tipps von Peter Konov füge ich hier den fertigen Code des Skripts ein, das eine Fortsetzung einer der Aufgaben der Teilnehmer dieses Threads ist. Das Skript wurde in allen Modi getestet. Keine Probleme festgestellt. Zunächst habe ich die minimale Anzahl von Eingabeparametern verwendet. Der Skriptcode ist auf Englisch geschrieben, die Kommentare zum Code sind auf Russisch, um den Lernprozess zu erleichtern. Wie ich vorhin versprochen habe, habe ich versucht, das Skript so zu beschreiben, dass es für einen Schüler der 1. Klasse der Programmierschule verständlich ist.

Mit freundlichen Grüßen, Vladimir.

Korrigieren Sie einen Fehler im Handumdrehen und es wird perfekt sein.

Der Punkt ist, dass es einen strukturellen Fehler in der Funktion have_time() gibt. Hier ist ein Hinweis:

Wenn der Textkörper einer Bedingung nicht in geschweifte Klammern eingeschlossen ist, bezieht sich die Bedingung selbst nur auf die erste Zeile, die ihr folgt. Da der Körper Ihrer Bedingung keine Klammern enthält, steht der Eintrag im Körper von enough_time =true; in keinem Zusammenhang mit der nächstfolgenden return-Erweiterung, die immer den letzten Wert von enough_time zurückgibt. Selbst wenn die Bedingung falsch ist, die Variable aber zuvor den Wert true erhalten hat, gibt return also true zurück.

Überlegen Sie, wie Sie das Problem lösen können.

P.S. Obwohl es sich um ein Skript handelt und es nur einmal funktioniert, tritt trotzdem ein Fehler auf.

P.S.S. Und außerdem sollten globale Variablen mit einem Anfangswert initialisiert werden, und Sie haben 2 Variablen nicht initialisiert. Dies ist ein "Halbfehler".
 
Реter Konow:
Beheben Sie einen Fehler und es wird perfekt sein.

Der Punkt ist, dass es einen strukturellen Fehler in have_time() gibt. Hier ist ein Hinweis:

Wenn der Text der Bedingung nicht in geschweifte Klammern eingeschlossen ist, bezieht sich die Bedingung selbst nur auf die erste Zeile nach ihr. Da der Körper Ihrer Bedingung keine Klammern enthält, steht der Eintrag im Körper von enough_time =true; in keinem Zusammenhang mit der nächstfolgenden return-Erweiterung, die immer den letzten Wert von enough_time zurückgibt. Selbst wenn die Bedingung falsch ist, die Variable aber zuvor den Wert true erhalten hat, gibt return also true zurück.

Überlegen Sie, wie Sie das Problem lösen können.

P.S. Obwohl es sich um ein Skript handelt und es nur einmal funktioniert, tritt trotzdem ein Fehler auf.

P.S.S. Und außerdem sollten globale Variablen mit einem Anfangswert initialisiert werden, und Sie haben 2 Variablen nicht initialisiert. Dies ist ein "Halbfehler".

Was die Funktion betrifft, so nehme ich an, dass der Code so hätte geschrieben werden müssen:

//--- Функция "имею_время"
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);         //возвращаем значение "достаточно времени" в функцию "имею время"
  }
Mit freundlichen Grüßen, Vladimir.
 
MrBrooklin:

Was die Funktion betrifft, so nehme ich an, dass der Code so hätte geschrieben werden müssen:

Mit freundlichen Grüßen, Vladimir.
Genau!
 
Реter Konow:
Beheben Sie nur einen Fehler, und schon ist alles perfekt.

Der Punkt ist, dass es einen strukturellen Fehler in have_time() gibt. Hier ist ein Hinweis:

Wenn der Text der Bedingung nicht in geschweifte Klammern eingeschlossen ist, bezieht sich die Bedingung selbst nur auf die erste Zeile nach ihr. Da der Körper Ihrer Bedingung keine Klammern enthält, ist der Eintrag im Körper von enough_time =true; nicht mit der Rückgabe verbunden - es wird immer der letzte Wert von enough_time zurückgegeben. Selbst wenn die Bedingung falsch ist, die Variable aber zuvor den Wert true erhalten hat, gibt return also true zurück.

Überlegen Sie, wie Sie das Problem lösen können.

P.S. Obwohl es sich um ein Skript handelt und es nur einmal funktioniert, tritt trotzdem ein Fehler auf.

P.S.S. Und außerdem sollten globale Variablen mit einem Anfangswert initialisiert werden, und Sie haben 2 Variablen nicht initialisiert. Dies ist ein "Halbfehler".

Globale Objekte, werden standardmäßig durch den Konstruktor initialisiert. Für primitive Typen (in unserem Fall alle außer String) ist es 0. Aber für Speicher (Lesevariablen), die auf dem Stack zugewiesen werden, werden sie nicht initialisiert. Aus diesem Grund können globale Variablen nicht initialisiert werden; denken Sie daran, dass sie in diesem Fall gleich Null sein werden. Das Fehlen der Initialisierung (gewöhnen Sie sich daran, die vom Compiler erzeugten Warnungen sofort zu vermeiden, es sei denn, Sie wissen genau, was Sie tun) ist jedoch ein ernstes Problem, da das Lesen einer nicht initialisierten Variablen zu undefiniertem Verhalten führt. Zum Beispiel verhält sich dieser Code in Release- und Debug-Builds unterschiedlich, und niemand kann garantieren, dass sich sein Verhalten nicht auch ändert, wenn Sie die Compiler-Version oder die Optimierungseinstellungen ändern:

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. Und außerdem sollten globale Variablen mit einem Anfangswert initialisiert werden, und Sie haben 2 Variablen, die nicht initialisiert sind. Dies ist ein 'Halbfehler'..."

Peter, zum Thema globale Variablen: Ich habe in der Literatur noch nicht gefunden, dass globale Variablen vordefiniert sein müssen. Haben Sie einen Link zur Quelle, um Ihr Wissen in dieser Angelegenheit zu verbessern? Die MQL5-Referenz enthält keinen expliziten Hinweis auf die Initialisierung:

Der Typ bool ist für die Speicherung der logischen Werte true oder false vorgesehen , deren numerische Darstellung 1 bzw. 0 ist .

Beispiele:

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

Die interne Darstellung ist eine 1-Byte-Integer-Zahl. Es ist zu beachten, dass in boolschen Ausdrücken auch andere ganzzahlige oder reelle Typen oder Ausdrücke dieser Typen anstelle von bool verwendet werden können, ohne dass der Compiler einen Fehler erzeugt. In diesem Fall wird Null als falsch und alle anderen Werte als wahr interpretiert.

Mit freundlichen Grüßen, Vladimir.
 
Vladimir Simakov:

Globale Objekte, werden mit dem Standardkonstruktor initialisiert. Für primitive Typen (in unserem Fall alle außer String) ist sie 0. Aber für Speicher (Lesevariablen), die auf dem Stack zugewiesen werden, werden sie nicht initialisiert. Aus diesem Grund können globale Variablen nicht initialisiert werden; denken Sie daran, dass sie in diesem Fall gleich Null sein werden. Aber das Fehlen der Initialisierung (gewöhnen Sie sich daran, die vom Compiler erzeugten Warnungen sofort zu vermeiden, es sei denn, Sie wissen genau, was Sie tun) ist ein ernstes Problem, weil das Lesen einer nicht initialisierten Variablen zu undefiniertem Verhalten führt. Zum Beispiel verhält sich dieser Code in Release- und Debug-Builds unterschiedlich, und niemand kann garantieren, dass sich sein Verhalten nicht auch ändert, wenn Sie die Compiler-Version oder die Optimierungseinstellungen ändern:

Dies ist sicherlich informativ, aber globale Variablen sollten der Übersichtlichkeit halber explizit initialisiert werden. Zum Beispiel können in mql4 Variablen/Arrays bei der Deklaration nirgendwo initialisiert werden, und sie erhalten trotzdem den Anfangswert Null. ))
Grund der Beschwerde: