ホーム » FX自動売買基礎と応用 » MT5版のiCustom関数の利用法【MQLプログラミングの基礎】

MT5版のiCustom関数の利用法【MQLプログラミングの基礎】

1.ファイルの新規作成

この記事では、別のインジケーターのバッファ情報を読み取り、利用できるようになるiCustom関数について説明します。

※この記事はMQL5の内容です。MQL4に対応した類似記事は以下を参照してください。

iCustom関数の作成方法や実際のソースコードなどを解説

iCustom関数を利用することで、既存インジケーターの機能を流用できるようになります。

まずは、ひな形となるファイルを新規作成します。
MetaEditorの「新規作成」をクリックし、「カスタムインディケータ」にチェックを入れて「次へ」ボタンを押します。

iCustom 新規作成

「カスタムインディケータの一般プロパティ」では、ファイル名を「iCustom_test.mq5」とし、「次へ」ボタンを押します。

iCustom 一般プロパティ

「カスタムインディケータのイベントハンドラ」は一番上のOnCalculateのみを選択して「次へ」をクリック。

iCustom イベントハンドラ

「カスタムインディケータの描画プロパティ」では、「追加」ボタンをクリックしてプロットを追加します。
今回は、ラベルを「custom」、タイプを「Arrow」、カラーを「Magenta」にしました。

「完了」ボタンをクリックすれば、ひな形の完成です。

iCustom 描画プロパティ

2.インジケーター用のハンドルを定義

プログラム内の「double customBuffer[];」の下に、下記の行を追記します。


int handle;

3.表示するサイン形状の指定

OnInit()関数内の「PlotIndexSetInteger(0,PLOT_ARROW,159);」を「PlotIndexSetInteger(0,PLOT_ARROW,181);」に変更。

サインの形状は、MetaEditorメニューの「ヘルプ」から「MQL5リファレンス」を開き、「wingdings」で検索すると、特殊文字の一覧表で確認できます。

2MA wingdings

4.バッファ配列方向の設定

OnInit()関数内の「SetIndexBuffer(0, customBuffer,INDICATOR_DATA);」の下に、下記の行を追記します。


ArraySetAsSeries(customBuffer, true);

上記を指定することで、バッファ配列の0番が最新の足の値として扱われます(指定しないと、0番が最も古い値になり、配列の並び順が逆になります)。

5.iCustom関数のハンドルを定義

今回は、iCustom関数を利用し「MT5で移動平均線クロスの矢印サインを表示する【MQLプログラミングの基礎】」という記事で作成した「MA_Cross_Sign.ex5」を呼び出してみます。

「MA_Cross_Sign」から書式(色、線種、太さ)以外のパラメーター部分(期間、シフト、MA種別、適用価格)をそのままコピーします。


input group "【MA1】"
input int PERIOD0 = 5; // 期間
input int SHIFT0 = 0; // シフト
input ENUM_MA_METHOD METHOD0 = MODE_SMA; // MA種別
input ENUM_APPLIED_PRICE PRICE0 = PRICE_CLOSE; // 適用価格

input group ""
input group "【MA2】"
input int PERIOD1 = 20; // 期間
input int SHIFT1 = 0; // シフト
input ENUM_MA_METHOD METHOD1 = MODE_SMA; // MA種別
input ENUM_APPLIED_PRICE PRICE1 = PRICE_CLOSE; // 適用価格

iCustom関数のパラメーターは、「通貨ペア名」「時間足」「ファイル名」「インジケーターのパラメーター(カンマ区切りで指定)」の順で指定します。


iCustom(通貨ペア名, 時間足、ファイル名、パラメーター1,パラメーター2,…)

OnInit()関数内に、下記の行を追記します。


   handle = iCustom(NULL, 0, "MA_Cross_Sign.ex5", "", PERIOD0, SHIFT0, METHOD0, PRICE0, clrNONE, 0, 0, "", "", PERIOD1, SHIFT1, METHOD1, PRICE1, clrNONE, 0, 0);

サインバッファ情報の読み取りと関係のない、色のパラメーターは「clrNONE」、線種や太さは「0」を指定しています。

6.関数OnDeinit()を定義

終了時にインジケーターをリセット(ハンドル開放)するために、下記の関数を追加します(他の関数の外であれば、どこに追加しても良い)。


//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(handle);
  }

7.バッファ配列へハンドルを適用

OnCalculate関数内に、下記を追記します。


 CopyBuffer(handle, 2, 0, rates_total, customBuffer);

ハンドル(handle)に適用されたインジケーターをバッファ配列(customBuffer)へコピーする式となっています。

「2」は、バッファの番号です。
MA_Cross_Signの買いサイン情報を取得するため、買いサインの番号である「2」を指定しています。

「0」は、コピーを開始する位置です。
最初(最新)からコピーする場合、「0」を指定します。

「rates_total」の部分は、コピーするデータの個数の指定です。
全範囲をコピーする指定となっています。

iCustom関数_MT5_チャート①

「iCustom_test」をコンパイルしてチャートへセットすると、「MA_Cross_Sign」の買いサイン矢印(赤矢印)と同じ箇所にマゼンタ色のマークが出ていることを確認できます。

iCustom関数により、正常にバッファ情報を取得できたことがわかります。

ハンドルを適用する式の「2」を「3」にすると、売りサイン情報を取得できるようになります。


  CopyBuffer(handle, 3, 0, rates_total, customBuffer);

iCustom関数_MT5_チャート②

8.ソースコード

今回、作成したソースコードは下記の通りです。


//+------------------------------------------------------------------+
//|                                                 iCustom_test.mq5 |
//|                                  Copyright 2025, 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 1
#property indicator_plots   1
//--- plot custom
#property indicator_label1  "custom"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrFuchsia
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

input group "【MA1】"
input int PERIOD0 = 5; // 期間
input int SHIFT0 = 0; // シフト
input ENUM_MA_METHOD METHOD0 = MODE_SMA; // MA種別
input ENUM_APPLIED_PRICE PRICE0 = PRICE_CLOSE; // 適用価格

input group ""
input group "【MA2】"
input int PERIOD1 = 20; // 期間
input int SHIFT1 = 0; // シフト
input ENUM_MA_METHOD METHOD1 = MODE_SMA; // MA種別
input ENUM_APPLIED_PRICE PRICE1 = PRICE_CLOSE; // 適用価格

//--- indicator buffers
double         customBuffer[];
int handle;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,customBuffer,INDICATOR_DATA);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,181);
   ArraySetAsSeries(customBuffer, true);
   
   handle = iCustom(NULL, 0, "MA_Cross_Sign.ex5", "", PERIOD0, SHIFT0, METHOD0, PRICE0, clrNONE, 0, 0, "", "", PERIOD1, SHIFT1, METHOD1, PRICE1, clrNONE, 0, 0);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(handle);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int32_t rates_total,
                const int32_t 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 int32_t &spread[])
  {
//---
   CopyBuffer(handle, 3, 0, rates_total, customBuffer);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

本記事の監修者・HT FX

2013年にFXを開始し、その後専業トレーダーへ。2014年からMT4/MT5のカスタムインジケーターの開発に取り組む。ブログでは100本を超えるインジケーターを無料公開。投資スタイルは自作の秒足インジケーターを利用したスキャルピング。

EA(自動売買)を学びたい方へオススメコンテンツ

EA運用の注意点

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


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

この記事をシェアする