初めてのインジケータ作成④ 入力パラメータを使う

この記事では、入力パラメータを使ったインジケーターのプログラミング方法を説明します。

入力パラメータを使うと、ユーザーがインジケータの設定を自由に変更することができます。

前回作ったインジケータを使って説明しますので、先に前回の記事をお読みください。

作成するインジケータ

今回は前回作った「Bid価格に水平線表示するインジケータ」を改造し、ユーザーがラインの色と太さを自由に変更できるようにします。

入力パラメータウィンドウ

↑パラメーターの入力でラインの色と太さを入力すると、、、

入力パラメータ設定後のインジケータ

↑入力した値がラインに反映されます。

入力パラメータ」を使って、インジケーターの利便性を高めるのが今回のインジケーター作成のポイントです。

入力パラメータの使い方

MQLで入力パラメーターを使う方法を説明します。

入力パラメータ使うには、グローバル変数の宣言時に先頭にinputと書き加えるだけです。

input int number = 1;  // 入力パラメーター(初期値は1)

上の例では、グローバル変数numberを入力パラメーターとして宣言しています。宣言時に値(ここでは1)を設定すると、その値が初期値となります。

注意点としては、入力パメーターはグローバル変数として宣言しなくてはならないということです。つまりOnInit()やOnCalculate()の関数内では宣言できません。

入力パラメーターを使うのはたったこれだけでOKです。

補足:inputとexternの違い

inputと似た修飾子にexternがあります。どちらもグローバル変数の先頭に付けることでそのグローバル変数を入力パラメータにすることができます。両者の違いは以下の通りです。

  • input → MQLのプログラム内で値を変更することができない。
  • extern → MQLのプログラム内で値を変更することができる。

入力パラメータはもともとユーザーが値を決めるためのものですから、プログラム内で値を変更するのは望ましくありません。誤って値を変更してしまわないように、入力パラメータの宣言にはinputを使うことをおすすめします。

では実際に前回作成したインジケーターに入力パラメータを組み込んでいきましょう。

1. 前回のコード

下図は前回のコードの全体像です。入力パラメータは、①のエリアでグローバル変数を入力パラメータとして宣言します。

前回のコード

今回の場合は①エリアで色と太さを入力パラメータとして宣言します。②エリアで入力された値を使います。③エリアは前回のまま変更なしです。

それぞれ具体的にコードを書いていきます。

2. 入力パラメータを宣言する

①のエリアは「インジケータ全体に関する設定が記述される部分」です。ここで入力パラメータをグローバル変数として宣言します。

①のエリアに下記2行を追記してください。

  // 入力パラメーターの宣言
  input color linecolor = clrYellow;  // ラインの色(初期値:黄色)
  input int   linewidth = 2;          // 水平線の太さ(初期値:2)

1行目は、ラインの色の入力パラメータとして変数linecolorしています。同様に二行目は太さを入力するパラメータの宣言です。

3. 入力値を使う

②のエリアで、入力パラメータの値を使用します。②エリアを以下の様に書き換えてください。

int OnInit()
{
   // 水平線を新規作成
   ObjectCreate(0, "testline", OBJ_HLINE, 0, 0, 0);

   // 水平線の色を入力パラメータ(lincolor)の値に設定
   ObjectSetInteger(0, "testline", OBJPROP_COLOR, linecolor);

   // 水平線の太さを入力パラメータ(linewidth)の値に設定
   ObjectSetInteger(0, "testline", OBJPROP_WIDTH, linewidth);

   return(INIT_SUCCEEDED);
}

アンダーラインを引いた箇所がポイントです。水平線の色と太さに、入力パラメータの値を使っています。

以上でコードの改造は完了です。

3. チャートに適用

コードの改造が終わったらコンパイルしてチャートに適用してください。

入力パラメータウィンドウ

入力パラメータ設定後のインジケータ

↑このように「パラメータの入力」で水平線の色と太さが変更できるれば成功です。

コード全体

今回作ったコード全体を以下に記載しておきます。


  //+------------------------------------------------------------------+
  //|                                                         TEST.mq4 |
  //|                                                     minagachi FX |
  //|                                            https://minagachi.com |
  //+------------------------------------------------------------------+
  #property copyright "minagachi FX"
  #property link      "https://minagachi.com"
  #property version   "1.00"
  #property strict
  #property indicator_chart_window

  // 入力パラメーターの宣言
  input color linecolor = clrYellow;  //ラインの色(初期値:黄色)
  input int   linewidth = 2;          //水平線の太さ(初期値:2)

  //+------------------------------------------------------------------+
  //| Custom indicator initialization function                         |
  //+------------------------------------------------------------------+
  int OnInit()
  {
     // 水平線を新規作成
     ObjectCreate(0, "testline", OBJ_HLINE, 0, 0, 0);

     // 水平線の色を入力パラメータ(lincolor)の値に設定
     ObjectSetInteger(0, "testline", OBJPROP_COLOR, linecolor);

     // 水平線の太さを入力パラメータ(linewidth)の値に設定
     ObjectSetInteger(0, "testline", OBJPROP_WIDTH, linewidth);

     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[])
  {

     // 水平線(testline)を現在のBid価格に移動する
     ObjectMove("testline", 0, 0, Bid);

     return(rates_total);
  }
  //+------------------------------------------------------------------+

まとめ

今回は入力パラメーターを使う方法を説明しました。

入力パラメータを使うとインジケータを使う時の自由度が上がりますね。でも入力パラメータを多くしすぎると逆に使いづらくなることもあるのでほどほどにしておきましょう。

今回のインジケーター作成はこれでで完了です。お疲れさまでした。

さて、次のステップではスプレッドを表示するインジケーターの作成にチャレンジです!MQLの関数の使い方もあらためて説明します。

コメント

この記事へのコメント(2 件)

  • hamaidoさんより

    はじめまして
    ブログ拝見させて頂いています。
    色は変わるのですが太さがどうしても変わりません。

  • 管理人ですさんより

    hamaidoさんへ
    コメントありがとうございます。
    ここに載せてある「コード全体」のコードを全コピペして試してみてください。念のため先ほど私が試したら太さも無事に変更できました。
    全コピペで正しく正しく動作する場合は、hamaidoさんが書かれたコードの中に誤記があるのかもしれません。ラインの太さを指定している箇所を中心にチェックしてみてください。(オブジェクト名のスペル間違いなど)
    あとはチャートにダブってインジを適用していないかも確認してみてください。