Pine Script™ (v5) の覚書 - 2 : labelを表示する
今回つかうもの - label
label
lable.new()を使うと、チャート内にいろんな情報が表示できる。
ここでは基本的に次の引数を使う。
label.new(x座標,y座標,[xloc=…],[yloc=…])
x座標
デフォルトはxloc.bar_index(現在のbarの時間)
xloc=xloc.bar_timeにして、unixtimeで指定することも可
y座標
デフォルトはyloc.price(価格)。
yloc=yloc.abovebarやyloc.bellowbarにするとローソク足の上下になる。
この場合y座標の指定はいらなくなる。(naを指定する)
labelを使ってみる1
label()を使うと、チャートに文字列を追加できる。
以下のスクリプトは、ローソク足ごとに、「label_sample」という文字列を表示するもの。
//@version=5
indicator("マイスクリプト", overlay=true)
mylabel=label.new(bar_index, na, text="label_sample", yloc=yloc.abovebar)
これをチャートへ反映してみると図1のようになる。
表示したい文字列は、string型として渡す必要があるため、価格などのfloat型のデータを表示したい場合には型変換する必要がある。
ローソク足の高値(high)を表示するには以下のように書く。
//@version=5
indicator("マイスクリプト", overlay=true)
mylabel=label.new(bar_index, na, text=str.tostring(high), yloc=yloc.abovebar)
これをチャートへ反映してみると図2のようになる。
さらにstring型は「+」で連結することができるので、以下のようにローソク足の高値と安値を表示するような書き方も可能である。(「\n」は改行を意味)
//@version=5
indicator("マイスクリプト", overlay=true)
mylabel=label.new(bar_index, na, text="high:"+str.tostring(high)+"\nlow:"+str.tostring(low), yloc=yloc.abovebar)
これをチャートへ反映してみると図3のようになる。
labelを使ってみる2
以上の方法だと、ローソク足を処理するごとにlabelオブジェクトが生成されるため、全ての足にlabelが表示される。(図1〜3)
これは、mylabel変数の定義の仕方によるもので、例示したスクリプトのように何も指定せずに新しい変数を定義すると、series変数(ローソク足毎に変数が定義される)となるから。
labelをこの方法で使った場合、1スクリプト内のlabelの数が制限数(設定しなければ50、設定すれば最大500)に達するまでlabelを生成し、その後は古いものから消えていく。
最新のローソク足時点の情報だけlabelで表示したい場合、次の2種類の方法が考えられる。
1. seriesの特徴を使って、一つ前のlabelを消す方法
//@version=5
indicator("マイスクリプト", overlay=true)
mylabel=label.new(bar_index, na, text=str.tostring(high), yloc=yloc.abovebar)
label.delete(mylabel[1])
この例では、ローソク足ごとに新しいlabelオブジェクトを生成し、一つ前のローソク足時点のlabelオブジェクトをdeleteしている。結果、最新のlabelだけが表示される。(図4)
series型に対しては「[1]」のように1つ前の足時点や、2つ前の足時点の変数の値を参照することができるのが特徴である。
2. varを使って、スクリプト内のlabelオブジェクトを一度しか生成しない方法
//@version=5
indicator("マイスクリプト",overlay=true)
var mylabel=label.new(bar_index, na, yloc=yloc.abovebar)
// 方法その1
label.set_x(mylabel, bar_index)
label.set_text(mylabel, text=str.tostring(high))
// あるいは、方法その2
//mylabel.set_x(bar_index)
//mylabel.set_text(str.tostring(high))
この例では、変数「mylabel」を「var」を使って宣言している。(結果は図4と同じ)
「var」を使うと、その行は1度だけ実行され、ローソク足が変わった際には実行されない。
そのため、スクリプト内のlabelオブジェクトは1度定義され、ローソク足ごとにlabelの「text」だけが更新されていくことになる。
追記(2024/12/4)
v6新機能を使い、labelの文字をtext_sizeとtext_formattingを使い見た目を買えることが出来るようになった。詳細はv6の覚書にて。