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は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で動かすまでの手順です。
- TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
- 新規スクリプトを作成し、上のコードを貼り付ける
- 「保存」してから「チャートに追加」をクリックする
- 2本の移動平均線が描画され、クロスした位置に三角マークが出ることを確認する
- マークにマウスを乗せ、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箇所だけに手動で作る)かという、
役割の違いを押さえておくと、移植時の設計判断がしやすくなります。
コメント