FX自動売買基礎と応用

MT5でMA(移動平均線)を表示する【MQLプログラミングの基礎】

1.ファイルの新規作成

この記事では、MT5版のメタエディター(MetaEditor)を利用し、最も基本的なインジケーターであるMA(移動平均線)を表示するプログラムを作成します。

メタエディターの「新規作成」アイコンをクリックしてMQLウィザードを開きます。

メタエディターの「新規作成」アイコンをクリックしてMQLウィザードを開きます

「カスタムインディケータ」を選択して「次へ」をクリック。

「カスタムインディケータ」を選択して「次へ」をクリック

ファイル名を「MA.mq5」とし、「次へ」をクリックします。

ファイル名を「MA.mq5」とし、「次へ」をクリック

イベントハンドラは一番上の「OnCalculate」のみを選択して「次へ」をクリック。

イベントハンドラは一番上の「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が表示されます。

コンパイルすると、簡易的な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(自動売買)を学びたい方へオススメコンテンツ

EA運用の注意点

OANDAではEA(自動売買)を稼働するプラットフォームMT4/MT5の基本的な使い方について、画像や動画付きで詳しく解説しています。MT4/MT5のインストールからEAの設定方法までを詳しく解説しているので、初心者の方でもスムーズにEA運用を始めることが可能です。またOANDAの口座をお持ちであれば、独自開発したオリジナルインジケーターを無料で利用することもできます。EA運用をお考えであれば、ぜひ口座開設をご検討ください。


本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。

この記事をシェアする

ホーム » FX自動売買基礎と応用 » MT5でMA(移動平均線)を表示する【MQLプログラミングの基礎】