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

初級から中級へ:WHILE文とDO WHILE文

MetaTrader 5 | 29 4月 2025, 08:34
43 0
CODE X
CODE X

はじめに

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

前回の記事「初級から中級まで:IF ELSE文」では、条件付きフロー制御を実装するためのコードを調べる方法について説明しました。これは、分析される式に応じて、いずれかの手順を実行するか別の手順を実行するかを選択できるようにするために行われました。

IF文は、その仲間であるELSEと組み合わせると非常に便利なので、ほぼあらゆるコードを実装できますが、実際にはこれはあまり賢明ではありません。2つの文のみを使用すると、コードの一部を理解し理解することが非常に難しくなります。

まさにこの理由から、プログラミング言語はIF-ELSEペアだけに依存するわけではありません。コードの読みやすさと理解しやすさを向上させるために、ループ文を含むより広範な命令セットが組み込まれています。

一般的に言えば、ループ文は、誇張ではなく、存在する制御フロー命令の中で最も危険なものの1つです。これは、ループを実装する際に小さなプログラミングエラーが発生するだけでも、大惨事につながる可能性があるためです。コードが無限ループに入るため、これは深刻な問題です。多くの初心者は、このような問題に遭遇すると諦めてしまいます。彼らは、コード内にループを実装する可能性があるという可能性にただただ恐怖を感じています。

プログラム内でループを作成するには、基本的に2つの方法があります。1つ目は、ループが実装されているメインルーチンの外部で関数とプロシージャを使用することです。2番目は、制御フロー文を使用する方法です。

制御フロー文を使用する方が簡単な方法なので、ここではそれを使って始めます。ただし、この先で関数とプロシージャを使用してループを作成する方法を説明します。多くの人が想定しているのとは反対に、制御フロー文だけに頼るのではなく、関数またはプロシージャを使用してループを作成する正当な理由があります。しかし、それについては、より適切な時期に別の記事で説明することにします。

この記事を読み進めるための前提条件として、変数と定数を理解している必要があります。このトピックについてはすでに説明しました。ただし、変数と定数が何であるかを知ること以上に、ここで最も重要なのは、ビット幅が値にどのように影響するか、変数の型がその値にどのように影響するかを理解することです。

私が言及している内容がよくわからない場合は、「初級から中級まで:オペレーター」ここでは、このトピックに関連するいくつかの重要な概念について説明します。そこに記載されている内容は基本的なものですが、ここで説明する内容を理解できれば十分でしょう。この記事で紹介されているすべての内容をより包括的に理解するために、他の記事を参照することを強くお勧めします。

この時点で、私はちょっとしたジレンマに直面しています。FOR文は一般にループを作成するのが簡単なので、プログラマーの間で好まれることが多いのですが、いくつかの欠点もあります。一方、ループを作成するための代替制御文は、FOR文よりも少しリスクが高い傾向があります。それで、どれを最初に導入するか検討中です。それまでの間、次のように進めていきましょう。このトピックに関連するいくつかの重要な概念を説明する新しいセクションを開始します。


ループを使用する理由

多くのプログラマーは、コード内にループを作成することを心から恐れています。他の人は、それらをできるだけ避け、他に方法がない場合にのみそれらを使用します。しかし、なぜループの使用に対してそれほどの恐れがあるのでしょうか?理由は簡単です。ループには本質的にリスクが伴うからです。ループを入力するたびに、コードの実行に依存するようになり、必要に応じてループを適切に終了するための特定の条件が必要になります。そうしないと、ユーザーが気付かないうちにループが無限サイクルに入り、実際にはコードが無限ループに陥っているにもかかわらず、コンピューターが何かを処理するのに時間がかかりすぎていると誤解する可能性があります。

多くの開発者がループを恐れるもう1つの理由は、ループ内で何が起こっているかを分析することが非常に難しい場合があることです。これは、実際のアプリケーションでは、ループが完了するまでに何千回、あるいは何百万回も実行する必要があることがよくあるためです。実行される計算の種類によっては、最終結果が出るまでに数時間かかる場合があります。

これは多くの人にとっては考えられないことだとわかっています。プログラムがタスクを完了するのに何時間もかかるのはどうしてでしょうか?しかし、それは実際に起こります。タスクを完了するには実際に何時間もの処理が必要となるシナリオがあります。とはいえ、ほとんどの場合、特に教育の分野では、記述するループは比較的小さく、反復回数も数千回程度になります。通常、実行時間はわずか数秒または数分になります。良い例としては、ニューラルネットワークのトレーニング用に設計されたアプリケーションが挙げられます。

他のプロファイルでは、純粋なMQL5で完全に記述されたニューラルネットワークなどのアプリケーションを実装する方法を示します。私の見解では、これはMQL5とその基礎となる数学の確かな理解のみを必要とする中級レベルのプロジェクトです。残りは比較的簡単です。

さて、このセクションのタイトルに挙げられた質問にはまだ答えていません。ループを使用する理由は何ですか?答えは、コードにシンプルさをもたらすことにあります。ループを使用すると、手動でコードを繰り返したり、Ctrl+CやCtrl+Vに頼ったりすることなく、特定の操作を実行する回数を制御できます。次の例を考えてみましょう。先ほど、与えられた数値の階乗を計算するように設計された簡単なコードを紹介しました。ご記憶にあるかと思いますが、コード自体は非常に単純なものでした。まだ見ていない人のために、もう一度ここに載せておきます。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06.     uchar counter = 0;
07.     ulong value = 1;
08. 
09.     Print("Factorial of ", counter, " => ", value);
10.     counter = counter + 1;
11.     value = value * counter;
12.     Print("Factorial of ", counter, " => ", value);
13.     counter = counter + 1;
14.     value = value * counter;
15.     Print("Factorial of ", counter, " => ", value);
16.     counter = counter + 1;
17.     value = value * counter;
18.     Print("Factorial of ", counter, " => ", value);
19.     counter = counter + 1;
20.     value = value * counter;
21.     Print("Factorial of ", counter, " => ", value);
22. }
23. //+------------------------------------------------------------------+

コード01

小さい数値の場合はコード01が許容される可能性があります。しかし、それらが増えるにつれて、事態はより複雑になり始めます。20の階乗の場合でも、CTRL+CやCTRL+Vを使用しても、コード実装でエラーが発生する可能性が非常に高いだけでなく、セットアップも非常に困難になります。そこで、このコード01が出てくる同じ記事で、別のコードを開発しました。以下をご覧ください。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06.     Factorial();
07.     Factorial();
08.     Factorial();
09.     Factorial();
10.     Factorial();
11. }
12. //+------------------------------------------------------------------+
13. void Factorial(void)
14. {
15.     static uchar counter = 0;
16.     static ulong value = 1;
17. 
18.     Print("Factorial of ", counter, " => ", value);    
19.     counter = counter + 1;
20.     value = value * counter;
21. }
22. //+------------------------------------------------------------------+

コード02

この時点で、コードが少しコンパクトになり、小規模な因数分解にCtrl+CとCtrl+Vを使用するのが少し簡単になっていることに気付くでしょう。しかし、はるかに大きな数を因数分解する必要がある場合はどうでしょうか?どうしたらそんな事ができるんですか?そうですね、ulong値の64ビットの上限を超えていないと仮定すると、階乗レイヤーを複数回コピーして貼り付ける必要があります。もちろん、これには、新しい階乗を計算する必要があるたびにコードを調整するために必要な追加の作業がすべて含まれているわけではありません。明らかに、これは楽しいというよりは、はるかに退屈なものとなるでしょう。このため、ループを使用すると、コードがはるかに管理しやすくなります。そして、これがループが不可欠である理由を説明しています。

ここまで理解できたので、使用する文について議論を始めることができます。FORループは多くのプログラマー(この記事を書いている私も含む)の間で人気ですが、別の文から始めましょう。この代替案には2つの実装方法がありますが、説明が簡単で、結果として、別のアプローチを開始するきっかけとなった特定のニュアンスを持つFORループに比べて理解しやすいです。


WHILE文とDOWHILE文

このセクションのタイトルには遊び心のある言葉が使われていますが、このループはIF文と同じ原則に従っているため、理解するのは非常に簡単です。ただし、留意すべき重要な注意事項がいくつかあります。開発者がこのループを使用する際に苦労することは珍しくありません。理由は簡単です。忘れっぽさです。多くのプログラマーは、ループをいつ終了するかを決定する条件を調整または修正することを忘れます。驚くべきことに、経験豊富な開発者でもこの間違いを犯します。したがって、これを警告として考えてください。この文を使用するコードを実装するときは注意してください。

WHILEとDO-WHILEペアの違いは非常に単純です。WHILEでは内部ルーチンがまったく実行されない可能性がありますが、DO-WHILEではルーチンが少なくとも1回実行されることが保証されます。基本的な仕組みはこうなっています。簡単ですよね。ただし、これによってリスクが軽減されるわけではありません。それでは、2つのうち簡単な方であるWHILE文から始めましょう。実行フローは以下のようになります。

図01

前の記事で説明したIF文と非常によく似ていることに注目してください。実際、ここでの表現の機能は同じ原則に従います。つまり、式がtrueと評価された場合にのみ、ループは定義されたルーチンを実行します。つまり、ループを実行するには、式がゼロ以外である必要があります。これが、最初にIF文を導入した理由です。この声明を理解することは、熟練したプログラマーを目指す人にとっても、単に楽しみのためにコードを書きたい人にとっても非常に重要です。

完璧です。この構造はIF文に非常に似ているため(読者の皆さんはIF文を勉強して宿題を終えていらっしゃると思いますが)、これでより直接的なアプローチをとることができます。

ループの基本を紹介するために、非常に簡単なコードから始めましょう。皆さんを困惑させたいわけではなく、実際にどのように機能するかを理解できるようにお手伝いしたいのです。これを実行するには、次のコードを分析してみましょう。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06.     char info = 10;
07. 
08.     Print(__FUNCTION__, " ", __LINE__, " It will be executed anyway...");
09. 
10.     while (info)
11.     {
12.         info = info - 1;
13.         Print(__FUNCTION__, " : ", info);
14.     }
15. 
16.     Print(__FUNCTION__, " ", __LINE__, " It will be executed anyway...");
17. }
18. //+------------------------------------------------------------------+

コード03

このコード03は、WHILEループがどのように動作するかを効果的に示しています。実行すると、以下に示す出力が生成されます。

図02

図02で強調表示されたセクションは、ループによって生成された出力の部分を表しています。これはWHILEループ内で実行されるルーチンです。さて、これがどのように起こったのか、そしてなぜカウントダウンが9で始まり0で終わったのかを簡単に見てみましょう。

これを理解するには、2つの重要な詳細を観察する必要があります。まず、6行目で、変数を値10で初期化します。WHILE文は、6行目に設定された変数の値である条件を評価すると、条件が真であると判断され、ループが開始されます。ただし、これが2番目に重要な点ですが、13行目で値を端末に出力する前に、12行目で変数infoの値を1減らしています。このため、カウントダウンは9から0へと進みます。ゼロはブール値の偽値とみなされるため、ループはゼロで終了します。

しかし、12行目のinfo変数を減算するのではなく、1増やすとどうなるでしょうか?ループは無限サイクルに入りますか?親愛なる読者の皆様、それは素晴らしい質問です。あなた自身で実験して結果を確認してみてください。ただし、テストする前に、まずこの特定のケースでループが無限サイクルに入らない理由を理解しましょう。

数字は負の無限大から正の無限大まで広がるという一般的な直感とは反対に、コンピューティングの世界では物事は異なる動作をします。コンピュータが表現できるすべての値には上限と下限があります。この制限は、使用されている変数タイプのビット幅によって決まります。これについては以前の記事で説明しました。この制限のため(一部の言語ではこのような制約が課されないことに留意してください。ただし、それはここでの説明の範囲外です)、値の変更によって変数が最終的にゼロに達することが保証される場合、ループはある時点で終了します。どれだけ時間がかかっても、いつかは終わります。ただし、このシナリオでは、WHILEループに特有の課題がいくつかあります。この段階での混乱を避けるため、この議論は別の機会に残しておきます。おそらく次の記事で。

つまり、WHILE文について言えることは基本的にこれだけです。ただし、ここで説明しておくと役立つかもしれない追加の詳細が1つあります。コードを制御された方法で動作させたい場合、特にループの場合は、通常の終了条件に加えて、二次的な終了条件を含めることがよくあります。これはフェイルセーフとして機能し、ループを強制的に終了させてプログラムが通常の実行を継続できるようにします。

MQL5はイベント駆動型言語(このトピックについては後でさらに詳しく説明します)であるため、イベントを無期限に待機するループを作成することはまれです。この動作は、本質的にイベント駆動ではないCやC++などの言語ではより一般的です。

実際には、アプリケーション内で制御された一時停止を作成するためにループを使用することがよくあります。この一時停止は、事前に決められた期間、または特定のイベントが発生するまでアクティブなままになります。ただし、この目的でWHILEループを直接使用することはあまり一般的ではありません。その理由は、WHILEループは初期条件が真の場合にのみ実行されるためです。そして多くの場合、これは私たちが必要としているものではありません。

ただし、緊急出口が必要な場合は、WHILEループの方が適切な選択となることがよくあります。条件が最初からfalseと評価された場合、ループはまったく実行されません。これは、多くの場合、ループのルーチンが特定の基準に基づいて実行を継続するかどうかに直接影響を与える可能性があるため、非常に重要です。DO-WHILEループについて説明するときに、この概念をさらに詳しく説明します。

では、次のことをやってみましょう。理論上は無限になるループを意図的に作成します。ただし、終了を許可する条件も実装します。このアプローチは以下で確認できます。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06.     char info = 5;
07. 
08.     Print("Press ESC to finish counting...");
09. 
10.     while (!TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE))
11.     {
12.         info = info - 1;
13.         Sleep(200);
14.         Print(__FUNCTION__, " : ", info);
15.     }
16. 
17.     Print(__FUNCTION__, " ", __LINE__, " It will be executed anyway...");
18. }
19. //+------------------------------------------------------------------+

コード04

コード04では、10行目にループがあり、理論上は無期限に実行されます。ただし、ユーザーがESCキーを押した場合、これは発生しません。注意すべき重要な点の1つは、警告メッセージはループが始まる前に1回だけ表示されることです。端末に出力されるこのメッセージをユーザーが見逃すと、混乱を招く可能性があります。ターミナルには、以下に示すような出力が表示されます。

図03

今回は、「info」変数の値がゼロになったにもかかわらず、ループが継続していることに注意してください。これは、ループが終了するタイミングを決定する条件が、ESCキーが押されたかどうかに依存するようになったために発生します。つまり、プログラムは実行を続行する前にイベントを待機します。MQL5スクリプトで使用されるもう1つの一般的なテストは、スクリプトが中断されたかどうかを確認することです。これを実装するには、コード04の10行目を次の行に置き換えるだけです。

    while ((!TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)) && (!IsStopped()))

この小さな変更により、コード04のループを2つの方法で終了できるようになります。ESCキーを押す方法と、チャートからスクリプトを手動で削除する方法です。簡単だと思いませんか、読者の皆さん?ループを恐れる必要はありません。しかし、まだ1つの問題が残っています。実行中に8行目の警告メッセージが簡単に見逃される可能性があるのです。つまり、ユーザーはESCキーを押すとアプリケーションも停止することに気付かない可能性があります。

この問題を解決する1つの方法は、ループ内に8行目を配置することです。ただし、WHILEループを直接変更するのではなく、この機会にDO-WHILEループのバリエーションを調べてみましょう。この内容については、よりわかりやすく説明するために、新しいトピックで取り上げることにします。


DO...WHILEループ

このセクションのタイトルには、ちょっとしたユーモアを添えずにはいられませんでした。しかし、ある意味では、これはDO-WHILEループを完璧に説明しています。これは単一の文ですが、IFELSEと同様にペアのように機能します。しかし、ここでは状況が少し異なります。

前回の説明で、WHILEループは条件が真の場合にのみ実行されることを思い出すかもしれません。ここでの主な違いは、条件が最初に真であるか偽であるかに関係なく、DO-WHILEループはルーチンを少なくとも1回実行するという点です。これは、DO文(文字通り「DO」を意味します)がWHILE条件(「WHILE」を意味します)の前に来るためです。これにより、条件がチェックされる前に、ループ内のルーチンが少なくとも1回実行されるようになります。この動作は特定のシナリオで特に役立ち、特に条件を評価する前に特定のルーチンを少なくとも1回実行する必要がある場合に、特定のルーチンの機能をより適切に制御できるようになります。

これを説明するために、警告メッセージが定期的に表示されるようにコード04を変更してみましょう。これをコード04で直接実行することもできますが、行8を複製するオプションがなかったと仮定しましょう。さらに重要なのは、事前の条件に関係なく、ループが少なくとも1回実行されるようにすることです。

したがって、次のコードが得られます。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06.     char info = 10;
07. 
08.     do
09.     {
10.         if (((info / 5) * 5) == info) Print("Press ESC to finish counting...");
11.         info = info - 1;
12.         Sleep(200);
13.         Print(__FUNCTION__, " : ", info);
14.     }while (!TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE));
15. 
16.     Print(__FUNCTION__, " ", __LINE__, " It will be executed anyway...");
17. }
18. //+------------------------------------------------------------------+

コード05

このコードを実行すると、以下に示すようなものが表示されます。

図04

ここでは、ある意味では、理解するのが非常に興味深い事柄を扱っています。これは、コード05の一部のアクションが一見非論理的に見える可能性があるためです。しかし、以前に公開された記事を注意深く注意深く研究していれば、比較的早く理解できるようになるでしょう。

さて、ここで何が起こっているのか、そしてなぜESCキーを押すように求めるメッセージが時々表示されるのかを理解しましょう。ご覧のとおり、ループ内のプロシージャの実行を継続するかどうかのチェックが14行目で実行され、完全なループプロシージャが少なくとも1回実行されます。これで、DO要素がWHILE要素とこの組み合わせで共存する理由が明らかになったと思います。

これから説明する内容に十分注意してください。非常に重要なことです。ここでの考え方はWHILE文の場合と同じです。ループは、WHILE文式がfalseになるまで実行されます。しかし、ループがどこから始まるのかをどうやって知るのでしょうか?8行目を削除すると、ループがどこから始まるのか正確にわからなくなります。さらに悪いことに、ループ内に必要な10行目から13行目までの手順は、手順としてではなく、通常のコードとして認識されます

14行目に表示されているWHILE文は、実際にはループになります。ただし、ループ内では他のコマンドは実行されないため、プロシージャは空になります。ESCキーを押して終了するまで待機するだけです。

DO要素とWHILE要素の組み合わせに基づいてのみ、コンパイラーと他のプログラマーの両方が、ループが8行目から始まり14行目で終了することを判断できます。これは少し混乱するかもしれませんが、8行目のDO要素を削除すると、コードは次のようになり、理解しやすくなります。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06.     char info = 10;
07. 
08. 
09.     {
10.         if (((info / 5) * 5) == info) Print("Press ESC to finish counting...");
11.         info = info - 1;
12.         Sleep(200);
13.         Print(__FUNCTION__, " : ", info);
14.     }while (!TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE));
15. 
16.     Print(__FUNCTION__, " ", __LINE__, " It will be executed anyway...");
17. }
18. //+------------------------------------------------------------------+

コード06

ご覧のとおり、簡単には気付かれない可能性のあるコードのこの小さな変更により、結果はまったく異なります。わかりやすくするために、画像は使用せず、代わりに下のGIFを使用して何が起こっているかを示します。

アニメーション01

適切な注意を払わずにループを作成すると、危険が1つ生じます。図04と同じ動作は見られなくなったことに注意してください。ここでは、ループの本体となるはずの部分が、通常のコードシーケンスであるかのように実行されました。しかし、その時点で停止し、コードは14行目に示されているループに入りました。その結果、ループの終了条件がループのルーチン内のアクションに依存している場合、そのアクションは発生しません。その結果、終了条件を持つように設計されたループは決して終了せず、恐ろしい無限ループが発生します。

ここで、10行目のメッセージがどのように、そしてなぜ間隔を置いて印刷されるのかを分析してみましょう。これを理解するには、10行目のIF文内の式を調べる必要があります。この表現は人間には意味をなさないかもしれませんが、特にMQL5のような厳密に型付けされた言語では、コンピューターにとっては完全に論理的です。

プログラミング言語における数学的計算については、すでに別の記事で説明しました。そうは言っても、変数infoの値を数値で割り、その結果にすぐに同じ数値を掛けるという、一見無意味な操作は、無意味に見えるかもしれません。ただし、プログラミングを始めたばかりの場合は、以前の記事を読むことを強くお勧めします。その理由は、この計算を実行すると、「info」の元の値と一致する結果または異なる結果が生成される可能性があるためです。値が同じ場合は、メッセージが印刷されます。異なる場合は、違いはありません。

このコードは添付ファイルとして提供されるため、より詳しく調べることができます。覚えておくべき重要な点は、除算と乗算の両方に同じ値を使用し、乗算の前に必ず除算をおこなう必要があるということです。ただし、整数値を使用する場合は注意が必要です。浮動小数点数は、後述する特定の要因により機能しません。

このトピックの最後に、DO-WHILEループの実行フロー図を調べてみましょう。以下に示します。

図05

ご覧のとおり、実際に動作する前に思ったほど複雑ではありません。実行フローを理解することは、単にコマンドと構文を記憶することよりもはるかに重要です。実行フローの仕組みが分かれば、より明確に考えることができるようになります。練習を続けることで、フロー内の小さな決断が最終結果にどのように影響するかを認識できるようになります。時間の経過とともに、趣味であっても自然にプログラミングスキルが身に付きます。1つのプログラミング言語に限定されず、他のプログラミング言語を学習できるほど熟練できるようになります。


最後に

この記事では、このトピックをできるだけわかりやすく簡潔な方法で紹介することを目的としました。多くの初心者プログラマーはループを悪夢とみなします。しかし、忍耐と集中力、そして細心の注意を払えば、自分でコードを実装する場合でも、他のプログラマーの仕事を研究する場合でも、本当に興味深い成果を達成できることを実証できたと思います。これらは非常に役立つものなのです。

ループを正しく効率的に使用すると、条件の構造化だけでなく、ロジックの簡素化においても、かなりの時間を節約できます。実際、この記事の冒頭の例では、ループを使用せず、順次呼び出しのみを使用して数値因数分解を示しましたが、これははるかにコンパクトで、したがってより効率的な方法で書き直すことができます。以下にループがどのようにエレガントかつ実用的なソリューションを可能にするかを示します。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06.     uchar counter = 0;
07.     ulong value = 1;
08. 
09.     while (counter < 5)
10.     {
11.         counter = counter + 1;
12.         value = value * counter;
13.     }
14. 
15.     Print("Factorial of ", counter, " => ", value);
16. }
17. //+------------------------------------------------------------------+

コード07

コード02を変更して、6行目と10行目の間の連続呼び出しの代わりにループを使用するようにしてください。これを実行する方法が見つからなくても、心配しないでください。まだすべてをカバーしていないので、次の記事でループについてさらに詳しく説明します。手遅れになる前に練習を始めましょう。

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

添付されたファイル |
Anexo.zip (1.64 KB)
取引におけるニューラルネットワーク:階層型ベクトルTransformer (HiVT) 取引におけるニューラルネットワーク:階層型ベクトルTransformer (HiVT)
マルチモーダル時系列の高速かつ正確な予測のために開発された階層的ベクトルTransformer (HiVT: Hierarchical Vector Transformer)メソッドについて詳しく説明します。
取引におけるニューラルネットワーク:統合軌道生成モデル(UniTraj) 取引におけるニューラルネットワーク:統合軌道生成モデル(UniTraj)
エージェントの行動を理解することはさまざまな分野で重要ですが、ほとんどの手法は特定のタスク(理解、ノイズ除去、予測)に焦点を当てており、そのため実際のシナリオでは効果的に活用できないことが多いです。この記事では、さまざまな問題を解決するために適応可能なモデルについて説明します。
多通貨エキスパートアドバイザーの開発(第17回):実際の取引に向けたさらなる準備 多通貨エキスパートアドバイザーの開発(第17回):実際の取引に向けたさらなる準備
現在、EAはデータベースを利用して、取引戦略の各インスタンスの初期化文字列を取得しています。しかし、データベースは非常に大容量であり、実際のEAの動作には不要な情報も多数含まれています。そこで、データベースへの接続を必須とせずにEAを機能させる方法を考えてみましょう。
ニューラルネットワークの実践:最初のニューロン ニューラルネットワークの実践:最初のニューロン
この記事では、シンプルで控えめなもの、つまりニューロンの構築を始めます。ごく少量のMQL5コードでプログラムしますが、それでも私のテストではこのニューロンは見事に機能しました。とはいえ、私がここで何を言おうとしているのかを理解するには、これまでのニューラルネットワークに関する連載を少し振り返ってみる必要があります。