
初心者からプロまでMQL5をマスターする(第1回):プログラミングを始める
はじめに
独自のエキスパートアドバイザー(EA)や指標の作成方法を知りたい方からプライベートメッセージを受け取ることがあります。このサイトやインターネット全般には、例を含む非常に優れたリソースを含む多くの資料がありますが、初心者にはまだサポートが必要です。プレゼンテーションの一貫性を求めるユーザーもいれば、明瞭さなどを求めるユーザーもいます。時々、ユーザーは次のように尋ねます。「動作するEAのコードにコメントを追加してください。それですべてを理解し、同じものを自分で作成します。」 しかし、これらのユーザーは、100行のコードを見ると怖くなって混乱し、このアイデアを諦めてしまいます。代わりに、彼らはこう言います。「私のためにEAを作成してください。」
とにかく、それでも「すべてを理解したい」という人がいます。このような場合、単純なものから複雑なものまでを説明したステップバイステップのガイドが役に立ちます。MQL5言語に関するそのようなステップバイステップのガイドは見つかりません。
私が見たこれらのマニュアルは、読者がすでにプログラミングの経験を持ち、それがどのように機能するかを理解していることを前提としています。したがって、ガイドではニュアンスの説明が提供されます。
私はこの連載を、特に初心者、つまり初めてプログラミングに遭遇し、それを学びたいと思っている方を対象として始めています。これらの記事は、プログラマに依存したくない、すべてがどのように機能するかを理解したいトレーダーを対象としています。この記事では、写真と例を含む一貫した詳細な情報を提供し、読者を「MQL5言語熟練」のレベルに導きます。
この言語は、取引を自動化するためだけでなく、他の関連する取引タスクを解決するためにも使用できます。たとえば、これを使用して、指標、最適化結果、カスタム形状をプロットしたり、ティック相場のリストや現在の取引状況のスクリーンショットなどのファイルを作成したり、Telegramやその他のメッセージングボットにメッセージを送信したり、データベースを操作したりできます。
「仮想シンボル」の使用、数学ライブラリによる操作など、この言語の最大の機能を徐々に紹介していきたいと考えています。今回は基本的なことから始めます。
基本的な技術用語
最新のコンピュータのほとんどは、ノイマン型アーキテクチャに基づいて構築されています。文献をうまく読むためには、プログラマが使用する用語を理解する必要があります。
- CPU(中央処理装置):このモジュールはすべての計算とロジックを担当します。
- RAM(ランダムアクセスメモリ):RAMにはデータとプログラムが保存されます。コンピュータの電源を切ったりプログラムを終了したりすると、RAMのデータは消去されます。
- 外部ドライブ(フラッシュドライブ、HDD、SSDなど):CPUはデータをファイルとして書き込むことができます。
- ファイル:(RAMではない)外部メディアに書き込まれた情報を意味します。
- 実行スレッド:動作中、CPUはRAMからデータを取得し、それがコマンドなのかデータなのかを「理解」し、コマンドを実行して、結果をRAMまたは実行中のプログラムによって示された外部ドライブに書き込みます。次に、次のメモリフラグメントを再度読み取り、プログラムが終了するまでこれを繰り返します。このプロセス全体を「実行スレッド」と呼びます。
情報を測定するためにさまざまなメトリックが存在します。
- ビット:情報の最も基本的な単位です。実際には、これは特定の最も小さな記憶の状態を決定する「スイッチ」です。ビットには「0」(無効)または「1」(有効)のいずれかが含まれます。
- バイト:「音節」として説明できます。これは、8ビットに等しい情報の最小の「パッケージ」です。コンピュータが大型でフロア全体を占有していた頃、RAMの量は少なく、ファイルはパンチカードに保存されており、8ビットが速度とメディアサイズの技術的な妥協点として最も便利でした(最大8穴を同時に読み取ることができる)。
プログラマにとって、プログラムがどれだけのスペースを占めるかを理解することが重要になる場合があります。現代の世界では、プログラム(特にそのデータ)は通常、多くのスペースを占めるため、「バイト」という単語に測定の接頭辞が追加されます。
情報量ではなく物理量を測定する場合、そのような各接頭辞は、以前のサイズの1,000倍の増加を報告します。たとえば、1キロメートルは1,000メートルに等しく、1メガボルトは1,000キロボルトまたは1,000,000ボルトです。
ただし、コンピュータデータについて話している場合、次の各測定接頭辞は、前の測定接頭辞よりも1024倍大きくなります。
たとえば、キロバイト(KB)は1024バイトに等しく、メガバイト(MB)には1024キロバイトが含まれます(以下同様)。その他の接頭辞はギガ、テラ、ペタなどです。
メモリ管理、プロセッサへのコマンド、MQL5を使用したファイルの書き込み、その他の日常的なことについては後の記事で扱います。
太字の用語は記事中に頻繁に登場するため、最初に説明します。他の用語については、初めて遭遇する箇所で説明します。用語を使用することは避けられませんが、最小限の用語を使用するように努めます。
MQL5でプログラミングを開始するために必要なソフトウェア
コンピュータを人々の役に立つようにするには、取引、写真の表示、音楽の鑑賞など、さまざまな種類のアクティビティに対応するプログラムを作成する必要があります。
プロセッサコマンドでプログラムを直接記述することはまったく可能ですが、非常に非生産的です。
したがって、現代世界には、人間に近い言語で書かれたテキストをプロセッサが理解できるコマンドに変換するのに役立つアシスタントプログラムが数多くあります。
プログラマに必要なそのようなプログラムの最小限のリストは次のとおりです。
-
テキストエディター:このソフトウェアでは、コードを記述します。お好きなエディターで構いませんが、入力するテキストに余分な文字が追加されてはいけません。エディターで必要な言語(この場合はMQL5)の構文を強調表示できると非常に便利です。
MetaTraderをインストールすると、MetaEditorと呼ばれる非常に強力なエディターがシステムに自動的にインストールされます。必要なことはすべて実行できます。
ただし、何らかの理由でそれが気に入らない場合は、他のものを自由に選択できます。たとえば、プログラマが使用する非常に人気のあるエディターの1つはVisual Studio Code (VSCode)です。プラグインを使用すると、MQL5で動作するように設定できます。
-
コンパイラ:コンパイラは、プログラマがエディターで書いたテキストをマシンコードに変換します。変換後にのみ、CPUはこのコードを実行できます。
MQL5言語の場合、コンパイラはMetaEditorに組み込まれています。C++などの他の言語の場合、コンパイラは別個のプログラムである場合があります。
Pythonなどの一部の言語には、明示的なコンパイラがありません。ファイルからテキストを直接実行するようなものです。
このような言語のファイルを読み取るプログラムは「インタプリタ」と呼ばれ、言語自体もそれに応じて「インタプリタ型」と呼ばれます。ただし、インタプリタであっても最終的にはマシンコードを実行することを理解することが重要です。違いは、テキストからコードへの変換がそれほど明白ではないことです。
-
デバッガー:このツールを使用すると、プログラム内のエラーを見つけて修正できます。これにより、プログラムが処理しているデータを各ステップでいつでもチェックすることを目的として、コードを段階的に実行できます。
MetaEditorには組み込みのデバッガーが用意されています。
-
バージョン管理システム(VCS):このようなシステムは、コードの変更を追跡するのに役立ちます。
大量のコードを書いていて、1日前のバージョンの方がはるかにうまく機能していたことに突然気づいた場合、または通常は別のパスを使用する必要がある場合、VCSを使用すると、ファイルを以前の状態に「戻す」ことができます(そして数回クリックするか、キーボードからテキストコマンドを入力するだけで、プロジェクト全体も含めることができます)。
最も重要なことは、VCSはローカルコンピュータではなくリモートサーバーにデータを保存することが多く、障害が発生した場合(ハードドライブのクラッシュなど)に作業を迅速に復元できることです。
これら2つの重要な要素により、他の開発者とのコラボレーションも可能になるため、企業の業務にはさまざまなバージョン管理システムが事実上必須となっています。さまざまなことが起こる可能性があるため、これらのツールを使用する習慣は、独立して作業する場合にも非常に役立ちます。
Gitなどのサードパーティソリューションがあります。ただし、そのようなツールはMetaEditorにも組み込まれています。初心者にとっては、内蔵VCSの機能で十分です。
これは、最新のプログラミングの存在に必須のツールキットです。プログラマはバージョン管理ツールを別途使用する場合があります。しかし現代社会では、このようなことは比較的まれです。より一般的に、ユーザーはこれらすべての機能(さらにはそれ以上)を備えたMetaEditorなどのソフトウェアを選択します。
上記のすべてのコンポーネント(テキストエディター、コンパイラ、デバッガーなど)を含むソフトウェアソリューションは統合開発環境(IDE)と呼ばれます。
MQL5プログラムの主な種類
MetaTrader5で実行できるプログラムアプリケーションは、次の4種類に分類できます。
- スクリプト:情報を表示したり、取引したり、グラフィックオブジェクトを表示したりできます。スクリプトは、実行が必要になるたび新たに実行する必要があります。
- 指標:これらは、ティックごとに取引戦略の情報を表示するように設計されています。指標は自ら取引をするわけではありません。
- エキスパートアドバイザー(EA):これらは取引用に設計されたプログラムです。指標と同様に、これらはティックごとに実行されますが、矢印や便利な線を描画するためのすべてのツールを備えているわけではありません。
- サービス:これまでのすべての種類のプログラムとは異なり、サービスは動作するために特定のチャートを必要としません。これらは端末の起動時に1回実行されます。端末が閉じられるまで(およびその後しばらくの間)強制的にメモリ内に保持することもできますが、新しいティックの到着やマウスクリックなどの端末イベントには応答できません。
MQL5で利用可能なプログラムの種類の比較
MQL5でのプログラムの使用に関連するすべては、簡単な表に要約できます。
表1:主要なMQL5プログラムタイプの機能の比較
プログラムの機能 | スクリプト | 指標 | EA | サービス |
---|---|---|---|---|
特定のチャートにリンクされている | はい | はい | はい | いいえ |
取引実行可能 | はい | いいえ | はい | はい |
時間枠が変更されるとメモリからアンロードされる | はい | はい | はい | いいえ |
ティックごとに実行 | いいえ | はい | はい | いいえ |
端末を開いたときに1回実行される | いいえ | いいえ | いいえ | はい |
チャートウィンドウが開いている間に実行される | いいえ | はい | はい | いいえ |
さまざまな端末またはチャートイベントを処理できる | いいえ | はい | はい | いいえ |
タイマーの開始と停止が可能 | いいえ | はい | はい | いいえ |
初期化関数と初期化解除関数を自動的に呼び出す | いいえ | はい | はい | いいえ |
チャート上で実行できるプログラムのインスタンスは1つだけ | はい | いいえ | はい | — |
関数
すべてのプログラムは何かをおこなう必要があります。つまり、いくつかの関数を実行する必要があります。
関数は、何らかの(多くの場合初歩的な)結果をもたらす一連のプログラム行動です。たとえば、テキスト行を印刷したり、一文字を描画したり、取引を開始したりすることができます。
一部のプログラミング言語では、関数を明示的に宣言する必要がありません。このような宣言はMQL5では必須です。各プログラムには少なくとも1つの開始関数が宣言されている必要があります。宣言されていない場合は、エラーメッセージが表示されます。プログラムの種類ごとに、初期関数の呼び出し方が異なります。しかし、いずれの場合も、プログラムには関数がなければなりません。そうでないと、プログラムは何もしないので意味がありません。
ほとんどすべてのプログラミング言語では、カスタム関数を作成して、繰り返されるコード部分を分離し、コードを何度も書き直すのではなく、それらの部分を1行で再利用できます。さらに、すべての言語には、あらかじめ決められた関数のセットがあります。あるプログラミング言語を他のプログラミング言語と区別するのは、これらの事前定義された関数です。
実際、言語について話すとき、作成者は、その言語にどの関数が事前定義されているか、および望ましい結果を得るためにそれらの関数を最適に使用する方法を説明しようとすることがよくあります。
MQL5も例外ではありません。MQL5には一連の組み込み関数が含まれており、カスタム関数を作成できます。言語の組み込み関数は、コンテキストヘルプを使用して簡単に調べることができます。ヘルプを呼び出すには、MetaEditorで任意のコード(他の人が書いたコードでもOK)を開き、強調表示された単語をクリックして<F1>キーを押します。
特定の種類のプログラムでは、特定の組み込み関数を呼び出すことができません。すでに述べたように、一部はヘルプの説明どおりに実装する必要があります。さらに、プログラムの種類が異なれば、必要な関数も異なります。
しかし、それ以外、私たちの創造性はほぼ無制限です。任意のヘルパー関数を作成し、それらを便利な方法で編成したり、C++やPythonなどの他の言語で記述された関数を使用したりすることもできます。これらすべての関数については、今後の記事で必ず説明します。
ここでは、MQL5言語で作成できる最も単純なものから始めましょう。マウスでチャート上にドラッグされたときに1回実行されるスクリプトを作成します。このスクリプトでは、標準のMQL5言語関数を使用して、端末の下部にある標準パネルにユーザーへの通常のテキストメッセージを表示します。
IDEの起動と設定
ついに実践です。現時点では、すべての作業をMetaEditorでおこないます。ショートカット(デスクトップまたはスタートメニューから)を使用するか、下図に示すいずれかの方法を使用してMetaTrader端末から直接起動できます(図1)。
図1:MetaEditorを開く3つの方法 - 1. ツールバーボタン、2. メニュー、3. ホットキー(F4)
エディターウィンドウが開いたら、すぐにmql5.com Webサイトからユーザー名とパスワードを入力することをお勧めします(まだ登録していない場合は、登録することもできます)。ログインすると、MetaEditorに組み込まれているバージョン管理ソリューションを使用して、プロジェクトをサーバーに直接保存できます。アクセスを許可しない限り、保存したファイルは誰も表示されないため、MetaQuotesクラウドに作業内容を保存することは、インターネット上に情報を保存するのと同じくらい安全であり、これ(作業内容をコンピュータ上以外にも保存すること)は良い習慣です。
図2:MQL5.com認証ダイアログ
認証ダイアログを開くには、エディターウィンドウのメインメニューで[ツール]->[設定]を選択し、[コミュニティ]タブに移動します。この設定は1回だけおこなう必要があります。これらのデータはエディターに保存され、バージョン管理システムやその他の便利なMQL5サービスをスムーズに利用できるようになります。
最初のスクリプト
次に、左側のダッシュボードでスクリプトを作成するフォルダを右クリックし、[新しいファイル]を選択するだけです。必要に応じて、<Ctrl>+<N>を押すこともできます。表示されるウィンドウで、「スクリプト」を選択します。次のウィンドウで、ファイル名を入力します。
図3:ファイルを新規作成する方法
図4:ファイル作成ウィザードダイアログ - 作成するプログラムの種類を選択する
図5:ファイル作成ウィザードダイアログ - 作成するプログラムの名前を入力する
その結果、次の内容を含む新しいウィンドウが表示されます。
//+------------------------------------------------------------------+ //| HelloWorld.mq5 | //| Oleg Fedorov (aka certain) | //| mailto:coder.fedorov@gmail.com | //+------------------------------------------------------------------+ #property copyright "Oleg Fedorov (aka certain)" #property link "mailto:coder.fedorov@gmail.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- } //+------------------------------------------------------------------+
例1:ウィザードによって生成されたスクリプトテンプレート
複雑なことは何もないようで、コードはわずか17行です。
ここに具体的に何が書かれているか見てみましょう。
- まず、先頭に二重スラッシュ文字(//)で始まる数行があります。プログラムの途中にも同様の行が登場します。
これらはコメントです。これらは人間向けに書かれているため、コンパイラはバイトコードを生成するときにそれらを無視します。二重スラッシュで始まるコメントは、単一行コメントと呼ばれます。これらは行の最後に配置されます。ルールは非常に単純です。二重スラッシュの前にあるものはすべてコンパイラによってコードとみなされ、二重スラッシュに続くものはすべて人間にとってのテキストです。
このウィザードで作成されたテンプレートでは、このコンテキストでは「前」コードは必要ありませんでした。
MetaEditorでは、数行を簡単にコメントアウトできます。それらを選択し、キーボードショートカット<Ctrl>+<'>(Ctrl+アポストロフィ)を押します。このような行のコメントを解除するには、それらの行を再度選択し、キーボードショートカット<Ctrl>+<;>を押します。
複数行のコメントもあります。これらは文字/*で始まり、逆のシーケンス*/で終わります。複数行のコメントは、空白が許容されるコード内のどこにでも挿入できます。コンパイル時に、コンパイラはまずそのようなシーケンスを「削除」し、その後で作成者が何を実装したかったのかを理解しようとします。
実際には、コードの途中にコメントが挿入されることはほとんどありません。ほとんどの場合、それは単に不便です。ただし、不要なコードの大きなブロックにコメントを付けたり、関数ヘッダーを説明したりする場合には非常に役立ちます。
複数行のコメントを使用した場合(MetaEditorウィザードでコードを生成するのではなく自分でコードを書いた場合)、このファイルのヘッダーは次のようになります。
/*
HelloWorld.mq5
Oleg Fedorov (aka certain)
mailto:coder.fedorov@gmail.com
*/
例2:複数行のコメント
または次のようにします。
/*******************************************************************
* HelloWorld.mq5 *
* Oleg Fedorov (aka certain) *
* mailto:coder.fedorov@gmail.com *
*******************************************************************/
例3:装飾された複数行のコメント
一般に、文字/*と*/の間、または//の後に、任意の言語の任意のテキストを含めることができます。どの言語でもそう言えるのは、最新のエディターがUnicodeエンコードを完全にサポートしているためです。ただし、言語を切り替える時間を節約できるため(大規模なプロジェクトでは非常に重要です)、英語を使用することをお勧めします。
- 2番目の興味深いブロックは、#で始まる行で構成されます。このファイルでは、このブロックの各行の最初の単語は#propertyです。
一般に、ハッシュ記号で始まるすべての単語はプリプロセッサディレクティブです。コンパイラは、テキストをマシンコードに変換する前に、すべてのコメントを削除するだけではありません。その他の準備もおこなう必要があります。大規模なプロジェクトでは、複数のファイルから結果として得られるソリューションを組み立てたり、いくつかのデータ(たとえば、数値Piなどの定数、またはより複雑な場合もある)を定義したりする必要があるため、通常はかなり多くの準備作業が必要になります。これらすべてのディレクティブについては、後ほど検討します。
現時点では、結果のコードを理解するには、#propertyディレクティブが結果のプログラムのプロパティを記述していることを知る必要があります。ほとんどの場合、これらのプロパティは、ユーザーがプログラムのアイコンをチャート上にドラッグしてプログラムを起動した直後に表示される初期ウィンドウに影響します。
これを説明するために、コードにもう1行追加してみましょう。
#property copyright "Oleg Fedorov (aka certain)" #property link "mailto:coder.fedorov@gmail.com" #property version "1.00" #property script_show_inputs
例4:プロパティscript_show_inputsの追加
この行により、入力ウィンドウを表示してからメインコードの実行を開始できるようになります。この行が存在しない場合、スクリプトはメッセージを表示せずにすぐに実行を開始します。入力がある場合、スクリプトはデフォルト値を使用します。
したがって、ファイル内の目的の場所(versionプロパティの直後)に必要な行を書き込んだ後、プログラムの最初のコンパイルを実行します。
図に示すいずれかの方法を選択します(たとえば、<F7>キーを押す)。
図6:プログラムをコンパイルするいくつかの方法
数秒待ちます。以上で、プログラムはコンパイルされました(図7)。
図7:コンパイル結果。この場合、コンパイルは成功しました(エラーは0件)。527ミリ秒かかり、64ビットプロセッサ用のバイトコードが作成されました。
図9は、コンパイルが成功したことを示しています。テキストファイルにエラーがある場合は、それに関するメッセージが同じウィンドウに表示されます。
コンパイル後、取引端末のスクリプトのリストにスクリプトアイコンが自動的に表示されます。端末に切り替えるには、たとえばエディターで<F4>キーを押します。これにより時間を節約できます。
スクリプトをマウスでチャート上にドラッグし、プロパティウィンドウを確認します。
図8:スクリプト入力ウィンドウ
(1)メインウィンドウの右上に実行中のスクリプトのアイコンが表示される
(2)Commonタブには、#propertyディレクティブを使用して記述されたプロパティの使用法が表示される
(3)linkプロパティで指定されたアドレスにパラメータが追加されている
(おそらく、Webサイトのリンクを使用した場合に、訪問者がどこから来たかを示す)
ウィンドウを閉じてエディターに戻り、ユーザーにメッセージを表示するなど、何か役に立つことをスクリプトに指示してみましょう。
これをおこなうには、パラメータウィンドウを表示する行をコメントアウトし(まだ何も変更する必要はありません)、メッセージを書き込む別の行を追加します。
//+------------------------------------------------------------------+ //| HelloWorld.mq5 | //| Oleg Fedorov (aka certain) | //| mailto:coder.fedorov@gmail.com | //+------------------------------------------------------------------+ #property copyright "Oleg Fedorov (aka certain)" #property link "mailto:coder.fedorov@gmail.com" #property version "1.00" //#property script_show_inputs //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- Print("Hello, MQL5 world!"); } //+------------------------------------------------------------------+
例5:ユーザーログに文字列を出力するスクリプト
- あらかじめ定義された単語に注意してください。
このコードでは、事前定義された単語は#property、copyright、link、version、void、OnStart、Printです。MetaEditorでそれらのいずれかをクリックし、<F1>を押して組み込みヘルプを開いてみてください。
- ウィザードによって生成されたOnStart関数内で、別の標準関数Printを呼び出しました。括弧内にリストされたパラメータ(引数とも呼ばれます)を使用して、正確に何を印刷するかをPrint関数に通知します。
例5では、Print関数は引数を1つだけ受け取ります。それは引用符で囲まれたテキストです。一般的なケースでは、そのような議論がいくつか存在する可能性があります。たとえば、このPrint関数は、任意の数のパラメータ(最大64)を指定して呼び出すことができます。
関数が複数のパラメータを受け取る必要がある場合は、例6のように、これらのパラメータをカンマで区切る必要があります。
Print("Hello, MQL5 World!", " I have written my own program. ", "Hooray!");
例6:3つのパラメータを取る関数
引用符で混乱しないように、パラメータを区切る各カンマの後に(<Enter>キーを使用して)改行文字を追加できます。
2番目の引数内のスペースにも注意してください。Print関数は引数を1つの大きな行に「結合」するため、プログラマはすべての句読点と単語間の追加の区切り文字を処理する必要があります。
OnStart関数は、スクリプトまたはサービスの起動時に1回自動的に実行されます。
既知の方法でスクリプトをコンパイルして実行します。
図9:最初の便利なアクション:文字列をログに出力する
結論
エキスパートアドバイザー(EA)と指標にも事前定義された関数がありますが、名前は異なります。これらの動作原理はスクリプト関数の原理と同じです。コードは主に内部的に記述され、プロパティは外部的に記述されます。しかし、違いもあります。
たとえば、EAと指標の一部の関数は、OnStartとして1回だけではなく、ティックごとに端末によって実行されます。
したがって、この記事から学んだことを確認したい(そして知識を新たにしたい)人は、自分で少しの「自宅調査」をおこなうことをお勧めします。
- ファイル作成ウィザードを使用して、この記事の例で説明されていない他の種類のプログラムをすべて生成します。
- この記事で説明されているツールを使用して、各種類のプログラムの開始時に呼び出される関数とその呼び出し順序を確認できるかどうかを検討します。
- 追加のタスクとして、次の場合に何が起こるかを確認できます。
- OnStart関数を指標とEAに追加します。
- ウィザードが他のタイプのプログラム用に作成した関数をスクリプトとサービスに追加します。
おそらく、これらの研究は新しいアイデアをもたらし、MQL5言語のプログラムがどのように正確に動作するかをより深く理解するのに役立つでしょう。
がんばって。次の記事でお会いしましょう!
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/13594



- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索