Pine Scriptのplot()やplotshape()を見て、

「MQLのObjectCreateと同じようなものだろう」と思ったことはありませんか。

実はこの思い込みが、MQLユーザーが最初に混乱するポイントです。

既刊object-create-mql5.mdでは、

MQL5のObjectCreate関数でチャート上に図形を描く方法を解説しました。

この記事では、Pine Scriptの描画用関数

plot()/plotshape()/plotchar()を、

MQLの描画方法と対比しながら解説します。

この記事で分かること
・plot/plotshape/plotcharの基本
・バッファ配列を自分で管理する必要があるか
・plotshape/plotcharの本当の対応先
・ObjectCreateとの役割の違い

plot/plotshape/plotcharの基本とMQLの対応

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

Pine Scriptのplot()の書式

plot(close, title = "終値", color = color.blue)

毎バーの値を1行で線として描画できます。

MQLではSetIndexBufferで実現する処理

SetIndexBuffer(0, LineBuffer);
PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);

MQLでは、まずバッファ配列を用意し、

そこに値を入れてから描画方法を指定する2段階の作業になります。

最大の違い: バッファ配列を自分で管理する必要があるか

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

MQLはバッファ配列に値を入れて描画を予約する設計

MQLユーザーが驚くポイント
・MQLはOnCalculate()内で配列の各要素に値を代入する
・描画はターミナル側がバッファの値を見て後から行う
・配列の添字(時系列順)を意識する必要がある

Pine Scriptは1行の呼び出しがそのまま描画になる

plot()はそのバーの値を渡すだけで、

配列やインデックスを自分で管理する必要がありません。

plotshape/plotcharの本当の対応先

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

plotshape()/plotchar()は矢印を1行で出せる

plotshape(buyCond, title = "Buy", style = shape.triangleup, location = location.belowbar, color = color.green)

条件を満たしたバーにだけ、三角マークを出す処理が1行で書けます。

本当の対応先はObjectCreateではなくバッファ描画

補足
・既刊の矢印インジケーター記事群はSetIndexBufferと
DRAW_ARROWの組み合わせで矢印を描いている
・これはplotshape/plotcharと同じ『条件を満たした
バーにだけ印を付ける』series指向の処理
・ObjectCreateは特定の1本の線や1個の図形を
手動で作る処理で、series指向ではない

ObjectCreateが対応するのは何か

ObjectCreateが本当に対応するのは、

Pine Scriptのline.*/label.*/box.*系の関数群です。

これらは今回の対象外ですが、将来の記事候補として覚えておいてください。

実際に動くサンプルコード

移動平均線をplot()で描き、クロスした瞬間をplotshape()で示すサンプルです。

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

fastMa = ta.sma(close, 10)
slowMa = ta.sma(close, 30)

plot(fastMa, title = "短期MA", color = color.orange)
plot(slowMa, title = "長期MA", color = color.blue)

buyCond = ta.crossover(fastMa, slowMa)
sellCond = ta.crossunder(fastMa, slowMa)

plotshape(buyCond, title = "Buy", style = shape.triangleup, location = location.belowbar, color = color.green, text = "BUY")
plotshape(sellCond, title = "Sell", style = shape.triangledown, location = location.abovebar, color = color.red, text = "SELL")

ta.crossover/ta.crossunderは、

既刊のクロス判定記事で解説した組込み関数です。

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

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

  1. TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
  2. 新規スクリプトを作成し、上のコードを貼り付ける
  3. 「保存」してから「チャートに追加」をクリックする
  4. 2本の移動平均線が描画され、クロスした位置に三角マークが出ることを確認する
  5. マークにマウスを乗せ、textに指定した文字が表示されることも確認する

よくあるエラーと注意点

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

plot()にbool型の値を渡そうとしてエラーになる

注意
・plot()は数値(series float/int)専用
・条件分岐の結果(true/false)をそのまま渡すとエラーになる
・条件を描画したい場合はplotshape()/plotchar()を使う

MQLのインジケーターバッファ数の上限を忘れる

MQLはIndicatorBuffers()で事前にバッファ数を宣言する必要があり、

後から線やマークを増やそうとして上限に達するミスが起きやすいです。

plotの線が多すぎてチャートが見づらくなる

Pine Scriptは1行で何本でも線を追加できる手軽さの反面、

MQLのバッファ数の上限のような歯止めが無い点に注意してください。

よくある質問

plot/plotshape/plotcharについて、よく検索される疑問に回答します。

実践アドバイス
・線を描きたいだけならplot()で十分
・条件付きのマーカーはplotshape()かplotchar()を使う
・特定の1本の線や注釈を手動で描きたい場合は
line.*/label.*系を調べる(ObjectCreateに近い)

plotshape()とplotchar()はどう使い分けますか?

plotshape()はあらかじめ用意された図形(三角・円等)を使います。

plotchar()は任意の1文字(絵文字含む)を表示できます。

既存の矢印表現をそのまま移植したい場合はplotchar()が、

図形の種類を選びたい場合はplotshape()が向いています。

plot()の線を途中で非表示にすることはできますか?

できます。

値にnaを渡すと、既刊のna値についての記事で、

解説したとおり、その位置だけ描画されません。

MQL5のObjectCreateで矢印を描くのは間違いですか?

間違いではありません。

ただし、全バーに自動で矢印を出すような処理には、

バッファ+DRAW_ARROWの方が向いています。

ObjectCreateは、特定の1箇所だけに注釈を置きたい場合に適しています。

【Pine Script入門】plot/plotshape/plotcharをMQLユーザー向けに解説してみた(ObjectCreateとの比較):まとめ

Pine Scriptのplot()/plotshape()/plotchar()は、

MQLのObjectCreateと見た目は似ていますが、

本当に対応するのはバッファ配列を使った描画の方です。

series指向(全バーに自動で適用される)か、

個別指向(特定の1箇所だけに手動で作る)かという、

役割の違いを押さえておくと、移植時の設計判断がしやすくなります。

関連記事