【MQL5】インジケーター値の取得!iMAやiRSIを使ったテクニカル指標の計算とデータコピー

MQL5 開発講座

こんにちは、潤奈です( ゚Д゚)!

これまでの連載で、「自動注文(エントリー)」と「ポジション決済」というEAの基本動作をマスターしてきました。
今回は、EAが売買判断を下すために絶対に欠かせない「インジケーター(移動平均線やRSIなど)の数値をプログラム内で取得する方法」を解説します!

実は、MQL4からMQL5へ移行した人が最も驚き、そして挫折しやすいのが、この「インジケーター値の取得方法」です。
MQL4では非常に手軽に1行で書けた処理が、MQL5では全く異なるアプローチが必要になります。

最初は「ちょっと面倒だな…」と感じるかもしれませんが、仕組みを理解してしまえばテンプレート化できますし、動作スピードも劇的に向上します。今回もコピペで動くサンプルコード付きで、分かりやすく解説しますね!


1. MQL5のインジケーター値取得はなぜ難しい?(MQL4との比較)

まず、MQL4とMQL5でコードがどれくらい違うのかを比較してみましょう。

移動平均線(SMA14)の「1本前の値」を取得したい場合、MQL4では以下のように関数を1回呼び出すだけでその場の数値が直接返ってきました。

一方、MQL5で同じことをやろうとすると、以下の「3つのステップ」を踏む必要があります。

  1. インジケーターの登録証(ハンドル)を発行する
  2. 数値を格納する配列を用意し、時系列順(最新の足が0番目)に並べ替える
  3. 登録証を使って、配列の中にデータをコピーする

MQL5では、iMA などの関数を実行しても直接数値は返ってこず、代わりに「ハンドル」と呼ばれる整理番号(ID)が返ってきます。このハンドルを使って、後から必要な時だけデータを引っ張ってくる(コピーする)という仕組みになっています。

なぜこんな面倒な仕様になったかというと、「動作を圧倒的に軽くするため」です。
MQL4の書き方は手軽でしたが、毎回のチックでインジケーターを丸ごと計算し直すため動作が重くなりがちでした。MQL5の仕様なら、初期化の段階で登録を済ませておくため、PCやサーバーにかかる負荷を激減させることができます。


2. インジケーター値を取得する「3つのステップ」

それでは、具体的な書き方を3ステップで順に解説します。

ステップ①:インジケーターの「ハンドル」を取得する

まずは、プログラム起動時(OnInit()内)で、使いたいインジケーターのハンドルを作成し、グローバル変数に保存しておきます。

ステップ②:格納用の配列を「時系列順」に設定する

次に、取得した値を保存するための double 型の配列を用意します。
EAを動かすチック処理の中で毎回配列の並び順を設定するのは無駄があるため、グローバル領域で配列を宣言し、OnInit() 内で ArraySetAsSeries() を1回だけ設定しておくのが、動作を軽くするためのMQL5のベストプラクティスです。

これを設定しておかないと、MQL4で馴染みのあった「[0] が最新の足、[1] が1本前の足」という指定ができなくなり、直感的ではない処理になってしまいます。

ステップ③:CopyBuffer でデータを配列にコピーする

最後に、OnTick() 内などで CopyBuffer() 関数を呼び出し、ハンドルから配列へ数値をコピーします。

  • maHandle: ステップ①で取得したハンドル
  • 0 (バッファ番号): 通常のインジケーター(MAなど)は 0 でOKです(MACDのシグナル線など、複数の線を持つインジケーターは 1 などを指定します)。
  • 0 (開始位置): コピーを開始するバーの位置。0 は最新の足です。
  • 3 (個数): コピーする本数。最新の足から過去3本分をコピーします。
  • maValues: コピー先の配列。

3. 使い終わったらハンドルを解放する(IndicatorRelease)

MQL5の大切な作法として、EAが停止するとき(OnDeinit()内)に、作成したインジケーターハンドルをメモリから解放してあげる必要があります。

これを忘れると、MT5のメモリが徐々に圧迫される原因になるため、必ずセットで書くようにしましょう!


4. コピペで動く!サンプルEAコード

それでは、実際に動かして挙動を確認できるサンプルコードを紹介します。
このコードは、「1本前の移動平均線(SMA14)の値」と、「1本前のRSI(14)の値」を毎チック取得してログ(操作履歴)に出力するEAです。

このコードをコンパイルしてデモ口座などのチャートにセットし、「操作履歴」タブを確認してみてください。以下のように、リアルタイムで現在の通貨ペアのMA値とRSI値が表示されれば成功です!


5. まとめ&次のステップ

今回は、MQL5でのインジケーター値の取得方法を解説しました。

  • MQL5では直接値を取得できず、「ハンドル取得」「データコピー」の2ステップが必要。
  • OnInit() でハンドルを取得し、OnDeinit() で解放する。
  • OnTick() 内で ArraySetAsSeries() を使って配列を時系列に設定する。
  • CopyBuffer() を使って必要本数分のデータを配列に引っ張ってくる。

これで、「発注」「決済」「インジケーター取得」という、EA開発に必要な3大要素をすべて手に入れました!

次回は、これまでに学んだ知識をすべてガッチャンコして、「移動平均線のゴールデンクロス・デッドクロスで自動で売買(注文&決済)を繰り返す、初めての実用EA」を作成していきます。ついに本物の自動売買プログラムが完成しますので、楽しみにしていてくださいね!

今回のコードで「エラーが出て値が取れない」「RSIのパラメーター変更方法が分からない」といったことがあれば、YouTubeのコメント欄やXでお気軽にご相談ください!

🎥 YouTubeチャンネル: 潤奈【FXチャンネル】
🐦 X (Twitter): @zyuna32246

コメント

タイトルとURLをコピーしました