Pine Scriptのコードで、

line.new・box.new・label.new・table.newという、

似た名前の関数が並んでいるのを見たことはありませんか。

「MQLのObjectCreateと同じようなものだろう」と、

思ったことはありませんか。

実は、管理の仕組みそのものが違います。

既刊object-create-mql5.mdと、

object-create-types.mdでは、

MQLのObjectCreate関数を解説しました。

この記事では、

Pine Scriptの描画関数group(line/box/label/table)を、

これらの既刊記事と対比しながら解説します。

この記事で分かること
・line.new/box.new/label.new/table.newの基本的な書式
・MQLの『1関数+種類指定』との違い(種類ごとに専用関数)
・文字列名で管理するMQLと
・変数(オブジェクト参照)で管理するPine Scriptの違い
・EA稼働状況パネルをtableで再現する実装例

描画関数の基本とMQLの対応

まず、それぞれの基本的な書式を確認します。

Pine Scriptは図形の種類ごとに専用関数がある

myLine  = line.new(bar_index, close, bar_index + 1, close)
myBox   = box.new(bar_index[5], high, bar_index, low)
myLabel = label.new(bar_index, high, text = "注目")
myTable = table.new(position.top_right, 2, 2)

line.new/box.new/label.new/table.newは、

それぞれ水平線・矩形・ラベル・表という、

作る図形の種類ごとに別の関数として用意されています。

MQLは1つのObjectCreateで全種類をまかなう

ObjectCreate(0, "myLine", OBJ_HLINE, 0, 0, 1.1000);
ObjectCreate(0, "myLabel", OBJ_LABEL, 0, 0, 0);

既刊object-create-mql5.mdのとおり、

MQLはObjectCreateという1つの関数に、

ENUM_OBJECT型の第3引数(OBJ_HLINE等)を渡すことで、

作る図形の種類を切り替えます。

最大の違い: 文字列名での管理 vs 変数での管理

ここが、MQLユーザーが最初に戸惑うポイントです。

MQLはオブジェクト名(文字列)で管理する

補足
・ObjectCreateの第2引数はオブジェクト名(文字列)
・名前が重複すると作成に失敗するため、一意な名前を自分で設計する必要がある
・更新・削除もすべて名前を指定して行う
・ObjectSetDouble(name, …)
・ObjectDelete(0, name)のように書く

Pine Scriptは戻り値の変数(オブジェクト参照)で管理する

Pine Scriptのline.new等は、

作成した図形そのものを指す「参照」を戻り値として返します。

var line myLine = na
myLine := line.new(bar_index, close, bar_index + 1, close)
line.delete(myLine)

更新・削除は、

文字列名ではなくこの変数(myLine)を指定して行います。

既刊pinescript-type-method-mql-comparison.mdで、

解説したtypeのインスタンスと、

同じ「参照型」の考え方です。

もう一つの違い: 再描画の仕組み

ここが、この記事で最も伝えたいポイントです。

Pine Scriptは毎バー実行されるため消し忘れに注意

MQLユーザーが驚くポイント
・Pine Scriptのコードは、過去のバー全体で毎回実行し直される
・label.new等を条件なしで毎バー呼ぶと、過去の分だけラベルが積み重なる
・既刊barstate.islastの記事で解説したとおり
・barstate.islastで『最後のバーだけ』に絞るのが定石

MQLは明示的にObjectDeleteしない限り残り続ける

既刊object-create-mql5.mdのとおり、

MQLで作成したオブジェクトは、

ObjectDelete()を呼ぶまでチャート上に残り続けます。

Pine Scriptのような「毎バー作り直される」心配はなく、

逆に消したいタイミングで自分からObjectDeleteを呼ぶ必要があります。

実際に動くサンプルコード: EA稼働状況パネルをtableで再現

既刊comment-display-ea-mt4.mdのEA稼働状況パネルを、

Pine Scriptのtable.new/table.cellで再現する例です。

//@version=6
indicator("Drawing Tools Sample", overlay = true)

level = input.float(0, title = "注目ライン(0で非表示)")

var line watchLine = na
if level != 0 and barstate.isfirst
    watchLine := line.new(bar_index, level, bar_index + 1, level, extend = extend.right, color = color.orange, width = 2)

if level != 0 and ta.crossover(close, level)
    label.new(bar_index, close, text = "ブレイク", style = label.style_label_up, color = color.green, textcolor = color.white)

var table infoTable = table.new(position.top_right, 2, 2, bgcolor = color.new(color.black, 80))
if barstate.islast
    table.cell(infoTable, 0, 0, "終値", text_color = color.white)
    table.cell(infoTable, 1, 0, str.tostring(close), text_color = color.white)
    table.cell(infoTable, 0, 1, "注目ラインとの差", text_color = color.white)
    table.cell(infoTable, 1, 1, str.tostring(close - level), text_color = color.white)

水平線(line)・ブレイク時のラベル(label)・

常時表示のパネル(table)という、

3種類の描画関数を組み合わせた構成です。

box.newについては、

直近の高値安値の範囲を囲む用途等で同様に使えます。

TradingViewでの貼り付け・実行手順

実際にTradingViewで動かすまでの手順です。

  1. TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
  2. 新規スクリプトを作成し、上のコードを貼り付ける
  3. 「保存」してから「チャートに追加」をクリックする
  4. 入力欄の「注目ライン」に価格を入力し、オレンジの水平線が表示されることを確認する
  5. 価格がそのラインを上抜けたとき、緑のラベルが表示されることを確認する

よくあるエラーと注意点

実装でつまずきやすいポイントをまとめます。

varを付けずに毎バーnewすると図形が積み重なる

注意
・var無しでline.new等を呼ぶと、新しいバーごとに別の図形が増え続ける
・古い図形を消したいなら、新しく作る前にline.delete()等を呼ぶ
・既刊var/varipの記事と同じ考え方
・varの考え方がここでも適用される

MQLは名前の重複でObjectCreateが失敗する

既刊object-create-types.mdのとおり、

MQLで同じ名前のオブジェクトを2回ObjectCreateすると、

2回目は失敗して戻り値がfalseになります。

ObjectFind()で存在確認してから作成するのが安全です。

よくある質問

table.new/line.new/box.new/label.newについて、

よく疑問に挙がる点に回答します。

実践アドバイス
・毎バー増え続けさせたくない図形はvarで保持し、作り直す前に削除する
・最後のバーだけに表示したいパネルはbarstate.islastで絞る
・MQLのObjectDeleteに相当するものがある
・line.delete/box.delete
・label.delete/table.delete

1つのスクリプトで表示できる図形の数に上限はありますか?

あります。

line・box・label・tableはそれぞれ、

インジケーター設定のmax_lines_count等で上限を指定でき、

デフォルトの上限を超えると古いものから自動的に消えます。

MQLのOBJ_RECTANGLEとPine Scriptのboxは同じですか?

役割は近いですが、管理方法が異なります。

既刊object-create-mql5.mdのOBJ_RECTANGLEは、

文字列名で管理しますが、

Pine Scriptのboxは戻り値の変数で管理します。

tableはインジケーター以外(EA相当のstrategy)でも使えますか?

使えます。

strategy()で宣言したスクリプトでも、

table.new/table.cellは同じ書式で使えます。

【Pine Script入門】table.new/line.new/box.new/label.newをMQLユーザー向けに解説してみた(ObjectCreateとの比較):まとめ

Pine Scriptのline.new/box.new/

label.new/table.newは、

MQLのObjectCreateが1つの関数で全種類をまかなうのに対し、

図形の種類ごとに専用の関数として用意されています。

管理方法も、MQLの文字列名による管理とは違い、

戻り値の変数(オブジェクト参照)で管理する点が大きな違いです。

毎バー実行されるPine Scriptの仕組み上、

var宣言とbarstate.islastでの絞り込みを忘れると、

図形が意図せず積み重なってしまう点にも注意してください。

関連記事