MQLプログラミング言語でチャートに移動平均線を表示する方法
MQL言語を覚えよう
MT4(MT5)でインジケーターやエキスパートアドバイザ-(EA:Expert Adviser)を作るためには、MQL言語でプログラミングする必要があります。プログラミング言語というと難解なイメージを持つ方もいるでしょうが、基礎から順番に学習を進めていけば、理解することができるでしょう。
この記事では、実際にMQL言語を利用してプログラムを作成していきます。
今回はまずMQLを基本から理解してもらうために、「チャートに移動平均線を表示する」という単純なインジケータープログラムを作ります。
MQLでプログラミングを行うには、メタエディター(MetaEditor)を用います。MT4の画面で、下記操作により立ち上げることができます。
メタエディターの立ち上げ方 | ・F4キーを押す ・ツールバーの「メタクォーツ言語エディタ」をクリック ・メニューの「ツール」→「メタエディター」を選ぶ |
---|
メタエディター「MQLウィザード」の操作手順
メタエディターが開いたら、「新規作成ボタン」をクリックします。すると「MQL4ウィザード」が立ち上がります。今回は移動平均線(MA:Moving Average)を作るので、「カスタムインディケータ」にチェックを入れて「次へ」を押します。
「カスタムインディケータの一般プロパティ」では、「名前」「著作者」「リンク」「パラメータ」の項目を指定します。今回は名前を「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 | バッファーとして使うための配列 |
O | OnInit関数。インジケーターをチャートにセットした最初に、1回のみ実行されるもの |
P | OnCalculate関数。サーバーからティックが配信されるたびに、毎回実行されるもの。ここに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本を超えるインジケーターを無料公開。投資スタイルは自作の秒足インジケーターを利用したスキャルピング。
本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。