Auto-aprendizagem da linguagem MQL5 a partir do zero - página 43

 
Реter Konow:
Você certamente deu um grande passo em frente no assunto principal - você dominou e começou a usar funções, e parabéns a você, é claro!)

A este ritmo, você logo estará atrás...

Estou consolidando o material que aprendi até agora, assim como comecei a estudar para e enquanto fazia loops. Trailing, embora em futuro distante, mas é uma parte obrigatória do meu plano de auto-aprendizagem.

Cumprimentos, Vladimir.

 
MrBrooklin:

...

De modo geral, o roteiro é escrito corretamente. Ele não leva em conta o valor nulo do Period_learning, mas de outra forma é bom.

Precisamos acrescentar argumentos e cálculos às funções a fim de "saturar" seu trabalho, pois agora elas substituem uma variável por outra ou simplesmente retornam um valor sem fazer nada com ela. Como exemplo de utilização de funções, esta opção é boa, mas na realidade o roteiro deve ter uma tarefa solvível, que não está presente neste exemplo.

Portanto, sugiro ou estender este roteiro e torná-lo mais complexo, ou inventar e escrever um novo roteiro mais significativo, cheio de cálculos em funções e com uma pequena árvore de condição if-else.

Pense no tipo de problema que poderia resolver.



 
Реter Konow:
De modo geral, o roteiro é escrito corretamente. Não leva em conta o valor nulo do Period_learning, mas de outra forma é bom.

Precisamos acrescentar argumentos e cálculos às funções para torná-las "significativas", porque agora elas substituem uma variável por outra ou simplesmente retornam um valor sem fazer nada com ela. Como exemplo de utilização de funções, esta opção é boa, mas na realidade o roteiro deve ter uma tarefa solvível, que não está presente neste exemplo.

Portanto, sugiro estender e complicar este roteiro ou elaborar e escrever um novo que seja mais significativo, cheio de cálculos em funções e com uma pequena árvore de condição if-else.

Pense no tipo de problema que poderia resolver.

Ok, Peter, vou pensar em como complicar o roteiro e aplicar a declaração de condição de if-else dentro da função.

Cumprimentos, Vladimir.

 

Bom dia e bom humor para todos!

Eu continuo estudando a linguagem de programação MQL5. Levando em conta as dicas de Peter Konov, estou colando o código finalizado do roteiro que é uma continuação de uma das tarefas dos participantes deste tópico. O roteiro foi testado em todos os modos. Nenhum problema detectado. Para começar, eu apliquei o número mínimo de parâmetros de entrada. O código do roteiro é escrito em inglês, os comentários ao código estão em russo, para facilitar o processo de aprendizagem. Como prometi anteriormente, tentei descrever o roteiro de uma forma compreensível para um aluno da escola de programação de 1ª série.

Com os melhores cumprimentos, 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:

Bom dia e bom humor para todos!

Eu continuo estudando a linguagem de programação MQL5. Levando em conta as dicas de Peter Konov, estou colando o código finalizado do roteiro que é uma continuação de uma das tarefas dos participantes deste tópico. O roteiro foi testado em todos os modos. Nenhum problema detectado. Para começar, eu apliquei o número mínimo de parâmetros de entrada. O código do roteiro é escrito em inglês, os comentários ao código estão em russo, para facilitar o processo de aprendizagem. Como prometi anteriormente, tentei descrever o roteiro de uma forma compreensível para um aluno da escola de programação de 1ª série.

Cumprimentos, Vladimir.

Conserte um erro na mosca e será perfeito.

A questão é que existe um erro estrutural na função have_time(). Aqui está uma dica:

Se o corpo de uma condição não estiver entre parênteses, a própria condição se refere apenas à primeira linha que a segue. Como o corpo de sua condição não contém parênteses, a entrada no corpo de tempo_suficiente = verdadeiro; não está relacionada com a próxima extensão de retorno seguinte que sempre retornará o último valor de tempo_suficiente. Portanto, mesmo que a condição seja falsa, mas a variável já tenha tido o valor verdadeiro antes, o retorno retornará verdadeiro.

Pense em como consertá-lo.

P.S. Mesmo que este seja um roteiro e funcione apenas uma vez, ainda há um erro.

P.S.S. E também, as variáveis globais devem ser inicializadas com um valor inicial, e você tem 2 variáveis não inicializadas. Este é um "semi-erro".
 
Реter Konow:
Conserte um erro e ele será perfeito.

A questão é que existe um erro estrutural no have_time(). Aqui está uma dica:

Se o corpo da condição não estiver entre parênteses, a própria condição está relacionada apenas com a primeira linha após ela. Como o corpo de sua condição não contém parênteses, a entrada no corpo de tempo_suficiente = verdadeiro; não está relacionada com a próxima extensão de retorno seguinte que sempre retornará o último valor de tempo_suficiente. Portanto, mesmo que a condição seja falsa, mas a variável já tenha tido o valor verdadeiro antes, o retorno retornará verdadeiro.

Pense em como consertá-lo.

P.S. Mesmo que este seja um roteiro e funcione apenas uma vez, ainda há um erro.

P.S.S. E também, as variáveis globais devem ser inicializadas com um valor inicial, e você tem 2 variáveis não inicializadas. Este é um "semi-erro".

Com relação à função, presumo que é assim que o código deveria ter sido escrito:

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

Sobre a função, presumo que é assim que o código deveria ter sido escrito:

Atenciosamente, Vladimir.
Certo!
 
Реter Konow:
Basta corrigir um erro de imediato e ele será perfeito.

A questão é que existe um erro estrutural no have_time(). Aqui está uma dica:

Se o corpo da condição não estiver entre parênteses, a própria condição está relacionada apenas com a primeira linha após ela. Como o corpo de sua condição não contém parênteses, a entrada no corpo de tempo_suficiente = verdadeiro; não está relacionada ao retorno - sempre retornará o último valor de tempo_suficiente. Portanto, mesmo que a condição seja falsa, mas a variável já tenha tido o valor verdadeiro antes, o retorno retornará verdadeiro.

Pense em como consertá-lo.

P.S. Mesmo que este seja um roteiro e funcione apenas uma vez, ainda há um erro.

P.S.S. E também, as variáveis globais devem ser inicializadas com um valor inicial, e você tem 2 variáveis não inicializadas. Este é um "semi-erro".

Objetos globais, são inicializados por padrão pelo construtor. Para os tipos primitivos (no nosso caso, todos, exceto string) é 0. Mas para a memória (ler variáveis) alocadas na pilha, elas não são inicializadas. É por isso que as variáveis globais podem não ser inicializadas, lembre-se que neste caso elas serão iguais a zero. Mas a ausência de inicialização (ao mesmo tempo, habitue-se a evitar imediatamente avisos gerados pelo compilador, a menos que você saiba exatamente o que está fazendo) é um problema sério, porque a leitura de uma variável não-inicializada leva a um comportamento indefinido. Por exemplo, este código se comporta de maneira diferente no release e no debug builds e ninguém pode garantir que quando você muda a versão do compilador ou as configurações de otimização, seu comportamento não mudará também:

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. E também, as variáveis globais devem ser inicializadas com um valor inicial e você tem 2 variáveis não inicializadas. Isto é um 'semi-erro'"..."

Peter, a respeito das variáveis globais, ainda não encontrei na literatura que as variáveis globais precisam ser predefinidas. Você tem um link com a fonte para melhorar seus conhecimentos sobre este assunto? A Referência MQL5 não contém uma referência explícita à inicialização:

O tipo bool é projetado para armazenar os valores lógicos verdadeiro ou falso, cuja representação numérica é 1 ou 0, respectivamente .

Exemplos:

bool a =verdadeiro;
bool b =falso;
bool c =1;

A representação interna é um número inteiro de 1-byte. Deve-se notar que em expressões booleanas, é aceitável usar outros tipos inteiros ou reais ou expressões destes tipos em vez de bool, e o compilador não irá gerar um erro. Neste caso, zero será interpretado como falso e todos os outros valores como verdadeiros.

Atenciosamente, Vladimir.
 
Vladimir Simakov:

Objetos globais, são inicializados com o construtor padrão. Para os tipos primitivos (no nosso caso, todos, exceto string), é 0. Mas para a memória (ler variáveis) alocadas na pilha, elas não são inicializadas. É por isso que as variáveis globais podem não ser inicializadas, lembre-se que neste caso elas serão iguais a zero. Mas a ausência de inicialização (ao mesmo tempo, habitue-se a evitar imediatamente avisos gerados pelo compilador, a menos que você saiba exatamente o que está fazendo) é um problema sério, porque a leitura de uma variável não-inicializada leva a um comportamento indefinido. Por exemplo, este código se comporta de maneira diferente no release e no debug builds e ninguém pode garantir que quando você muda a versão do compilador ou as configurações de otimização, seu comportamento não mudará também:

Isto é certamente informativo, mas as variáveis globais devem ser inicializadas explicitamente para maior clareza. Por exemplo, em mql4 variáveis/arrays não podem ser inicializadas em nenhum lugar ao serem declaradas, e ainda recebem zero inicial. ))