改めて前回の内容をおさらいをしておくと、
- インスタンスとは、構造体、クラスなどを実際に利用する時に宣言する変数名のようなものである。
- インスタンスは、必要に応じて複数個宣言することができる。
- クラスや構造体のメンバを呼び出すには、インスタンスの後ろにドット(.)をつけて、その後に呼び出したいメンバの名前を記述する。
- 普通のメンバ関数は、インスタンスを生成した後、個別に呼び出さなくてはいけないが、コンストラクタはインスタンスを生成した段階で関数処理を実施する。
ということをお伝えしました。
さて、今回は EA(自動売買プログラム)を作るにあたって、MQL5プログラムに共通する全体構造 についてお話ししたいと思います。
MQL5プログラムに共通する全体構造
ここまで、約50回以上をかけてMQL5の言語的基礎要素について解説をしてきました。
皆様おつかれさまです!
ここまでの知識を身につけていれば、EA(自動売買プログラム)を作るにあたっての下地は十分です。
今回はEA(自動売買プログラム)を作っていくにあたって、MQL5の各要素が全体としてどのように構成され、記述されていくのか、という部分を見ていきながら、今後この講座がどうやって進んでいくのか?という部分も示してきたいと思います。
メタエディターを開いて、MQL5プログラムを記述していき、1つの成果物を完成させた時、
そのコード群を上から順に見ていくと概ね以下のような順で書かれています。
※絶対の順序ではありません。
↓
↓
↓
上記の中には、すでに記事として取り上げ解説済みのものもありますし、これから解説や補足を予定しているものもあります。
今回は、上記の流れに沿って、記述をしていけばMQL5を使ってEA(自動売買プログラム)を作ることができるんだ、というイメージを徐々に持っていただけるような内容にしたいな、と思います。
プリプロセッサ命令
プログラムの最上部にはプリプロセッサ命令を記述します。
プリプロセッサ命令とは、
メインとなるプログラムが、処理を開始する前に、メインプログラムとは別に実行される命令記述です。
プリプロセッサ命令は、メインプログラムのコンパイルが始まる前に処理される命令であり、コンパイル終了以降は、プログラムの実行には直接影響を与えません。
※コンパイルについては↓の記事をご参照ください。
※pre_processor→「pre」は”前もって、事前の”等を意味する接頭辞、「processor」”は処理するもの”をそれぞれ意味しており、プリプロセッサ命令=「前もって処理しておく命令」と言い換えることができます。
プリプロセッサ命令には以下のようなものがあります。
#property命令(#property directive)
#define命令(#define directive)
#include命令(#include directive)
#property命令
#define命令
#include命令
#property命令(#property directive)について
#property命令については
MQL5 EA講座 第4回「#プロパティ命令(#property directive)」
で既に取り上げていますので、詳細はこちらを見て頂ければと思いますが、
著作権者や作者のホームページURL、プログラムのバージョン等の情報を明示するための記述をするときなどに使われます。
#define命令(#define directive)について
定数を定義する時に使われる命令記述です。
※定数→定まった数→決まっている、変わらない数で、変数→変わる数とは逆の概念になります。
#define命令については↓
MQL5 EA講座 第17回「定数(Constant)について」
で既に解説しており、従って #define命令についてもこの中で取り上げているので詳しくはコチラを見て頂ければと思います。
#include命令(#include directive)について
#include命令は、特定のインクルードファイル(.mqhファイル)をメインプログラムに組み込むための命令です。
インクルードファイルについて自作した関数やクラスをまとめたファイルです。詳しくは次回の講座記事で解説しているのですが↓
#include命令でファイルを呼び出すことによって、インクルードファイルに含まれた関数やクラスをメインプログラムで使えるようになります。
インプット変数 ・ グローバル変数
プリプロセッサ命令の記述が終わったら、次にくるのは
になります。
で解説済みですので、「そもそもそれってなんだっけ?」という方がいましたら、↑をご参照ください。
文法的な観点で言えば、インプット変数 と グローバル変数 どちらが先に来ても問題はありません。ただ、慣習的にはインプット変数を先に記述していくのが一般的かと思われます。
#property命令
#define命令
#include命令
<変数群>
input データ型 変数名;
input データ型 変数名;
input データ型 変数名;
<グローバル変数群>
データ型 変数名;
データ型 変数名;
データ型 変数名;
イベントハンドラー
イベントハンドラーとは?
イベントハンドラー→event handler
event=出来事 handler=処理・扱うもの
すなわち、特定の出来事が起こるたびに実行される関数のことを指します。
今までに取り上げてきた中だと、OnTick関数やOnStart関数、OnInit関数、OnDeinit関数などがイベントハンドラーになります。
上記のイベントハンドラーについて「どんな役割だったっけ・・・」という方は↓
をご覧ください。
そしてEA(自動売買プログラム)を作るにあたり、主要な記述の9割がたは、価格の値動きがあるたびに、処理を実行するOnTick関数の{}内に記述していくことになります。
OnTick関数やOnStart関数以外のイベントハンドラーについても折に触れて紹介していきたいと思います。
#property命令
#define命令
#include命令
<変数群>
input データ型 変数名;
input データ型 変数名;
input データ型 変数名;
<グローバル変数群>
データ型 変数名;
データ型 変数名;
データ型 変数名;
<イベントハンドラー群>
OnTick()
{
}
関数・構造体・enum列挙型・クラスなどの定義
関数・構造体・enum列挙型・クラスをメインプログラム内で定義する場合、メインプログラムのどの場所でも定義できますが、インプット変数 と グローバル変数 よりは下に配置した方がよいでしょう。
イベントハンドラーより上の領域で定義するか、下の領域で定義するかはプログラマー次第です。
以上の事を加味し、MQL5でMT5用のEA(自動売買プログラム)を作ろうとしたときの全体構成は以下のようになります↓
#property命令
#define命令
#include命令
<変数群>
input データ型 変数名;
input データ型 変数名;
input データ型 変数名;
<グローバル変数群>
データ型 変数名;
データ型 変数名;
データ型 変数名;
<イベントハンドラー群>
void OnTick()
{
}
<自作の関数・構造体・enum列挙型・クラス群>
void 関数名()
{
}
class クラス名
{
};
struct 構造体名
{
};
enum 列挙型名
{
};
もっとも、関数・構造体・enum列挙型・クラスなどの定義は#include命令を使って、別ファイルにて定義した方がメインプログラムの記述がスリムになります。
#include命令の講座記事にてそのあたりは解説予定なので、もうしばらくお待ちください<m(__)m>
※それぞれの言葉・概念について意味が分からない、というものがあった場合は↓
をそれぞれご参照ください。
まとめ
今回は MQL5プログラムに共通する全体構造 について解説しました。
今回の記事では以下のことを学びました。↓
MQL5のプログラムは概ね、次のような順序で記述・構成される。
↓
↓
↓
今回は以上になります。
最後までお読みいただきありがとうございました<m(__)m>
【超入門】MQL5 EA講座 第54回「インスタンス(オブジェクト)について」【EAの作り方】←
→【超入門】MQL5 EA講座 第56回「#include命令(#include directive)」【EAの作り方】
コメント