input変数の書式例をそのままコピペしたのにコンパイルエラーが出た——という人向けの記事です。この記事では、input変数・extern変数の違いの解説に加えて、そうした典型的なつまずきポイントと、実際にMetaEditorでコンパイルして確認できるサンプルコードを紹介します。

パラメーター

MT4を利用する際にインジケーターのパラメーターやEAなどのロット数やマジックナンバーなど、

利用者が自由に設定や変更したい数値があります。

これらの数値を変数として宣言することで外部パラメーターとして利用することができます。

外部パラメータの利用できる変数には、

  • input変数
  • extern変数

があります。それぞれについて説明します。

input変数

input変数はインジケーターやEAの入力パラメーターを決定します。

プログラムのプロパティウィンドウから利用者が設定できます。

input変数の書式は以下のように記述します。

#property strict
input 型 変数名 = 初期値;//変数の名称

※半角スペースで区切り、末尾に必ずセミコロン(;)を付けてください。全角スペースが混入するとコンパイルエラーの原因になります。

input修飾子はデータ型の前に書きましょう。また、input変数はグローバル変数で宣言します。

input変数で宣言された変数はプログラム内部で変更することはできず、

読み取り専用でアクセスすることはできないです。

パラメータの入力タブの変数の名称には同じ行の後に書かれたコメントの文字列が使われます。

これでユーザーにとって分かり易い名前を表示させる事が出来ます。

extern変数

extern変数もinput変数と同様に、MQL4プログラムの入力パラメータを決定します。

extern変数は以下のように記述します。

#property strict
extern 型 変数名 = 初期値;

extern変数はプログラム動作中に変更する事が出来ます。

extern変数とinput変数の違い

input変数
    外部パラメータの値は変更できない。
extern変数
    外部パラメータは、プログラム内の処理によって変更可能

externとinputの違いですが、

externで作成した外部パラメータは、プログラム内の処理によって変更可能です。

inputを使用した外部パラメータの値は変更ができません。

externの代わりにinputを使っても、同じようにMT4の設定画面(プロパティウィンドウ)でユーザーが変更できる外部パラメータとして表示されます。

externで外部パラメータを受け取り、

それを変数として使い回すと予期してない問題が発生する可能性があります。

基本的にパラメータを設定する場合は、externよりもinputがおすすめです。

実際にコンパイルして確認する

input変数でロット数とマジックナンバーを外部から設定できるようにしたインジケーターで確認してみましょう。

//+------------------------------------------------------------------+
//|                                                    Parameter.mq4  |
//|                     Copyright 2020, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict
#property indicator_chart_window

input double Lots = 0.1;//ロット数
input int MagicNumber = 12345;//マジックナンバー

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   Comment("");
  }

void OnTick()
  {
   Comment("設定中のロット数: ", Lots, "\n設定中のマジックナンバー: ", MagicNumber);
  }
//+------------------------------------------------------------------+

コンパイル後、チャートにこのインジケーターを追加すると設定画面が開き、LotsMagicNumberの値をユーザーが自由に変更できることを確認できます。input変数として宣言した値は、この設定画面から変更する以外の方法(コード内部での代入)では変更できません。

まとめ

今回はパラメーターについて説明しました。

カスタムインジケーターやEAを作る際にパラメーターは必要です。

input変数とextern変数の違いなどをしっかりと理解しておきましょう。

ポイント

パラメーター:利用者が自由に設定や変更したい数値を設定できる
input変数:外部パラメータの値は変更できない
extern変数:外部パラメータをプログラム内の処理によって変更可能できる

関連記事