MQL4 からMQL5 への移行

MQL5 は、その前身であり多数の指標、スクリプト、及びエキスパートアドバイザーを提供したMQL4 プログラミング言語が進化したものです 。この新しいプログラミング言語は、前世代の言語と最大限の互換性を保つものでありますが、これらの言語の間にはいくつかの違いが存在します。プログラムを移行する際には、これらの違いに注意する必要があります。

このセクションは、MQL4になじみのあるプログラマの MQL5 言語へのコード適応の簡易化を意図した情報が含まれています。

初めに留意点がいくつかあります。

  • MQL5 言語は start()、init() 及び deinit() 関数を含みません。
  • 指標バッファの数に制限はありません。
  • DLLは、エキスパートアドバイザー(またはその他の MQL5 プログラム)をロードした直後にロードされます。
  • 論理条件のチェックは短縮されます。
  • 配列の制限が超えられた場合、実行が( 重大エラーの発生とともに)終了します。
  • 演算子の優先順位は C + + と同じです。
  • MQL5 言語は(文字列から数値の場合にも)暗黙の型キャストを提供しています。
  • 文字列を除いたローカル変数は自動的に初期化されません。
  • 一般的なローカル配列は自動的に削除されます。

特別関数 init、start 及び deinit

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

MQL4

MQL5

init

OnInit

start

OnStart

deinit

OnDeinit

OnInit 及び OnDeinit 関数は MQL4 の init 及び deinit と同じ役割を果たします。 これらは、MQL5 プログラムの初期化と初期化解除中に実行されるコードを見つけるために設計されています。MQL4 関数の名称を変更する、または、名称を変更せずに対応した場所でMQL5 関数の呼び出しをする選択肢があります。

例:

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 変数はわずかに異なるスペルを持っています。

MQL4

MQL5

Digits

_Digits

Point

_Point

 

_LastError

 

_Period

 

_Symbol

 

_StopFlag

 

_UninitReason

時系列へのアクセス

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

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

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

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

カスタム指標

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

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

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

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

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

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

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

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