条件に応じてローソク足の色を塗り分けることができると、よりチャートを見やすくすることができます。
方法はいくつかあるのですが、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は全て塗りつぶせる反面メインチャートとの前後関係を都度設定しなければならず面倒だったりと、一長一短です。
実際にサンプルコードからインジケーターを作ってみて、お好きな方をご利用ください。
ではでは。