Pineスクリプト インジケーター

var と varip の使い方 - PineScript変数宣言完全ガイド

このページで分かること

  • PineScriptでの変数宣言方法をすべて理解できる
  • var と varip をどんな場面で、どのように使い分ける必要があるのかを理解できる

はじめに

PineScriptで変数を宣言する際、varvaripの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 を使用する場面
  • バー間で状態を保持したい場合
  • トレード状態の管理
  • 価格の最高値・最安値の追跡
  • 複雑な条件の組み合わせ
  • 累積計算が必要な場合

パフォーマンスのヒント

  1. 必要最小限の varip 使用: メモリ使用量を抑える
  2. 適切な初期化: バグを防ぐ
  3. 条件付き計算: 処理速度を向上させる
  4. 用途に応じた選択: 通常変数 → var → varip の順で検討

-Pineスクリプト, インジケーター