関数宣言

From TradingView Wiki
Jump to: navigation, search
Language: English  • 日本語 • Русский

Pineスクリプトには豊富なビルトイン関数のライブラリがあります。それを利用してインジケーターを作成できます。またビルトイン関数とは別に、 ユーザーはPineで自身の関数を作成することができます。

単一行の関数

簡単な短い関数は1行で書くのが便利です。次の例は、単一行関数の構文です。

<identifier>(<list of arguments>) => <expression>

関数の名前 <identifier> は括弧の前に定義します。続いて括弧の中には、引数のリスト <list of arguments> を定義します。引数のリストは単純にカンマで区切ります。この例の <expression> は関数本体です。

こちらは単一行関数の具体的な例です。

f(x, y) => x + y

関数 'f' を定義した後、この様に呼び出すことができます。

a = f(open, close)
b = f(2, 2)
c = f(open, 2)

関数 'f' の戻り値のデータ型は異なる可能性があるという事実に注意してください。上記の例では、変数 'a' の型は、系列になります。変数 'b' の型は、整数(Integer)です。変数 'c' の型は、系列です。Pineは動的な引数の型を使用するため、それぞれの引数の型を割り当てるべきではありません。

結果のデータ型は自動的に導き出されます。これは関数に渡された引数の型と関数本体のステートメントに依存します。

脚注: Pineでは関数から他の関数​​を呼び出すことができます。ただし元の関数自体を呼び出すことはできません。つまり、再帰呼び出しはサポートされていません。

複数行の関数

しかし当然ながら、1行の関数のみで高度な計算を行うことは難しいです。そこで関数宣言の構文に複数行を利用できるようにしました。こちらは複数行関数の構文です。

<identifier>(<list of arguments>) =>
    <Variable Declaration>
    ...
    <Variable Declaration>
    <expression> or <Variable Declaration>

複数行関数の本体は、複数のステートメントから構成されます。それぞれのステートメントは別々の行に置かれ、各行には1つのインデント(4つのスペースまたは1つのタブ)が必要です。ステートメントの前のインデントは、それがグローバルスコープではなく関数本体の一部であることを示します。インデントのある関数本体のステートメントの後に、(行の開始に)インデントの無い行が初めて来た段階で、前の行で関数本体が終了したと認識されます。

式または宣言された変数が関数本体の最後のステートメントでなければなりません。この式(または変数)の結果が、関数呼び出し全体の結果になります。

例えば、

geom_average(x, y) =>
    a = x*x
    b = y*y
    sqrt(a + b)

関数 'geom_average' は2つの引数を持ち、内部で 'a' と 'b' の2つの変数を作成します。最後のステートメントでは関数 'sqrt' を呼び出します(平方根の抽出)。'geom_average' を呼び出すと、最後の式の値 (sqrt(a+b)) を戻します。

関数や変数のスコープ

関数本体の外側で宣言された変数は、グローバルスコープに属します。ユーザー定義の関数もグローバルスコープに属します。すべてのビルトイン変数とビルトイン関数もグローバルスコープに属します。

各関数にはそれぞれ「ローカルスコープ」があります。関数内で宣言されたすべての変数(と関数の引数)はその関数のスコープに属します。外部から参照することはできません。これはグローバルスコープや別の関数のローカルスコープからは参照できないという事です。同時に、どの関数のスコープからも、グローバルスコープで宣言された変数を参照することは可能です。

従って、ユーザ関数の本体からグローバルなユーザ変数と関数(再帰呼び出しとは別)やビルトイン変数/関数を参照することは可能です。これはつまりローカルスコープはグローバルスコープに埋め込まれていると言うことができます。

Pineではネストされた関数は許可されません。具体的には関数の中で別の関数を宣言することはできません。すべてのユーザー関数はグローバルスコープで宣言されます。ローカルスコープは互いに交わりません。

関数内部に自己参照変数を持つ関数

複数行関数の本体は、一連の式または変数宣言、もしくはその両方です。関数の内部で宣言された変数は、自己参照型の変数として利用できます。

この例は、ビルトイン関数 sma と同等の関数 my_sma です。

study("Custom Simple MA", overlay=true)
my_sma(src, len) =>
    sum = nz(sum[1]) - nz(src[len]) + src
    sum/len
plot(my_sma(close, 9))

NaN値を防ぐために関数 nz を使うことに注意してください。右にシフトされデータ系列の左側から表示されます。

こちらはやや難しい例ですが、次の関数 my_ema はビルトイン関数の ema と同じです。

study("Custom Exp MA", overlay=true)
my_ema(src, len) =>
    weight = 2.0 / (len + 1)
    sum = nz(sum[1]) - nz(src[len]) + src
    ma = na(src[len]) ? na : sum/len
    out = na(out[1]) ? ma : (src - out[1]) * weight + out[1]
    out
plot(my_ema(close, 9))

out が関数 my_ema 最後の文であるという事に注意してください。outの行は変数を参照する単純な式です。また変数 out の値が、my_ema 関数全体の戻り値となります。最後の式が変数宣言の場合、その値は関数の結果になります。したがって、次の2つの関数は完全に同じです。

f1(x) =>
    a = x + a[1]
    a
f2(x) =>
    a = x + a[1]

複数の結果を返す関数

大抵のケースでは関数は1つの結果を返します。しかし結果のリストを返すことも可能です。

fun(x, y) =>
    a = x+y
    b = x-y
    [a, b]

このような関数を呼び出すための特別な構文があります。

[res0, res1] = fun(open, close)
plot(res0)
plot(res1)

前の項目: 式、変数定義、文, 次の項目: 改行, メニューに戻る: Pineスクリプトチュートリアル