Самообучение языку MQL5 с полного нуля - страница 43

 
Реter Konow:
В главном, безусловно, Вы сделали серьезный шаг вперед - освоили и начали использовать функции, с чем Вас конечно нужно поздравить!)

Такими темпами скоро до трейлинга дойдете...

Пока закрепляю пройденный материал, а также начал изучать циклы for и while. Трейлинг, хоть и в далёкой перспективе, но зато обязательный пункт плана самообучения.

С уважением, Владимир.

 
MrBrooklin:

...

По большому счету, скрипт написан верно. Не учитывается нулевое значение Period_learning, но в остальном хорошо.

Необходимо добавить функциям аргументов и расчетов для "насыщения" смыслом их работы, ведь сейчас они подменяют одну переменную другой или просто возвращают значение ничего с ним не делая. В качестве примера использования функций, этот вариант годится, но в реальности у скрипта должна быть решаемая задача, которой в данном примере нет. 

Поэтому, предлагаю либо расширить и усложнить данный скрипт, либо придумать и написать новый, более содержательный, насыщенный расчетами в функциях и с небольшим деревом условий if-else.

Подумайте, какую задачу он мог бы решать.



 
Реter Konow:
По большому счету, скрипт написан верно. Не учитывается нулевое значение Period_learning, но в остальном хорошо.

Необходимо добавить функциям аргументов и расчетов для "насыщения" смыслом их работы, ведь сейчас они подменяют одну переменную другой или просто возвращают значение ничего с ним не делая. В качестве примера использования функций, этот вариант годится, но в реальности у скрипта должна быть решаемая задача, которой в данном примере нет. 

Поэтому, предлагаю либо расширить и усложнить данный скрипт, либо придумать и написать новый, более содержательный, насыщенный расчетами в функциях и с небольшим деревом условий if-else.

Подумайте, какую задачу он мог бы решать.

Хорошо, Петер, подумаю, как можно будет усложнить скрипт и применить внутри функции оператор условий if-else.

С уважением, Владимир.

 

Всем доброго дня и хорошего настроения!

Продолжаю изучение языка программирования MQL5. С учетом подсказок от Петера Конова выкладываю доработанный код скрипта, который является продолжением выполнения одного задания со стороны участников данной темы. Скрипт проверил на всех режимах. Проблемы не выявлены. Для начала применил минимальное количество входных параметров. Код скрипта написан на английском языке, а комментарии к коду на русском языке, чтобы облегчить усвоение материала. В данном скрипте постарался всё расписать, как ранее и обещал, в изложении доступном для ученика 1-го класса школы программирования.

С уважением, Владимир.

//+------------------------------------------------------------------+
//|                                                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. С учетом подсказок от Петера Конова выкладываю доработанный код скрипта, который является продолжением выполнения одного задания со стороны участников данной темы. Скрипт проверил на всех режимах. Проблемы не выявлены. Для начала применил минимальное количество входных параметров. Код скрипта написан на английском языке, а комментарии к коду на русском языке, чтобы облегчить усвоение материала. В данном скрипте постарался всё расписать, как ранее и обещал, в изложении доступном для ученика 1-го класса школы программирования.

С уважением, Владимир.

Вот с ходу одну ошибку исправьте и будет идеально.

Дело в том, что в функции have_time() есть структурная ошибка. Дам намек:

Если тело условия не взято в фигурные скобки, то само условие имеет отношение только к первой строке после него. Поскольку, у Вас тело условия не имеет скобок, то запись в теле enough_time =true; не связана со следующим за ней return-ом, который всегда будет возвращать последнее значение enough_time. Получается, даже если условие ложно, но до этого переменная получила значение true, return вернет true. 

Подумайте как исправить.

П.С. не смотря на то, что это скрипт и он отработает только раз, ошибка все равно есть.

П.С.С. И также, глоб.переменные следует инициализировать начальным значением, а у Вас 2 переменные не инициализированы. Это "полу-ошибка".
 
Реter Konow:
Вот с ходу одну ошибку исправьте и будет идеально.

Дело в том, что в функции have_time() есть структурная ошибка. Дам намек:

Если тело условия не взято в фигурные скобки, то само условие имеет отношение только к первой строке после него. Поскольку, у Вас тело условия не имеет скобок, то запись в теле enough_time =true; не связана со следующим за ней return-ом, который всегда будет возвращать последнее значение enough_time. Получается, даже если условие ложно, но до этого переменная получила значение true, return вернет true. 

Подумайте как исправить.

П.С. не смотря на то, что это скрипт и он отработает только раз, ошибка все равно есть.

П.С.С. И также, глоб.переменные следует инициализировать начальным значением, а у Вас 2 переменные не инициализированы. Это "полу-ошибка".

По поводу функции предполагаю, что вот так нужно было написать код:

//--- Функция "имею_время"
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; не связана со следующим за ней return-ом, который всегда будет возвращать последнее значение enough_time. Получается, даже если условие ложно, но до этого переменная получила значение true, return вернет true. 

Подумайте как исправить.

П.С. не смотря на то, что это скрипт и он отработает только раз, ошибка все равно есть.

П.С.С. И также, глоб.переменные следует инициализировать начальным значением, а у Вас 2 переменные не инициализированы. Это "полу-ошибка".

Глобальные объекты, инициализируются конструктором по умолчанию. Для примитивных (в нашем случае все, кроме string) типов - это 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:

"...П.С.С. И также, глоб.переменные следует инициализировать начальным значением, а у Вас 2 переменные не инициализированы. Это "полу-ошибка"..."

Петер, а вот по поводу глобальных переменных пока не нашёл в литературе, что глобальные переменные нужно заранее предопределять. У вас есть ссылка на источник, чтобы повысить свои знания в этом вопросе? В Справочнике MQL5 нет явного указания про инициализацию, вот выдержка из него:

Тип bool предназначен для хранения логических значений true (истина) или false (ложь), числовое представление которых 1 или 0 соответственно.

Примеры:

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

Внутреннее представление – целое число размером 1 байт. Необходимо отметить, что в логических выражениях допустимо использовать вместо типа bool другие целые или вещественные типы или выражения этих типов, компилятор не выдаст ошибки. В таком случае значение ноль будет интерпретировано как false, а все остальные значения как true.

С уважением, Владимир.
 
Vladimir Simakov:

Глобальные объекты, инициализируются конструктором по умолчанию. Для примитивных (в нашем случае все, кроме string) типов - это 0. А вот для памяти (читай переменных), выделенной на стеке, инициализация не производится. Поэтому, глобальные переменные можно не инициализировать, помним, что в этом случае они будут равны нулю. А вот отсутствие инициализации (заодно, сразу приучайтесь не допускать предупреждений компилятора, если, конечно, четко не знаете, что делаете) - это уже серьезнее, так как чтение не инициализированной переменной приводит к неопределенному поведению. Например, этот код по разному себя ведет в релизной и дебаг сборке и никто не даст гарантии, что при смене версии компилятора или настроек оптимизации не изменится и его поведение:

Это конечно познавательно, но глоб.переменные желательно явно инициализировать для наглядности. Например, в mql4 переменные/массивы можно вообще не инициализировать нигде при обьявлении, а они все равно получают начальный ноль. ))