MT5 共通ライブラリ その2

1.ファイル構成

共通ライブラリは、一つのファイルではなく、五つのファイルより構成されています。いずれも拡張子が「mqh」というヘッダファイルよして記述されています。
通常、プログラムのソースファイルは、MT4の場合「mq4」,MT5の場合「mq5」という拡張子で区別されます。しかし、mqhファイルはMT4用、MT5用と区別されているわけではなく、共通に使うことができます、

それぞれのファイルの役割を以下に示します。

・LibEA.mqh EAのプログラムから直接読み込まれるファイルで、MQL4、MQL5共通の関数ライブラリ化したものです。

・LibOrder4.mqh MQL4のトレード関数をライブラリ化したものです。

・LibOrder5.mqh MQL5のトレード関数をライブラリ化したものです。

・LibMQL4.mqh MQL5で対応していないMQL4の関数(時間関数、テクニカル指標関数)をMQL5で利用するためにライブラリ化したものです。

・LibTF5/mqh MQL4で対応していないMQL5のタイムフレームや、テクニカル指標関数をMQL4で利用するためにライブラリ化したものです。

実際にMT4のEAで利用されるファイルは、LibEA.mqh、LibOrder4.mqh、LibTF5/mqh の三つ、MT5のEAで利用されるファイルは、LibEA.mqh、LibOrder5、LibMQL4.mqhの三つとなりますが、上記の五つのファイルをまとめて「共通ライブラリ」と呼ぶことにしました。

取り扱い
これらのライブラリファイルは、作成するEAと同じフォルダに入れておくことをお勧めします。
同じフォルダに入れる場合は、

#include”LibEA.mqh”

EAを別々のフォルダに複製する場合など、すべてのフォルダにライブラリファイルをコピーするのが煩わしい場合は、データフォルダの下の「MQL4\Incude」「MQL5\Include」フォルダに入れておくとよいかと思います。
この場合は

#include<LibEA\LibEA.mqh>

と記載してください。

なお、これらのファイルは単独で使用するものではありません。したがって、これらのファイルをコンパイルしても実行ファイルは作成されません。逆にエラーメッセージが表示されるかもしれませんが、エラーがでること自体問題ではありませんので、ご安心ください。

2.ライブラリのしくみ

ライブラリを使ってEAを作成するだけであれば、ライブラリの中身を詳しく知る必要はありません。ただ、すでにMQL4、MQL5の組み込み関数が本ライブラリとどのように対応しているかがわかった方が理解しやすいかと思います。ここでは、共通化のしくみについて簡単に説明しておきます。

2-1.トレード関数の共通化

トレードを行う関数として、MQL4では、ポジションオープンに「OrderSend()」、ポジションクローズに「OrderClose()」と別々の関数を使います。MQL5では、ポジションオープン・クローズにも、同じ「OrderSend()」を使いますが、引数はMQL4とまるで違います。

この違いを吸収するために、MQL4とMQL5とで同じ名前の関数を用意します。
例えば、各注文や各ポジションは、それぞれチケット番号という数値で区別されますが、それぞれの注文やポジションの情報は一旦注文やポジションを選択してから取得するという流れになります。この処理も、MQL4では、「OrderSelect()」、MQL5では、オープンポジションは「PositionGetSymbol()」、待機注文は「OrderGetTicket()」と、使う関数と選択の仕組みが違います。
そこで、ポジション情報を取得する関数をMQL4とMQL5とで同じ名前とし、互いに異なるポジション選択の部分も同じ関数のなかに含めて、共通化を図っています。つまり、共通ライブラリではポジション選択の処理は必要なく、それぞれの関数の最後の引数であるポジション番号を変えるだけで
ポジション情報の取得ができるようになっています。

このようにトレード関数は、MQL4とMQL5とでほとんど共通部分がないので、MQL4用のトレード関数の定義を「LibOreder4.mqh」に、MQL5用のトレード関数の定義を「LibOrder5.mqh」に、別々のファイルとして作成しておきます。
そして、どちらのファイルを読み込むかは、「#ifdef-#endif」というプリプロセッサ命令で制御します。

メタエディタでソースファイルをコンパイルする際、「_MQL4_}「_MQL5_」という文字列が特殊な役割をもっています。拡張子がmq4というファイルをMT4でコンパイルする場合は、「_MQL4_}が定義済みとなり、「#ifdef_MQL4_」と「#endif」で囲まれた命令を実行します。

同じように拡張子がmq5というファイルを
MT5でコンパイルする場合は、「_MQL5_}が定義済みとなり、「#ifdef_MQL5_」と「#endif」で囲まれた命令を実行します。

つまり、LibEA.mqhの中で、次のように書いておけば、MQL4用にコンパイルする場合、「LibOrder4.mqh」をインクルードし、MQL5用にコンパイルする場合、
「LibOrder5.mqh」をインクードするといった具合にライブラリファイルを自動的に読み分けてくれるのです。

2-2.チャートの4本値の共通化

MQL4では、チャートの値である売値、買値や四本音(始値、高値、安値、終値)をプログラム中で扱うために、それぞれ「Bid」「Ask」「Open[]」「High{}」
「LOW[]」「close[]」といった定義済み変数が用意されており、特に宣言することなく利用できます。

しかし、MQL5では、これらの定義済み変数が用意されていません。そこで、これらの変数をライブラリ中で宣言して、実行中に更新していくというコードを追加する必要があります。

四本値を更新する関数は、共通ライブラリLibEA.mqh中に「UpdatePosition()」として定義されています。この関数をティックのたびに実行することで、MQL4の定義済み変数と互換性をもたせています。そのために、ティックのたびに実行される特別な関数である「OnTick()」を利用します。通常、EAの
プログラム中にOnTick()関数の本体を記述するのですが、OnTick()中で確実にUpdatePosition()を実行させるために、共通ライブラリLibEA.mqh中にOnTick()関数を記述しています。

//ティック時実行関数

void OnTick()
{
if(UpdatePosition()) Tick();
}

こうすることで、共通ライブラリを使ったEAでは、ティックごとに無条件に「UpdatePosition()」関数を実行したあとに、「Tick()」という関数を実行することになります。

ここでは、Tick()という関数が、従来のOnTick()関数と同じ役割のものだと考えてください。つまり、EAのなかでは、OnTick()関数を定義する代わりに、Tick()関数を定義すればよいのです。なお、EAをチャートに挿入した直後に実行される「OnInit()」関数や、EAをチャートから削除したときに実行される
「OnDeinit()」関数は、特に共通ライブラリ中で記述してはいけません。必要に応じてEAのなかで定義していただいて構いません。

2-3.テクニカル指標関数の共通化

最後に問題となるのが、テクニカル指標関数です。テクニカル指標関数の呼び出し方は、MQL4とMQL5とで大きく異なります。

MQL4では、テクニカル指標の値が必要なところで、

//1本前のモメンタム
double mom1 = iMomemtum(_Symbol,0,MomPeriod,PRICE_CLOSE,1);

のように関数を直接呼出し、関数を戻り禰を指標値として使います。

一方MQL5では、利用するテクニカル指標を宣言する。テクニカル指標の値をバッフャにコピーする。バッファから必要な指標値を取り出す、といった3段階の手順が必要となります。このままでは、トレード関数のように、MQL4とMQL5のテクニカル指標関数を1対1に対応させることはできません。

そこで共通ライブラリでは、テクニカル指標関数の呼び出し方をMQL4の書式に統一することにしました。そして、MQL5のテクニカル指標関数を、MQL4と同じ書式で呼び出せるような工夫をしました。

具体的には、MQL5に組み込まれているテクニカル指標関数に対して、3段階の手順を一度の呼び出しで実行できるような関数を定義し、これを「LibMQL.4」というライブラリファイルとして作成しました。詳細な仕組みについては省略しますが、このライブラリファイルをインクルードすることで、MQL5でも、MQL4と同じ書式でテクニカル指標関数を使うことができます。なお、「LibMQL4.mqh」というライブラリファイルは、MQL5のEAをコンパイルする際に自動的に読み込まれるようになっています。ただ、一つだけ、使い方で注意する点があります。それは、同じテクニカル指標関数でも、パラメータの値が異なる場合の扱いです。

例えば、期間のパラメータが「FastMAPeriod」と「SlowMAPeriod」と異なっている場合です。

MQL4では、テクニカル指標関数を呼び出すときにパラメータの値を指定するので、同じテクニカル指標関数でも、パラメータの値を自由にかえることができます。
しかし、MQL5では最初にパラメータの値を決めて宣言するので、パラメータの値が異なると同じテクニカル指標でも別物として扱われます。つまり、二つの異なるiMA()が宣言されていることになっているのです。ですので、内部で配列を使ってパラメータの値を記憶しています。配列のサイズを無制限にするわけにはいかないので、何個の値に対応させるかという上限を決めておく必要があるのです。そこで、同じテクニカル指標で対応させるパラメータの値の組み合わせを、「MAX_IND」という定数で指定しています。
この場合、同じテクニカル指標でも、パラメータの値の組み合わせが8種類まで対応できることが可能です。もし、8種類よりも多いパラメータの値の組み合わせが
必要な場合には、

define MAX_ IND 10

//共通 ライブラリ #include “LibEA. mqh”

のように共通ライブラリを読み込む前に{MAX_IND」の値を定義しておきます。

ただし、テクニカル指標のパラメータの値は共通で、最後に「shift」のパラメータの値が異なるだけの場合は、別指標とはならず、同じ指標とみおなされます。

MT5 共通ライブラリ その3

shin3をフォローする
System trading topics
タイトルとURLをコピーしました