Pineスクリプト道場は、Pineスクリプト入門からコード作成までをサポートする初心者の方のための記事です。
Pineスクリプトをある程度使える方は「Pineスクリプトの学校」にて記事を書いておりますのでそちらをどうぞ。
今回は、変数の宣言の際に使用する「var」 について解説する。
1、「var」とは?
Pineスクリプトにおいて、「var」とは
変数の宣言時に使用するキーワード
のことだ。「変数の宣言とは何?」という方は以下の記事を参照してほしい。
2、どんな場面で「var」を使用するのか?
「var」は
変数の値を保存して使用したい場合
(言い換えると変数の宣言を1度しかしたくない場合)
に使用する。今は理解できなくて問題ない。
これを理解するためには、Pineスクリプトで記述したコードがどのように処理をされているかについて説明する必要があるので次からその解説を。
(1)Pineスクリプトにおけるコード処理の流れ
Pineスクリプトは、
足ごとにコードを実行する
という特徴がある。例えば、以下のようなチャートがあったとする。
ここではわかりやすいように各足の上に番号を表示している。
このチャートで言えば、「1」「2」「3」・・・とそれぞれの足で処理が実行される。
例えば、以下のようなコードがあった場合、
a = 0 //変数aを宣言し0を代入
a := a + 1 // 変数cにa+1値を代入(この時aは、0+1=1となる)
これを、Pineスクリプトで実行すると以下のように動作する。
【No.1の足での処理】
a = 0 //変数aを宣言し0を代入
a := a + 1 // 変数cにa+1値を代入(この時aは、0+1=1となる)
【No.2の足での処理】
a = 0 //変数aを宣言し0を代入
a := a + 1 // 変数cにa+1値を代入(この時aは、0+1=1となる)
【No.3の足での処理】
a = 0 //変数aを宣言し0を代入
a := a + 1 // 変数cにa+1値を代入(この時aは、0+1=1となる
・・・・・・
つまり、足が変わるたびに同じ処理を実行しているのだ。
(2)変数の値の保存ができない!?
ここで「足が変わっても変数の値を保持したい場合」を考える。
今回は「足が更新されるたびに変数a(初期値1)を2倍する処理」を考える。以下に成功例を示した。今回は変数aの値を足の下部にオレンジのラベルで表示している。
このプログラムでは、変数aの値は前回の足での処理結果を引き継ぐ必要がある。
では、このようなプログラムを記述したらどうなるだろうか。(今回の記事では、オレンジのラベルを表示するコードは省略)
a = 1 //変数aを宣言し初期値1を代入
l2 =label.new(〜略〜) //変数aをオレンジのラベルに表示(今回は省略)
a := a * 2 //変数aにa*2の値を再代入
結果はこうなった。
変数aの値が1のまま変わっていない。これは、足ごとに処理が実行されるため、変数aの宣言と初期値の代入が毎足で行われているためである。イメージとしてはこんな感じ。
【No.1の足での処理】
a = 1 //変数aを宣言し初期値1を代入
l2 =label.new(〜略〜) //変数aを表示(aの値は1)
a := a * 2 //変数aにa*2の値を再代入
【No.2の足での処理】
a = 1 //変数aを宣言し初期値1を代入
l2 =label.new(〜略〜) //変数aを表示(aの値は1)
a := a * 2 //変数aにa*2の値を再代入
【No.3の足での処理】
a = 1 //変数aを宣言し初期値1を代入
l2 =label.new(〜略〜) //変数aを表示(aの値は1)
a := a * 2 //変数aにa*2の値を再代入
つまり、足ごとに変数の宣言をしており、その値がそのまま出力されている。
では、変数の宣言をしなければどうなるだろうか。コードは以下の通り。
l2 =label.new(〜略〜) //変数aをオレンジのラベルに表示(今回は省略)
a := a * 2 //変数aにa*2の値を再代入
するとこうなる。
「変数a定義しろやぁ!」Pineスクリプト激おこである。
ここまでをまとめると、
・変数を宣言すると値の引き継ぎができない
・変数を宣言しないとPineスクリプトが怒る
「じゃあどうしたらいんだよ!」と思う。
(3)「var」で解決!
実はこういう時のために「var」がある。
要するに最初の1回だけ変数aを宣言してくれれば良いわけだ。イメージとしては以下のような感じ。
【No.1の足での処理】
var a = 1 //最初だけ変数aを宣言し初期値1を代入
l2 =label.new(〜略〜) //変数aを表示(aの値は1)
a := a * 2 //変数aにa*2の値を再代入(aの値は2)
【No.2の足での処理】
l2 =label.new(〜略〜) //変数aを表示(aの値は2)
a := a * 2 //変数aにa*2の値を再代入(aの値は4)
【No.3の足での処理】
l2 =label.new(〜略〜) //変数aを表示(aの値は4)
a := a * 2 //変数aにa*2の値を再代入(aの値は8)
プログラムで記述すると、以下のようになる。
var a = 1 //変数aを宣言し初期値1を代入
l2 =label.new(〜略〜) //変数aをオレンジのラベルに表示(今回は省略)
a := a * 2 //変数aにa*2の値を再代入
こうすることで、varがついている「a=1」は最初の1度しか処理がされないため、変数の宣言を1度だけ実施することが可能となる。
これを実行すると、
しっかりと希望の出力となった。
3、まとめ
まとめると、
1、「var」とは変数の宣言時に使用するキーワード
2、「var」は変数の値を保存して使用したい場合
(変数の宣言を1度しかしたくない場合)に使用する。
となる。
Pineスクリプトで自作のインジケータなどを作成する際には必ず必要になる知識なのでぜひぜひマスターしてほしい。
次回くらいから実践的にインジケーターなどを作成する記事を書こうと思う。
ではでは!
本記事を気に入っていただけたらブックマークお願いします!また、ツイッターもやってるのでフォローよろしくお願いいたします!
Twitter : makoto(@Makoto_beginner)
また、記事中で不明なことや間違い等ありましたら以下のコメント欄からコメントいただけると幸いです。
皆様のコメントをもとにどこよりもわかりやすいブログを目指していきます。
はじめまして。道場#1よりこのサイトでコツコツ学んでおります。大変有益で助かっております。ありがとうございます。
ところで#9で学んだところで#10へのリンク(NEXTの表示が@3バックテスト~となっており#10を見つけにくくなっています。
自分は1日1コンテンツ学んで次回のコンテンツはブックマークを付けております(簡単に復習ページへ行けるようにするため)NEXTの表示が間違っているのかよくわかりませんがご対応いただけたら幸いです。よろしくお願いします
しおすけ様
いつもブログを読んでいただきありがとうございます。
また、NEXTの表示について間違っている旨のご連絡ありがとうございます。
対応として、当該記事に次の記事はこちらというリンクを設けましたので、そこから次の記事へ飛んで頂けますと幸いです!