このページで分かること
- PineScriptでの変数宣言方法をすべて理解できる
- var と varip をどんな場面で、どのように使い分ける必要があるのかを理解できる
はじめに
PineScriptで変数を宣言する際、var
とvarip
の2つのキーワードを使用できます。これらの違いを理解することで、より効率的で正確なインジケーターやストラテジーを作成できるようになります。
変数宣言の3つのパターン
1. 通常の変数(キーワードなし)
my_variable = 0
- 特徴: バーごとに再計算される
- 用途: 毎回新しい値を計算したい場合
- メモリ使用量: 最も少ない
- 動作: 各バーで初期値から再計算
2. var(バー内保持変数)
var my_variable = 0
- 特徴: バー内で値が保持される
- 用途: バー内での一時的な計算や状態管理
- メモリ使用量: 少ない
- 動作: バー開始時に初期化、バー内で値保持
3. varip(永続的変数)
varip my_variable = 0
- 特徴: バー間で値が保持される
- 用途: 状態管理や、バーをまたいで必要な値の保存
- メモリ使用量: 多い
- 動作: 一度初期化後、バー間で値保持
実例で理解する3つの変数宣言
実際にインジケーターを作成してみて、3つの変数宣言の違いを確認してみましょう!
お題としては、「シンプルなカウンター比較」です。
それぞれの変数宣言方法で counter = 0 を宣言し、宣言した変数に対して1を追加する処理を確認してきましょう。
//@version=6
indicator("3つの変数宣言比較", overlay=false)
// 1. 通常の変数(キーワードなし)
normal_counter = 0
normal_counter := normal_counter + 1
// 2. var を使用したカウンター(バー内で保持)
var var_counter = 0
var_counter := var_counter + 1
// 3. varip を使用したカウンター(バー間で保持)
varip varip_counter = 0
varip_counter := varip_counter + 1
// 表示
plot(normal_counter, "通常変数", color=color.yellow)
plot(var_counter, "var カウンター", color=color.blue)
plot(varip_counter, "varip カウンター", color=color.red)
実行結果は以下の画像のようになりました。
キーワードを使用しない通常の変数(黄色のプロット)の場合は、常に1になっていますね。
これは、normal_counter = 0 という宣言がティックが更新されるたびに実行されているためで、常に normal_counter = 0 + 1 という実行になっています。
次に var を使用した変数(青色のプロット)の場合は、新しいバーができるたびに1ずつ増えていっていますね。
これは、var var_counter = 0 という宣言が最初の1回だけ実行されているためです。
最後に varip を使用した変数(赤色のプロット)の場合は、var と同じ結果になりました。
これだと var と varip が一緒に見えますね。
違いを確認するために、サンプルコードを少し修正してリアルタイムデータで確認してみましょう!

リアルタイムデータでの動きを確認するため、 barstate.isrealtime がtrueのときのみ変数に1を追加するように修正しました。
また、各バーでの変数の結果を確認するため、label で変数の数値を各バーに表示するように修正しています。
//@version=6
indicator("3つの変数宣言比較", overlay=false)
// 1. 通常の変数(キーワードなし)
normal_counter = 0
if barstate.isrealtime
normal_counter := normal_counter + 1
label.new(bar_index, normal_counter, str.tostring(normal_counter, '#'), style = label.style_label_up, color = color.new(color.yellow, 50))
// 2. var を使用したカウンター(バー内で保持)
var var_counter = 0
if barstate.isrealtime
var_counter := var_counter + 1
label.new(bar_index, var_counter, str.tostring(var_counter, '#'), style = label.style_label_down, color = color.new(color.blue, 50))
// 3. varip を使用したカウンター(バー間で保持)
varip varip_counter = 0
if barstate.isrealtime
varip_counter := varip_counter + 1
label.new(bar_index, varip_counter, str.tostring(varip_counter, '#'), style = label.style_label_down, color = color.new(color.red, 50))
// 表示
plot(normal_counter, "通常変数", color=color.yellow)
plot(var_counter, "var カウンター", color=color.blue)
plot(varip_counter, "varip カウンター", color=color.red)
下記チャート画像の縦線が引かれている箇所までヒストリカルデータとなります。
まず通常の変数宣言の場合(黄色のプロット)ですが、リアルタイムデータの箇所からは常に1になっています。
ここはヒストリカルデータのときと変化はないですね。
次に var を使用した変数(青色のプロット)の場合ですが、各バーごとに1ずつ増えていっています。
ここもヒストリカルデータと変わらないですね。
最後に varip を使用した変数(赤色のプロット)の場合です。
ヒストリカルデータのときと違って、1以上のかなり多くの数が各バーで加算されていることが分かります。
以上の確認結果から、
- 何もキーワードを付けない変数宣言の場合、ティックが更新されるたびに変数は0になり、0となった変数に対して1を加算している
- var を付けた変数宣言の場合、初期化は読み込みの1回のみとなる
ただし、各バーでのティックごとの更新の際は変数が巻き戻り、巻き戻った変数に対して1を加算している
例)
初期化時:0
初期化時のバーでの計算:常に0に対して1を追加。バーが決定後は0+1=1が変数として確定する。
次バーでの計算:前回の確定値が1のため、常に1に対して1を追加。バーが決定後は1+1=2として確定する。 - varip を付けた変数宣言の場合、初期化は読み込みの1回のみとなる
ただし、各バーでのティックごとの更新の際は変数が巻き戻らず、ティックごとに計算された変数に対して1を加算している

まとめ
変数宣言の選択指針
通常の変数(キーワードなし)を使用する場面
- 毎回新しい値を計算したい場合
- バーごとに独立した計算を行う場合
- メモリ使用量を最小限に抑えたい場合
- 単純な一時的な値の保存
var を使用する場面
- バー内での一時的な計算や状態管理
- バー内で値を保持したいが、バー間ではリセットして良い場合
- メモリ使用量を抑えつつ、バー内での状態管理が必要な場合
varip を使用する場面
- バー間で状態を保持したい場合
- トレード状態の管理
- 価格の最高値・最安値の追跡
- 複雑な条件の組み合わせ
- 累積計算が必要な場合
パフォーマンスのヒント
- 必要最小限の varip 使用: メモリ使用量を抑える
- 適切な初期化: バグを防ぐ
- 条件付き計算: 処理速度を向上させる
- 用途に応じた選択: 通常変数 → var → varip の順で検討