2015/05/15

MQL4 更新内容

MQL4の新機能


MQL4はビルド600以降、プログラミング言語として、MQL5の水準まで改良されました。
これは、MetaEditorというMQL4/5統合開発環境により、同じ構文、同じライブラリ、そして同じデバッグツールを利用して、自動売買システムを制作できるということを意味します。

MQL4は、長年に渡って制作されてきたMT4で稼働する数多くのソースコードをそのまま利用可能とし、これまでの学習効果を損なわないという理由で、自動売買システム開発者の間でとても人気のある言語です。
しかし、本言語は、その優位性から発生する欠点も抱えていました。
というのも、単純な言語であるがゆえに、複雑なシステムが制作しにくく、また高水準のデバッグ済みライブラリの移植を妨げる場合がありました。
そのため、MQL5の全ての機能や特徴を、MQL4の機能として完全に実装する必要がありました。
言い換えれば、MQL5のオブジェクト指向プログラミングを含む強力な機能や、機械語へのコンパイル機能を、MQL4でも実現しなければなりませんでした。

MQL4とMQL5のコンパイラを統合し、自動でどちらの言語もサポートする必要がありました。
また、MetaEditorは、MT4/MT5ターミナルのどちらでも稼働するアプリケーションの開発も可能とする必要がありました。
これにより、MQL4とMQL5は、どちらのどのバージョンでもコンパイルすることができるようになりました。
MQL5のより広い記憶域も確保されたままです。

MQL4のアプリケーション保護機能もMQL5の水準まで引き上げられました。
新しい実行ファイル(EX4/EX5)は、厳重に保護されるようになりました。
これにより、MT4アプリケーション(EX4)をマーケットで安全に運用することができるようになりました。

一方、MQL4でも、チャート上に新しいグラフィックオブジェクトを描画したり、新しい機能を実行できるようになりました。
MQL4での開発者が望んでいたグラフィックインターフェイスやライブラリが、MQL5の標準ライブラリからMQL4へと移植されたのです。
こうして、MT4のリソースを使って本格的なアプリケーションを開発できるようになりました。


MQL4言語の変更点


新しいデータ型、charshortlongucharushortulong、そしてdoubleが追加されました。
これらは、他のC++系言語からコード変換できます。
様々なデータは、それぞれのデータ型に応じて処理されます。
Integer型の整数データが最も速く処理されます。
特殊なコプロセッサを利用すれば、倍精度で取り扱うこともできます。
これに対して、浮動小数点データの内部処理は複雑になってしまうので、Integer型に比べて処理速度は遅くなります。
型変換は実装されています。

文字型は、以前はANSI(1バイト文字)でしたが、Unicodeで処理されるようになりました。
DLLとの変数の引き渡しで利用する場合には、注意が必要です。

Volume変数はlong型で定義されるようになりました。
時系列配列のVolume配列もlong型で定義されています。
以前のMQL4プログラムで発生しうる型オーバーフローエラーを回避するために、型変換を明示的に行う方がよいでしょう。

構造体とクラスで利用されるオブジェクトポインターは、void型で定義されていて、this句を用いて参照渡しを行うことができるようになりました。
つまり、オブジェクト指向プログラミングの標準を全てサポートするようになりました:

・ 型のカプセル化と拡張性
・ 継承
・ ポリモーフィズム
・ オーバーロード
・ 仮想関数

オブジェクト指向プログラミングは、クラスを利用して開発します。
これにより、大型のアプリケーションのコーディングとデバッグを容易にし、継承を利用することで、過去に生成したソースコードを再利用することができます。
一方、以前のMQL4での手続き型プログラミングも、引き続き行うことができます。
つまり、今回の新要素を使うことなく、プログラミングすることができるのです。

init()、deinit()、そしてstart()関数は、互換性を保つために、引き続き利用できます。
今回、これらの代替として、OnInit()OnDeinit()OnStart()OnCalculate()、そしてOnTick()関数が用意されました。
さらに、これまでなかった、OnTimer()OnChartEvent()、そしてOnTester()ハンドラ関数も実装されました。
以前のMQL4では、定義済み関数は、どんな引数や戻り値の型でも、明示せずに呼び出すことができました。
しかし、新しいMQL4では、全ての定義済み関数の引数の数や戻り値の型は、明示する必要があり、厳密に一致していなけばなりません。
言い換えれば、関数を定義する際には、引数の数や戻り値の型を正確に定義する必要があるということになります。

今回から、変数名に特殊文字とドット「.」を使用することができなくなりました。
また、MQL4言語に追加された予約語も変数名にすることができません。
これまでのMQL4プログラムを、新しいコンパイラがコンパイル時に出力するメッセージに従って修正することで、簡単にリコンパイルすることができます。

実行優先順位規則は、C言語の標準に則しています。
実行順位が不確実な場合は、これまでのMQL4アプリケーションと同じように、括弧「()」を使用することによって、意図した通りの実行順位にすることができます。

これまでのMQL4では、論理演算子を使用した条件式は、全て実行した後にチェックされていましたが、今回からこの過程が短縮されました。
AND演算子を使用した2つの条件式の場合:
  if(condition1 && condition2)
    {
     // 任意の命令文
    }

condition1がfalseだった場合、condition2は実行されません。
「false && true」のチェック結果が常にfalseになるためです。


ArrayCopyRates()関数の仕様が変更されました。
この関数は以前は、価格セットをdouble[][6]配列にコピーしていましたが、今回からMqlRates構造体を使って、スプレッドと出来高も取得できるようになりました:
//--- 価格セット、出来高、、スプレッドを格納する構造体
struct MqlRates
  {
   datetime time;         // バーの開始時刻
   double   open;         // 始値
   double   high;         // 高値
   double   low;          // 安値
   double   close;        // 終値
   long     tick_volume;  // ティック量
   int      spread;       // スプレッド
   long     real_volume;  // 出来高
  };

また、価格データが必要ない時は、あらかじめ仮想コピーを行っておき、実際に設定された後で取得することができます。
int  ArrayCopyRates(
   MqlRates&  rates_array[],   // MqlRates配列、 参照渡し
   string     symbol=NULL,     // 通貨ペア
   int        timeframe=0      // 時間軸
   );

これまでのMQL4プログラムと互換性を保つために、以前の形式も残してありますが、double型配列への実コピーのみ行うことができます。
int  ArrayCopyRates(
   void&     dest_array[][],    // コピー先配列、参照渡し
   string    symbol=NULL,       // 通貨ペア
   int       timeframe=0        // 時間軸
   );

これは、時系列配列の値が切り替わる(最新のバーが閉じて、新しいバーの値が再構成される)タイミングで、dest_array[][]にコピーしなおす必要があるということです。
コピー先配列の要素数は、例え静的宣言されていても、コピー元のバー数に応じて、自動的に割り当てられます。


RateInfo構造体の格納形式は変更されました。
これまでのRateInfo構造体の記述は、次のようでした:
struct RateInfo
  {
   unsigned int      ctm;   // バー開始日
   double            open;  // 始値
   double            low;   // 安値
   double            high // 高値
   double            close// 終値
   double            vol;   // ティック量
  };

新しい形式の特徴として、スプレッドと出来高を格納するようになりました:
//--- 新ターミナル版の標準的な記述
struct RateInfo
  {
   INT64             ctm;               // バー開始日時
   double            open;              // 始値 (絶対値)
   double            high;              // 安値
   double            low;               // 高値
   double            close;             // 終値
   UINT64            vol;               // ティック量
   INT32             spread;            // スプレッド
   UINT64            real;              // 出来高
  };

DLLと関数との間で価格データの引き渡しを行う際に、処理を厳密に行う(値を一致させる)ために、この形式変更を考慮して、ソース修正とリコンパイルを行う必要があるでしょう。
これまでのRateInfo構造体を使用したEX4アプリケーションとDLLは、実行できなくなりました。
新しい形式で記述しなおしてください。


ファイル操作関数についての変更点ですが、同時に開くことのできるファイル数の制限が、32から64へと拡張されました。
また、これまで、同時にファイルを開く場合は、FILE_SHARE_READモード、もしくはFILE_SHARE_WRITEモードのどちらかでしか開くことができませんでしたが、これからは、個々のファイルについて指定することができるようになりました。
FileWrite()FileWriteArray()FileWriteDouble()FileWriteInteger()、そしてFileWriteString()関数の戻り値の型がint型からuint型へと変更されました。
さらに、これらの関数の戻り値は、実際に書き込まれたバイト数、もしくは0(これまでは、エラーの場合の戻り値は負数でした)になりました。
関数内での変数のスコープとローカル配列の記憶域の解放関連が変更になりました。
変更点が多いので、以前のMQL4プログラムの開発方法と最大限の互換性を保つために、厳密な#property(制御コンパイル)が導入されました。
MQLウィザードを利用してMQL4アプリケーションを開発する際には、この制御コンパイルがテンプレートに記述されています。



================= Now writing =================






2015/05/14

MQL4 リファレンス

MQL4 リファレンス


メタクオーツ社のプログラミング言語4(MQL4)は、自動売買戦略を行うために生まれました。
本言語はMetaQuotes Software Corp.が、自動売買取引システムの長期間に渡る研究に基づいて開発されたもので、自動制御されたExpert Advisorを作ることができます。
これは、あなたの考案した売買戦略を完全に適切な形で実装することができ、その他、MQL4を利用して、あなたの考案したテクニカルインジケータ(Custom Indicator)、Script、またはLibraryを制作することができます。

MQL4は、過去から現在に至る価格データ、等を分析するのに必要な数多くの機能を含んでいます。
MetaEditor(テキストエディタ)は、MQL4言語をプログラミングするためのツールで、ソースコードを構造的に表現(ハイライト表示)します。
また、このツールを使用することで、ソースコードを直観的に読み取ることができます。

本ガイドは、関数、制御命令、予約語、その他語句を構造的に分類して、必要となる全ての言語要素を収録しています。

MQL4プログラムは、通例とは異なる特徴と目的を持っています。

・ Expert Advisorは、チャートに従って機械的売買を行うシステムです。
  Expert Advisorは、eventが発生したタイミングで動き出します。
  eventとは、実行開始時、実行終了時、ティック更新時のイベント、およびタイマーイベント、マーケット変更イベント、チャートイベント、カスタムイベントです。
  Expert Advisorは、自動売買によるサーバへの注文指示と、そのお知らせを行います。
  Expert Advisorは、「Data Folder\MQL4\Experts」に格納します。

・ Custom Indicatorは、MT4ターミナルに既に実装済みのインジケータとは別に制作された、テクニカルインジケータを指します。
  実装済みのインジケータと同じく、自動売買は行いませんし、チャート分析機能のみを目的としています。
  Custom Indecatorは、「Data Folder\MQL4\Indicators」に格納します。

・ Scriptは、様々な手続きを一括して行うことを目的としています。
  Scriptは、Expert Advisorとは異なり、自動実行は行いません。(ただし、OnStartハンドラ関数がScript内に記述されている場合を除きます)
  Scriptは、「Data Folder\MQL4\Scripts」に格納します。

・ Libraryは、頻繁に利用されるカスタム関数群を格納し、配布することを目的としています。
  Libraryは、それ単体では実行されることはありません。
  Libraryは、「Data Folder\MQL4\Libraries」に格納します。

・ Include Fileは、プログラム内で最も頻繁に利用されるソースコード群です。
  Include Fileは、Expert Advisor、Script、Custom Indicator、Libraryをコンパイルする際に、プログラム内に包括されてコンパイルされます。
  Include Fileは、Libraryで利用するのが望ましいです。なぜなら、関数の呼び出しにおいて、冗長性が発生するからです。
  Include Fileは、#include句によりダブルクォーテーション「""」付きで宣言した場合は、ソースファイルと同じディレクトリに格納します。
  #include句により山かっこ「<>」付きで宣言した場合は、「Data Folder\MQL4\Include」に格納します。

  


2015/05/13

はじめに

本サイトは、筆者であるsnepが趣味と実益を兼ねて、MQL4 Referenceの日本語翻訳作業を行う作業場所である。

以下にその主目的を挙げる。


  ・筆者のMQL言語への理解力の向上
  ・筆者の英語の語学力の向上


筆者の現在のつたない語学力で精一杯完成度は上げていく予定であるが、その正確性、完全性は保証されないことを前提とさせて頂きたい。

毎日、少しずつ書きあげていく予定なので、完了するのはかなり先のことになるだろう。

温かく見守って頂ければ幸いである。