Autoapprendimento del linguaggio MQL5 da zero - pagina 43

 
Реter Konow:
Hai certamente fatto un grande passo avanti nel soggetto principale - hai padroneggiato e iniziato a usare le funzioni, e complimenti a te, naturalmente!)

Di questo passo, presto sarai in trappola...

Sto consolidando il materiale che ho imparato finora, così come ho iniziato a studiare per e mentre i loop. Trailing, anche se in un futuro lontano, ma è una parte obbligatoria del mio piano di auto-apprendimento.

Saluti, Vladimir.

 
MrBrooklin:

...

In generale, la sceneggiatura è scritta correttamente. Non tiene conto del valore nullo di Period_learning, ma per il resto è buono.

Dobbiamo aggiungere argomenti e calcoli alle funzioni per "saturare" il loro lavoro, perché ora sostituiscono una variabile con un'altra o semplicemente restituiscono un valore senza farci nulla. Come esempio di utilizzo di funzioni, questa opzione va bene, ma in realtà lo script dovrebbe avere un compito risolvibile, che non è presente in questo esempio.

Quindi, suggerisco o di estendere questo script e renderlo più complesso, o di inventare e scrivere un nuovo script che sia più significativo, pieno di calcoli in funzioni e con un piccolo albero di condizioni if-else.

Pensa a che tipo di problema potrebbe risolvere.



 
Реter Konow:
In generale, la sceneggiatura è scritta correttamente. Non tiene conto del valore nullo di Period_learning, ma per il resto è buono.

Dobbiamo aggiungere argomenti e calcoli alle funzioni per renderle "significative", perché ora sostituiscono una variabile con un'altra o semplicemente restituiscono un valore senza farci nulla. Come esempio di utilizzo di funzioni, questa opzione va bene, ma in realtà lo script dovrebbe avere un compito risolvibile, che non è presente in questo esempio.

Quindi, suggerisco o di estendere e complicare questo script o di inventare e scrivere uno nuovo che sia più significativo, pieno di calcoli in funzioni e con un piccolo albero di condizioni if-else.

Pensa a che tipo di problema potrebbe risolvere.

Ok, Peter, penserò a come complicare lo script e applicare la dichiarazione di condizione if-else all'interno della funzione.

Saluti, Vladimir.

 

Buona giornata e buon umore a tutti!

Continuo a studiare il linguaggio di programmazione MQL5. Prendendo in considerazione i suggerimenti di Peter Konov, sto incollando il codice finalizzato dello script che è la continuazione di uno dei compiti dei partecipanti a questo thread. Lo script è stato testato in tutte le modalità. Nessun problema rilevato. Per cominciare ho applicato il numero minimo di parametri di input. Il codice dello script è scritto in inglese, i commenti al codice sono in russo, per facilitare il processo di apprendimento. Come ho promesso prima, ho cercato di descrivere lo script in un modo comprensibile per un allievo della 1a forma di scuola di programmazione.

Cordiali saluti, 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:

Buona giornata e buon umore a tutti!

Continuo a studiare il linguaggio di programmazione MQL5. Prendendo in considerazione i suggerimenti di Peter Konov, sto incollando il codice finalizzato dello script che è la continuazione di uno dei compiti dei partecipanti a questo thread. Lo script è stato testato in tutte le modalità. Nessun problema rilevato. Per cominciare ho applicato il numero minimo di parametri di input. Il codice dello script è scritto in inglese, i commenti al codice sono in russo, per facilitare il processo di apprendimento. In questo script ho cercato di descrivere la situazione come ho promesso prima, in un modo accessibile a uno studente di prima classe della scuola di programmazione.

Saluti, Vladimir.

Correggete un errore al volo e sarà perfetto.

Il punto è che c'è un errore strutturale nella funzione have_time(). Ecco un suggerimento:

Se il corpo di una condizione non è racchiuso tra parentesi graffe, la condizione stessa si riferisce solo alla prima riga che la segue. Poiché il corpo della vostra condizione non contiene parentesi, la voce nel corpo di enough_time =true; non è collegata alla successiva estensione di ritorno che restituirà sempre l'ultimo valore di enough_time. Così, anche se la condizione è falsa ma la variabile ha ottenuto il valore vero prima, return restituirà vero.

Pensate a come risolvere il problema.

P.S. Anche se questo è uno script e funzionerà solo una volta, c'è ancora un errore.

P.S.S. Inoltre, le variabili globali dovrebbero essere inizializzate con un valore iniziale, e tu hai 2 variabili non inizializzate. Questo è un "semi-errore".
 
Реter Konow:
Correggete un errore e sarà perfetto.

Il punto è che c'è un errore strutturale in have_time(). Ecco un suggerimento:

Se il corpo della condizione non è racchiuso tra parentesi graffe, la condizione stessa è legata solo alla prima riga dopo di essa. Poiché il corpo della vostra condizione non contiene parentesi, la voce nel corpo di enough_time =true; non è collegata alla successiva estensione di ritorno che restituirà sempre l'ultimo valore di enough_time. Così, anche se la condizione è falsa ma la variabile ha ottenuto il valore vero prima, return restituirà vero.

Pensate a come risolvere il problema.

P.S. Anche se questo è uno script e funzionerà solo una volta, c'è ancora un errore.

P.S.S. Inoltre, le variabili globali dovrebbero essere inizializzate con un valore iniziale, e tu hai 2 variabili non inizializzate. Questo è un "semi-errore".

Per quanto riguarda la funzione, presumo che questo sia il modo in cui il codice avrebbe dovuto essere scritto:

//--- Функция "имею_время"
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:

Per quanto riguarda la funzione, presumo che questo sia il modo in cui il codice avrebbe dovuto essere scritto:

Sinceramente, Vladimir.
Giusto!
 
Реter Konow:
Basta correggere subito un errore e sarà perfetto.

Il punto è che c'è un errore strutturale in have_time(). Ecco un suggerimento:

Se il corpo della condizione non è racchiuso tra parentesi graffe, la condizione stessa è legata solo alla prima riga dopo di essa. Poiché il corpo della vostra condizione non contiene parentesi, la voce nel corpo di enough_time =true; non è legata al ritorno - restituirà sempre l'ultimo valore di enough_time. Così, anche se la condizione è falsa ma la variabile ha ottenuto il valore vero prima, return restituirà vero.

Pensate a come risolvere il problema.

P.S. Anche se questo è uno script e funzionerà solo una volta, c'è ancora un errore.

P.S.S. Inoltre, le variabili globali dovrebbero essere inizializzate con un valore iniziale, e tu hai 2 variabili non inizializzate. Questo è un "semi-errore".

Gli oggetti globali, sono inizializzati di default dal costruttore. Per i tipi primitivi (nel nostro caso, tutti tranne le stringhe) è 0. Ma per la memoria (leggere le variabili) allocate sullo stack, non sono inizializzate. Ecco perché le variabili globali possono non essere inizializzate, ricordate che in questo caso saranno uguali a zero. Ma l'assenza di inizializzazione (allo stesso tempo, abituatevi ad evitare subito gli avvertimenti generati dal compilatore, a meno che non sappiate esattamente cosa state facendo) è un problema serio, perché leggere una variabile non inizializzata porta a un comportamento non definito. Per esempio, questo codice si comporta in modo diverso nelle build di rilascio e di debug e nessuno può garantire che quando si cambia la versione del compilatore o le impostazioni di ottimizzazione non cambi anche il suo comportamento:

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 inoltre, le variabili globali dovrebbero essere inizializzate con un valore iniziale e tu hai 2 variabili non inizializzate. Questo è un 'semi-errore'..."

Peter, a proposito delle variabili globali, non ho ancora trovato nella letteratura che le variabili globali debbano essere predefinite. Avete un link alla fonte per migliorare la vostra conoscenza in materia? Il riferimento MQL5 non contiene un riferimento esplicito all'inizializzazione:

Il tipo bool è progettato per memorizzare i valori booleani true o false, la cui rappresentazione numerica è rispettivamente 1 o 0 .

Esempi:

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

La rappresentazione interna è un numero intero a 1 byte. Va notato che nelle espressioni booleane, è accettabile usare altri tipi interi o reali o espressioni di questi tipi al posto di bool, e il compilatore non genererà un errore. In questo caso, zero sarà interpretato come falso e tutti gli altri valori come vero.

Sinceramente, Vladimir.
 
Vladimir Simakov:

Gli oggetti globali sono inizializzati con il costruttore predefinito. Per i tipi primitivi (nel nostro caso, tutti tranne le stringhe), è 0. Ma per la memoria (leggere le variabili) allocate sullo stack, non sono inizializzate. Ecco perché le variabili globali possono non essere inizializzate, ricordate che in questo caso saranno uguali a zero. Ma l'assenza di inizializzazione (allo stesso tempo, abituatevi ad evitare subito gli avvertimenti generati dal compilatore, a meno che non sappiate esattamente cosa state facendo) è un problema serio, perché leggere una variabile non inizializzata porta a un comportamento non definito. Per esempio, questo codice si comporta in modo diverso nelle build di rilascio e di debug e nessuno può garantire che quando si cambia la versione del compilatore o le impostazioni di ottimizzazione non cambi anche il suo comportamento:

Questo è certamente informativo, ma le variabili globali dovrebbero essere inizializzate esplicitamente per chiarezza. Per esempio, in mql4 le variabili/array possono non essere inizializzate da nessuna parte quando vengono dichiarate, e ottengono ancora lo zero iniziale. ))