FX自動売買基礎と応用

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


専用のひな形を作る


この記事では、非常に便利なiCustom関数を取り上げます。iCustom関数は、別のインジケータープログラムが出力するバッファー情報を読み取り、その値を利用するための関数です。これにより、新たにプログラムを組まなくても既存のインジケーターの機能を流用することができます。

具体的な利用方法の解説の前に、まずはひな形を作ります。メタエディターを開き「新規作成ボタン」をクリックし、「カスタムインディケータ」にチェックを入れて「次へ」を押します。ここではファイル名を「iCustom_test」とし、「カスタムインディケータのイベントハンドラ」では「OnCalculate」を選択した状態で「次へ」をクリックします。

「カスタムインディケータの描画プロパティ」では、「追加」をクリックしてプロットを追加します。今回は、ラベルを「custom」、タイプを「Arrow」、カラーを「マゼンタ」にして「完了」をクリックすれば、ひな形の完成です。

「カスタムインディケータの描画プロパティ」画面

最初にOnInit関数内で、表示する矢印(マーク)の番号を指定します。「PlotIndexSetInteger(0,PLOT_ARROW,159);」の一文を次のように書き換えましょう。


SetIndexArrow(0, 181);

今回は「181番」のマークを使用します。矢印の形については、メニューバーの「ヘルプ」→「MQL4リファレンス」を立ち上げて「wingdings」で検索すると、さまざまな記号を一覧で確認できます。

記号一覧


iCustom関数の式を記述


今回は、iCustom関数を使って「MQLプログラミングの基礎~移動平均線のクロスでサインを表示~」という記事で作った「MA_Cross_Sign_demo」を呼び出してみます。まずOnCalculate関数のところに、MA_Cross_Sign_demoで使用しているfor文のプログラムをコピーして貼り付けます。


  int limit = Bars - IndicatorCounted() - 1;
    if (limit < 1) limit = 1;
     
    for (int i = limit; i >= 0; i--) {

そして、for文の中にiCustom関数の結果を格納するバッファーを持っていき、その中にiCustom関数の式を記述します。今回は次のように指定しました。


int limit = Bars - IndicatorCounted() - 1;
    if (limit < 1) limit = 1;
     
    for (int i = limit; i >= 0; i--) {
       customBuffer[i] = iCustom(NULL, 0, "MA_Cross_Sign_demo.ex4", "", PERIOD0, SHIFT0, METHOD0, PRICE0, clrNONE, 0, 0, "", "", PERIOD1, SHIFT1, METHOD1, PRICE1, clrNONE, 0, 0 , 2, i);
    }  

                                                 
iCustom関数の設定項目
symbol通貨ペア名を指定
timeframe時間足を指定
name使用したいカスタムインジケーター名を指定
カスタムインジケーターの入力パラメーターのリストをカンマ区切りで指定
modenameで指定されたインジケーターのバッファー(色の設定の#番号)を指定
shift何番目の足を計算に使用するかを指定

最初のパラメーターは通貨ペア名です。表示中の通貨ペアを使うので、「NULL」とします。次の時間足は表示中のものを使うので「0」、呼び出すカスタムインジケーターの名称は前述の通り「MA_Cross_Sign_demo」です。ファイル名の拡張子は省略できますが、もし書き入れるとすれば「.ex4」とします。ここからは各インジケーターのパラメーターが続き、最後から二つ目はバッファーの番号を指定します。ここでは買いサインの番号を指定したいので、「2」とします。最後に何番目のローソク足を使うかを指定します。ここではi番目とします。

これで完成です。作成した「iCustom_test」をセットしたチャートと、「MA_Cross_Sign_demo」をセットしたチャートを比較してみましょう。

チャートを比較

「iCustom_test」をセットしたチャートを見ると、「MA_Cross_Sign_demo」の買いサイン矢印(赤い矢印)と同じ箇所にマゼンタ色のマークが出ていることが分かります。つまり、正常にiCustom関数が利用できているということです。


売りサインを呼び出して表示


次に、売りサインを呼び出してみましょう。

売りサインを呼び出せるかを確認するためには、iCustom関数のカッコ内のバッファー番号を買いサインの「2」から売りサインの「3」へ変更します。


customBuffer[i] = iCustom(NULL, 0, "MA_Cross_Sign_demo.ex4", "", PERIOD0, SHIFT0, METHOD0, PRICE0, clrNONE, 0, 0, "", "", PERIOD1, SHIFT1, METHOD1, PRICE1, clrNONE, 0, 0 , 3, i);

これをコンパイルしてチャートにセットすると、「MA_Cross_Sign_demo」の売りサイン矢印(青い矢印)と同じ箇所にマゼンタ色のマークが表示されます。これで正常にiCustom関数が利用できていることが確認できました。

マゼンタ色のマークが表示

ちなみに、今回はiCustom関数のカッコ内に10個以上のパラメーターを指定していますが、実はこの数には限界があります。59個まで指定可能となっており、それ以上にするとコンパイルができず、使えなくなってしまうので注意が必要です。

またパラメーターは省略することも可能で、省略した場合は呼び出されるインジケーター側で設定されている初期値が適用されます。表示に関わるようなパラメーターは値に関係ないので削除し、固定値にして使うなどすると良いでしょう。


ソースコード


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


//+------------------------------------------------------------------+
//|                                                 iCustom_test.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#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  3

input string _00 = ""; // [ 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 string _10 = ""; //   
input string _11 = ""; // [ 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[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,customBuffer);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   SetIndexArrow(0, 181);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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 = Bars - IndicatorCounted() - 1;
    if (limit < 1) limit = 1;
     
    for (int i = limit; i >= 0; i--) {
       customBuffer[i] = iCustom(NULL, 0, "MA_Cross_Sign_demo.ex4", "", PERIOD0, SHIFT0, METHOD0, PRICE0, 
                         clrNONE, 0, 0, "", "", PERIOD1, SHIFT1, METHOD1, PRICE1, clrNONE, 0, 0 , 3, i);
    }  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


本記事の監修者・HT FX


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


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



この記事をシェアする

ホーム » FX自動売買基礎と応用 » iCustom関数の作成方法や実際のソースコードなどを解説