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は毎バー実行されるため消し忘れに注意
・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で動かすまでの手順です。
- TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
- 新規スクリプトを作成し、上のコードを貼り付ける
- 「保存」してから「チャートに追加」をクリックする
- 入力欄の「注目ライン」に価格を入力し、オレンジの水平線が表示されることを確認する
- 価格がそのラインを上抜けたとき、緑のラベルが表示されることを確認する
よくあるエラーと注意点
実装でつまずきやすいポイントをまとめます。
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での絞り込みを忘れると、
図形が意図せず積み重なってしまう点にも注意してください。
コメント