関数とメソッドはひとまとまりの命令文をカプセル化するために使用される。それらには名前と、任意選択で入力パラメーター(引数)を与えられる。それらはNinjaScript中の任意の場所で呼び出すことができる。一度記述したら、その関数やメソッドが何を行うかだけを気にすれば良い。関数とメソッドの違いは、一般的に関数は呼び出し元のルーチンに値を返すということである。C#では関数という用語を廃止していて、メソッドという用語のみを使用する。メソッドは値を返すようにも、返さないようにもできる。
メソッドは、スクリプト中でそれを使用する前に、宣言しておかなければならない。
[Method Access] [Return Data Type] [Name] (Optional parameters)
// このメソッドは日付と時刻を出力する
private void PrintDateTime()
{
Print(DateTime.Now.ToString());
}
上のメソッドはキーワード"void"を使用しているので戻り値を持たず、ユーザー定義のメソッド名としてPrintDateTimeを与え、宣言を"()"で完結させているので引数は無い。メソッドのコード自体は、その後の波括弧内にカプセル化されている。
// このメソッドは計算を実行し、double型の値を返す
private double Multiply(double input)
{
return input * 10;
}
上のメソッドはキーワードdouble"を使用しているのでdobule型の値を返し、ユーザー定義のメソッド名として"Multiply"を与え、"input"という名前のdouble型の引数を取るように宣言している。このメソッドは値を返すので、呼び出し元のルーチンに(input * 10)の値を返すために"return"キーワードを使用している。
// このメソッドは計算を実行し、double型の値を返す
private double Multiply(double input)
{
PrintDateTime();
return input * 10;
}
上の例では、我々のMultiplyメソッドの中にPrintDataTime()メソッドの呼び出しを付け加えている。
メソッドの利用はコードのブロックを論理的に構造化するのに良い方法である。もしスクリプトの異なる部分で同一の計算を実行するところを見つけたなら、その反復的なコードをメソッドにカプセル化することは理にかなっている。
例:
複数の箇所で、過去の3つのバー(Bar)の平均レンジを計算する必要があるスクリプトがあるとする。これはレンジを計算するロジックを1つのメソッドにカプセル化するのに役立つ場面である。
最初にdobule型の戻り値を返す、メソッド名AverageRangeというメソッドを宣言する。何らかの引数を渡す必要は無い。その後に過去の3つのバーの平均レンジを計算・返却する命令を記述する。仕上がったメソッドは下のようになる。
// 過去の3つのバーの平均レンジを計算する
private double AverageRange()
{
return ((High[1] - Low[1]) + (High[2] - Low[2]) + (High[3] - Low[3])) / 3 ;
}
下の例に示すように、その後、スクリプト中のどこからでもAverageRangeメソッドを参照することができる。
// AverageRange()メソッドを2回呼び出すメソッドの例
private void ExampleMethod()
{
if (High[0] - Low[0] > AverageRange())
{
Print("The current bar range is greater than the 3 bar average range of " +
AverageRange().ToString());
}
}
メソッド内で変数を宣言することができる。これらの変数はスコープがローカルであり、それはそのメソッドの内部でのみアクセスすることができ、メイン・スクリプトのような外部からはアクセスできない、ということを意味する。
// 変数を使用するメソッドの例
private double MyMethod()
{
double myDouble = 100.25
return myDouble * 10;
}