MQLプログラミング言語で移動平均線を作成する方法
パラメータの追加
「MQLプログラミング言語でチャートに移動平均線を表示する方法」という記事では、簡易的なMAプログラムを作成しました。この記事では、その簡易版に機能を追加して、一般的なMAと呼べる状態まで改修する方法を解説します。
参考記事:MQLプログラミング言語でチャートに移動平均線を表示する方法
まずはパラメータ(変数)を指定できるようにします。これによりインジケーターの各種設定が変更できるようになります。ここではMAの期間(計算期間)を設定できるようにしてみましょう。パラメータを定義する際の決まりとして、最初に「input」と入れます。ここでは、整数型「int」で「PERIOD」、初期値「20」として定義します。
input int PERIOD = 20; // 期間
なお、inputの「PERIOD」の横に「//」および文字を入力すると、変数の名前をつけることができます。この「PERIOD」を、(前回の記事で作成した簡易版プログラムの)iMA関数の期間の所に貼り付ければ準備完了です。
for (int i = 0; i < Bars; i++) {
MABuffer[i] = iMA(NULL, 0, PERIOD, 0, MODE_SMA, PRICE_CLOSE, i );
}
改修前は「パラメータの入力」タブがない状態でしたが、改修プログラムをコンパイルすることで追加されます。これにより期間を任意の値に変更することができるようになりました。
期間以外も同様の手順で設定
上記の手順と同様に、その他のパラメータとして「SHIFT」(シフト)、「MA_METHOD」(MA種別)、「APPLIED PRICE」(適用価格)などの項目を設定できます。なお、「MA_METHOD」などはint型ではなく、あらかじめMT4に用意されている列挙型(ENUM)を利用します。
input int PERIOD = 20; // 期間
input int SHIFT = 0; // シフト
input ENUM_MA_METHOD METHOD = MODE_SMA; // MA種別
input ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE; // 適用価格
それぞれ作った定数をiMA関数に貼り付けます。
for (int i = limit; i >= 0; i--) {
MABuffer[i] = iMA(NULL, 0, PERIOD, SHIFT, METHOD, PRICE, i );
}
これをコンパイルすると、全て反映されます。列挙型を用いたものは、値を入力する形式ではなく、例えばMA種別ならSimple、Exponential…などの選択肢からいずれかを設定する形式となります。
色や線種を変更できるようにする
期間やシフトなどのパラメータを設定できるようにするだけではなく、色や線種なども指定できるように改修することが可能です。簡易版プログラムでは「#property」でそれらを指定していましたが、パラメータで任意に変更できるようにしてみましょう。
手順は同様です。「CLR」は色、「input LINE_STYLE」は線種、「WIDTH」は太さを表します。
input color CLR = clrWhite; // 色
input ENUM_LINE_STYLE STYLE = STYLE_SOLID; // 線種
input int WIDTH = 1; // 太さ
そしてここで定義した色、線種、太さを、「SetIndexStyle」で指定していきます。一つ目はバッファーなので「0」、タイプは「DRAW_LINE」、スタイルは「STYLE」、太さは「WIDTH」、色は「CLR」です。
SetIndexStyle (0, DRAW_LINE, STYLE, WIDTH, CLR);
さらに「SetIndexLabel」でIndex番号を「"MA"」とします。これによりパラメータで指定できるようになります。
SetIndexLabel(0, "MA");
以上によって、色などを指定していた元々の記述が不要になりました。不要になった部分に関しては、「/*」と「*/」で囲ってコメントアウトします。この記号で囲われた中は、プログラムの文ではなく、ただの文字列(メモ、コメント)として扱われるようになります。
/*#property indicator_label1 "MA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1*/
ここまでの段階でコンパイルすると、下画像のように改修されます。色、線種、太さを変えられるようになっているのが分かるでしょう。
計算の最大数を変更
簡易版プログラムのCalculate関数の中では、毎回全Barsの本数が計算されるようになっています。ここから無駄な計算を減らすように改修してみましょう。
計算の最大数を定義するのは「limit」で、「IndicatorCounted」を利用します。「IndicatorCounted」は、今までに計算されたインジケーターの数を出力するものです。最初は0で、計算が終わるとその分の数値がここに入ることになります。
int limit = Bars - IndicatorCounted() - 1;
さらに計算の方向も変更してみます。リミットから始まって、0まで順番に値を小さくしていく方向にします。
for (int i = limit; i >= 0; i--)
これで「Bars-1番目」から始まって、0番まで計算するという式になります。次からは「IndicatorCounted」がその時のBarsの本数になるので、最小限の数だけ計算するということになります。最小限の数に関しては、ポイントがあります。最低1番から0番の足まで計算するように設定することです。
0番の足というのは、未確定の値動きしている足のことです。1番の足というのは、確定したばかりの足のことです。なぜこのようにするかというと、サーバーの動作が長い間止まっている場合などで、1番のデータが正しく設定されてない可能性を考えてのことです。
int limit = Bars - IndicatorCounted() - 1;
if (limit < 1) limit = 1;
今回、以上の手順で、簡易的なMAから、一般的なMAにまで改修することができました。
スタイラーを使う
これまでの記事では取り上げませんでしたが、メタエディターのひな形では、書式に関して気になる部分があります。それは例えば、スペースが多かったり、少なかったりなど、細い部分です。これらの書式を一気に変更してくれるツールに、「スタイラー」という機能が実装されています。
スタイラーは、ツールバーにありますが(名称は「ソースコードを整える」)、まずはメニューバーの「ツール」→「オプション」からスタイラーの初期設定をします。デフォルトのスタイルは「MetaQuotes」ですが、好みに応じてスタイルやスペースの挿入条件等を変更します。下画像は、スタイルを「Linux」に設定し、スペース関連のチェックを入れた例です。
この設定を終えた後に、ツールバーのスタイラー(ソースコードを整える)をクリックすると、ソースコードの見た目が修正されます。
ソースコード
今回、作成したソースコードは下記の通りです。なお、先ほどコメントアウトした部分は、消去してあります。
//+------------------------------------------------------------------+
//| 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
//--- parameters
input int PERIOD = 20; // 期間
input int SHIFT = 0; // シフト
input ENUM_MA_METHOD METHOD = MODE_SMA; // MA種別
input ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE; // 適用価格
input color CLR = clrWhite; // 色
input ENUM_LINE_STYLE STYLE = STYLE_SOLID; // 線種
input int WIDTH = 1; // 太さ
//--- indicator buffers
double MABuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0, MABuffer);
SetIndexStyle(0, DRAW_LINE, STYLE, WIDTH, CLR);
SetIndexLabel(0, "MA");
//---
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[])
{
//---
int limit = Bars - IndicatorCounted() - 1;
if(limit < 1)
limit = 1;
for(int i = limit; i >= 0; i--)
{
MABuffer[i] = iMA(NULL, 0, PERIOD, SHIFT, METHOD, PRICE, i);
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
本記事の監修者・HT FX
2013年にFXを開始し、その後専業トレーダーへ。2014年からMT4/MT5のカスタムインジケーターの開発に取り組む。ブログでは100本を超えるインジケーターを無料公開。投資スタイルは自作の秒足インジケーターを利用したスキャルピング。
本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。