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

June 11, 2020

labelの登場によりチャート上に任意のテキストを描画できるようになった(以前は不可能)しかし少し使い方が複雑なので解説する。

title

本日はPine基礎編

本日はPine基礎の中でもVersion 4から追加になった機能を使用する。

以前は画面上に文字列を自由に描くことは不可能だったがlabeの登場でそれが可能に。

label

まずは次のスクリプトを見ていただきたい。

//@version=4
study("ukeru label", overlay=true)

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.delete(l[1])

結果

image-20200610152946453

最新(一番右)の足にだけラベルが表示される。

これはバーが更新された場合はこのラベルは消えて、次のバーの上に表示される。

つまりこのコードなら「常に一番右側に1コだけ」ラベルが表示される。

Ver4より前ではこのような表現はできなかった。

初心者がつまずくポイント1:「改行」

ここで予め躓きポイントを解説する。

オブジェクト.メソッド(引数1,2,3...)というとき普通のプログラム言語ならカッコの中は改行してよいのだが...

image-20200610153259688

ここがスペース4個未満でなければならない(2個がオススメ)

スペースを4個 or TABを入れてしまうとエラーになる仕様につき注意。

つまずくポイント2:引数

image-20200610153831606

順番を守らなければならない引数

変数の頭から2個。数値を直接いれる場所は順番を入れ替えてはいけない。

つまり「bar_index」が1つ目、「na」が二つ目(左この変数の意味は後述)

でなければエラーとなる。

順番が自由な引数(オプション)

画像下部の引数は変数名=値というルールになっているが、この変数名に値を入れる書式の引数同士は自由に位置を変えて良い。

つまり

  (省略)
  text='うけるw',
  color=color.green, 
  (省略)

でもいいし

  (省略)
  color=color.green, 
  text='うけるw',     //上と下が入れ替わっている
  (省略)

でもよい。

これは何を意味するか

つまり、順番を守らねばならない引数(ここでは第一引数と第二引数)は「省略できない引数」だと覚えておこう。

最低でもこれらが指定してなければエラーとなる。

ビルトイン変数

まだ本題に入る前に覚えるものが有る。

ビルトイン変数だ。

これはシステムで予め予約されている変数であり、自動的に中に値が入っている。

ここではbar_indexは現在のバーが0から始まり今見ているバーが何番目なのかが入っている。

naは空っぽの値。プログラミングではいわゆるnullだと思っておけば良い(厳密に言えばPinenaはちょっと違う物のようだが)

本題!label.new()

ようやく本題。

ラベルはnewメソッドを通して新規に描画する。

引数がかなりたくさんある。初心者殺しのパラメータだ。

初めのコードから抜粋する。

l = label.new(
  bar_index, //1
  na, //2
  text='うけるw', //3
  color=color.green,  //4
  style=label.style_labeldown, //5
  xloc=xloc.bar_index, //6
  yloc=yloc.abovebar, //7
  textcolor=color.white, //8
  size=size.huge, //9
  textalign=text.align_right //10
  )

1.bar_index

先ほど説明したように今見ているバーの番号が入っている。つまり第一引数は「どこにラベルを表示するか」である。

後ほど説明するが、最新以外のラベルはdeleteによりバーが増えるたび削除されていくので、最新のバーのラベルだけ画面に残る。

2.na

2番めの引数はY軸の値。つまりラベルを描画する高さを指定している。

必ず次のオプションとセットで考える

 yloc=yloc.abovebar, //8

abovebarになっている場合はnaを指定し、自動でバーの上のいい感じのところに描画される。

例えばもっと下に指定したいときは「価格」を使わねばならない。yloc.priceに設定して次のようにする。

l = label.new(
  bar_index,
  9000,
  text='うけるw',
  yloc=yloc.price,
  ...

image-20200610160717973

下の方に表示された。

3.text='うけるw'

ここにテキスト。変数をつかって自由に変化させることができる。

4.color=color.green

ここに色。色の種類もビルトイン変数で分かりやすく用意されているので参照して記述。

5.style=label.style_labeldown

ラベルの形を変えられる。label.newのstyleに全種類乗っている。

次の例はlabel.style_label_left

image-20200610161309590

6.xloc=xloc.bar_index

たぶん一番解釈が難しい箇所。

これはx軸はbar_index(バーを左から数えた数)で指定するという意味。

ここはデフォルトでxloc.bar_indexが入るので普段は指定する必要はない。

一方でここをxloc.bar_time にして、直接時間を指定するように変更できる。

例えば

specified_time = timestamp(2020, 06, 1, 0, 0) //追加!

l = label.new(
  specified_time, //変更!
  na,
  text='うけるw',
  color=color.green, 
  textcolor=color.white,
  style=label.style_labeldown,
  xloc=xloc.bar_time, //変更!
  yloc=yloc.abovebar,
  size=size.huge,
  textalign=text.align_right
  )

image-20200610161909678

時間指定したところにラベルを置ける。これは便利そう。

7以降は省略

7は上で解説。その他は字面そのままのパラメータなので省略。

公式を参照のこと。

label.delete()

最後の行label.delete(l[1])書かななかった場合どうなるだろうか。

image-20200610162451886

めっちゃウケる。

一度描画されたラベルは足が変わった時に残ってしまうようだ。

一方で画面左端までびっしり詰められているわけではなく、ある一定期間以上前のラベルは削除されていってるように見える。

これはdeleteメソッドがない場合ラベルは表示数に制限がありおよそ50個(変化する模様)で古いものから自動で削除される仕様とのこと。

ちなみにl[1]1は1コ前のバーと言う意味。l[0]にすると最新のラベルまで消えてしまう。

より難しい使い方

label.set_を使って後からオプションを変更できそうだ。公式はこのあたりを参考

日曜日だけ特殊なラベルを出したい

例えば毎日午前9時にラベルを生成して、日曜日だけ色とテキストを変えるには

hourおよびdayofweekはビルトイン変数

if(hour == 9 - 9) //時差を補正すること
    l = label.new(
      bar_index,
      na,
      text='うけるw',
      color=color.gray, 
      textcolor=color.white,
      style=label.style_labeldown,
      xloc=xloc.bar_index,
      yloc=yloc.abovebar,
      size=size.huge,
      textalign=text.align_right
      )
    if(dayofweek == 1) //日曜は1。月が2・・・土が7
        label.set_color(l, color.red)
        label.set_text(l, "日曜日!")

このようなコードが可能。

最後の2行で指定したラベルのオプションを後から変更している。

1時間足

image-20200610171154545

正しく色が変わった。

line.newというのもある

今回は解説しないが、ほぼ同じような仕組みで新しくline.newというのも追加されており、ラベルではなく線を引くことができる。

現在のトレンドを矢印で表示するなど様々な表現が可能になっている。

こちらは次回の記事で解説する。

さいごに

サクっとやるつもりが、結構細かくやってしまった。

やろうと思えばまだまだいくらでも細かくできそうだが、さすがにやりすぎなので今日はここまでにする。

この記事をシェア:

author icon

仮想トイレ @CrypticToilet
プログラミングや仮想通貨のシステムトレードに関する情報を更新中!どんな情報を流しても詰まらないトイレ。