見出し画像

Pine Script™ (v6) の覚書 - コラム : plot系列の上限について –input.color()は罠?!- (2)

前回までの話

色数を増やすとplot系列が増えるのかというとそうではありません。

以下のスクリプトは、plotで2色と3色の線を引くことができますが、いずれの場合も消費plot系列は2(1+1)です。

plot(close,color=hour(time)%2==1?color.red:color.yellow)//→2系列(1+1)

plot(close,color=hour(time)%3==2?color.red:hour(time)%3==1?color.orange:color.yellow)//→2系列(1+1)、条件を2回入れたので1系列+2系列=3系列、とはならない

極端な話、randomでたくさんの色に塗り分けても消費系列は2です。

colors=array.from(color.black,color.silver,color.gray,color.white,color.maroon,
  color.purple,color.fuchsia,color.green,color.lime,color.olive,color.yellow,
  color.navy,color.blue,color.teal,color.aqua,color.orange)

rcolor(int seed)=>
    colors.get(int(colors.size()*math.random(0,1,timenow)))

plot(close,color=rcolor(timenow),linewidth=6)//→2系列。ランダムに色を変えても系列数がどんどんと加算されることはない

実際に表示してみるとカラフルですが、2系列(1+1)です。

図1 plotでrandomに色を指定

関数の引数に色を指定出来る場合、色を const colorで指定する場合は基本の系列数だけが加算されますが、input等で設定できるように書くと色の指定箇所ごとに系列数が加算されます。

例えば、
plot()は引数がcolorの1個なので、最大2系列(1+1)
plotchar()は引数がcolorとtextcolorの2個なので、最大3系列(1+2)
plotarrow()は引数がcolorupとcolordownの2個なので、最大3系列(1+2)
plotshape()は引数がcolorとtextcolorの2個なので、最大3系列(1+2)
plotbar()は引数がcolorの1個なので、最大5系列(4+1)
fill()は2種類あり、引数がcolorの1個の場合と、引数がtop_colorとbottom_colorの2個の場合があり、最大2系列(0+1 または 0+2)
となります。

要注意なのがplotcandle()で、引数でcolor/wickcolor/bordercolorが指定できますが、これをinput等で設定できるように書いてしまうと、
もともとの4系列にcolor/wickcolor/bordercolorの3箇所でinputで色指定すると、最大7系列(4+3)も消費してしまいます。

c=input.color(color.red,'color')

plotcandle(open,high,low,close,color=c,wickcolor=c,bordercolor=c)//→なんと7系列。4系列+color+wickcolor+bordercolorの3箇所

というわけで、plot系の関数を使う時に、色を後から変更できるような(あるいは色を配列やUDTで取り扱う)とすると、plot系列の浪費につながる可能性があります。

移動平均線をMTFでたくさん描いたり、GMMAやボリンジャーバンドのように色や線の数が多いような場合、色を設定できるようにしようとするとplot系列の上限にぶつかりやすくなります。
(例えば、GMMAでは12本のEMAが用いられますが、これを色を変えられるように書くと、24系列消費することになります。MTFで2種類表示したら48系列です。)

たくさんの機能を詰め込まなければ発生しないのですが、ランタイムエラーなので実行しないと気が付きにくい厄介な問題です。
スクリプトに含めたい機能を色決め打ちで書いて、書ききった後にinput.colorする余地があるか検討するのが良さそうです。

以下は、効率良く(悪く?)plot系列を食いつぶすサンプルコードです。
いくつオーバーしたかエラー表示されるので、自分のスクリプトがいくつのplot系列を使っているかを確認するのに使えるかもしれません。

//参考: 無駄にplot系列を食いつぶす
c=input.color(color.red,'color')

plotcandle(open,high,low,close,'candle1',color=c,wickcolor=c,bordercolor=c)
plotcandle(open,high,low,close,'candle2',color=c,wickcolor=c,bordercolor=c)
plotcandle(open,high,low,close,'candle3',color=c,wickcolor=c,bordercolor=c)
plotcandle(open,high,low,close,'candle4',color=c,wickcolor=c,bordercolor=c)
plotcandle(open,high,low,close,'candle5',color=c,wickcolor=c,bordercolor=c)
plotcandle(open,high,low,close,'candle6',color=c,wickcolor=c,bordercolor=c)
plotcandle(open,high,low,close,'candle7',color=c,wickcolor=c,bordercolor=c)
plotcandle(open,high,low,close,'candle8',color=c,wickcolor=c,bordercolor=c)
plotcandle(open,high,low,close,'candle9',color=c,wickcolor=c,bordercolor=c)//←7x9=63系列

plot(close,color=c)//←とどめの2系列

チャートに追加するとランタイムエラーとなって、上限の64系列を超えて65系列使っていることが確認できました。

図1 系列数が上限の64を超えのランタイムエラー

以前に公開した記事のplot系列数を調べてみると、

このように、実際に使っている系列数がかなり違うことが分かりました。

いいなと思ったら応援しよう!

rca
よろしければ応援お願いします!