MQL5言語をゼロから独学で学ぶ - ページ 43

 
Реter Konow:
確かに本題の大きな一歩を踏み出しましたね。関数をマスターして使い始めたのですから、もちろんおめでとうございます!)

このままでは、すぐに後塵を拝することになる...

これまで学んだ内容を定着させるとともに、ループの勉強を始めたり、ループしながら勉強したりしています。遠い将来の話ですが、私の自己学習計画には欠かせないものです。

ウラジミールさん、ありがとうございます。

 
MrBrooklin:

...

大体、スクリプトは正しく書かれている。Period_learningの NULL値を考慮していませんが、それ以外は良好です。

関数に引数や計算を追加して、その働きを「飽和」させる必要があります。なぜなら、今の関数は、ある変数を別の変数に置き換えたり、何もせずにただ値を返したりするだけだからです。関数の使用例として、このオプションは問題ないが、実際にはスクリプトには解決可能なタスクが必要であり、この例には存在しない。

したがって、このスクリプトを拡張してより複雑にするか、あるいは、より意味のある、関数での計算が多く、小さな if-else 条件木を持つ新しいスクリプトを考案して書くことをお勧めします。

どんな問題を解決できるのか、考えてみてください。



 
Реter Konow:
大体、スクリプトは正しく書かれている。Period_learningのNULL値が考慮されていませんが、それ以外は良好です。

関数に引数や計算を加えて「意味あるもの」にする必要があります。今は、ある変数を別の変数に置き換えたり、何もせずにただ値を返したりしているからです。関数の使用例として、このオプションは問題ないが、実際にはスクリプトには解決可能なタスクが必要であり、この例には存在しない。

したがって、このスクリプトを拡張して複雑にするか、あるいは、より意味のある、関数での計算が多く、小さな if-else 条件木を持つ新しいスクリプトを考え、書くことをお勧めします。

どんな問題を解決できるか、考えてみてください。

OK、Peter、スクリプトを複雑にして、関数の中にif-else条件文を適用する方法を考えてみるよ。

ウラジミールさん、ありがとうございます。

 

皆さん、ご機嫌いかがでしょうか?

プログラミング言語「MQL5」の勉強を続けています。Peter Konov氏のヒントを参考に、このスレッドの参加者のタスクの1つを継続したスクリプトの最終的なコードを貼り付けます。スクリプトはすべてのモードでテストされています。問題なく検出されました。まず最初に、最小限の入力パラメータを適用しました。スクリプトのコードは英語で書かれていますが、コードへのコメントはロシア語で書かれており、学習しやすいように配慮されています。先に約束したように、このスクリプトはプログラミングスクールの1stフォームの生徒にも理解できるように記述したつもりです。

ウラジミールさん、よろしくお願いします。

//+------------------------------------------------------------------+
//|                                                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氏のヒントを参考に、このスレッドの参加者のタスクの1つを継続したスクリプトの最終的なコードを貼り付けます。スクリプトはすべてのモードでテストされています。問題なく検出されました。まず最初に、最小限の入力パラメータを適用しました。スクリプトのコードは英語で書かれていますが、コードへのコメントはロシア語で書かれており、学習しやすいように配慮されています。先に約束したように、このスクリプトはプログラミングスクールの1stフォームの生徒にも理解できるように記述したつもりです。

ウラジミールさん、ありがとうございます。

その場で1つでもミスを修正すれば、完璧なものになります。

要は、関数have_time()に構造的な間違いがあるのです。ここにヒントがあります。

条件本体が中括弧で囲まれていない場合、条件自体はそれに続く1行目のみを参照する。あなたの条件の本体には括弧が含まれていないので、enough_time =true;の本体内のエントリは、常にenough_timeの最後の値を返す次のreturn-extensionとは関係ありません。したがって、たとえ条件がfalseであっても、その変数が以前にtrueの値を持っていた場合は、returnはtrueを返します。

どうすれば直せるか考える。

追伸:スクリプトなので一度しか動作しないにもかかわらず、エラーが発生します。

P.S.S. また、グローバル変数は初期値で初期化する必要がありますが、初期化されていない変数が2つありますね。これは「半誤差」です。
 
Реter Konow:
1つのエラーを修正すれば、完璧になります。

要はhave_time()に構造的な間違いがあるということです。ここにヒントがあります。

条件本体が中括弧で囲まれていない場合、条件そのものは、中括弧の後の最初の行にのみ関係する。あなたの条件の本体には括弧が含まれていないので、enough_time =true;の本体内のエントリは、常にenough_timeの最後の値を返す次のreturn-extensionとは関係ありません。したがって、たとえ条件がfalseであっても、その変数が以前にtrueの値を持っていた場合は、returnはtrueを返します。

どうすれば直せるか考える。

追伸:スクリプトなので一度しか動作しないにもかかわらず、エラーが発生します。

P.S.S. また、グローバル変数は初期値で初期化する必要がありますが、初期化されていない変数が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:
ただ、1つのエラーをまっすぐに修正すれば、完璧になります。

要はhave_time()に構造的な間違いがあるということです。ここにヒントがあります。

条件本体が中括弧で囲まれていない場合、条件そのものは、中括弧の後の最初の行にのみ関係する。条件本体に括弧がないので、enough_time =true;の項目は戻り値に関係なく、常にenough_timeの最後の値を返します。したがって、たとえ条件がfalseであっても、その変数が以前にtrueの値を持っていた場合は、returnはtrueを返します。

どうすれば直せるか考える。

追伸:スクリプトなので一度しか動作しないにもかかわらず、エラーが発生します。

P.S.S. また、グローバル変数は初期値で初期化する必要がありますが、初期化されていない変数が2つありますね。これは「半誤差」です。

グローバルオブジェクトは、コンストラクタによってデフォルトで初期化さ れます。ただし、スタック上に確保されたメモリ(変数)は初期化されない。そのため、グローバル変数は初期化されないことがありますが、この場合、ゼロになることを覚えておいてください。しかし、初期化されていない(同時に、自分が何をしているのかを正確に把握していない限り、コンパイラが生成する警告を すぐに避けることに慣れる)ことは、初期化されていない変数を読むと未定義の動作につながるため、深刻な問題である。例えば、このコードはリリースビルドとデバッグビルドで挙動が異なりますし、コンパイラのバージョンや最適化の設定を変更したときに、その挙動も変わらないという保証は誰もしてくれません。

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つあります。これは「セミ・エラー」..."

Peterグローバル変数について ですが、グローバル変数が事前に定義されている必要があるという文献はまだ見当たりませんね。この件に関する知識を深めるために、ソースへのリンクをお持ちですか?MQL5リファレンスには、初期化に関する明示的な言及は ありません。

bool型は 論理値 true または false 格納するために設計されて おり、 その数値表現はそれぞれ 1 または 0 である。

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

内部表現は1バイトの整数値である。なお、boolean式では、boolの代わりに他の整数型や実数型、またはそれらの式を用いても、コンパイラはエラーを発生させない。この場合、0はfalse、それ以外はtrueと解釈される。

敬具 ウラジミール
 
Vladimir Simakov:

グローバルオブジェクトは、デフォルトのコンストラクタで初期化さ れます。ただし、スタック上に確保されたメモリ(読み出し変数)については、初期化されない。そのため、グローバル変数は初期化されないことがありますが、この場合、ゼロになることを覚えておいてください。しかし、初期化されていない(同時に、自分が何をしているのか正確に分かっていない限り、コンパイラが生成する警告を すぐに避けることに慣れる)ことは、初期化されていない変数を読むと未定義の動作につながるため、深刻な問題である。例えば、このコードはリリースビルドとデバッグビルドで挙動が異なりますし、コンパイラのバージョンや最適化の設定を変更したときに、その挙動も変わらないという保証は誰もしてくれません。

これは確かに有益ですが、わかりやすくするために、グローバル変数は明示的に初期化すべきです。例えば、mql4では変数や配列は宣言時に全く初期化されないことがあり、その場合でも初期値は0になります。))