ローソク足の色を条件に応じて塗り分けるPine言語の書き方(ボディ部/枠線/ひげのすべて)

条件に応じてローソク足の色を塗り分けることができると、よりチャートを見やすくすることができます。

方法はいくつかあるのですが、Pine言語における条件分岐や関数にややクセがあったり、「ローソク足すべてを同じ色で塗る(ボディ部、枠、ひげ、などすべて)」のが意外と難しかったりします。

本記事ではTradingViewのPine言語で可能なローソク足チャートの色塗りわけについて、いくつかの方法をご紹介していきます。

具体的な題材として、以下のようなことをPine言語で実現する方法について解説しています。

今回の制作ネタ

出来高が前日より2倍以上に急増したローソク足について・・

・陽線なら黄色で塗りつぶす
・陰線なら緑色(ライム色)で塗りつぶす

”中空ローソク足”はチャート設定で変更可能

今回のテーマに入る前に・・もしあなたの目的が「中空ローソク足を表示させたい」ということであれば、そもそもPine言語は必要ありません。

TradingViewの左上にあるローソク足設定から「中空ローソク足」を指定するだけでOKです。

中空ローソク足とは?
「塗りつぶし」と「中空(中抜き)」の足が混在するローソク足チャートです。陽線/陰線の扱いも、通常のローソク足とは異なります。

(通常のローソク足)
・当日終値が当日始値より高ければ「陽線(赤色)」、低ければ「陰線(青色)」

(中空ローソク足)
・当日終値が前日終値より高ければ「陽線(赤色)」、低ければ「陰線(青色)」
・当日終値が当日始値より高ければ「塗りつぶし無し(中抜き、中空)」、低ければ「塗りつぶしあり」

それ以外の目的で、独自の条件で塗り分けをしたい場合は以下に進んでください。

ローソク足のボディ部(胴体部)だけならbarcolor

ローソク足のボディ部(胴体部)のみ色変更したいならbarcolor関数で可能です。ローソク足標準の色に重ねる形で、ボディ部のみを指定色で塗りつぶせます。

例えば以下のように書くと、「出来高が前日の2倍以上になった陽線を黄色に、陰線を緑色(ライム)に塗る」ことができます。

【コード】

barcolor(volume >= volume[1] * 2 and close > open ? color.yellow : volume >= volume[1] * 2 and close < open ? color.lime : na)

【結果】

barcolorをif構文の中に書けないため、三項演算子( X ? A : B )を使っています。barcolorの引数がnaなら色塗りがされない仕様になっているので、以下のような意味になります。

(1) volume >= volume[1] * 2 and close > open なら color.yellow(黄色)
(2) volume >= volume[1] * 2 and close < open なら color.lime(緑、ライム色)
(3) それ以外はna

この表示で良ければ、barcolorを利用するのが最も柔軟で便利です。

ただし、barcolorはボディ部の色のみ変更可能で、「ひげ」や「ボディ部の枠線」の色は変更不可の仕様となっております。

ローソク足すべて色変更したいならplotcandle

ローソク足のひげやボディ部の枠線など、ローソク足全体を任意の色に変更したいならplotcandle関数が利用できます。こちらの関数は、引数で指定した価格(始値/高値/安値/終値) を元にローソク足を描画します。

barcolorと違って「メインのローソク足を塗りつぶす」ではなく「新たにローソク足チャートを描画する」もので、どちらかと言えばメインチャートとは別の銘柄のローソク足を描画したい時に利用します。(security関数で別銘柄のデータを取得してplotcandleでチャート描画、など)

ただ、以下のようにPine言語を書くことで、任意のローソク足について「ボディ部」「ボディ部の枠線」「ひげ」すべてを同じ色で塗りつぶすことができます。

※こちらの方法については、メインチャートをインジケーターの背面に描画する必要があります。インジケーター詳細設定またはオブジェクトツリーからメインチャートを最背面に移動してください。

【コード】

plotcandle(volume >= volume[1] * 2 and close > open ? open : na, high, low, close, title='Title', color = color.yellow, wickcolor=color.yellow, bordercolor=color.yellow)

plotcandle(volume >= volume[1] * 2 and close < open ? open : na, high, low, close, title='Title', color = color.lime, wickcolor=color.lime, bordercolor=color.lime)

【結果】

plotcandleの引数「wickcolor」と「bordercolor」で、それぞれ「ひげ」と「ボディ部の枠線」の色を指定できます。これらの引数にも三項演算子を利用できれば便利なのですが、残念ながらこれらの引数は定数値か入力値(input)しか対応していません。

たとえば以下のようなコードはエラーになって動きません。

※注意:以下は動作しないコードです

plotcandle(open, high, low, close, color=close>open ? color.red : color.blue, wickcolor=close>open ? color.red : color.blue, bordercolor=close>open ? color.red : color.blue)

そこでplotcandleの「第1~第4引数(価格関連)のいずれか1つでもna(値無し)だった時には描画しない」という性質を利用して、変更したい色ごとにplotcandleを用意し、第1引数に三項演算子で条件分岐しています。

注意点と別の解決策について

今回の方法については、「複雑な条件には対応しにくい」です。

例えば複数の条件の組み合わせがある場合、それぞれplotcandle関数を用意する必要があります。

複雑な条件だと三項演算子の式が長くなって見づらくなりますし、またpltocandle関数は多用しすぎると表示がかなり重くなります。

複雑な条件による色分けをしたい時は、以下のような別の方法もオススメです。

barcolorでボディ部のみの色付けに妥協する
bgcolorでチャート背景部の方を色付けする
plotでマークやラベルを表示する

詳細については、各関数の逆引きPine辞典や別のブログ記事(今後追加予定)も参考にしてください。

まとめ

今回はローソク足の色を条件に応じて塗り分けるPine言語の書き方についてご紹介しました。

barcolorの方が利便性は高いがボディ部しか色を塗れなかったり、plotcandleは全て塗りつぶせる反面メインチャートとの前後関係を都度設定しなければならず面倒だったりと、一長一短です。

実際にサンプルコードからインジケーターを作ってみて、お好きな方をご利用ください。

ではでは。