English Русский 中文 Español Deutsch Português
preview
初級から中級へ:SWITCH文

初級から中級へ:SWITCH文

MetaTrader 5 | 13 5月 2025, 06:58
87 0
CODE X
CODE X

はじめに

ここで提示されるコンテンツは、教育目的のみを目的としています。いかなる状況においても、提示された概念を学習し習得する以外の目的でアプリケーションを閲覧することは避けてください。

前回の記事「初級から中級まで:Includeディレクティブ」では、#includeコンパイルディレクティブの基本について解説しました。この記事は、情報をしっかりと吸収し、制御フロー文の操作方法を学ぶための小休止としての役割も果たしていました。なぜなら、これらの使い方を正しく学び、深く理解することが非常に重要だからです。しかし、まだ学習は終わっていません。MQL5には、さらに2つの制御文が残っています。これらは少し複雑で、特に使用時には細心の注意が求められます。

そのため、今回はこれら2つの文について、より丁寧かつ慎重に解説していきます。というのも、これらの文を使う際にほんの小さなミスをするだけでも、バグの原因を突き止めるのにかなりの時間を費やすことになりかねないからです。

もし前回までの制御構文が難しく感じられた場合は、さらに注意が必要になるでしょう。しかし、この記事を最後まで読めば、それぞれの文がどのように機能するのかをしっかり理解できるようになります。この記事を読み進めるにあたっての前提条件は、「変数」と「定数」の扱いに慣れていること、そして「IF文」の使い方を理解していることです。これらに自信がある方は、今回の内容を十分に理解できる準備が整っています。

それでは、いつものように新しいトピックを始めましょう。今回は、残り2つのうちの1つ目の文について解説を始めていきます。


SWITCH文

この文は文字通り「スイッチ」を意味し、IF文の代替として使用できる場合があります。ただし、SWITCH文をIF文の代わりとして効果的に使うには、ある重要なニュアンスを理解する必要があります。

この置き換えがいつ、どのような条件で可能かを理解するには、まず読者の皆さんに知っておいてほしい基本的な考え方があります。プログラミングにおいては、同じ変数に対して複数の値を比較しながら、非常に特定の値を探すという状況によく遭遇します。この「非常に特定」という表現こそが、ここでの核心です。その値は、「大なり」「小なり」「ほぼ同じ」などではなく、完全に一致していなければならないのです。一切の誤差なく、完全に一致していることが求められます。

このようなケースでは、複数のIF文を並べる代わりに、1つのSWITCH文を使うことでコードを簡潔に記述することが可能になります。ただし、ここで非常に重要なのは、SWITCH文で使用される変数のビット幅やデータ形式が、処理結果に大きな影響を与える可能性があるという点です。

要約すると、SWITCH文を複数のIF文の代替として使用できるのは、条件として常に同じ変数をチェックしている場合に限られます。また、比較できるのは「ある特定の値と等しいかどうか」だけであり、「大なり」や「小なり」といった条件では使用できません。さらに、変数のビット幅(型)によって評価結果が左右される可能性があるため、この点にも注意が必要です。簡単に言えば、これらがSWITCH文の基本的な動作ルールを構成しています。

一見すると、SWITCH文は必要以上に複雑で、あるいは少なくとも実用性に欠けるように思えるかもしれません。しかし、実際にはまったく逆で、SWITCH文はさまざまな場面で非常に広く活用されています。最初のうちは制限が多く、少し扱いづらい印象を受けるかもしれませんが、現実のアプリケーションにおいてはとても有効で便利な構文です。

初心者のプログラマーにとってSWITCH文が少し理解しづらく感じられる最大の理由は、プログラミング言語や文脈によって動作の仕様が異なるという点です。とはいえ、この記事ではMQL5におけるSWITCH文の使い方に焦点を絞って解説していきます。MQL5では、その構文と動作がC/C++と非常によく似ているため、C/C++のドキュメントを参考資料として併用することで、より理解が深まるでしょう。ここではSWITCH文の基本的な仕組みと、使用時に注意すべき点についての入門的な内容を取り上げています。SWITCH文のC/C++での実装や拡張的な使い方をさらに調べれば、この構文の可能性をより深く理解することができます。

それでは、SWITCH文についての大まかな概要と、必要に応じて掘り下げるべきポイントが見えてきたところで、早速SWITCH文とその潜在的な用途について調べてみましょう。まずは、SWITCH文をまだ使用しないごく簡単な例から始めていきます。以下のコードを見てみましょう。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06.     uchar counter = 5;
07. 
08.     if (counter == 5) Print("The counter value is five."); else
09.     if (counter == 3) Print("The counter value is three."); else
10.     if (counter == 1) Print("The counter value is one."); else
11.         Print("The counter value is unknown.");
12. }
13. //+------------------------------------------------------------------+

コード01

多くの読者がこれを見て、なんて単純で馬鹿げたコードなんだと思うことでしょう。ええ、私もそれはわかっています。ですが、本当に基本的なことから始める必要があるのです。そうしなければ、後々、何が起きているのかを理解しようとしたときに、完全にわからなくなってしまうかもしれません。

このコードを見るだけで、MetaTrader 5端末に何が表示されるかは一目瞭然です。したがって、出力結果をここで説明する必要はないと私は考えています。ただし、もしこのコードを見ただけで内容が理解できなかった場合は、読者の皆さん、今すぐに手を止めてください。そして最初の記事「初級から中級まで:変数(I)」に戻り、もう一度最初からやり直すことを、私は強く、そして一切のためらいなく推奨します。ステップを飛ばしてもプログラミングの方法を学べると思わないでください。学べません。まずは基本的な概念とコマンドを確実に理解し、それから道の領域に飛び込むべきです。

さて、それでは先に進みましょう。この時点で、今回のコードがこのトピックの冒頭で説明した内容を正確に示していることが、はっきりと理解できると思います。つまり、1つの変数に対して複数のIF文を使って評価しており、それぞれのIF文は特定の1つの値との一致を確認しています。値が「より大きい」や「より小さい」かどうかではなく、完全に一致するかどうかだけを見ています。これこそが重要なポイントです。つまり、コード01のようなケースが出てきた場合、そこからもっと洗練された書き方に置き換えることが可能です。その何かとは、SWITCH文です。

これで明確に定義され、よく理解できたので、実行時にまったく同じ結果を生成する別のコード例を見てみましょう。以下に示します。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06.     uchar counter = 5;
07. 
08.     switch (counter)
09.     {
10.         case 5:
11.             Print("The counter value is five.");
12.             break;
13.         case 3:
14.             Print("The counter value is three.");
15.             break;
16.         case 1:
17.             Print("The counter value is one.");
18.             break;
19.         default:
20.             Print("The counter value is unknown.");
21.     }
22. }
23. //+------------------------------------------------------------------+

コード02

さて、読者の皆さん、これでお分かりいただけたでしょう。コード02はコード01と非常によく似ており、出力結果に一切の違いはなく、まったく同じ結果を生み出します。とはいえ、コード02のほうがずっと複雑に見えるので、コード01を使い続けたいと思った方もいるかもしれません。実際、一見しただけなら、コード02のほうが複雑に見えるのは事実です。では、プログラムを書く際に、なぜあえてコード01ではなくコード02、つまりSWITCH文を使うのでしょうか。これについては、SWITCH文の最も基本的な使い方に限定するなら、明快な答えを出すのは少し難しいかもしれません。しかし断言できるのは、SWITCHにはIFにはない明確な利点が存在するということです。その最大のポイントは、実行時に「他の値」も扱える能力を持っているという点です。これはIFにはできない芸当です。

このような動作はSWITCH文のより高度な使い方に属します。ここで言及しているのは、わかりにくかったり複雑に思えるという理由だけで、SWITCHを完全に敬遠してもらいたくないからです。実際には、想像以上に便利な構文です。

それでは、コード02を詳しく見てみましょう。いくつか面白い要素が登場していることに気づいたでしょう。まず、このBREAK文はここで何をしているのでしょうか。BREAKは通常ループ内で使用されませんか?その通りです、読者の皆さん。BREAK文は確かにループ内で使用されます。ただし、SWITCH文の中でも特定の場面で使用されるのです。その目的は、SWITCH文の実行の流れを明示的に制御することです。具体的には、BREAK文を記述することで、「ここでこのSWITCHブロックの処理を打ち切る」という指示をコンパイラに与えるわけです。これにより、次にどの処理をすべきか、コンパイラが迷うことなく判断できます。ある意味、これはループ内のBREAKと似た仕組みですが、適用のされ方は構造の違いに基づいて異なります。ご安心ください、これについてはこの後、もう少し詳しく説明していきます。その前にもう一つ、皆さんが気づいているかもしれないポイントについて触れましょう。それは、予約語「CASE」の存在です。コード01とコード02を比較してみると、明らかな類似点が見えてくると思います。

SWITCH文はIFに似ていますが、ここでブロックが入力されます。CASEという単語は、コード01の各IF式で使用される等価条件とほぼ同じように動作します。CASEに続いて値を指定しますが、これは各IF条件で指定した値とまったく同じです。面白いと思いませんか。いいえ、これは偶然ではありません。SWITCH文はまさにこのように動作するように設計されており、実際の使用ではこのように理解される必要があります。だからこそ、最初はSWITCHがややこしく見えても、その本質を理解し始めると非常にシンプルかつ強力な構文だと実感できるはずです。きっとすぐに、応用アイデアが次々と浮かんでくるでしょう。

さて、コード01では「どの条件にも一致しなかった場合」に実行される11行目がありましたが、SWITCH文にも同じような動作をする仕組みがあります。それが、もう1つの予約語である「DEFAULT」です。SWITCH文やそのブロック内では、DEFAULTを使って、どのCASEにも一致しなかった場合に実行する処理を指定します。通常、このDEFAULTはブロックの最後に置かれるのが一般的です。その方が構造的にも読みやすく、論理が明確になるからです。ただし、技術的にはブロック内のどこに置いてもOKです。ただし、それはスタイル的にはちょっと奇妙に映るかもしれません。

なかなか面白いと思いませんか。さらにもう1つ、SWITCHの利点をより明確にしてくれる重要な違いを紹介しておきます。IF文では、「条件がtrueと評価されたときのみ」ブロックが実行されます。条件がtrueでなければ、何も実行されません。この点は非常に直線的です。一方で、SWITCH文では、まず与えられた値(式)を数値的に評価し、その値がどのCASEに一致するかを判断します。一致したCASEブロックが見つかれば、その場所から実行が開始されます。しかし、BREAK文が出てくるか、SWITCHブロックの終わりに達するまでは処理は続いてしまうという点に注意が必要です。

ですから、現時点では必ず新しいCASEの前にBREAK文を記述する習慣をつけてください。このようにすることで、コードの構造が明確になり、混乱を防ぐことができます。後ほど、あえてBREAKを使わないことで処理を次に「落ちるように」継続させるテクニックについてもご紹介します。しかし、それまでは、新しいCASEの前に必ずBREAKを入れる習慣をつけてください。

それでは、SWITCH文の実行フローがどのように機能しているのか、次にその流れを図で見ていきましょう。これは以下の図に示されています。

図01

読者の皆さん、ここではこれまで見てきた実行フロー図とは少し異なるものを扱います。というのも、図01はSWITCH文をどのように理解すればよいかを示すために設計されているからです。ですから、SWITCHがどう動作するのかを本当に理解したいのであれば、特に今後さらに高度な内容に進む前に、この図をしっかりと理解しておくことが重要です。この図の理解ができれば、今説明しているレベルを超えるような高度な使い方であっても、SWITCH文をスムーズに扱えるようになるでしょう。

以下はその解説です。ご覧のとおり、すべては他の文と同じように始まります。つまり、予約語を使って文の開始を宣言するのです。その瞬間から、出口(図の端にある小さな円)に達するまでのすべてが、完全にSWITCHブロックの内部に属します。この内部にあるものは外部のコマンドからは一切アクセスできません。この点を理解しておくことは、後ほど登場するある重要な概念を理解するためにも不可欠です。

さて、次に現れる要素が「式」です。式は、論理的にではなく数値的に解釈されるべきものです。では、それは実際にどういう意味なのでしょうか。つまり、「大なり」や「小なり」といった条件式をこの中で使っても、思ったような結果にはならないということです。IF文とは異なり、IFでは式がtrueかfalseかがすべてでしたが、SWITCHの場合はそうではありません。SWITCHにおいては、式が常に「数値を返すもの」として考えられなければならないのです。その数値は、次のステップで使われます。

次に進むと、今度はCASE文の出番です。ここで、式の値が論理的に評価されます。つまり、真か偽かが判断されます。ただし、少し疑問が生まれるかもしれません。何か矛盾があるようです。先ほど、「式は論理的ではなく数値的に評価される」と言ったのに、今は「論理的に評価される」と言っているのです。これは確かに矛盾して聞こえるかもしれません。ごくもっともな疑問です。最初は、誰でも混乱するものです。

残念ながら、これをもっと単純に説明する方法はありません。実際には、式で得られた値はそのまま渡されて、複数のCASEに対して順番に比較されます。この比較には厳密な順序はなく、式とCASEの値のつながりは純粋に数値的です。しかし、CASE文が実行されるときには、その値は論理的に(trueかfalseか)で評価されます。ですので、図中の各CASEの横に「VALUE」というラベルを付けてあります。これは、「どの値が式と比較されているか」を示すためのものです。一致すれば、対応するROUTINEが実行されます。つまり、どんな決定処理であれ、論理的な比較がおこなわれるのです。たとえその比較が数値的な一致によって引き起こされたものであったとしても、です。ここが、混乱を招きがちなポイントです。多くの人が、式の評価がSWITCHの中で直接起きると思い込んでしまうのですが、実際に評価が起きるのは、特定のCASEとのマッチングのときなのです。

以前の記事でも言いましたが、これまでの内容をしっかり理解していないと、SWITCH文は混乱しやすい構文です。そして、今私たちが扱っているのは、その最も基本的な使い方にすぎません。

ともかく、CASEが式の値と一致すると、ROUTINEが実行されます。ここで、一区切りしましょう。さて、ここからが話がややこしくなる部分です。ただし、この点については後で詳しく説明します。図01で見た、あの赤い線を覚えているでしょうか。あの線は、まだ触れていない、より複雑な処理を表しています。とりあえず無視しましょう。もし自分で試して、その線を通過するとどうなるかを探りたい方は別ですが、そうでないなら、今は保留するのが良いでしょう。代わりに今やるべきことは、各ROUTINEの終わりにBREAK文を必ず挿入することです。これにより、処理がSWITCHブロックの外へ正常に抜けることが保証されます。このSWITCHという構文は面白いのですが、気を抜くと本当に頭を悩ませるものです。SWITCHの中でロジックを複雑に書いてしまうと、制御フローに精通していないと追えなくなるようなコードになってしまうこともあります。

ここまでは順調ですが、ちょっと引っかかることがあります。これまでの記事では、BREAK文はループの途中で条件を再評価せずに終了できるものでした。それはすごく理にかなっていました。ところが、今、SWITCH文の中でBREAKを使っているのを見ると、「もし、ループの中にいて、その中にSWITCHがあったとて、そのSWITCHの中でBREAKを使ったら、ループ全体も止まってしまうのでは」といった疑問が浮かぶかもしれません。読者の皆さん、それは素晴らしい質問です。それは、ここまでの内容をちゃんと理解して追ってきてくれている証拠です。ではこうしましょう。すでにループの作り方、BREAK・RETURN・CONTINUEによる制御方法は学んできたので、次は、この記事の最初の例や、それより前の例よりも少し高度な例を見てみることにしましょう

。ここでの目的は、特別なものを作ることでも、機能的なコードを書くことでもありません。そうではなく、学んできた概念を、より実践的・説明的な方法で見せることによって、理解を深めることが目的です。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06.     Print(__FUNCTION__, " ", __LINE__, " Counting...");
07.     Print(__FUNCTION__, " ", __LINE__, " Pit Stop :: ", Tic_Tac());
08.     switch (Tic_Tac())
09.     {
10.         case true:
11.             Print(__FUNCTION__, " ", __LINE__, " Return TRUE");
12.             break;
13.         case false:
14.             Print(__FUNCTION__, " ", __LINE__, " Return FALSE");
15.             break;
16.     }
17. }
18. //+------------------------------------------------------------------+
19. bool Tic_Tac(void)
20. {
21.     static uchar counter = 10;
22. 
23.     while (true)
24.     {
25.         switch (counter)
26.         {
27.             case 8:
28.                 counter = counter - 1;
29.                 return false;
30.             case 6:
31.                 Print("Press TAB to continue or ESC to abort the count.");
32.                 counter = counter - 1;
33.                 break;
34.             case 5:
35.                 if (TerminalInfoInteger(TERMINAL_KEYSTATE_TAB))
36.                 {
37.                     Print("Accelerating count.");
38.                     counter = 2;
39.                 } else if (TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE))
40.                 {
41.                     Print("General panic...");
42.                     return false;
43.                 }
44.                 continue;
45.             case 0:
46.                 return true;
47.             default:
48.                 counter = counter - 1;
49.         }
50.         Print(__FUNCTION__, " ", __LINE__, " :: ", counter);
51.         Sleep(300);
52.     }
53.     Print(__FUNCTION__, " ", __LINE__, "This line will never be executed.");
54. }
55. //+------------------------------------------------------------------+

コード03

この「コード03」では、コードの構築および実装に関する非常に興味深い要素がいくつか登場します。というのも、ここではこれまでに学んできたほぼすべての要素を実際に使っているからです。ただし、「コード03」の詳細に入る前に、まずはMetaTrader 5端末でこのコードを実行するとどうなるのかを見てみましょう。実は、実行結果としては2通りの可能性があります。それぞれのケースについては、以下のアニメーションで確認できます。

アニメーション01

この最初のアニメーションでは、ESCキーが押されたときに何が起こるかを確認できます。ここで、TABキーを押すと、次のアニメーションに示すように、少し異なる動作が起こります。

アニメーション02

2つのアニメーションには微妙な違いがあることに注目してください。しかし、ここで本当に重要なのは、この情報がどのように端末に到達するか、そしてフロー制御文が各情報がいつ表示されるかをどのように決定するかを理解することです。

さて、読者の皆さん、ここでは特定の部分について詳しく説明することはしません。各フロー制御文がどのように機能するかを本当に理解するために、以前の記事を再度読んでみることをお勧めします。ただし、コード03で物事がどのように展開するかについての概要は説明します。

コードのエントリポイントであるOnStartから始めましょう。6行目は、実行プロセスのどこにいるかを示しています。この行は実行されるとすぐに印刷されます。ただし、7行目はすぐには処理されません。Tic_Tac関数の呼び出しが含まれているためです。その結果、Tic_Tacがタスクを完了するまで、7行目の完全な実行は延期されます。

Tic_Tac関数(行19)内に入ると、23行目で無限ループに突入します。でも安心してください、親愛なる読者の皆さん。このループは形式上は無限ですが、特定の箇所で抜け出せる仕組みになっています。ここで何が起きているのかを理解するために、しっかりと注意を向けてください。25行目では、フロー制御文であるSWITCHに入ります。ここでは、カウンタの値に応じて特定の処理が実行されます。このカウンタ変数はstaticとして宣言されています。それは非常に重要です。カウンタ値が8に達すると、関数は呼び出し元に戻り、falseを返します。この時点で、7行目の処理が完全に終了します。これが、端末に表示されたメッセージの理由です。その後、処理は8行目に移り、再びTic_Tac関数を呼び出します。ただし、今回はその戻り値をSWITCH文の式として使っています。ここでも、Tic_Tacの処理が完了するまで、実行は待機します。そして再び19行目に戻り、処理が続行されます。

「待ってください。さっき29行目で関数を抜けたのでは?」と思われた方もいるでしょう。「29行目で処理が終了したのなら、すべてがリセットされて、また23行目のループが29行目で終わるのでは?」と。その通りです、親愛なる読者の皆さん。ですが、呼び出し元に戻る前に28行目の処理が実行されているため、カウンタの値は「7」を指しています。そして、25行目のSWITCH文には「7」に一致するcaseが存在しないため、処理は47行目までジャンプします。47行目には、48行目のみを実行するルーチンがあります。その48行目では、カウンタを1つ減らす処理がおこなわれます。これにより、カウンタは「6」を指すようになります。

いずれにしても、SWITCHブロックが終了した後は、50行目と51行目へと進みます。このようにして、値7の出力がターミナルに現れない理由が説明できます。値6が出力されると、再びループが始まり、SWITCH文が実行されます。今度は式の値が「6」になっています。ここで注目してほしいのが、31行目の処理です。この行では、別のメッセージが端末に出力されます。次に32行目で、カウンタが「5」に設定されます。では、33行目のBREAK文では何が起こっているのでしょうか。ここが初心者の方が特につまずきやすいポイントです。以前の記事で、BREAK文がループを終了することを学びました。それは正しく、明確に実演もされてきました。ですが、今回のケースでは話が少し違います。このBREAKは、外側のループを終了するものではありません。なぜなら、ここでのBREAKはSWITCH文の一部だからです。このような場合、BREAKはWHILE、DO WHILE、FORといった外側のループではなく、SWITCH文に対してのみ作用します。

混乱するかもしれませんが、この動作を証明するために、53行目にメッセージを仕込んでおきました。ただし、このメッセージはコード03では絶対に表示されることはありません。なぜなら、コード全体でBREAK文が出現するのは33行目だけだからです。

この点は、明確に理解しておくべきです。この記事にはコード03が添付されているので、BREAK演算子のちょっとした癖が理解できるまで、じっくりと観察・実験してみてください。

33行目のBREAKが実行されると、処理は50行目へスキップします。その直前の32行目でカウンタの値が減少していることを思い出してください。つまり、カウンタは「5」になっています。

ループが再び始まり、再度SWITCHが評価されます。今度は式が「5」なので、それに対応するCASEが実行されます。さて、ここからが本当に面白いポイントです。もう一度、細心の注意を払ってください。この状態で、プログラムはカウンタが6のときに表示されたメッセージに従い、ユーザーが何らかのキーを押すのを待機します。ですが(ここが非常に重要です)、ユーザーが何も押さなかった場合、44行目のCONTINUE文が実行されます。ここで処理の流れに疑問が生じます。その答えは、CONTINUEは囲んでいるループに作用するということです。つまり、実行は23行目(ループの最初)に戻り、50行目と51行目は完全にスキップされます。このループは、式が「5」のままである限り、ずっと繰り返され続けます。しかし、ユーザーがいずれかのキーを押すと、処理の流れが変化します。押されたキーに応じて、38行目へ進んでカウンタを2に設定するか、42行目へジャンプします。どちらにしても、最終的には42行目または46行目でループが終了します。ただし、それでもなお53行目は絶対に実行されません。その後、再び8行目に戻り、今度はSWITCHの式が再評価されます。ここで新たな疑問が出てくるかもしれません。「待ってください。SWITCH文は数値で式を評価するのではないですか?ケース値がブール値であるのはなぜですか?意味が分かりません。」読者の皆さん、まさにその点こそが重要なのです。以前IF文を扱ったとき、どのような値がtrueまたはfalseとみなされるのかを解説しました。falseの定義は常に「ゼロ」ですが、trueの定義は「非ゼロ」、より厳密には、10行目の文脈ではtrue = 数値の1です。つまり、Tic_Tac関数が0または1を返した場合、8行目のSWITCH文はその値を評価し、対応するcaseでメッセージを表示します。ですが、もしTic_Tacの戻り値を0や1以外の数値に変更した場合、SWITCH文に一致するcaseが見つからず、メッセージは表示されません。

ここで、もう1つ興味深い点を指摘しておきましょう。8行目のSWITCH文をIF文に置き換えた場合、その書き方次第ではメッセージが表示されることがあります。ここでの目的は、プログラマーのように考える力を養うことです。単に「正解」を教えることではありません。代わりに、プログラマーのように考えて、各文の機能や制限など、各文がどのように動作するかを理解してください。


最終的な考察

この記事では、SWITCH文の仕組みについて解説しました。一見すると、問題を解決するどころか、かえって混乱を招くように思えるかもしれません。しかし、練習を重ねることで、必ずや役立つ存在になると保証します。改めて強調しておきますが、各制御構造はじっくりと時間をかけて学習してください。同じ動作を、少しずつ異なる方法で再現してみるとよいでしょう。そうすることで、各要素がどのように組み合わさって動作しているのかを、より明確に理解できるようになります。

最初は小さなところから始めましょう。焦ってインジケーターやエキスパートアドバイザー(EA)をいきなり作ろうとせず、まずは確かな知識の土台を築くことが何よりも大切です。そうすることで、今後の開発がより効率的になり、あなたの努力も確実に報われるはずです。ですので、時間をかけて添付されたコードをじっくり確認してみてください。それでは、次回の記事でお会いしましょう。

MetaQuotes Ltdによりポルトガル語から翻訳されました。
元の記事: https://www.mql5.com/pt/articles/15391

添付されたファイル |
Anexo.zip (1.43 KB)
リスク管理への定量的なアプローチ:PythonとMetaTrader 5を使用してVaRモデルを適用し、多通貨ポートフォリオを最適化する リスク管理への定量的なアプローチ:PythonとMetaTrader 5を使用してVaRモデルを適用し、多通貨ポートフォリオを最適化する
この記事では、複数通貨ポートフォリオの最適化におけるバリュー・アット・リスク(VaR: Value at Risk)モデルの可能性について探ります。PythonのパワーとMetaTrader 5の機能を活用し、効率的な資本配分とポジション管理のためにVaR分析をどのように実装するかを紹介します。理論的な基礎から実践的な実装まで、アルゴリズム取引における最も堅牢なリスク計算手法の一つであるVaRの応用に関するあらゆる側面を取り上げています。
PythonとMQL5における局所的特徴量選択の適用 PythonとMQL5における局所的特徴量選択の適用
この記事では、Narges Armanfardらの論文「Local Feature Selection for Data Classification」で提案された特徴量選択アルゴリズムを紹介します。このアルゴリズムはPythonで実装されており、MetaTrader 5アプリケーションに統合可能なバイナリ分類モデルの構築に使用されます。
リプレイシステムの開発(第65回)サービスの再生(VI) リプレイシステムの開発(第65回)サービスの再生(VI)
この記事では、リプレイ/シミュレーションアプリケーションと併用する際に発生するマウスポインタの問題について、その実装と解決方法を解説します。ここで提示されるコンテンツは、教育目的のみに使用されることを意図しています。いかなる状況においても、提示された概念を学習し習得する以外の目的でアプリケーションを閲覧することは避けてください。
アーチェリーアルゴリズム(AA) アーチェリーアルゴリズム(AA)
この記事では、アーチェリーに着想を得た最適化アルゴリズムについて詳しく検討し、有望な「矢」の着地点を選定するメカニズムとしてルーレット法の活用に焦点を当てます。この手法により、解の質を評価し、さらなる探索に最も有望な位置を選び出すことが可能になります。