MQL4イメージ

ビルド600からMQL4の仕様が大きく変わりました。ビルド509以前のMT4はいずれ利用できなくなるので新旧MQL4の変更点などを確認しておきましょう。
※ビルド509以前のMT4は使用できなくなりました。

MQL4 ReferenceのUpdated MQL4の和訳

この記事は、2014年5月24日時点でのMQL4リファレンスのUpdated MQL4の和訳です。MQL4リファレンスは更新されていきますので、最新の内容ではない可能性があります。

参考ページ https://docs.mql4.com/ MQL4 Reference → Language Basics → Updated MQL4

MQL4の新機能

ビルド600からMQL4プログラミング言語は完全に改訂され、MQL5レベルに達しています。今あなたは統合されたメタエディタ・ライブラリー・デバッグツールを使用してMQL4/5で売買ロボットを開発することができます。

MQL4は、学習のしやすさとメタトレーダー4ターミナルを使用している何年もの間に生成されたコードが膨大な量のため、自動システムの開発者の間で人気があります。しかし、言語はその主な利点から生じるいくつかの欠点を持っています – 簡単なプログラミング言語は、複雑なシステムの開発を許可せず、また高レベル言語からデバッグライブラリの移植を妨げます。そのため、我々はそれにMQL5言語の関数を最大限実装して完全にMQL4の機能を維持することを決定しました。つまり、OOP(オブジェクト指向プログラミング)とネイティブコードコンパイラを含むすべての強力なMQL5機能は、MQL4で利用できるようになります。

これを達成するために、我々はMQL4とMQL5の両方の言語を自動的にサポートする統一されたコンパイラを開発しました。メタエディタもメタトレーダー4とメタトレーダー5プラットフォーム用の両方の統一されたアプリケーションとなります。このように、いずれかのバージョンからMQL4とMQL5の両方をコンパイルすることが可能となります。MQL5ストレージも利用可能になります。

MQL4アプリケーションの保護は、MQL5レベルに上昇。新しいEX4/EX5ファイルは、重大かつ完全に改訂された保護を備えています。これは安全なEX4アプリケーションマーケットもメタトレーダー4で利用可能になることを意味しています。

また、MQL4は現在新しいグラフィカル・オブジェクトとチャートを操作するための新しい関数を備えています。MQL5標準ライブラリはMQL4に移植され、独自のグラフィカル・インターフェースと取引のライブラリを作成する際に新たな可能性を開発者に提供します。今あなたはリソースを使用してメタトレーダー4で本格的なアプリケーションを作成することができます。

MQL4言語の変更点

新しいデータ型char, short, long, uchar, ushort, uint, ulong, doubleが追加された。これは他のC++のような言語からのコード転写を可能にします。様々な種類のデータが異なる速度で処理される。整数データが最も速く処理される。特別なコプロセッサは、倍精度浮動小数点数型を処理するために使用される。しかし、浮動小数点型の内部表示の複雑さにより整数よりも遅く処理される。型キャストも実装されている。

文字列は、以前はANSI形式(シングルバイト)であったが、現在、Unicode形式で表示されます。プログラムがDLLを使用し、それらに文字列変数を渡した場合、それは考慮されるべきである。

定義済みのボリュームの変数はlong型になりました。ボリュームにアクセスするための時系列もlong型の配列で構成されています。オーバーフローエラーを回避するために、古いMQL4プログラムではターゲットの型にこのタイプを持っているデータという明示的なキャストを使用することをお勧めします。

構造体、クラス、オブジェクトポインタ、void型、オブジェクトが自分自身への参照ができるthisキーワードが追加されました。次のようにすべてのオブジェクト指向プログラミングの標準がサポートされています。

・カプセル化およびタイプの拡張性
・継承(インヘリタンス)
・多相性(ポリモーフィズム)
・多重定義(オーバーロード)
・仮想関数

http://docs.mql4.com/basis/oop
OOPではクラスを使用してプログラムを開発することができます。これは、デバッグや大規模なアプリケーションの開発を容易にするだけでなく、継承(インヘリタンス)によって以前に生成されたコードを何度も再利用する機能を提供します。しかし、それは以前のように手続き指向のスタイルではMQL4コードが生成できないことを意味するものではありません。新しい機能を必要としない場合は、あなたが過去に行ったようにプログラムを開発することができます。

定義済みの関数init(), deinit(), start()は互換性のため残っていますが、現在 OnInit(), OnDeinit(), OnStart(), OnCalculate(), OnTick()が代わりに使用できます。また、新しい定義済みのハンドラ関数 OnTimer(), OnChartEvent(), OnTester()が実装されています。以前のMQL4では、定義済みの関数は任意のパラメータと任意の戻り値の型を持つことができ、シグネチャではなく名前で呼び出すことができた。新しいMQL4では、すべての定義済みの関数が厳密に呼び出し形式に対応する必要があります。言い換えれば、正確にパラメータや戻り値の型のセットを定義している必要があります。

現在、変数名は特殊文字とポイントを含めることはできず、新しいMQL4言語のキーワードは、名前として使用することはできません。古いMQL4プログラムは、コンパイラのメッセージに従うことですべてのエラーを簡単に補正でき新しいコンパイラで再コンパイルすることができます。

優先順位のルールは現在のC言語の標準と一致します。よくわからない場合は、信頼性を高めるために優先順位を明らかに示すため古いMQL4アプリで括弧を挿入することができます。

現在、すべての式が計算されチェックが実行される古いMQL4のバージョンとは違って、短縮される条件チェック法方が論理演算に使用されている。下記のような論理「AND」を使用した2つの条件のチェックがあるとします。

if(condition1 && condition2)
{
   // some block of statements
}

もし、式condition1がfalseの場合、「false && true」は依然として「false」に等しいので、式condition2の計算は行われません。

ArrayCopyRates()は動作が変更されました。double[][6]配列への仮想コピーの代わりに、現在はMqlRates[]配列への仮想コピーを実行します。double[][6]配列へのコピーは互換性のためそのまま残っていますが、そのコピーは実際であって仮想ではありません。

ファイル操作では、同時に開くことのできるファイル数は現在64に達しています。古いMQL4では32でした。最近まで、ファイルは常にFILE_SHARE_READまたはFILE_SHARE_WRITEモードで開かれていました。現在、必要なオープンモードが明示的に指定されている必要があります。

関数の働き、変数の有効範囲、ローカル配列のメモリ開放についても変更されました。変更数が大きいので、以前のアプローチでのMQL4プログラム開発との互換性を最大限提供するため、新しく「#property strict」プロパティーが導入されました。MQLウィザードを使用して新しいMQL4アプリケーションを作成する場合、このプロパティは常にテンプレートに追加されます。

下記のように、DateTime型の文字列表現は、コンパイルモードによって異なります。

   datetime date=D'2014.03.05 15:46:58';
   string str="mydate="+date;
//--- str="mydate=1394034418" - 旧コンパイラ/新コンパイラ #property strictなし
//--- str="mydate=2014.03.05 15:46:58" - 新コンパイラ #property strictあり

下記の表は、旧MQL4・新MQL4(strict指定なし)・新MQL4(strict指定あり)の違いを含んでいます。
※strict指定の仕方

#property strict

コンパイラーによる違いの表

旧MQL4 新MQL4(strict指定なし) 新MQL4(strict指定あり)
init(), start(), deinit()のエントリポイントは任意のパラメータと任意の戻り値の型を持ってもよい init(), start(), deinit()は、互換性の為そのまま残っているが、新たなOnInit(), OnStart(), OnCalculate(), OnTick(), OnTimer(), OnChartEvent(), OnTester(), OnDeinit()は厳密に呼び出し形式に対応している必要がある 同左
事実上(予約語を除く)任意の変数名には、特殊文字やポイントなどが可能である 変数名は特殊文字や点を持つことはできません。予約語のリストが拡張されました。そのため、short, long, constなどのような広範囲にわたる単語が名前として使用することができません 同左
変数の有効範囲は(ネストされたブロック内でも)宣言からその関数の終わりまで 同左 変数の有効範囲は宣言からその変数を宣言したブロックの終わりまで
(グローバルでもローカルでも)全ての変数が0に暗黙的に初期化される 同左 グローバル変数のみ初期化されます。ローカル変数では、文字列のみ暗黙的に初期化される
ローカル配列はその関数を終えても開放されません ローカル配列はその関数を終えると開放されます ローカル配列は{}のブロックを終えると開放されます
範囲外配列の参照はクリティカルエラーを起こしません 同左、構造体とクラスについては重要なエラーなので除きます 範囲外配列の参照はプログラム停止のクリティカルエラーを起こします
構造体とクラスはありません 構造体とクラスが存在する。追加のデータ型が実装されている 同左
文字列はシングルバイトです。datetime型は32ビットの整数です。定義済みのボリュームの変数はdouble型です 文字列はUnicodeです。datetime型は64ビットの整数です。定義済みのボリュームの変数はlong型です 同左
ArrayCopyRates()は、double[][6]配列への仮想コピーが行われる ArrayCopyRates()はMqlRates[]配列への仮想コピーが行われる。double[][6]配列へのコピーは互換性のためそのまま残っていますが、そのコピーは実際であって仮想ではありません 同左
関数は型を持っていても値を返さなくてもよい。こうするため、return(0)が自動的に関数の最後にコンパイラによって挿入されている 同左 任意の型の関数は値を返す必要があります
同時オープンファイル数は32 同時オープンファイル数は64 同左
ファイルは常にFILE_SHARE_READまたはFILE_SHARE_WRITEモードで開かれる FILE_SHARE_READおよび/またはFILE_SHARE_WRITEを明示的に指定する必要があります 同左

※範囲外配列のエラーに特別な注意を払ってください – 多くの古いカスタムインジケータはチャート上で起動した際、新コンパイラのstrictモードではこのエラーが表示されます。原因を見つけて、それを排除することをお勧めします。
※※新しいMQL4とMQL5では、FILE_SHARE_READとFILE_SHARE_WRITEフラグがファイル共有使用モードを担当しています。

ファイル構造の変更点

メタトレーダー4クライアントターミナルのビルド509以前のビルドでは、下記のように全てのMQL4アプリケーションが<ターミナルインストールフォルダ>\experts\ルートディレクトリのサブディレクトリに格納されていました。

  • \experts – エキパートアドバイザー (取引ロボット)
  • \experts\indicators – カスタムインジケータ
  • \experts\scripts – スクリプト (チャート上で1回実行されるMQL4アプリケーション)
  • \include – 他のプログラムに実装する MQH と MQ4 ファイルのソースコード
  • \libraries – MQ4形式のソースコードと、それらからコンパイルされたEX4形式の実行可能ファイルのライブラリ。これらは他のMQL4プログラムによってそこに含まれる関数の動的呼び出しのために使用される
  • \files – 特別な「ファイルのサンドボックス」。MQL4アプリケーションでは、このディレクトリ内のみファイル操作を実行することが許可されています。

新しいMQL4バージョンでは、ソースコードを格納するためのファイル構造が変更されました。現在、すべてのMQL4のアプリケーションは<data_folder>\ MQL4\ディレクトリの適切なフォルダに配置する必要があります。

  • \Experts – エキパートアドバイザー (取引ロボット)
  • \Indicators – カスタムインジケータ
  • \Scripts – スクリプト (チャート上で1回実行されるMQL4アプリケーション)
  • \Include – 他のプログラムに実装する MQH と MQ4 ファイルのソースコード
  • \Libraries – MQ4形式のソースコードと、それらからコンパイルされたEX4形式の実行可能ファイルのライブラリ。これらは他のMQL4プログラムによってそこに含まれる関数の動的呼び出しのために使用される
  • \Images – リソースに使用するための画像ファイル
  • \Files – 特別な「ファイルのサンドボックス」。MQL4アプリケーションでは、このディレクトリ内のみファイル操作を実行することが許可されています。

ビルド509からさらに新しいバージョンにメタトレーダー4ターミナルを更新する際に、以前のバージョンの標準のルートディレクトリにある全てのMQ4, MQH, EX4ファイルは自動的にコピーされ、適切なフォルダに再配置されます。ユーザーによって追加されたサブフォルダ及びそこに含まれるファイルは(コピー)処理されません。必要に応じてそれらを手動で新しい場所に再配置する必要があります。

どのファイルやフォルダも、更新時に削除されません!使用されているファイルのパスを含むすべてのファイルコピー操作は、更新中はターミナルの実行記録で固定されている。

古いEX4ファイルの新しいバージョンへの自動再コンパイルは更新中には実行されません。ユーザーは、どのソースコードを新しいEX4バージョンにコンパイルされるべきかを自由に決定できます。すべての古いEX4は、新たなメタトレーダー4ターミナルで動作します。新しいコンパイラでコンパイルEX4ライブラリはまた、新しいバージョンでコンパイルされているEX4プログラムから呼び出すことができます。新しいコンパイラでコンパイルされたEX4ライブラリは、新しいバージョンでコンパイルされているEX4プログラムからのみ呼び出すことができます。

いくつかのケースでは、ソースファイルで(相対パスが変更されている場合)#includeでインクルードされているファイルのパスを編集する必要があるかもしれません。メタエディタのルートディレクトリは現在<data_folder>\MQL4\であることに注意してください。すべてのプログラムは、正しいサブディレクトリに配置する必要があります。

お使いのコンピュータ上でメタトレーダー4ターミナルの各コピー用のデータフォルダ(<data_folder>)は、ターミナルまたはMetaEditorの「ファイル」→「データフォルダを開く」で見つけることができます。