从头开始自学MQL5语言 - 页 43

 
Реter Konow:
你肯定在主旨上迈出了一大步--你已经掌握并开始使用函数,当然,祝贺你!)

按照这种速度,你很快就会落后...

我正在巩固我迄今所学的材料,以及我已经开始学习和而循环。追踪,虽然是在遥远的未来,但这是我自我学习计划中的一个强制性部分。

问候,弗拉基米尔。

 
MrBrooklin:

...

总的来说,剧本写得很正确。它没有考虑到Period_learning 的空值,但除此之外,它是好的。

我们需要给函数添加参数和计算,以便使它们的工作 "饱和",因为现在它们用一个变量替代另一个变量,或者只是返回一个值而不做任何处理。作为一个使用函数的例子,这个选项很好,但是在现实中,脚本应该有一个可解的任务,而这个例子中却没有。

因此,我建议要么扩展这个脚本,使其更加复杂,要么发明和编写一个新的脚本,使其更有意义,充满函数的计算,并有一个小的if-else条件树。

想一想它能解决什么样的问题。



 
Реter Konow:
总的来说,剧本写得很正确。它没有考虑到Period_learning的空值,但除此之外,它很好。

我们需要在函数中加入参数和计算,使它们变得 "有意义",因为现在它们用一个变量替代另一个变量,或者只是返回一个值而不做任何处理。作为一个使用函数的例子,这个选项很好,但是在现实中,脚本应该有一个可解的任务,而这个例子中却没有。

因此,我建议要么扩展和复杂化这个脚本,要么想出并编写一个更有意义的新脚本,在函数中充满计算,并有一个小的if-else条件树。

想一想它能解决什么样的问题。

好的,彼得,我会考虑如何使脚本复杂化,在函数中应用if-else条件语句。

问候,弗拉基米尔。

 

大家今天好,心情好

我继续学习MQL5编程语言。考虑到Peter Konov的提示,我粘贴了脚本的最终代码,它是这个主题的参与者的一项任务的延续。该脚本已在所有模式下进行了测试。没有发现问题。首先,我应用了最小数量的输入参数。脚本代码是用英语写的,代码的注释是用俄语写的,以方便学习。正如我先前所承诺的那样,我试图以一个编程学校一年级学生可以理解的方式来描述这个脚本。

最好的问候,弗拉基米尔。

//+------------------------------------------------------------------+
//|                                                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:

大家今天好,心情好

我继续学习MQL5编程语言。考虑到Peter Konov的提示,我粘贴了脚本的最终代码,它是这个主题的参与者的一项任务的延续。该脚本已在所有模式下进行了测试。没有发现问题。首先,我应用了最小数量的输入参数。脚本代码是用英语写的,代码的注释是用俄语写的,以方便学习。正如我先前所承诺的那样,我试图以一个编程学校一年级学生可以理解的方式来描述这个脚本。

问候,弗拉基米尔。

即时修正一个错误,就会变得完美。

重点是,函数have_time()存在结构性错误。这里有一个提示。

如果一个条件的主体没有用大括号括起来,那么这个条件本身只指它后面的第一行。由于你的条件主体不包含括号,所以主体中的 enough_time =true;的条目与接下来的return-extension没有关系,它将始终返回 enough_time 的最后一个值。因此,即使条件是假的,但变量之前的值是真,返回也会返回真。

想想如何解决这个问题。

P.S. 尽管这是一个脚本,而且只工作一次,但仍有一个错误。

P.S.S. 还有,全局变量应该用一个初始值进行初始化,而你有两个变量没有初始化。这是一个 "半错误"。
 
Реter Konow:
修正一个错误,它就会变得完美。

关键是have_time()中存在一个结构性错误。这里有一个提示。

如果条件的主体没有用大括号括起来,那么条件本身只与它后面的第一行有关。由于你的条件主体不包含括号,所以主体中的 enough_time =true;的条目与接下来的return-extension没有关系,它将始终返回 enough_time 的最后一个值。因此,即使条件是假的,但变量之前的值是真,返回也会返回真。

想想如何解决这个问题。

P.S. 尽管这是一个脚本,而且只工作一次,但仍有一个错误。

P.S.S. 还有,全局变量应该用一个初始值进行初始化,而你有两个变量没有初始化。这是一个 "半错误"。

关于这个函数,我想代码应该是这样写的。

//--- Функция "имею_время"
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);         //возвращаем значение "достаточно времени" в функцию "имею время"
  }
真诚的,弗拉基米尔。
 
MrBrooklin:

关于这个函数,我想代码应该是这样写的。

真诚的,弗拉基米尔。
对了!
 
Реter Konow:
只要直接修复一个错误,就会变得完美。

关键是have_time()中存在一个结构性错误。这里有一个提示。

如果条件的主体没有用大括号括起来,那么条件本身只与它后面的第一行有关。由于你的条件主体不包含括号,所以 enough_time =true;主体中的条目与返回无关--它将总是返回 enough_time 的最后一个值。因此,即使条件是假的,但变量之前的值是真,返回也会返回真。

想想如何解决这个问题。

P.S. 尽管这是一个脚本,而且只工作一次,但仍有一个错误。

P.S.S. 还有,全局变量应该用一个初始值进行初始化,而你有两个变量没有初始化。这是一个 "半错误"。

全局对象,默认是由构造函数初始化 的。对于原始类型(在我们的例子中,除了字符串以外的所有类型),它是0。 但对于在堆栈上分配的内存(读变量),它们是不初始化的。这就是为什么全局变量可能没有被初始化,记住在这种情况下它们将等于零。但是没有初始化(同时,要习惯于马上避免编译器产生的警告,除非你很清楚自己在做什么)是一个严重的问题,因为读取一个未初始化的变量会导致未定义行为。例如,这段代码在发布版和调试版中的行为是不同的,没有人能够保证当你改变编译器版本或优化设置时,它的行为也不会改变。

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. 还有,全局变量应该用一个初始值进行初始化,你有两个变量没有初始化。这是一个'半错误'......"

Peter,关于全局变量 的问题,我还没有在文献中发现全局变量需要被预定义的说法。你是否有一个来源的链接,以提高你在这个问题上的知识?MQL5参考文献不包含 对初始化的明确参考

bool类型 设计用来存储布尔值 truefalse ,其数字表示分别为1或0

例子。

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

内部表示是一个1字节的整数。应该注意的是,在布尔表达式中,使用其他整数或实数类型或这些类型的表达式来代替布尔是可以接受的,而且编译器不会产生错误。在这种情况下,零将被解释为假,所有其他的值都是真。

真诚的,弗拉基米尔。
 
Vladimir Simakov:

全局对象,用默认的构造函数进行初始化。对于原始类型(在我们的例子中,除字符串外的所有类型),它是0。 但对于在堆栈上分配的内存(读变量),它们是不初始化的。这就是为什么全局变量可能没有被初始化,记住在这种情况下它们将等于零。但是没有初始化(同时,要习惯于马上避免编译器产生的警告,除非你很清楚自己在做什么)是一个严重的问题,因为读取一个未初始化的变量会导致未定义行为。例如,这段代码在发布版和调试版中的行为是不同的,没有人能够保证当你改变编译器版本或优化设置时,它的行为也不会改变。

这当然是有参考价值的,但为了清晰起见,全局变量应该被明确初始化。例如,在mql4中,变量/数组在声明时可以不在任何地方初始化,而且它们仍然得到初始零。))