本日はPine基礎の中でもVersion 4から追加になった機能を使用する。
以前は画面上に文字列を自由に描くことは不可能だったがlabeの登場でそれが可能に。
まずは次のスクリプトを見ていただきたい。
//@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])
最新(一番右)の足にだけラベルが表示される。
これはバーが更新された場合はこのラベルは消えて、次のバーの上に表示される。
つまりこのコードなら「常に一番右側に1コだけ」ラベルが表示される。
Ver4より前ではこのような表現はできなかった。
ここで予め躓きポイントを解説する。
オブジェクト.メソッド(引数1,2,3...)
というとき普通のプログラム言語ならカッコの中は改行してよいのだが...
ここがスペース4個未満でなければならない(2個がオススメ)
スペースを4個 or TAB
を入れてしまうとエラーになる仕様につき注意。
変数の頭から2個。数値を直接いれる場所は順番を入れ替えてはいけない。
つまり「bar_index
」が1つ目、「na
」が二つ目(左この変数の意味は後述)
でなければエラーとなる。
画像下部の引数は変数名=値
というルールになっているが、この変数名に値を入れる書式の引数同士は自由に位置を変えて良い。
つまり
(省略)
text='うけるw',
color=color.green,
(省略)
でもいいし
(省略)
color=color.green,
text='うけるw', //上と下が入れ替わっている
(省略)
でもよい。
つまり、順番を守らねばならない引数(ここでは第一引数と第二引数)は**「省略できない引数」**だと覚えておこう。
最低でもこれらが指定してなければエラーとなる。
まだ本題に入る前に覚えるものが有る。
ビルトイン変数
だ。
これはシステムで予め予約されている変数であり、自動的に中に値が入っている。
ここではbar_index
は現在のバーが0から始まり今見ているバーが何番目なのかが入っている。
na
は空っぽの値。プログラミングではいわゆるnull
だと思っておけば良い(厳密に言えばPine
のna
はちょっと違う物のようだが)
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
)
bar_index
先ほど説明したように今見ているバーの番号が入っている。つまり第一引数は「どこにラベルを表示するか」である。
後ほど説明するが、最新以外のラベルはdelete
によりバーが増えるたび削除されていくので、最新のバーのラベルだけ画面に残る。
na
2番めの引数はY軸の値。つまりラベルを描画する高さを指定している。
必ず次のオプションとセットで考える
yloc=yloc.abovebar, //8
abovebar
になっている場合はna
を指定し、自動でバーの上のいい感じのところに描画される。
例えばもっと下に指定したいときは**「価格」**を使わねばならない。yloc.price
に設定して次のようにする。
l = label.new(
bar_index,
9000,
text='うけるw',
yloc=yloc.price,
...
下の方に表示された。
text='うけるw'
ここにテキスト。変数をつかって自由に変化させることができる。
color=color.green
ここに色。色の種類もビルトイン変数で分かりやすく用意されているので参照して記述。
style=label.style_labeldown
ラベルの形を変えられる。label.newのstyleに全種類乗っている。
次の例はlabel.style_label_left
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
)
時間指定したところにラベルを置ける。これは便利そう。
7は上で解説。その他は字面そのままのパラメータなので省略。
公式を参照のこと。
label.delete()
最後の行label.delete(l[1])
を書かななかった場合どうなるだろうか。
めっちゃウケる。
一度描画されたラベルは足が変わった時に残ってしまうようだ。
一方で画面左端までびっしり詰められているわけではなく、ある一定期間以上前のラベルは削除されていってるように見える。
これは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時間足
正しく色が変わった。
今回は解説しないが、ほぼ同じような仕組みで新しくline.new
というのも追加されており、ラベルではなく線を引くことができる。
現在のトレンドを矢印で表示するなど様々な表現が可能になっている。
こちらは次回の記事で解説する。
サクっとやるつもりが、結構細かくやってしまった。
やろうと思えばまだまだいくらでも細かくできそうだが、さすがにやりすぎなので今日はここまでにする。