式、変数定義、文

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

式とは、オペランド(変数、値)に演算子と関数呼び出しを適用するシーケンスです。式ではスクリプトで実行されるアクションと演算を処理します。Pineの式はほとんどの場合、結果を戻します(アノテーション関数だけは例外です。アノテーション関数には studyfill などがあり付随効果があります。それらは後で説明します)。

簡単な式の例をいくつか示します。

(high + low + close)/3
sma(high - low, 10) + sma(close, 20)

変数の定義

Pineの変数は、特別シンボル = を用いて次の様に定義されます。

<identifier> = <expression>

<identifier> の部分に変数名を指定します。

変数定義の例

src = close
len = 10
ma = sma(src, len) + high

ここでは3つの変数(srclenma)が定義されています。識別子 closehigh はビルトイン変数です。識別子 sma はビルトイン関数です。こちらは単純移動平均線を算出します。

変数への代入

可変変数は、新しい値を代入することができる変数です。

演算子 := は、変数に値を代入する時に用いられます。この演算子を利用するには、コードの1行目で //@version=2 という特別な属性を指定する必要があります。この属性はPineスクリプトのバージョンを識別します。可変変数はバージョン2で導入されたものです。

変数はあなたが値を変数にセットする前に定義されなければなりません(変数定義については上記で説明した通りです)。

変数の型は定義段階で識別されます。式と変数の両方が同じデータ型である場合のみ、式の値を変数に代入することができます。それ以外の場合にはコンパイルエラーが発生します。

変数への代入の例:

//@version=2
study("My Script")
price = close
if hl2 > price
    price := hl2
plot(price)

この例では、‘if’ 文も使用しています。

バージョン2の自己参照変数

注:自己参照変数および前方参照変数は、バージョン3で削除されました。

宣言された変数の前の値を(演算子 [] を使用して)参照できることは、Pineの便利な機能です。これらの変数は自己参照変数と呼ばれます。

例えば、

study("Fibonacci numbers")
fib = na(fib[1]) or na(fib[2]) ? 1 : fib[1] + fib[2]
plot(fib)

変数 fib はフィボナッチ数列です。1, 1, 2, 3, 5, 8, 13, 21, … 最初の2つの数字は1に等しく、それに続くそれぞれの数字は直前の2つの数字の合計です。先の例で、引数の値がまだ設定されていない場合 (NaN) 、ビルトイン関数 na で処理され、true を戻します。先の例を実行すると下記の様になります。 fib[1] と fib[2] の値は、最初のバーの段階では決定されません。2つ目のバーでも fib[2] は決定されません。3つ目のバーでようやく、それら2つの値が決定され、追加されます。 Fib.png

脚注: フィボナッチ数列は急速に大きくなるため、'fib' の値はすぐにオーバーフローします。その為、例題のインジケーターは「月足」や「年足」に適用する必要があります。そうしない場合、フィボナッチ数でなく、'n/a' 値がチャートに表示されます。

関数naとnzでNaN値を防ぐ

自己参照変数は、バーのインジケータの計算中に値を蓄積することが可能です。しかし一つ覚えておく必要があります。例えば、次のスクリプトでチャートのすべてのバーを数えたいとします。

barNum = barNum[1] + 1

自己参照変数 'barNum' は前のバーの値を参照します。しかしこのケースでは、すべてのバーでインジケータが計算される時、barNum[1]はNaNとなります。詳しくは、まず最初のバーで barNum[1] は定義されません(NaN)。NaNに1を加えても、依然として結果はNaNです。その為、barNumはすべてのバーでNaNと等しくなります。具体的に次のバーでは、barNum = NaN + 1 = NaN といった具合になります。つまり、barNumにはNaN値のみが含まれます。

こういった問題を避けるために、Pineにはビルトイン関数 nz があります。この関数は引数をとり、NaNに等しい場合は0を返し、そうでない場合は引数の値を返します。つまりバーの計算の問題は次のように解決することができます。

barNum = nz(barNum[1]) + 1

nz では最初の引数がNaNの場合、2番目の引数を返すやり方もあります。nzの詳細についてはこちらをご覧ください。

また na という単純な関数があります。これは1つの引数を持ち論理結果(bool値)を返します。この関数は、引数がNaNかどうかを調べることができます。詳しくはこちらを確認してください。

'sma' 関数を利用しない単純移動平均線(SMA)

自己参照変数を使用して、ビルトイン関数 'sma' と同等の単純移動平均線(SMA)を書くことができます。

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

変数 'sum' は期間 'len' の終値の合計です。各バーで変数 'sum' は、その前の値に等しく、そして期間の最も左の終値が 'sum' から減算され、(最も右端の)最新の終値の値が加算されます。これはベクトル言語に最適化されたアルゴリズムです。基本アルゴリズムのより詳細な説明については移動平均線を参照してください。

さらにチャートがレンダリングされる前に、'sum' は期間 'len' で除算され、チャート上に単純移動平均線として表示されます。

自己参照変数は、ユーザー定義の関数でも使用できます。これについては後ほど触れます。

‘if’ 文

If 文は式の条件が合致した時に実行される文のブロックを定義します。

if 文を使用するには、コードの最初の行に //@version=2 といった形でPineスクリプト言語のバージョンを指定する必要があります。

一般的なコードの形式:

var_declarationX = if condition
    var_decl_then0
    var_decl_then1
    
    var_decl_thenN
    return_expression_then
else
    var_decl_else0
    var_decl_else1
    
    var_decl_elseN
    return_expression_else

解説:

  • var_declarationX — この変数は if 文の戻り値を取得します。
  • condition — もし条件が true であれば、then ブロックのロジック(var_decl_then0, var_decl_then1など)が処理され、もし条件が false であれば、'else' ブロックのロジック(var_decl_else0, var_decl_else1など)が処理されます。
  • return_expression_then, return_expression_else — then ブロック、または else ブロックの最後の式は、if文の戻り値を返します。もし変数の定義が最後にある場合には、その値が戻り値となります。

if 文の戻り値の型は return_expression_then や return_expression_else の型に依ります。(それらの型は一致しなければいけません。例えば else ブロックで文字列の値を戻す場合、then では整数値を戻すことはできません)。

例:

// This code compiles
x = if close > open
    close
else
    open
// This code doesn’t compile
x = if close > open
    close
else
    "open"

else ブロックは省略できます。この場合、もし条件が false であれば、var_declarationX 変数には、"空の値"(na、false、“”)が 戻されます。

例:

x = if close > open
    close
// If current close > current open, then x = close.
// Otherwise the x = na.

"then" と "else" ブロックには4つのスペースが必要です。入れ子の場合、さらに4つのスペースが必要です。

x = if close > open
    b = if close > close[1]
        close
    else
        close[1]
    b
else
    open

if文の戻り値は無くても構いません("var_declarationX=" は省略可能)。これは例えばストラテジーなどで式に属性が必要なときなどに便利です。

if (crossover(source, lower))
    strategy.entry("BBandLE", strategy.long, stop=lower,
                   oca_name="BollingerBands",
                   oca_type=strategy.oca.cancel, comment="BBandLE")
else
    strategy.cancel(id="BBandLE")

‘for’文

for 文を使うと複数の命令を繰り返し実行できます。for 文を使用するには、コードの最初の行に //@version=2 といった形でPineスクリプト言語のバージョンを指定する必要があります。この属性はPineスクリプトのバージョンを識別します。for 文はバージョン2で導入されたものです。

一般的なコードの形式:

var_declarationX = for counter = from_num to to_num [by step_num]
    var_decl0
    var_decl1
    
    continue
    
    break
    
    var_declN
    return_expression

解説:

  • counter - 変数。ループカウンター。
  • from_num - カウンターの開始値。
  • to_num - カウンターの終了値。カウンターが to_num(または from_num > to_num の場合には、to_num in より小さくなると)より大きくなるとループから抜けます。
  • step_num - 増分値(間隔)。これは省略可能でその場合、増分値は 1 として処理されます。from_num が to_num より大きい場合には、増分値は自動的に負の方向に変化します。明示的に負の数を指定する必要はありません。
  • var_decl0, … var_declN, return_expression - ループで処理される命令。4つのスペースか1つのタブが必要です。
  • return_expression - 戻り値を返します。ループが終了、またはループから抜けると、戻り値が var_declarationX に返されます。
  • continue - ループでのみ利用できるキーワードです。次のループ処理に移ります。
  • break - ループでのみ利用できるキーワードです。ループから抜けます。

ループの例:

//@version=2
study("My sma")
my_sma(price, length) =>
    sum = price
    for i = 1 to length-1
        sum := sum + price[i]
    sum / length
plot(my_sma(close,14))

変数 'sum' は可変変数であり、ループ内で演算子 := により新しい値が代入されます。なおこれはあくまで例であることに注意してください。Pineで実際に移動平均線を利用する場合には、より高速に計算するためにビルトイン関数smaの利用が推奨されます。


前の項目: 関数とアノテーション関数, 次の項目: 関数宣言, メニューに戻る: Pineスクリプトチュートリアル