【MQL4 からMQL5 への移行】

MQL5 は、その前身であるMQL4 プログラミング言語が進化したものです 。
MQL4プログラミング言語とは異なる部分も多いため、このセクションで主な違いについてを説明しています。

初めに主な仕様の違いについてを以下に記載しました。

  • MQL5 言語は start()、init() 及び deinit() 関数を使用する必要がない。
  • バッファの数に制限はありません(MQL4では最大512)
  • DLLは、EA(またはその他の MQL5 プログラム)をロードした直後にロードされる。
  • 配列の制限が超えられた場合、実行プログラムが終了する。
  • 演算子の優先順位は C++言語と同じ。
  • MQL5 言語は(文字列から数値の場合にも)暗黙の型キャスト(コンパイラが安全だと判断し、自動的にデータを拡張してくれる機能)を提供しています。
  • 文字列を除いたローカル変数は自動的に初期化されない。
  • 一般的なローカル配列は自動的に削除される。

特別関数 init、start 及び deinit

MQL4 言語では、(*.mqh インクルードファイルとライブラリファイルを除いて)指標、スクリプトまたはエキスパートアドバイザーで使用出来る 3 つの事前定義された関数(init、start、deinit)が含まれていました。
MQL5 では、これらの関数の代わりに類似した関数が存在します。下記の表は関数のおおよその対応を示しています。

MQL4

MQL5

init

OnInit

start

OnStart

deinit

OnDeinit

OnInit 及び OnDeinit 関数は MQL4 の init 及び deinit と同じ役割を持ちます。

例:

void OnInit()
 {
//--- 初期化の際に関数を呼び出す
  init();
 }
void OnDeinit(const int reason)
 {
//--- 初期化解除の際に関数を呼び出す
  deinit();
//---
 }

start関数はスクリプトでのみ OnStart で置き換えられます。エキスパートアドバイザーならびにインジケーターではそれぞれOnTick 及び OnCalculate が使用されるべきです。
MQL5 プログラム動作中に実行されるコードはこれらの 3 つの関数内に置かれるべきです。

MQL5 プログラム

メインファンクション

script

OnStart

indicator

OnCalculate

エキスパートアドバイザー

OnTick

インジケーターまたはスクリプトコードにメインファンクションが含まれていない場合、もしくは関数名が必要なものと異なる場合、この関数の呼び出しは実行されません。
つまり、スクリプトのソースコードが OnStart を含まない場合には、そのようなコードはエキスパートアドバイザーとしてコンパイルされます。

コードが OnCalculate 関数を含まないインジケーターのコンパイルはできません。

 

定義済み変数

MQL5 には Ask、Bid、Bars といった事前定義された変数はありません。
Point 及び Digits 変数はわずかに異なるスペルを持っています。

 

時系列へのアクセス

MQL5 では Open[]、High[]、Low[]、Close[]、Volume[] 及び Time[] の定義済み時系列は存在しません。
時系列の必要な深さは、対応する時系列アクセス関数を使用して設定出来ます。

 

エキスパートアドバイザー

MQL4 と異なって、MQL5 の エキスパートアドバイザーは新しいティックの受信 イベント を処理する関数である OnTick を必要としません。
MQL5 では、エキスパートアドバイザーは複数の種類のイベントの事前定義されたハンドラ関数を含むことが出来ます。

  • OnTick – 新しいティックの受信
  • OnTimer – タイマーイベント
  • OnTrade - 取引イベント
  • OnChartEvent – キーボードやマウスからの入力のイベント、グラフィックオブジェクトの移動イベント、ラベル編集オブジェクトの入力フィールドでのテキスト編集完了のイベント
  • OnBookEvent – 板情報の状態変化のイベント

カスタム指標

MQL4 では、インジケーターバッファの数は制限されていています。MQL5 にはこのような制限はありませんが、それぞれのインジケーターバッファが端末で存在するためにメモリの特定の部分の割り当てを必要とするので、この新しい権限は悪用されるべきではありません。

MQL4 で提供されたカスタムインジケータープロットは 6 種類のみでしたが、MQL5 では 18 の描画スタイルが提供されています。
描画の種類の名称は変更されていませんが、指標のグラフィク表現のイデオロギーが大幅に変更されました。

指標バッファの索引付けの方向も異なります。デフォルトでは、MQL5 の全てのインジケーターバッファが通常の配列のように機能します。
つまり、0 インデックスが付けられた要素は履歴中で最も古いものであり、インデックスの増加に伴い、最も古いデータから最新のデータへの移動がなされます。

MQL4 から保存された唯一のカスタムインジケーター関数は SetIndexBufferです。しかしその呼び出しが変更されました。MQL5 では、インジケーターバッファとリンクされた配列に格納されるデータ型を指定する必要があります。

カスタムインジケーターのプロパティも変化し、拡大しています。時系列アクセスに使用される関数も加わったため、計算アルゴリズムを全体として考え直す必要があります。

 

グラフィックオブジェクト

MQL5 におけるグラフィックオブジェクトの数は大幅に増加しています。
その上、グラフィックオブジェクトは、任意の時間軸のチャートで秒単位の精度をもって配置することが出来ます。
オブジェクトアンカーポイントは現在の価格チャートにおいてバーの開始時刻に丸められていません。

『矢印』、『テキスト』及び『ラベルオブジェクト』では結合メソッドを、そして、『ラベル』、『ボタン』、『チャート』、『ビットマップラベル』及び編集オブジェクトではオブジェクトが接続されるチャートのコーナーを指定することが出来ます。