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

初級から中級へ:FOR文

MetaTrader 5 | 19 5月 2025, 07:49
31 0
CODE X
CODE X

はじめに

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

前回の「初級から中級まで:SWITCH文」では、SWITCH演算子の最も基本的でシンプルな使い方を解説し、実際の使用例を示しました。これまでに紹介した各制御文については、それぞれの仕組みを理解することが非常に重要です。単なる暗記ではなく、各文や概念がどのように応用できるのかを自分の頭で考えられるようになることが目標です。

中には、この内容が簡単すぎる、あるいはもっと深い話が聞きたいと感じる方もいらっしゃると思います。たしかに、より高度なトピックに踏み込むことも可能ではあります。しかし、私の長年のプログラミング経験から言えるのは、基礎がしっかりしていれば、難解に見える内容でも驚くほどすんなりと理解できるということです。これこそが、私がこの連載で伝えたいことです。読者の皆さんには、各構文がどのように機能しているのかを根本的なレベルで理解していただきたいと思っています。その理解があってこそ、今後取り扱うより高度なトピックにも、スムーズに対応できるようになるでしょう。

さて、アプリケーションの実行フローを制御するためにMQL5で用意されている制御文の中で、まだ取り上げていないものがあと1つあります。これは、MQL5でこの目的のために設計された最後の演算子です。そう、FOR文です。とはいえ、これまでの記事をお読みの方はお分かりかと思いますが、私はトピックを一つずつ丁寧に紹介することを重視しています。その方が、読者にとって理解しやすくなるからです。それでは、新しいトピックに進んでいきましょう。


FOR文の前提

多くの初心者は、プログラミングで学ぶべき文法が膨大に存在すると考えがちです。しかし実際のところ、少なくとも制御フロー文に関して言えば、ほとんどのプログラミング言語で使用される文はごくわずかです。ライブラリ呼び出しや予約語と混同しないようにしてください。これらはまったく別のものです。制御フロー文の種類は一般に非常に限られていますが、一方でライブラリ関数や予約キーワード、補助的な関数やプロシージャは、たった一つの言語の中だけでも数千種類に達することがあります。たとえばC/C++を例にとると、制御フロー文の種類は少ないものの、利用可能な補助関数やプロシージャ(ライブラリ関数を除いても)は非常に多く、すべてを完全に習得するのは現実的ではありません。実際には、プログラマーは特定の分野に特化するものです。ただし、言語の基礎をしっかりと理解していれば、その知識を応用し、時間をかけて新しい課題にも柔軟に対応できるようになります。

このような理由から、熟練したプログラマーでさえ学習を止めることはありません。常に新しい知識を吸収し、技術の進化に遅れないよう努めています。これは、プログラミングを学び始めたばかりの多くの人が抱くイメージとは大きく異なるかもしれません。中には、「少し知識を身につけただけで自分はもうプログラマーだ」と思い込んでしまう人もいますが、現実はそう単純ではありません。古い技術も繰り返し見直し、改良し、常に腕を磨き続けることこそが、本当の意味で「私はプログラマーです」と胸を張って言えるレベルへの道なのです。

では、なぜこんな話をするのでしょうか。それは、ここまでの記事で扱ってきた内容を丁寧に学び、理解を深めていけば、あらゆるプログラミングの課題に立ち向かえる基礎力が身につくからです。今回紹介するFOR文も、その一部です。FOR文は本質的にループ構造です。すでにWHILEやDO WHILEによるループ処理については学習してきました。それなのに、なぜまた別のループ文が必要なのでしょうか。一見すると、FOR文は余分に思えるかもしれません。

しかし、FOR文がWHILEやDO WHILEと並んで存在しているのにはしっかりとした理由があります。その理由とは、特定の状況下ではWHILEやDO WHILEよりもFORの方が適しているからです。少し奇妙に聞こえるかもしれませんが、実際にそのようなケースは存在します。特に、ループ内でCONTINUE文を使うような場合によく関係しています。

ここで重要なのは、FOR文が多くのプログラマーにとって圧倒的に好まれているという事実です。なぜなら、FOR文で書かれたコードは、WHILEやDO WHILEを使った同等の処理よりも明確で読みやすい傾向があるからです。その理由は単純で、FOR文には通常、ループ制御に関するすべての要素が宣言部にまとまって記述されているためです。一方、WHILEやDO WHILEでは、ループ制御のロジックがループ本体の中に散在してしまいがちです。この小さな違いこそが、プログラマーがFORを好む理由です。制御ロジックを見つけるためにループを調べなくても、FOR宣言自体を見るだけでループを修正、変更、さらには理解することがはるかに容易になるからです。

とはいえ、それほど優れているなら、なぜFOR文をもっと早く紹介しなかったのかと思う方もいるでしょう。もっと早く導入した方がよかったのではないでしょうか。この点については、正直に言えばやや議論の余地があるところです。確かにFOR文は最初はシンプルに見えますが、実は扱い方によっては非常に複雑になる特性も持っています。だからこそ、私はWHILEやDO WHILEを先に紹介し、FOR文を最後の制御文として取り上げることにしたのです。

まずは、FORを最も基本的で単純な形で扱います。すでに他のループ文に触れていれば、FOR文がどのように機能するのか、理解はずっとスムーズになるはずです。本来であれば、演算子の優先順位ルールについても説明してからの方がよかったのかもしれません。これらはプログラミング全体に大きな影響を与える要素です。とはいえ、それらをまだ詳しく学んでいなくても、制御フロー文だけで多くのことが実現可能です。このようにして、MQL5のドキュメントとあわせて、本当にこれからプログラミングを始める初心者にとって最適な入門コンテンツを目指しています。それが理想的なシナリオでしょう。もちろん、中にはすでにある程度のプログラミング経験がある方もいると思います。ただし、深く理解しているとは限りません。そのため、初心者と経験者の中間に立って、誰もが共通の理解にたどり着けるような内容を意識してお届けしています。

さて、FOR文が実際に動作する様子を見ていきましょう。ただし、最初の出会いが誰にとってもスムーズで楽しいものになるよう、新たなトピックとして改めて進めていきます。


FOR文

新しいコマンドを導入する最も簡単な方法は、すでに見たことのある内容を活用することです。そこで今回は、WHILE文やDO WHILE文について解説した記事に登場したスクリプトを再利用していきます。こうすることで、よりスムーズに新しい文法へと移行できるようになります。この最初の導入は、過去のコードを別の形式に「翻訳」するようなものだと考えてください。違いは、今回はFOR文のみを使って書き直すという点です。

では、最もシンプルなコードから始めていきましょう。

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. //+------------------------------------------------------------------+

コード01

これはすべての例の中で最もシンプルなものなので、FOR文を使ってこのコードを書き直す前に、「変数の有効期間」および「グローバル変数とローカル変数の違い」について理解しておくことが不可欠です。これらの概念は、本連載の初期の記事ですでに取り上げています。そのため、もしまだグローバル変数とローカル変数の違いについてよく理解できていない場合は、今回の説明をより深く理解するためにも、最初の記事を読み直すことを強くお勧めします。まずは「初級から中級まで:変数(I)」から復習してみてください。

すでにこれらの基礎知識があることを前提として、ここからはコード01をFOR文で書き換えていきます。FOR文を使った書き換えにはいくつかの方法があり、それぞれの方法でコードの構造や要素が少しずつ異なってきます。まずは、元のコード01に最も近い形で書かれたバージョンから見ていきましょう。以下にそのコードを示します。

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.     for( ; info; )
11.     {
12.         info = info - 1;
13.         Print(__FUNCTION__, " : ", info);
14.     }
15. 
16.     Print(__FUNCTION__, " ", __LINE__, " It will be executed anyway...");
17. }
18. //+------------------------------------------------------------------+

コード02

このコード02は、FOR文を使用する最初の方法を示しています。ご覧のとおり、変更したのは10行目だけです。ただし、コード01とコード02のいずれも、得られる結果は同じです。この結果については、次の画像で確認できます。

図01

さて、コード02を見て、少し戸惑いを感じた方もいるかもしれません。それもそのはずで、もしこれまでに他のFOR文を見たことがあるなら、10行目にあるFOR文は、一般的な例でよく見かけるものとはかなり異なっていると感じるでしょう。だからこそ、読者の皆さんには、これまでの記事で紹介してきた知識をしっかりと身につけておくことが非常に大切なのです。FORは、単なる普通の演算子ではありません。実は3つの構成要素から成り立っていて、それぞれが明確な目的を持っています。そして、その役割を正しく理解することが求められます。詳細な説明に入る前に、コード01をFOR文で書き換える別の方法を紹介しましょう。その代替案が、次のコードです。

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.     for( ; info; info = info - 1)
11.         Print(__FUNCTION__, " : ", info);
12. 
13.     Print(__FUNCTION__, " ", __LINE__, " It will be executed anyway...");
14. }
15. //+------------------------------------------------------------------+

コード03

さて、読者の皆さん、次の点について考えてみてください。コード03で見られる内容は、これまでのものとは異なります。というのも、変数infoの値が、あなたが期待するような形では変更されないからです。確かに値は変更されますが、得られる結果は違ったものになります。つまり、コード03を実行した場合、実際に表示される結果は以下のとおりです。

図02

では、なぜ結果が異なってしまったのでしょうか。少し不思議に感じたかもしれません。このケースでは、FOR演算子を使ってループを作成できるはずではないのか、と思った方もいるでしょう。そこで、親愛なる読者の皆さん、一歩ずつ丁寧に見ていきましょう。まず最初に、FORループを使って図01に示されているような反復処理を実現することは可能です。しかし(そして、ここから多くの人にとって混乱が始まります)、重要なのは変数「info」の役割を理解することです。すべてはこの変数に依存しており、必ずしもFORループ自体に依存しているわけではありません。なぜそのように言うのかというと、具体的なケースによっては、コード03のFOR文でコード02と同じ結果を得るために、別の方法を使わなければならない場合があるからです。このため、FOR文の使い方を覚えようとするのではなく、その仕組みを理解することに集中すべきなのです。ここが、多くの人が混乱しやすいところです。

そして、多くの人がFOR文を適切に使用する方法を学習することを諦めてしまうのがここですが、私はそれをできるだけ簡単に説明するために最善を尽くすつもりです。たとえば、変数「info」を6行目で宣言する必要があると仮定しましょう。理由は今は関係ありません。ただその時点で定義されている必要があるということです。次に、「info」がループによって変更され、その最終的な値によってループが終了するようにしたいのです。この段階では小さな問題がありますが、それについてはまだ心配しなくて構いません。今はこの前提に従いましょう。コード01でループを通過した後に変数「info」の値を確認すると、値は0になっています。コード02でも同様です。しかしコード03では、値は1になります。そして、図02を見ればわかるように、最初に表示される値は、予想される9ではなく10です。

そうなると、6行目に宣言された値を10から9に変更するとどうなるかと、疑問に思うかもしれません。さて、親愛なる読者の皆さん、これは皆さん自身で考えてみてほしい小さな練習課題として残しておきます。ただし、ここで覚えておいていただきたい重要な点があります。それは、6行目の値を変更することで、「info」変数に依存する何らかの計算や条件が影響を受ける可能性があるということです。だからこそ、実際に何が起きているのかを理解する前に、コードをいじってみるのは良くないのです。ここでの目的は、コードのあちこちを無作為に変更することではなく、10行目で実際に行われていることに焦点を当てることなのです。

もちろん、動作するのであれば、コード02をそのまま使い続けてもかまいません。あるいは、コード01に戻っても同様に機能します。では、FORループを使ってこの問題を解決する、別の方法はあるのでしょうか。実はあります。ただし、それは本連載のこの時点で取り上げるには少し高度な内容になります。それでも、別のアプローチをお見せすることは可能です。少なくとも、図01に示された結果に近い形にはなります。

ということで、これまでに説明した仮定すべてを考慮に入れたうえで、以下のようなコードを書くことができます。

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.     for(info = info - 1; info; info = info - 1)
11.         Print(__FUNCTION__, " : ", info);
12. 
13.     Print(__FUNCTION__, " ", __LINE__, " It will be executed anyway...");
14. }
15. //+------------------------------------------------------------------+

コード04

このコード04は、私が「基本的な内容」と見なす範囲にまだ収まっています。他の概念に少し触れ始めてはいますが、これは依然としてFORループを使用する基本的な方法の一つです。ここでの目的は、このあとに紹介するフローチャートの内容がしっかりと理解できるようにすることです。このコードを実行すると、以下のような結果が得られます。

図03

待ってください、ちょっと分かりづらいですね。今度はカウントが図01のように9から始まっています。しかし、図02のように1で止まってしまいます。これはなぜでしょうか。ループの後の変数「info」の値が、他のコード、特にコード01のときとは違うのでしょうか。いいえ、親愛なる読者のみなさん。ループを抜けたあとの「info」変数の値は、これまでのすべてのコードと同じく、ゼロのままです。違いはそこにはありません。ここで私たちが出力しているのは、「info」の最終的な値ではなく、FORループの各反復の中での値なのです。少しややこしく感じるかもしれませんが、実際に起きているのはまさにそれです。このことを本当に理解するためには、コードの少し違ったバージョンを見てみる必要があります。ただ、その前に、FOR文の内部で処理がどのように流れているのかを、もう少し詳しく見ておきましょう。そのために、次のトピックへと進みましょう。


実行フロー

一見すると、FORループの実行フローは、これまでに学んできた他のループ(たとえば、WHILEやDO WHILE)よりも少し複雑に見えるかもしれません。しかし、一度その流れをしっかり理解してしまえば、前のトピックでなぜあのように出力結果が異なっていたのかが、ずっと分かりやすくなります。以下のフローチャートをご覧ください。

図04

ここでは、FORループの仕組みをより詳しく説明するために、矢印に異なる色を使っています。フローチャートの中にIF文が登場しているのを見て、驚かれた方もいるかもしれません。しかし、このIFを入れることで、何が起きているのかを説明しやすくなっているのです。

それでは、一歩ずつ進めていきましょう。最初に登場するのは予約語「for」で、これはループの本体が始まることを示しています。その直後にあるのがExpression01です。ここには様々な処理を書くことができますが、大切なのは、これはループ開始時に一度だけ実行されるという点です。たいていの場合、この部分ではループ内で使う変数の初期化をおこないます。ただし、コード04で見たように、グローバルな値を調整するために使うこともできます。また、コード02や03のように、この式を空にすることも可能です。その場合、コンパイラは何も実行せずにスキップします。初期化も宣言も一切おこなわれません。なお、ここで変数を宣言する際にはいくつかルールがありますが、今はそこまで深く立ち入りません。基本的には、グローバル変数を使うか、式そのものを空にするという形になります。

Expression01の実行が終わると、次に進むのが、フローチャート上で「IF」として表されている部分です。ここでチェックされるのがExpression02です。厳密に言えば、この部分はIFというよりも、WHILEと表現するほうが正確でしょう。ただ、WHILE自体もループ文であるため、FORを説明している図の中にそれを登場させると、かえって混乱する恐れがあります。ともかく、Expression02の評価結果がfalseであれば、ループは終了します。trueであれば、ループ本体の処理へと進みます。これは、コード03や04では11行目、コード02では11行目から14行目までのブロックに該当します。ループ本体の処理が実行された後は、Expression03の実行に移ります。この部分は、これから見るように、多くの場面でとても重要な役割を果たします。FORループの構造や目的に応じて、このExpression03の部分を少しずつ変えることで、多様なループパターンを作り出すことができます。Expression03が特に優れている点は、これを使うことで、FORループが他のループ(WHILEやDO WHILEなど)よりも安全に運用できるようになることです。なぜなら、Expression02でチェックしている変数をうっかり更新し忘れるというリスクを避けられるからです。

正直なところ、このフローチャートは、図で見るよりも、実際に手を動かして体験したほうがずっと理解しやすいものです。ただ、よく見てみると、緑色の矢印が使われていることに気づくでしょう。これは、ループの処理がどのように進んでいくのかを示しています。一方で、赤い矢印はループがどのように終了するかを表しています。

ですから、しっかり観察して少し分析してみると、変数infoがループを通過した後に「0」という値になるのは、実は理にかなっていることが分かります。同時に、(コード03を例にすると)ターミナルに表示される値が常にinfo + 1であることにも納得がいくはずです。他のバージョンのコードでは、表示される結果が最初に思っていたものとは違っているのです。

いいですね。FORループの仕組みが少しずつ分かってきたように思えます。確かに、扱いやすいようでいて、ところどころに混乱しやすい要素がある構造です。でも、内緒ですが、先ほど「フローチャート中のIFは、実はWHILEであるべきだ」と言いましたよね。では、それをどうやって実現できるのでしょうか。それを説明してみましょう。私の見方では、この点はそれほど難しくありません。もっと高度なFORループの話に入らなくても、理解できると思います。もちろん、FORループには初心者にとって少し複雑な部分もありますが、「IFの代わりにWHILEを使うべきだ」と言った理由を理解するには、コード01とコード02を見比べるだけで十分でしょう。なぜなら、どちらのコードもExpression01とExpression03が空になっており、実際に働いているのはExpression02(ループ条件)だけだからです。つまり、まさにWHILEループと同じ構造になっているのです。ですから、フローチャートのIFは、本当はWHILEの処理を表していると考えるほうが自然なのです。

さて、読者の皆さんはお気づきかもしれませんが、私はあえてFORループのより高度な話題に深入りしないように心がけています。それは、皆さんがFORループと初めて出会うこのタイミングで、つまずいてほしくないからです。でも同時に、FORループがなくてもいいとか、WHILEやDO WHILEに置き換えられるから必要ないと思ってほしくもないのです。それを証明するために、FORでなければ実現が難しいような状況を、これからお見せしようと思います。ただし、それについては、次のセクションでお話ししましょう。


空のFORループ

これから紹介する内容は、実際に使うものというより、ちょっとした豆知識や好奇心として捉えてもらえればと思います。正直に言えば、ここで取り上げるテクニックは、実際のコードではほとんど使われることがありません。私自身、プログラマーとして長年やってきましたが、このやり方を使ったのは、数えるほどしかありません。それでも、いつかとても珍しいFORループに出くわすことがあるかもしれません。一見すると「おかしな書き方だな」と感じても、ちゃんと動作するループです。しかも、今後しばらくはこの話題を取り上げないと思いますし、もしかすると皆さんが思ったよりも早くこの形式に出くわすかもしれません。ですから、今のうちに紹介しておきたいのです。そうしないと、私がうっかり忘れてしまうかもしれません。では、何を言っているのかを説明するために、まずはとてもシンプルなコード例から始めましょう。そしてもちろん、問題が起きないように注意深く進めていきます。以前、WHILEループを扱ったときには、次のようなコードを使って説明しました。

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

このコードの目的は、ESCキーで明確に終了できる、一種の無限ループを作ることでした。素晴らしいですね。しかし実は、まったく何も書かれていないFORループを使って、同じように無限ループを作ることも可能です。それをお見せするために、次のコードを使って説明していきましょう。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06.     char info = 10;
07. 
08.     for (; ; )
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.         if (TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)) break;
15.     }
16. 
17.     Print(__FUNCTION__, " ", __LINE__, " It will be executed anyway...");
18. }
19. //+------------------------------------------------------------------+

コード06

ここからの内容は、特に注意してご覧ください。繰り返し説明することはありません。これまでに紹介したFORループのすべての例では、「Expression 02」と呼ばれる条件式が含まれていました。これにより、ループが最終的に終了するように設計されていました。しかし、場合によっては、ループを終了させたくない、少なくともループヘッダーに記述された条件によって終了させたくないという状況が発生することもあります。そのような場合には、Expression 02を省略することが可能です。このように式02が省略された場合、ループは少なくとも構文上の条件によって終了することはありません。終了条件が必要な場合には、それをループ本体内で明示的に記述する必要があります。たとえば、コード06をご覧ください。このコードでは、ループを抜けるための条件が14行目に定義されています。FORループには何らかの式を必ず含めなければならないと考える方も多いかもしれませんが、実際にはそのような制約はありません。コード06の8行目のように、FORループを完全に空の形式で記述することも可能です。このような書き方をおこなった場合、コンパイラはそれを無限ループとして解釈します。また、ある程度経験のあるプログラマーであれば、この構文が何を意図しているかは容易に理解できるでしょう。

このような理由から、以前WHILE文によるループを説明した際にループは慎重に取り扱うべきものであると述べました。注意を怠ると、プログラムに深刻な不具合を引き起こす原因になりかねません。したがって、ループを記述する際には常に注意深く設計することが重要です。

最後に、コード06が正しく動作し、制御不能な無限ループに陥っていないことを確認するため、実行結果を以下のアニメーションでご覧いただけます。

アニメーション01

それでもなお(明確にするために強調しておきますが)、この内容を取り上げているのは、将来、空のforループを含むコードに遭遇した際に、慌てたり、何が起きているのか分からなくなったりしないようにするためです。この時点で、こうしたループがどのように動作し、どのような条件で(あるいはそもそも)終了するかを理解できるはずです。


最終的な考察

この記事では、FORループの基本について説明しました。ここで見た内容はすべて、しっかりと理解しておく必要があります。他の命令とは異なり、FORループにはいくつか特殊な点があり、すぐに非常に複雑になる可能性があります。ですので、理解が追いつかないまま放置せず、今すぐ学んだことを勉強し、実践に移してください。そのためには、以前の記事の例を改めて見直し、該当する部分のループをFORループに置き換えてみるとよいでしょう。

今回で、私たちが学ぶべき基本的な制御構造はすべて終わりました。これ以降は、これまでに学んだ基礎の上に新たな内容が積み重なっていきます。ただし、まだ中級の内容に進むには準備ができていません。まだいくつかの基本的な概念について学ぶ必要があり、それらはいずれも、これまで学んだ内容と同じくらい重要です。ただ、今では少し高度なコーディング技術を紹介しても、以前ほどの制限を感じずに進められるようになりました。これにより、残りの基本的なトピックをより効果的に説明できるようになります。

したがって、ここまでの内容をしっかり復習してください。次の記事でまたお会いしましょう。皆さんの学習が順調に進むことを願っています。

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

添付されたファイル |
Anexo.zip (1.9 KB)
EAのサンプル EAのサンプル
一般的なMACDを使ったEAを例として、MQL4開発の原則を紹介します。
取引におけるニューラルネットワーク:データの局所構造の探索 取引におけるニューラルネットワーク:データの局所構造の探索
ノイズの多い状況下で市場データの局所構造を効果的に識別・保持することは、取引において極めて重要な課題です。自己アテンション(Self-Attention)メカニズムの活用は、このようなデータの処理において有望な結果を示していますが、従来のアプローチでは基盤となる構造の局所的な特性が考慮されていません。この記事では、こうした構造的依存関係を組み込むことが可能なアルゴリズムを紹介します。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
多通貨エキスパートアドバイザーの開発(第18回):将来期間を考慮したグループ選択の自動化 多通貨エキスパートアドバイザーの開発(第18回):将来期間を考慮したグループ選択の自動化
これまで手動でおこなっていた手順の自動化を引き続き進めていきましょう。今回は、第2段階の自動化、すなわち取引戦略の単一インスタンスの最適なグループ選定に立ち返り、フォワード期間におけるインスタンスの結果を考慮する機能を追加します。