基本については前回の記事を参考にしてもらいたいが、可能な限り知らなくてもできるように記述する。
【Pine Script】 ラベルオブジェクト(label)の使い方【Version 4】
公式ブログにて2020/06/22
にて新しいラベルの描画方法が可能になった旨の告知があった。
Pineの新しいラベルスタイル – TradingView Blog Japan
こちらに対応したラベルの描画方法が少々小難しいため私なりに分かりやすく紐解きたい。
追加されたのは次の2つ
label.style_label_lower_right
label.style_label_left
どちらもstyle
のオプションに適応する。つまり見た目が変わる。
特に変化したのは**「直接指定した価格に吹き出しの先端を持っていくことができる」**ということだろう。
//@version=4
study("Labels", overlay = true)
var l = label.new(
bar_index,
na,
text='うけるw',
color=color.green,
textcolor=color.white,
style=label.style_labeldown,
xloc=xloc.bar_index,
yloc=yloc.abovebar,
size=size.huge,
textalign=text.align_right
)
label.set_xy(l, bar_index, high)
実行結果
「うけるw」と表示される
吹き出しの始点が随分上のほうになっており価格に直接ラベルを密着させることは難しかった。
毎回削除する方法から一度描画して移動する方式に推奨が変わった(?)模様なのだがこれは今回のテーマではないので一番下に貼り付けておく
style
のオプションにlabel.style_labeldown
が指定されていたが
新しいlabel.style_label_lower_right
に設定しなおしてみる。
また、y座標には具体的な価格を入れることを前提としているので次のコードにする
//@version=4
study("Labels", overlay = true)
var l = label.new(
bar_index,
na,
text='うけるw',
color=color.green,
textcolor=color.white,
style=label.style_label_lower_right, //ここを変更 と yloc=yloc.abovebarを削除
xloc=xloc.bar_index,
size=size.huge,
textalign=text.align_right
)
label.set_xy(l, bar_index, high) //ここにy座標にhighを指定
※yloc
を指定すると想定外の動きをするようなので削除した。
結果
矢印の先がぴったりと指定した場所になる。これは便利
ということで絶対値で変なところを設定すれば...
label.set_xy(l, bar_index, 1500000)
当然ぴったりそこに出てくる。
次はleft
style=label.style_label_lower_left
こちらは右側に現れるという違いだけ。
left
とright
は矢印の向きに対応しているので想定とは逆にならないように注意(left
は右側にラベルが出る)
この実装で矢印がピッタリと価格を示すので視覚的に高いのか安いのかがはっきり示せるようになった。
小さなアップデートではあるが非常に便利だ。
Pineではtostring()
をつかってやると数字を文字列として+演算子で結合できる。
コード例
//@version=4
study("Labels", overlay = true)
var l = label.new(
bar_index,
na,
text=tostring(high) + ' うけるw', //ここ!
//以下略
こうすると...
数字と文字を結合できる
よく見ると文字列が180万
あたりを指しているが、この時点でBTCは120万
ほどの価格で推移中であった。
つまり表示されている価格が異常(現在のOHLCが正しく取得できていないように見える)
これはどういうことか。
これはbar_index
が0
のときにラベルを1度だけ生成し、バーが切り替わるごとにそれを右にずらしているだけなので
つまりこの180万
という数字はバーの番号が0
番のhigh
を表しているのである。
現在の価格を表示したい場合は従来どおりdelete
文を使うラベル表示方式にするか、label.set_text関数を毎回走らせる必要がある。
コード例
//@version=4
study("Labels", overlay = true)
var l = label.new(
bar_index,
na,
text='',
color=color.green,
textcolor=color.white,
style=label.style_label_lower_left,
xloc=xloc.bar_index,
size=size.huge,
textalign=text.align_right
)
label.set_xy(l, bar_index, high)
label.set_text(l,tostring(high) + ' うけるw') //ここを追加!
秒足などに設定すると最新のほしい数字を画面に大きく表示できるので便利かもしれない。
今回わりと細かいお話をがっつり書いてみた。
Pineスクリプト – TradingView Blog Japan
実は最近まで知っていながらあまり見ていなかった公式BLOGだが、小さな更新がどんどん掲載されていくようなので
今後は細かくチェックしていきたいと思った次第である。
ここからはラベルの描画方法に関するおまけ。
【Pine Script】 ラベルオブジェクト(label)の使い方【Version 4】
前回の記事ではdelete
を使って毎回ラベルを表示しては新しい足で一つ前のラベルを剥がす...
というルーチンによって常に新しいラベル1個だけにしていた(これが公式のサンプルだった記憶)が
公式がvar
を使って一度だけラベルを描画してset_xy
を用いて座標を逐一変更する方式に推奨が変わった模様?
ラベルを複数ではなく全体で1回しか描画しない場合はこちらの方法が理解しやすいと思う。
//以前私が書いたコード
//全てのバーに一度ラベルを描画して
l = label.new(
bar_index,
na,
//中略
label.delete(l[1]) //毎回一つ前を削除 = 最新のラベルだけ残る
毎バーで削除する方式から
//var宣言により一番左の足で1回だけ描画
var l = label.new(
bar_index,
na,
//中略
label.set_xy(l, bar_index, high) //一度描画したラベルのx,y座標を後から移動
一度描画してから移動している
var
って?「一度しか実行されない」Pine
に書かれたコードは「全ての足で1回づつ」実行されている。
しかしvar
を付けると最初の0本目の足で1回だけ宣言され、後は二度とこの宣言文が実行されることがなくなるPine v4
からの概念だ。
つまり後者のコードをset_xy
を記述しわすれて実行すると
こうなってしまう。
0番目の足で1度だけ実行され、二度とラベルを描画することがないので
Xの設定が0のまま動かない。
つまり一番左側(画面外)に1度だけ描画されている
label.set_xy
メソッドこのメソッドを使うと一度描画したラベルに対して後からx,y座標
を変更することができる。
コードは
label.set_xy(l, bar_index, na) //naの代わりにhighなどの価格でもOK
これを追加。
第一引数にラベルのID(new
するときにイコールで代入した変数)を入れてやれば良い。
また当然だがラベルを毎回描画してから一つ前を削除するのではなく一つ描画したものを移動する方式になったのでdelete
が必要ない。
※一応コード全文
//@version=4
study("Labels", overlay = true)
var l = label.new(
bar_index,
na,
text='うけるw',
color=color.green,
textcolor=color.white,
style=label.style_labeldown,
xloc=xloc.bar_index,
yloc=yloc.abovebar,
size=size.huge,
textalign=text.align_right
)
label.set_xy(l, bar_index, high)
結果は
これで常に一番右に一つだけ「うけるw」ラベルが表示され続ける。
ラベルを一つしか表示しない場合はこちらのほうが感覚的にわかりやすいかと思う。