MT5で方向によって色が変化するMAを作成する【MQLプログラミングの基礎】
1.ファイルの新規作成
この記事では、「MT5版の簡易MAにパラメーターを追加する【MQLプログラミングの基礎】」で作成した簡易MAファイルを編集し、上下の方向に合わせて色変化するMA(移動平均線)を作成します。
※この記事はMQL5の内容です。MQL4に対応した類似記事は以下を参照してください。
簡易MAファイルを開いた後、MetaEditorメニューの「ファイル」から「名前を付けて保存」を開き、ファイル名称を「Colorful_MA」に変更して保存し、そのファイルを編集します。
2.色指定用バッファの追加
ローソク足1本毎に色を指定するためのバッファを追加します。
バッファ数を指定している下記の行「#property indicator_buffers 1」を
「#property indicator_buffers 2」へ変更します。
「#property indicator_plots 1」で指定しているプロット数は、そのままで構いません。
上昇用の色として赤、下降用の色として青を指定します。
「#property indicator_plots 1」の下に
「#property indicator_color1 clrRed, clrDodgerBlue」を追加します。
上記の記述で、色バッファの0番に赤、1番に青を指定したことになります。
(カンマ区切りで追記することで、3色以上の指定も可能です。最大64色)
色は指定済なので、「input color CLR = clrRed; // 色」の行を削除します。
同様に、OnInit関数内の「PlotIndexSetInteger(0, PLOT_LINE_COLOR, CLR);」も削除します。
MAの色を目視しやすいよう、太さを「3」へ変更します。
「input int WIDTH = 1; // 太さ」を「input int WIDTH = 3; // 太さ」に変更します。
色指定用のバッファ「double ColorBuffer[];」を「double MABuffer[];」の行の下に追加します。
OnInit関数内を色変化用のライン表示仕様に合わせて変更します。
<変更前>
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);
<変更後>
SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
SetIndexBuffer(1,ColorBuffer,INDICATOR_DATA);
PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE);
PlotIndexSetInteger(0, PLOT_LINE_WIDTH, WIDTH);
PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_COLOR_LINE);
PlotIndexSetString(0, PLOT_LABEL, StringSubstr(EnumToString(METHOD), 5) + "(" + (string)PERIOD + ")");
ArraySetAsSeries(MABuffer, true);
ArraySetAsSeries(ColorBuffer, true);
インジケーターの描画タイプは、DRAW_COLOR_LINEへ変更しています。
3.色変化の式を追加
OnCalculate関数内にfor文を追加して、色バッファに対し、上昇時は「0」、下降時は「1」を入力する式を記述します。
「 CopyBuffer(handle, 0, 0, limit, MABuffer);」の下に下記のコードを追加します。
for (int i = limit - 2; i >= 0; i--) {
if (MABuffer[i] > MABuffer[i + 1]) ColorBuffer[i] = 0;
else ColorBuffer[i] = 1;
}
現足MAの値(MABuffer[i])と前足MAの値(MABuffer[i + 1])を比較し、現足が大きいときは「0」、小さいときは「1」を指定しています。
上記までの改修で完成なので、コンパイルしてチャートにセットすると、色変化するMAが表示されます。
4.ソースコード
今回、作成したソースコードは下記の通りです。
//+------------------------------------------------------------------+
//| Colorful_MA.mq5 |
//| Copyright 2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 1
#property indicator_color1 clrRed, clrDodgerBlue
input int PERIOD = 20; // 期間
input int SHIFT = 0; // シフト
input ENUM_MA_METHOD METHOD = MODE_SMA; // MA種別
input ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE; // 適用価格
input ENUM_LINE_STYLE STYLE = STYLE_SOLID; // 線種
input int WIDTH = 3; // 太さ
//--- indicator buffers
double MABuffer[];
double ColorBuffer[];
int handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
SetIndexBuffer(1,ColorBuffer,INDICATOR_COLOR_INDEX);
PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE);
PlotIndexSetInteger(0, PLOT_LINE_WIDTH, WIDTH);
PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_COLOR_LINE);
PlotIndexSetString(0, PLOT_LABEL, StringSubstr(EnumToString(METHOD), 5) + "(" + (string)PERIOD + ")");
ArraySetAsSeries(MABuffer, true);
ArraySetAsSeries(ColorBuffer, 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);
for (int i = limit - 2; i >= 0; i--) {
if (MABuffer[i] > MABuffer[i + 1]) ColorBuffer[i] = 0;
else ColorBuffer[i] = 1;
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
本記事の監修者・HT FX
2013年にFXを開始し、その後専業トレーダーへ。2014年からMT4/MT5のカスタムインジケーターの開発に取り組む。ブログでは100本を超えるインジケーターを無料公開。投資スタイルは自作の秒足インジケーターを利用したスキャルピング。
EA(自動売買)を学びたい方へオススメコンテンツ

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