【MQL5】 MT5のEA作成の勉強 その16 EA / インジケータにテクニカル指標導入

【MQL5】 MT5のEA作成の勉強 その16 EA / インジケータにテクニカル指標導入

まえがき

 前回の投稿で予告した通り、今回は、EA、インジケーターにMQL5既定のテクニカル指標を導入する方法をまとめてみたいと思います。
 

MQL5既定のテクニカル指標について

 MQL5既定のテクニカル指標は公式リファレンスのテクニカル指標のページにまとめられています。 これらの【i + {指標名}」であらわされるテクニカル指標はEA、インジケーターのどちらでも使うことができ、使い方も同じです。しかし、これを使うためにはプログラムのあちこちで変数の準備をする必要があり、一つでも抜けるとエラーになってしまうので注意が必要です。

グローバル変数の準備

 グローバル変数ブロックでは、以下の二つの変数を準備します。

  • ハンドル変数 : int型
     指標のハンドルを格納する変数です。ハンドルとは、ざっくり言うと、プログラムから外部のプログラムを呼び出すとき、呼び出されたプログラムから帰ってきた値を格納する場所の番号のようなものです。
  • バッファ配列 : double型配列
     指標の値を格納する配列です。あまりないと思いますが、指標の値が数値ではなく文字l型で表現される場合は、それに合わせてstring型配列とします。

Oninit()での準備

 Oninit()ブロックではグローバル変数ブロックで作製したハンドル変数にハンドルを割り当てて行きます。ハンドルの割り当ては 「バンドル変数 = 公式リファレンスのテクニカル指標のページにまとめられている関数のいずれか」の形で行うことができます。この時、関数に与える変数は種類によってまちまちですが、以下の二つは必ず与える必要があります。

  • symbol
     基本的に「Null」または「_symbol」を入力しておけばOKです。この場合、現在表示中の銘柄の価格から計算した指標がかえされます。一応、銘柄名を入力することで他の銘柄(通貨ペア)の値を参照することは可能なようですが、ここでいう銘柄名はサーバー側で決定される値とのことで、リファレンスで見つけることはできませんでした。ここに入力する値を知りたければ、テスター上で取引の結果を取得し、その中の銘柄名プロパティを参照する必要があります。ちょっと面倒なうえに、使いどころがあんまりなさそうなので今回は割愛します。
  • period
     基本的に「0」または[_period]を入力しておけばOKです。この場合、現在表示中の時間軸のの価格から計算した指標がかえされます。symbolに比べると、こちらは幾らか表示中の時間軸以外を参照するケースもあります。その場合はチャート時間軸の「ENUM_TIMEFRAMES」のいずれかの値を入力します。

 また、指標バンドルの取得に失敗した場合は「INVALID_HANDLE」という値が変数に格納されます。その場合、不完全な状態での誤作動を避けるため、初期化処理を失敗として「INIT_FAILED」を返す処理を入れておきましょう。

Ontick() / OnCalculate()での準備 

 Ontick()(インジケータではOnCalculate())では、実際にテクニカル指標の値を取得し、それを使用して計算を行います。テクニカル指標の取得には、 CopyBuffer関数を使用します。 CopyBuffer関数 の指標ハンドルに、グローバル変数ブロックで作製したハンドル変数を、受け取り側の配列にバッファ配列をそれぞれ与えることで、値を取得することができます。以前の投稿でも触れましたが、 CopyBuffer関数で取得した配列に格納される指標の値は、要素番号最大の場所に格納されている値が最新(現在)の値となります。そのため、計算を行う際、この配列から現在の値を取得したい場合、 配列の要素数によって指定する要素番号が変わってしまうので注意が必要です。

まとめ

 変数の準備、ハンドルの取得、値の取得という具合に、プログラム内の3か所に処理が散らばってしまうことが避けられず、ぶっちゃけかなり使いにくいです。特に、プログラムが複雑化してくると、ソースが長くなり、変数の追加や削除をするたびに、いちいちスクロールして目的の場所を探す必要があり、厄介です。
 せめて、作業性を向上させるために、C#等のように複数のウィンドウ(ファイル)に分割して記述する方法を検討したいと思います。includeファイルを使えばできそうな気もするのですが、グローバル変数の入力が必要なので、ちょっと実現できるかは不透明です。追々トライしてゆきたいと思います。