変数宣言
- 導入
- で
na
初期化する - タプル宣言
- で
- 変数の再代入
- 声明
- 各列に
var
varip
序章
変数は値を保持する識別子です。これらを使用するには、コード内で宣言する必要があります*。*変数宣言の構文は次のとおりです。
[<declaration_mode>] [<type>] <identifier> = <expression> | <structure>
また
<tuple_declaration> = <function_call> | <structure>
ノート:
|
「または」を示します。[]
角括弧 ( ) で囲まれた部分は 0 回または 1 回出現できます。- <declaration_mode> は変数の宣言モードです。var または varip、あるいは何もない場合もあります。
- ほとんどすべての Pine Script™ 変数宣言と同様に、これはオプションです。
- 変数の名前です。
- リテラル、変数、式、または関数呼び出しを指定できます。
- if、for、while、または switch構造を使用できます。
- <tuple_declaration> は、角括弧 ( ) で囲まれた変数名のカンマ区切りのリストです
[]
。[ma, upperBand, lowerBand]
これらはすべて有効な変数宣言です。最後の変数、plotColor には 4 行が必要です。
BULL_COLOR = color.lime
i = 1
len = input(20, "Length")
float f = 10.5
closeRoundedToTick = math.round_to_mintick(close)
st = ta.supertrend(4, 14)
var barRange = float(na)
var firstBarOpen = open
varip float lastClose = na
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)
plotColor = if close > open
color.green
else
color.red
ノート
上記のステートメントはすべて変数宣言=
であるため、代入演算子が含まれています。:=再代入演算子を使用して値が表示された場合、コードはその値を既に宣言された変数に再代入しています。これが変数の再代入です。これは、Pine Script™ の初心者にとってよくある障害となるため、違いを必ず理解してください。詳細については、次の変数の再割り当てセクションを参照してください。
変数宣言の正式な構文は次のとおりです。
<variable_declaration>
[<declaration_mode>] [<type>] <identifier> = <expression> | <structure>
|
<tuple_declaration> = <function_call> | <structure>
<declaration_mode>
var | varip
<type>
int | float | bool | color | string | line | linefill | label | box | table | array<type> | matrix<type> | UDF
でna
初期化する
型はコンパイル時に右側の値から自動的に推論されるため、ほとんどの場合、明示的な型宣言は冗長です。=
したがって、それらを使用するかどうかは通常、好みの問題になります。例えば:
baseLine0 = na // compile time error!
float baseLine1 = na // OK
baseLine2 = float(na) // OK
例の最初の行では、baseLine0
na が特定の型を持たない汎用値であるため、コンパイラは変数の型を判断できません。baseLine1
変数の float 型が明示的に宣言されているため、変数の宣言は正しいです。変数の型は、 na 値から float 型への明示的な変換であるbaseLine2
expressionから派生できるため、変数の宣言も正しいです。と の宣言は同等です。float(na)
baseLine1
baseLine2
タプル宣言
関数呼び出しまたは構造体が複数の値を返すことができるようにします。これらを呼び出して、返される値を保存したい場合は、 *tuple 宣言を使用する必要があります。これは、かっこで囲まれた 1 つ以上の値のコンマ区切りのコレクションです。* これにより、複数の変数を同時に宣言できるようになります。たとえば、ボリンジャー バンドの ta.bb() 組み込み関数は 3 つの値を返します。
[bbMiddle, bbUpper, bbLower] = ta.bb(close, 5, 4)
変数の再代入
変数の再割り当ては、:= 再割り当て演算子を使用して行われます。これは、最初に変数を宣言し、初期値を与えた後にのみ実行できます。コンピューティングでは、変数に新しい値を再割り当てする必要があることがよくあります。これは、次のように、グローバル スコープの変数に構造体のローカル ブロック内から新しい値を割り当てる必要がある場合に常に必要になります。
//@version=5
indicator("", "", true)
sensitivityInput = input.int(2, "Sensitivity", minval = 1, tooltip = "Higher values make color changes less sensitive.")
ma = ta.sma(close, 20)
maUp = ta.rising(ma, sensitivityInput)
maDn = ta.falling(ma, sensitivityInput)
// On first bar only, initialize color to gray
var maColor = color.gray
if maUp
// MA has risen for two bars in a row; make it lime.
maColor := color.lime
else if maDn
// MA has fallen for two bars in a row; make it fuchsia.
maColor := color.fuchsia
plot(ma, "MA", maColor, 2)
知らせ:
- 最初の bar でのみ初期化する
maColor
ため、すべての bar でその値が保持されます。 - 各バーで、if ステートメントは maUp または maOn のユーザー指定のバー数 (デフォルトでは 2) をチェックします。これが発生した場合、
maColor
if local ブロックの値から新しい値を再割り当てする必要があります。このために、:= 再代入演算子を使用します。 - := 再代入演算子を使用しなかった場合、その結果、
maColor
グローバル スコープと同じ名前を持つ新しいローカル変数が初期化されますが、実際には、ローカル ブロック内にのみ存続する非常に厄介な別個のエンティティとなり、その後消滅します。跡形もなく。
Pine Script™ のユーザー定義変数はすべてmutableです。つまり、値は := 再代入演算子を使用して変更できます。変数に新しい値を割り当てると、その形式が変わる場合があります(詳細については、Pine Script™ タイプ システムのページを参照してください)。変数には、バーでのスクリプトの実行中に必要なだけ新しい値を割り当てることができるため、スクリプトには変数の再割り当てを何度でも含めることができます。変数の宣言モードにより、変数に割り当てられた新しい値がどのように保存されるかが決まります。
宣言モード
変数の動作に対する宣言パターンの影響を理解するには、Pine Script™ 実行モデルについての事前の知識が必要です。
変数を宣言する場合、宣言方法が指定されている場合は、それを最初に宣言する必要があります。次の 3 つのモードが利用可能です。
- 「各バーで」、指定されていません
- だった
- 変化
各バーでパターンが宣言されていない
明示的な宣言モードが指定されていない場合、つまり var または varip キーワードが使用されていない場合、変数は各バーで宣言され、初期化されます。たとえば、このページの導入部分の最初の例のセットにある次の宣言のようになります。
BULL_COLOR = color.lime
i = 1
len = input(20, "Length")
float f = 10.5
closeRoundedToTick = math.round_to_mintick(close)
st = ta.supertrend(4, 14)
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)
plotColor = if close > open
color.green
else
color.red
var
var キーワードを使用すると、変数はグローバル スコープで宣言された場合は最初の列で、ローカル ブロック内で宣言された場合はローカル ブロックの最初の実行時に 1 回だけ初期化されます。その後、新しい値を再割り当てするまで、連続するバーの最後の値が保持されます。この動作は、連続するバーでのスクリプトの反復にわたって変数の値を一定に保つ必要がある多くの場合に役立ちます。たとえば、グラフ上の緑色のバーの数を数えたいとします。
//@version=5
indicator("Green Bars Count")
var count = 0
isGreen = close >= open
if isGreen
count := count + 1
plot(count)
[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-H1PPWToT-1671845307319)(null)]
var
修飾子を使用しないと、count
新しいバーの更新によってスクリプトの再計算がトリガーされるたびに、変数はゼロにリセットされます (したがって値が失われます)。
最初のバーでのみ変数を宣言すると、多くの場合、プロットをより効率的に管理できます。最後のバーの終了線を右側のチャートの右側まで延長したいとします。我々は書ける:
//@version=5
indicator("Inefficient version", "", true)
closeLine = line.new(bar_index - 1, close, bar_index, close, extend = extend.right, width = 3)
line.delete(closeLine[1])
ただし、各履歴バーとライブ バーの更新のたびに行を作成および削除するため、これは非効率的です。以下を使用するとより効率的です。
//@version=5
indicator("Efficient version", "", true)
var closeLine = line.new(bar_index - 1, close, bar_index, close, extend = extend.right, width = 3)
if barstate.islast
line.set_xy1(closeLine, bar_index - 1, close)
line.set_xy2(closeLine, bar_index, close)
知らせ:
closeLine
var 宣言パターンを使用して、最初の bar のみを初期化します。- 行を更新するコードを if barstate.islast 構造内で囲むことにより、残りのコードの実行をチャートの最後のバーに制限します。
var 宣言パターンを使用すると、パフォーマンスがわずかに低下します。このため、定数を宣言する場合、パフォーマンスが問題になる場合は、初期化にメンテナンスのペナルティよりも長い時間がかかる計算 (複雑なコードや文字列操作を含む関数など) が含まれる場合を除き、var を使用しないことをお勧めします。
変化
varip 宣言モードを使用した変数の動作を理解するには、Pine Script™ の実行モデルとバーの状態についての事前の知識が必要です。
Pine Script™ 実行モデルのページで説明されているように、varip キーワードを使用して、ロールバック プロセスをエスケープする変数を宣言できます。
このスクリプトは履歴バーの終了時に 1 回だけ実行されますが、スクリプトがリアルタイムで実行されている場合は、チャートのフィードが価格または出来高の更新を検出するたびに実行されます。ライブ更新ごとに、Pine Script™ のランタイムは通常、スクリプト変数の値を最後に送信された値 (前のバーが閉じられたときに保持されていた値) にリセットします。これは、各ライブ スクリプトの実行が既知の状態から開始され、スクリプト ロジックが簡素化されるため、多くの場合便利です。
ただし、スクリプト ロジックでは、ライブ バーの異なる実行間で変数値を保存できるコードが必要になる場合があります。** varip を使用して変数を宣言すると、これが可能になります。varip の「ip」はintrabarpersistを表します。
varip を使用しない次のコードを見てみましょう。
//@version=5
indicator("")
int updateNo = na
if barstate.isnew
updateNo := 1
else
updateNo := updateNo + 1
plot(updateNo, style = plot.style_circles)
else
履歴バーでは、barstate.isnew は常に true であるため、 if 構造体の部分が実行されなかったため、プロットには値「1」が表示されます。ライブバーでは、barstate.isnew は、バーの「始値」でスクリプトが初めて実行されるときにのみ true になります。その後、次の実行が行われるまで、グラフには一時的に「1」が表示されます。ライブ バーの次回の実行では、barstate.isnew が true ではなくなるため、if ステートメントの 2 番目の分岐が実行されます。実行のたびに na に初期化されるため、式の結果は na となり、それ以降のスクリプトのリアルタイム実行では何も描画されません。updateNo``updateNo + 1
ここで varip を使用してupdateNo
変数を宣言すると、スクリプトの動作はまったく異なります。
//@version=5
indicator("")
varip int updateNo = na
if barstate.isnew
updateNo := 1
else
updateNo := updateNo + 1
plot(updateNo, style = plot.style_circles)
現在の違いは、updateNo
各ライブ バーで発生するライブ アップデートの数を追跡することです。これは、varip 宣言によりupdateNo
ライブ更新間で値を保持できるため、スクリプトがライブで実行されるたびにロールバックされなくなるために発生します。barstate.isnew のテストにより、新しいライブ バーが表示されたときに更新カウントをリセットできます。
varip はライブバーでのコードの動作にのみ影響するため、varip 変数に基づくロジックを使用して設計された戦略のバックテスト結果は、履歴バーでその動作を再現できず、テスト結果が無効になります。これは、履歴バーにプロットしてもスクリプトの動作がリアルタイムで再現されないことも意味します。