LibEA.mqhの仕様と使用上の注意

前の記事で、MT4とMT5で同じソースのEAがコンパイル、実行できるというライブラリを紹介しました。

そのライブラリ、LibEA.mqhというヘッダファイルですが、当然ながら、これをインクルードすれば、どんなEAでもMT4とMT5で動くというものではありません。

ソースを共通化させるには、そのためのルールが必要です。MQL4の関数をそのまま使ってしまうと、それをMQL5に対応させるのは大変です。独自にライブラリ関数を作るのは、MQL4とMQL5との違いを吸収させるためです。詳しくは、「新MT4対応ライブラリによるメタトレーダーEA実践プログラミング」(新メタトレ実践本)をご参照ください。

EAをプログラミングするにあたり、MQL4とMQL5とで、互換性に注意する必要があるのは、大きく以下の二つです。

  • 実際に発注するオーダー系の関数
  • 売買シグナル生成に利用するチャートの4本値とテクニカル指標関数

オーダー系の関数の共通化


オーダー系の関数は、MQL4では、ポジションオープンにOrderSend()、ポジションクローズにOrderClose()と別関数を使うのですが、MQL5ではOrderSend()だけしか使いません。

この違いを吸収するために、MQL4とMQL5とで同じ名前の関数を用意します。例えば、ポジションオープンにMyOrderSend()、ポジションクローズにMyOrderClose()といった具合です。そして、それぞれの関数にMQL4、MQL5用のオーダー関数を書いておきます。

オーダー系の関数は、MQL4用をLibOrder4.mqh、MQL5用をLibOrder5.mqhとして用意しておき、LibEA.mqhの中で、MQL4用にコンパイルする場合、LibOrder4.mqhをインクルードし、MQL5用にコンパイルする場合、LibOrder5.mqhをインクルードするようにします。

こんな感じに書いておくと、拡張子がmq4のEAをコンパイルする場合、MQL4用に、拡張子がmq5のEAをコンパイルする場合、MQL5用に勝手にインクルードファイルを変えてくれるわけです。

このようにオーダー系の関数は、MQL4とMQL5とで1対1に対応させられるので、共通化させるのはそう難しくはありません。

チャートの4本値の共通化


MQL4では、チャート上の値である売値、買値、4本値が、Bid, Ask, Open[], Low[], High[], Close[]のような定義済み変数として自動的に格納されています。

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

詳しいことは省略しますが、それをまとめて実行するためにOnTick()関数の最初にUpdatePosition()という関数を実行させるようにしました。つまり、OnTick()中に毎回、UpdatePosition()を書けばいいのですが、EAに共通のコードは極力EAには記述しないで、ライブラリにまとめようというのが、本書の方針なので、OnTick()関数をLibEA.mqh中に入れてしまいました。

ここで、Tick()という関数を呼び出していますが、これの本体をEAに書いておくようにしました。なお、

のようにライブラリをインクルードする前に「UseOnTick」を定義しておけば、EA中にOnTick()を書くことができるようになっています。

テクニカル指標関数の共通化


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

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

と関数を直接呼び出せばいいのですが、MQL5では、利用するテクニカル指標を宣言、テクニカル指標の値をバッファにコピー、バッファから必要な指標値を取り出す、と3段階の手順が必要となります。

このままでは、オーダー系関数のように1対1に対応させることはできません。

ラトルズから出版した黄色本のライブラリでは、MQL5の標準クラスライブラリが新MQL4でも使えることから、テクニカル指標クラスを使う方法で、MQL4とMQL5を共通化させました。

しかし、今回の新メタトレ実践本では、MQL4用にはiMA()やiRSI()といった関数を直接使っているので、同じ書式のままMQL5でも使えるようにライブラリの方を工夫しました。

MQL5でもiMA()とかiRSI()というMQL4と同じ名前の関数はあります。ただし、引数の数や戻り値の型が違うので、MQL4の関数と同じ書式で定義しても区別することができます。

そこで、MQL4で使える29個のテクニカル指標関数に対して、何段階か必要な手順を、一度の呼び出しで実行できるような関数をLibMQL4.mqhというヘッダファイルに作っておきます。但し、iCustom()と、iMAOnArray()など配列に適用させるテクニカル指標には対応していません。

あと、使い方で注意する点は、パラメータの異なる同じテクニカル指標の扱いです。

MQL4では、テクニカル指標関数を呼び出すときにパラメータを指定するので、同じテクニカル指標関数でも、パラメータを自由に変えることができます。

しかし、MQL5では、パラメータを決めて宣言するので、パラメータを変える度にテクニカル指標を宣言し直さなくてはいけません。ただ、テクニカル指標を作ったり、削除したりを繰り返すと、実行時間が相当遅くなってしまうので、このライブラリでは、パラメータが変わっても前のテクニカル指標は残しておいて、新にテクニカル指標を宣言するという方法にしました。

同じテクニカル指標で何個の異なるパラメータに対応させるかは、

の定数で指定します。パラメータの種類が8個よりも多くなる場合には、この値を大きくしてください。

他にもいろいろありますが、ライブラリの仕様は今後変更になることもありますので、細かい点については省略します。



コメントは受け付けていません