MT5版の簡易MAにパラメーターを追加する【MQLプログラミングの基礎】
1.パラメーターを追加
「MT5でMA(移動平均線)を表示する【MQLプログラミングの基礎】」で作成した簡易MAファイルを編集し、パラメーターで各種設定を変更できる仕様に改修します。
まずは、期間をパラメーターで指定できるようにします。
前回作成したMA.mq5をメタエディター(MetaEditor)で開き、プログラム内の
//--- indicator buffers
の上に次の行を追記します。
input int PERIOD = 20; // 期間
パラメーターを定義する際の決まりとして、最初に「input」と入れます。
ここでは、整数型「int」で「PERIOD」を、初期値「20」として定義しています。
定義したPERIODをiMA関数の期間の場所へ貼り付けます。
handle = iMA(NULL, 0, PERIOD, 0, MODE_SMA, PRICE_CLOSE);
コンパイルしてインジケーター設定を開くと、「インプット」タブが追加され、期間の値を変更できるようになっていることが確認できます。
上記の手順と同様に、その他のパラメーターとしてシフト、MA種別、適用価格を追加します。
MA種別及び適用価格については、int型ではなく、あらかじめ用意されている列挙型(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関数の各場所へ貼り付けます。
handle = iMA(NULL, 0, PERIOD, SHIFT, METHOD, PRICE);
コンパイルしてインジケーター設定を開くと、各種パラメーターが追加されていることを確認できます。
パラメーターの指定で、MAの各種設定を変更できるようになりました。
2.色や線種をパラメーターで指定できるようにする
インジケーターで表示されるラインの書式(色、線種、太さ)は、インジケーター設定の「カラー」タブで指定し、変更できます。
今回のMAにおいては、「インプット」タブのパラメーター設定でラインの書式を変更できるようにしても、機能追加としての意味はあまりありませんが、MT4との指定方法の違いを認識するための参考として下記に示します。
パラメーターとして、CLR(色)、STYLE(線種)、WIDTH(太さ)を追記します。
input color CLR = clrRed; // 色
input ENUM_LINE_STYLE STYLE = STYLE_SOLID; // 線種
input int WIDTH = 1; // 太さ
パラメーターで指定した書式を適用するため、OnInit()関数内に、下記を追記します。
PlotIndexSetInteger(0, PLOT_LINE_COLOR, CLR);
PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE);
PlotIndexSetInteger(0, PLOT_LINE_WIDTH, WIDTH);
インジケーターの表示タイプを指定するため、下記を追記します。
PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
インジケーターのラベル表示に、MA種別や期間が自動で反映されるよう、下記を追記します。
PlotIndexSetString(0, PLOT_LABEL, StringSubstr(EnumToString(METHOD), 5) + "(" + (string)PERIOD + ")");
EnumToString()関数にMETHODを入力すると、文字列「MODE_SMA」が出力されます。
StringSubstr()関数で、5文字目以降と指定することで、「MODE_SMA」の5文字目以降が切り取られ「SMA」という出力となります。
カッコ付きの期間の文字列と合わせて「SMA(20)」というラベル表示になります。
OnInit()関数内へMAの書式指定を追記したことにより、元々の記述が不要となったので、プログラム内の下記の行を削除します。
--- plot MA
#property indicator_label1 "MA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
コンパイルしてインジケーター設定を開くと、MAの書式パラメーターが追加されていることを確認できます。
上記までの編集により、簡易的なMAを一般的なMAへ改修することができました。
3.ソースコード
今回、作成したソースコードは下記の通りです。
//+------------------------------------------------------------------+
//| MA.mq5 |
//| Copyright 2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
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 = clrRed; // 色
input ENUM_LINE_STYLE STYLE = STYLE_SOLID; // 線種
input int WIDTH = 1; // 太さ
//--- indicator buffers
double MABuffer[];
int handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
PlotIndexSetInteger(0, PLOT_LINE_COLOR, CLR);
PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE);
PlotIndexSetInteger(0, PLOT_LINE_WIDTH, WIDTH);
PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
PlotIndexSetString(0, PLOT_LABEL, StringSubstr(EnumToString(METHOD), 5) + "(" + (string)PERIOD + ")");
ArraySetAsSeries(MABuffer, true);
handle = iMA(NULL, 0, PERIOD, SHIFT, METHOD, PRICE);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
IndicatorRelease(handle);
}
//+------------------------------------------------------------------+
//| 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 = rates_total - prev_calculated;
if (limit < 1) limit = 1;
CopyBuffer(handle, 0, 0, limit, MABuffer);
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
EA(自動売買)を学びたい方へオススメコンテンツ

OANDAではEA(自動売買)を稼働するプラットフォームMT4/MT5の基本的な使い方について、画像や動画付きで詳しく解説しています。MT4/MT5のインストールからEAの設定方法までを詳しく解説しているので、初心者の方でもスムーズにEA運用を始めることが可能です。またOANDAの口座をお持ちであれば、独自開発したオリジナルインジケーターを無料で利用することもできます。EA運用をお考えであれば、ぜひ口座開設をご検討ください。
本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。