Autoaprendizaje del lenguaje MQL5 desde cero - página 43

 
Реter Konow:
Sin duda, has dado un gran paso adelante en el tema principal: has dominado y empezado a utilizar las funciones, y ¡felicidades a ti, por supuesto!)

A este ritmo, pronto te quedarás atrás...

Estoy consolidando el material que he aprendido hasta ahora, así como he empezado a estudiar para y mientras los bucles. El seguimiento, aunque en un futuro lejano, pero es una parte obligatoria de mi plan de autoaprendizaje.

Saludos, Vladimir.

 
MrBrooklin:

...

En general, el guión está escrito correctamente. No tiene en cuenta el valor nulo de Period_learning, pero por lo demás es bueno.

Hay que añadir argumentos y cálculos a las funciones para "saturar" su trabajo, porque ahora sustituyen una variable por otra o simplemente devuelven un valor sin hacer nada con él. Como ejemplo de uso de funciones, esta opción está bien, pero en realidad el script debería tener una tarea resoluble, que no está presente en este ejemplo.

Por lo tanto, sugiero ampliar este script y hacerlo más complejo, o inventar y escribir un nuevo script que tenga más sentido, lleno de cálculos en funciones y con un pequeño árbol de condiciones if-else.

Piensa en qué tipo de problema podría resolver.



 
Реter Konow:
En general, el guión está escrito correctamente. No tiene en cuenta el valor nulo de Period_learning, pero por lo demás está bien.

Tenemos que añadir argumentos y cálculos a las funciones para que tengan "sentido", porque ahora sustituyen una variable por otra o simplemente devuelven un valor sin hacer nada con él. Como ejemplo de uso de funciones, esta opción está bien, pero en realidad el script debería tener una tarea resoluble, que no está presente en este ejemplo.

Por lo tanto, sugiero ampliar y complicar este script o idear y escribir uno nuevo que tenga más sentido, lleno de cálculos en funciones y con un pequeño árbol de condiciones if-else.

Piensa en qué tipo de problema podría resolver.

Ok, Peter, voy a pensar cómo complicar el script y aplicar la declaración de condición if-else dentro de la función.

Saludos, Vladimir.

 

¡Buen día y buen humor a todos!

Sigo estudiando el lenguaje de programación MQL5. Teniendo en cuenta los consejos de Peter Konov, pego el código finalizado del script que es una continuación de una de las tareas de los participantes de este hilo. El script ha sido probado en todos los modos. No se ha detectado ningún problema. Para empezar, he aplicado el número mínimo de parámetros de entrada. El código del script está escrito en inglés, los comentarios al código están en ruso, para facilitar el proceso de aprendizaje. Como he prometido antes, he tratado de describir el guión de forma comprensible para un alumno de la escuela de programación de 1º curso.

Saludos cordiales, 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:

¡Buen día y buen humor a todos!

Sigo estudiando el lenguaje de programación MQL5. Teniendo en cuenta los consejos de Peter Konov, pego el código finalizado del script que es una continuación de una de las tareas de los participantes de este hilo. El script ha sido probado en todos los modos. No se ha detectado ningún problema. Para empezar, he aplicado el número mínimo de parámetros de entrada. El código del script está escrito en inglés, los comentarios al código están en ruso, para facilitar el proceso de aprendizaje. Como he prometido antes, he tratado de describir el guión de forma comprensible para un alumno de la escuela de programación de 1º curso.

Saludos, Vladimir.

Arregla un error sobre la marcha y será perfecto.

La cuestión es que hay un error estructural en la función have_time(). Aquí tienes una pista:

Si el cuerpo de una condición no va entre corchetes, la propia condición se refiere sólo a la primera línea que la sigue. Como el cuerpo de su condición no contiene paréntesis, la entrada en el cuerpo de enough_time =true; no está relacionada con la siguiente extensión de retorno que siempre devolverá el último valor de enough_time. Por lo tanto, incluso si la condición es falsa pero la variable tiene el valor verdadero antes, el retorno devolverá verdadero.

Piensa en cómo solucionarlo.

P.D. Aunque se trata de un script y sólo funcionará una vez, sigue habiendo un error.

P.S.S. Y además, las variables globales deben ser inicializadas con un valor inicial, y tienes 2 variables sin inicializar. Esto es un "semi-error".
 
Реter Konow:
Arregla un error y será perfecto.

La cuestión es que hay un error estructural en have_time(). Aquí tienes una pista:

Si el cuerpo de la condición no está encerrado entre llaves, la condición en sí está relacionada sólo con la primera línea que le sigue. Como el cuerpo de su condición no contiene paréntesis, la entrada en el cuerpo de enough_time =true; no está relacionada con la siguiente extensión de retorno que siempre devolverá el último valor de enough_time. Por lo tanto, incluso si la condición es falsa pero la variable tiene el valor verdadero antes, el retorno devolverá verdadero.

Piensa en cómo solucionarlo.

P.D. Aunque se trata de un script y sólo funcionará una vez, sigue habiendo un error.

P.S.S. Y además, las variables globales deben ser inicializadas con un valor inicial, y tienes 2 variables sin inicializar. Esto es un "semi-error".

En cuanto a la función, supongo que el código debería haberse escrito así:

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

Sobre la función, supongo que el código debería haberse escrito así:

Sinceramente, Vladimir.
¡Correcto!
 
Реter Konow:
Sólo hay que arreglar un error de inmediato y será perfecto.

La cuestión es que hay un error estructural en have_time(). Aquí tienes una pista:

Si el cuerpo de la condición no está encerrado entre llaves, la condición en sí está relacionada sólo con la primera línea que le sigue. Como el cuerpo de su condición no contiene paréntesis, la entrada en el cuerpo de enough_time =true; no está relacionada con la siguiente extensión de retorno que siempre devolverá el último valor de enough_time. Por lo tanto, incluso si la condición es falsa pero la variable tiene el valor verdadero antes, el retorno devolverá verdadero.

Piensa en cómo solucionarlo.

P.D. Aunque se trata de un script y sólo funcionará una vez, sigue habiendo un error.

P.S.S. Y además, las variables globales deben ser inicializadas con un valor inicial, y tienes 2 variables sin inicializar. Esto es un "semi-error".

Los objetos globales, son inicializados por defecto por el constructor. Para los tipos primitivos (en nuestro caso, todos menos la cadena) es 0. Pero para la memoria (leer variables) asignada en la pila, no se inicializan. Por eso las variables globales pueden no ser inicializadas, recuerda que en este caso serán iguales a cero. Pero la ausencia de inicialización (al mismo tiempo, acostúmbrate a evitar las advertencias generadas por el compilador de inmediato, a menos que sepas exactamente lo que estás haciendo) es un problema grave, porque la lectura de una variable no inicializada conduce a un comportamiento indefinido. Por ejemplo, este código se comporta de forma diferente en las versiones de lanzamiento y de depuración y nadie puede garantizar que cuando se cambie la versión del compilador o la configuración de optimización su comportamiento no cambie también:

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. Y además, las variables globales deben ser inicializadas con un valor inicial y tienes 2 variables sin inicializar. Esto es un "semi-error"..."

Peter, sobre el tema de las variables globales, todavía no he encontrado en la literatura que las variables globales tengan que estar predefinidas. ¿Tiene un enlace a la fuente para mejorar sus conocimientos en esta materia? La Referencia MQL5 no contiene una referencia explícita a la inicialización:

El tipo bool está diseñado para almacenar los valores booleanos true o false, cuya representación numérica es 1 o 0 respectivamente .

Ejemplos:

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

La representación interna es un número entero de 1 byte. Hay que tener en cuenta que en las expresiones booleanas, es aceptable utilizar otros tipos enteros o reales o expresiones de estos tipos en lugar de bool, y el compilador no generará un error. En este caso, el cero se interpretará como falso y todos los demás valores como verdaderos.

Sinceramente, Vladimir.
 
Vladimir Simakov:

Los objetos globales, se inicializan con el constructor por defecto. Para los tipos primitivos (en nuestro caso, todos excepto string), es 0. Pero para la memoria (leer variables) asignada en la pila, no se inicializan. Por eso las variables globales pueden no ser inicializadas, recuerda que en este caso serán iguales a cero. Pero la ausencia de inicialización (al mismo tiempo, acostúmbrate a evitar las advertencias generadas por el compilador de inmediato, a menos que sepas exactamente lo que estás haciendo) es un problema grave, porque la lectura de una variable no inicializada conduce a un comportamiento indefinido. Por ejemplo, este código se comporta de forma diferente en las versiones de lanzamiento y de depuración y nadie puede garantizar que cuando se cambie la versión del compilador o la configuración de optimización su comportamiento no cambie también:

Esto es ciertamente informativo, pero las variables globales deberían ser inicializadas explícitamente para mayor claridad. Por ejemplo, en mql4 las variables/arreglos pueden no ser inicializados en ninguna parte al ser declarados, y aún así obtienen el cero inicial. ))
Razón de la queja: