FX自動売買基礎と応用

MQLプログラミング言語でチャートに移動平均線を表示する方法


MQL言語を覚えよう


MT4(MT5)でインジケーターやエキスパートアドバイザ-(EA:Expert Adviser)を作るためには、MQL言語でプログラミングする必要があります。プログラミング言語というと難解なイメージを持つ方もいるでしょうが、基礎から順番に学習を進めていけば、理解することができるでしょう。

この記事では、実際にMQL言語を利用してプログラムを作成していきます。

今回はまずMQLを基本から理解してもらうために、「チャートに移動平均線を表示する」という単純なインジケータープログラムを作ります。

MQLでプログラミングを行うには、メタエディター(MetaEditor)を用います。MT4の画面で、下記操作により立ち上げることができます。

                 
メタエディターの立ち上げ方・F4キーを押す
・ツールバーの「メタクォーツ言語エディタ」をクリック
・メニューの「ツール」→「メタエディター」を選ぶ

メタエディター「MQLウィザード」の操作手順


メタエディターが開いたら、「新規作成ボタン」をクリックします。すると「MQL4ウィザード」が立ち上がります。今回は移動平均線(MA:Moving Average)を作るので、「カスタムインディケータ」にチェックを入れて「次へ」を押します。

MQL4ウィザード画面

「カスタムインディケータの一般プロパティ」では、「名前」「著作者」「リンク」「パラメータ」の項目を指定します。今回は名前を「MA_demo」とし、著作者やリンク等はデフォルトのままとします。また、パラメータは用いません。名前の入力を終えたら「次へ」をクリックします。

カスタムインディケータの一般プロパティ画面

「カスタムインディケータのイベントハンドラ」では、「OnCalculate」が選択されています。今回は「OnTimer」「OnChartEvent」は使いませんので、何も操作せず「次へ」をクリックします。

カスタムインディケータのイベントハンドラ画面

「カスタムインディケータの描画プロパティ」では、「サブウインドウに表示」や「プロット」を指定します。今回はメインチャートにMAを表示するので、「サブウインドウに表示」にチェックは入れません。そしてプロットには、MAのデータを格納するバッファーを一つ登録します。「追加」を押して、ラベル(バッファーの名前)をMAとし、タイプはLine、カラーはRedのまま進めます。「完了」をクリックすると、プログラムするためのひな形ができます。

カスタムインディケータの描画プロパティ画面


プログラムのひな形


「MQLウィザード」で新規で立ち上げたひな形について、解説していきます。下の画像にアルファベットを振り、その箇所が表す内容をまとめます。

アルファベットを振られたソースコード

                                                                                                                                 
Aインジケーターのファイル名
B著作権
Cリンク先
Dバージョン番号
Eコンパイルの方式
Fインジケーターの表示箇所(chart_windowはメインチャートを意味する)
Gバッファーの数
H表示するバッファーの数
Iインジケーターの名前
Jインジケーターのタイプ
Kインジケーターの色
Lインジケーターの線種
Mインジケーターの太さ
Nバッファーとして使うための配列
OOnInit関数。インジケーターをチャートにセットした最初に、1回のみ実行されるもの
POnCalculate関数。サーバーからティックが配信されるたびに、毎回実行されるもの。ここにMAに関する式を書き入れます

MAに関する式


ひな形の構成が分かったところで、続いてOnCalculate関数の配下に、MAの式を書いていきます。チャートに表示されている全てのバーに対して計算する必要があるので、繰り返し計算で利用する「for文」を使います。


for (int i = 0; i < Bars; i++) 

i=0番目から、Bars番目まで繰り返し実行します、というのがこの文です(Barsはチャートに表示されているローソク足の数を意味します)。

続いて、バッファーの配列の中に、MAの計算を入れます。その時に利用するのがiMA関数です。これはMT4に初期搭載されているもので、必要なパラメータを設定することによってMAの計算をしてくれます。


for (int i = 0; i < Bars; i++) {
   MABuffer[i] = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, i );
   }

iMA関数の設定項目

                                                         
const string symbol(通貨ペア名)NULLは、表示されているチャートを使うという意味
timeframe(時間足)0は、表示されている時間足を使うという意味
period(ピリオド)インジケーターの計算期間。ここでは20とします
ma_shift(シフト)MAを左右にずらす指定。ずらさないなら0
ma_method(メソッド)MAの種類の指定。単純移動平均線ならSMA
applied_price(プライス)MAの計算に適用する価格。終値ならCLOSE
shift(シフト)何番目の足を計算に使用するか。ここではi番目とします

これで完成です。i番目のMAの値が、i番目のMAのバッファーの中に入ります、という式ができました。このiは、0からBars番目まで繰り返し計算され、これでMAが表示されるようになっています。


コンパイルの手順


プログラムし終わったら、保存のアイコンをクリックしてセーブします(「ファイル」→「保存」でも可)。

注意したいのは、プログラムを保存しただけでは、このインジケーターを実行できないということです。コンパイルという工程が必要です。実際に書いたのがソースファイルで、これをコンパイルすることで、MT4で使える実行ファイル(ex4ファイル)に変換されることになります。

コンパイルのアイコンをクリック(「ファイル」→「コンパイル」でも可)すれば完了です。コンパイル後にMT4を見ると、作成したインジケーターがナビゲータ-内に表示されます。当該ファイルをチャートにドラッグ&ドロップすると表示できます。

今回作った赤いMAが表示されました。

インジケーターがナビゲータ-内に表示

プログラミングに慣れていない人にとっては、ひな形が英語で埋め尽くされているため、文字量に圧迫感があると思われます。しかし、実際に書いたのはわずか数行の非常に簡単なプログラムです。

たったこれだけの作業で、移動平均線を作ることができました。まだプログラムをしたことがない方でも、簡単にできるのではないでしょうか。


ソースコード


今回、作成したソースコードは下記の通りです。今後の記事では、この簡易版プログラムを用いて解説していきます。


//+------------------------------------------------------------------+
//|                                                      MA_demo.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot MA
#property indicator_label1  "MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         MABuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MABuffer);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
      for (int i = 0; i < Bars; i++) {
      MABuffer[i] = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, i );
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


本記事の監修者・HT FX


2013年にFXを開始し、その後専業トレーダーへ。2014年からMT4/MT5のカスタムインジケーターの開発に取り組む。ブログでは100本を超えるインジケーターを無料公開。投資スタイルは自作の秒足インジケーターを利用したスキャルピング。


本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。

この記事をシェアする

ホーム » FX自動売買基礎と応用 » MQLプログラミング言語でチャートに移動平均線を表示する方法