MT5でMA(移動平均線)を表示する【MQLプログラミングの基礎】
1.ファイルの新規作成
この記事では、MT5版のメタエディター(MetaEditor)を利用し、最も基本的なインジケーターであるMA(移動平均線)を表示するプログラムを作成します。
メタエディターの「新規作成」アイコンをクリックしてMQLウィザードを開きます。
「カスタムインディケータ」を選択して「次へ」をクリック。
ファイル名を「MA.mq5」とし、「次へ」をクリックします。
イベントハンドラは一番上の「OnCalculate」のみを選択して「次へ」をクリック。
「追加」ボタンを押して、プロットするバッファを追加します。
ラベルを「MA」、タイプを「Line」、カラーを「Red」として「完了」をクリックすると、ファイルのベースが作成されます。
2.インジケーター用のハンドルを定義
MT5ではMT4と異なり、標準的にMQL5で用意されているインジケーター用の関数を利用する際、そのコピーを入力する変数としてハンドルを定義します。
プログラム内の
double MABuffer[];
の下に次の行を追記します。
int handle;
3.バッファ配列方向の設定
OnInit()関数内の
SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
の下に次の行を追記します。
ArraySetAsSeries(MABuffer, true);
上記を指定することで、バッファ配列の0番が最新の足の値として扱われます(指定しないと、0番が最も古い値になり、配列の並び順が逆になります)。
4.ハンドルにiMAのコピーを入力する
OnInit()関数内に下記の行を追記します。
handle = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE);
関数内で指定している各パラメーターの意味は、下記の通りです。
iMA(通貨ペア名, 時間足, MAの期間, シフト, MAの種類, 適用価格);
・通貨ペア名:NULL(チャートで表示されている通貨ペア)
・時間足:0(チャートで表示されている時間足)
・MAの期間:20
・シフト:0(横方向への移動なし)
・MAの種類:MODE_SMA(SMAで計算)
・適用価格:PRICE_CLOSE(終値で計算)
5.関数OnDeinit()を定義
終了時にインジケーターをリセット(ハンドル開放)するために、下記の関数を追加します(他の関数の外であれば、どこに追加しても良い)。
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
IndicatorRelease(handle);
}
6.計算範囲を設定してMAを計算
初期時のみチャート全体を計算し、次からは最小限の範囲のみ計算するよう、OnCalculate()関数内に、変数limitを下記の通り定義します。
int limit = rates_total - prev_calculated;
if (limit < 1) limit = 1;
MAのハンドルをバッファにコピーするため、下記を追記します。
CopyBuffer(handle, 0, 0, limit, MABuffer);
ハンドル内の0番の値(iMA関数には0番のみ)の、0~limitの値をMABufferにコピーするという意味になります。
コンパイルすると、簡易的なMAインジケーターの完成となり、チャートに適用するとMAが表示されます。
7.ソースコード
今回、作成したソースコードは下記の通りです。
//+------------------------------------------------------------------+
//| 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
//--- 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[];
int handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
ArraySetAsSeries(MABuffer, true);
handle = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE);
//---
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運用をお考えであれば、ぜひ口座開設をご検討ください。
本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。