2020-08-02

【Pine Script】新しいラベルスタイル【Trading View】

以前解説したラベルオブジェクト(line.newメソッド)に新しいラベルが追加され、価格に直接吹き出しの始点をもってこれるようになった。

Article Image

ラベルオブジェクトについて

基本については前回の記事を参考にしてもらいたいが、可能な限り知らなくてもできるように記述する。

【Pine Script】 ラベルオブジェクト(label)の使い方【Version 4】

Pine側の更新について

公式ブログにて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)

実行結果

image-20200731215555544

「うける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を指定すると想定外の動きをするようなので削除した。

結果

image-20200731225912925

矢印の先がぴったりと指定した場所になる。これは便利

ということで絶対値で変なところを設定すれば...

label.set_xy(l, bar_index, 1500000)

image-20200731230057428

当然ぴったりそこに出てくる。

次はleft

style=label.style_label_lower_left

image-20200731230137835

こちらは右側に現れるという違いだけ。

leftrightは矢印の向きに対応しているので想定とは逆にならないように注意(leftは右側にラベルが出る)

価格が視覚的に分かりやすく

この実装で矢印がピッタリと価格を示すので視覚的に高いのか安いのかがはっきり示せるようになった。

小さなアップデートではあるが非常に便利だ。

おまけ:文字列と数字の結合

Pineではtostring()をつかってやると数字を文字列として+演算子で結合できる。

コード例

//@version=4
study("Labels", overlay = true)
var l = label.new(
  bar_index,
  na,
  text=tostring(high) + ' うけるw', //ここ!
  
//以下略

こうすると...

image-20200731231127852

数字と文字を結合できる

文字列にOHLCを入れる時の注意!

よく見ると文字列が180万あたりを指しているが、この時点でBTCは120万ほどの価格で推移中であった。

つまり表示されている価格が異常(現在のOHLCが正しく取得できていないように見える)

これはどういうことか。

これはbar_index0のときにラベルを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') //ここを追加!

image-20200802205131278

おまけ:動いているように見える

秒足などに設定すると最新のほしい数字を画面に大きく表示できるので便利かもしれない。

さいごに

今回わりと細かいお話をがっつり書いてみた。

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を記述しわすれて実行すると

image-20200731221316488

こうなってしまう。

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)

結果は

image-20200731222030168

これで常に一番右に一つだけ「うけるw」ラベルが表示され続ける。

ラベルを一つしか表示しない場合はこちらのほうが感覚的にわかりやすいかと思う。



この記事のタグ

この記事をシェア


謎の技術研究部 (謎技研)