ビルド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の「ファイル」→「データフォルダを開く」で見つけることができます。
こんにちは。
VPSで自動売買を行ってる者です。MQLがバージョンアップされますたが、信頼性の面で不安があるのでビルド509のまま稼動してます。
EAの作成は自宅のPCでビルド600の環境で開発してます。しかし、ビルド600の新たな機能は使用しておらず、ビルド509の形式に沿って開発してます。
自宅PCで開発したEA(.mq4)をVPS上にコピーするため、USBメモリに一旦コピーすると「関連するプロパティはコピーできません」というメッセージが表示されました。無視してコピーを行いましたが、ファイルサイズは同じでしたのコピーできたと思ってました。ところが、VPS(ビルド509)のエディタで開くと中身が空です。
ビルド600の環境で開発したEA(.mq4)をコピーするには、何か特別な方法があるのでしょうか?
とりあえず、今は以下の方法で回避してます。
ビルド600で開発したEAを無理やりコピー。
コピーしたファイルの拡張子を.txtに変える。
VPSのMT4(ビルド509)を起動し、エディタを開く。
新規、または空のmq4ファイルを作成する。
先の.txtを開き、クリップボードにコピーする。
空のmq4ファイルにペーストする。
コンパイルする。
宜しくお願いします。
こんにちわ!
えむてぃふぉーさん>
ビルド600以降のメタエディタで作成したmq4ファイルは、ビルド509以前のメタエディタでは読み込まないようですね。
私もコード自体をコピペしています。
ビルド509以前のMT4は来月いっぱいで使用できなくなるようですので、そろそろアップデート後のMT4で稼動確認していったほうがよさそうです。
MetaTrader 4で始める FX自動売買システム作成の教科書を購入させていただきました!
とてもわかりやすいですね!
ところで今回Build600以降の仕様変更で結構困っています。
変更一覧などはよく見るのですが、やはりBuild600以降の現在の仕様に対応した書籍を出すべきではないでしょうか?
有名先生の書籍も買いましたが、結局変更一覧に多くのページを割いているだけで、MetaTrader 4で始める FX自動売買システム作成の教科書のような至れり尽せりの内容ではなかったので初心者にはわかりにくい書籍でした。
ぜひ新刊期待しています!
こんにちわ!
HTDさん>
書籍を購入いただきありがとうございます^^
新MQL4対応書籍については、出版社と相談しながら検討させていただきます。
今後とも宜しくお願い申し上げます。
こんにちわ
EAパーフェクトマスタースクールの
サンプルEA 22本はビルド600番台でも
問題なく作動するのでしょうか?
かいとんさん
こんにちわ!
問題なく動作します。
コンパイルの警告項目などがビルドが進むにつれて増加したりしていますが、対応策をお聞きいただければ回答いたします。
はじめまして。Ztomと申します。
http://www.dr-ea.com/meta-blog/mql/mqlreference-metaeditor2.html
MT4のヘルプ日本語化を探していて上記アドレスに辿り着いたのですが
ビルド600以降のMT4ではlanguagesフォルダがないようなのですが、
宜しければビルド600以降でのリファレンス日本語化の手順を教えて頂けませんでしょうか?
宜しくお願いします。
こんにちわ。
>Ztomさん
ビルド600以降では翻訳リファレンスを使用することができなくなってしまいました。
スミマセンm(_ _)m
以前にEA作成アカデミーでお世話になっておりました。その後EA自作を色々と試しているのですが、中々解明ができない問題があったのでご連絡させて頂きました。
USD/CADの過去の値を見て、EUR/USDと、CAD/USDの取引をするEAをデモで稼働しています。
EUR/USDと、CAD/USDのチャートには全く同じEAを入れています。
当然、各EA内で、
double C1 = iClose(“USDCAD”,PERIOD_M1,1);
と同じように組まれていますが出てくる値がちがいます。
ターミナルで確認すると、データ取得時間が分単位はあっていますが、秒単位ではずれています。結果値も違っています。
たとえば、
EUR/USDのチャートでは、2015.03.16 09:12:48.155 CAD/USD 1.2812
CAD/USDのチャートでは、2015.03.16 09:12:45.241 CAD/USD 1.281
といった具合です。
上記EAで取得出きるデータは、”USD/CADの現在の一つ前の分足の終値”ですから、USD/CADで9時12分00秒以降の最初のティックで既に確定されていると思うのですが、なぜ違いが出るのでしょうか?
これは、”USD/CADの現在の一つ前の分足の終値”とは、確定足の基準がGMTでも、指定されている通貨(この場合はUSD/CAD)の基準でもなく、EAがある通貨(この場合EUR/USDとCAD/USD)基準ということなのでしょうか?
GMT基準であれば、9時12分00秒時点のUSD/CAD、指定されている通貨基準であればUSD/CADで9時12分00秒以降の最初のティックの確定足、EAがある通貨基準であれば、今回のように、EUR/USDのチャートでは、2015.03.16 09:12:48.155時点、CAD/USDのチャートでは、2015.03.16 09:12:45.241時点、となってしまう、なので、今回のようなズレが出てしまうのでしょうか?
複数の違う通貨のチャート上のEAでも、EAがある通貨のティックに影響されず、指定されている通貨又はGMTの基準で、特定の通貨の値を正しく同じ値で取得する方法はあるのでしょうか?もしご存じでしたら、ご回答頂けますと幸いです。