チャートの設定で「セッション区切り」をONにすると、日経225の場合16:30に縦線が描写される。 ここではなく、デイセッション開始時刻である8:45に線を引きたい。
2021年3月10日
自作インジケーターの第2回
前回、TradingView用インジケーターの自作の事はじめとして、複数の指標を1つのインジケーターにまとめる方法 を紹介しました。
今回も引き続き、シンプル且つ実用的なサンプルを使って、インジケーターを自作するためのウォーミングアップをしていきましょう。
「コードの書き方を勉強しよう」という姿勢だと、スキルを身に付けることが難しくなります。 コードを書くというのは「手段」であって、目的とするには弱いからです。 これは「英語を話せるようになりたい」と言っている人のほとんどが英語を話せるようになれないのと一緒です。
何か具体的な問題があり、それを解決するために行動する。その解決法が「コードを書く」ことだったという経験を繰り返すことで、 コードを書くスキルは自然に身に付いていきます。ですから、まず問題を明確にしましょう。
任意の時間に縦線を引く
TradingViewでも1ドル追加で支払うことで日経225の価格データを取得できます。
短い時間足のチャートでは、どこまでがどの日なのかを認識しやすくするために「セッション区切り」を描写したくなりますが、 これをONにするとナイトセッションの始まりである16:30にだけ縦線が引かれるのです。
日本人トレーダーとしては、デイセッションの開始時刻である8:45にこの線を引きたいところです。 つまり、「毎8:45に縦線を引きたいのだが、通常の機能を使うと16:30に引かれてしまう」 というのが今回取り組む問題となります。
どうも設定の変更だけでこの問題を解決するのは難しそうなので、 「自分でインジケーターを作ってこの問題を解決しよう」となり、本題である「チャートに縦線を引く」につながるわけです。
この方法が分かれば、8:45に限らず自分の好きな時間に「自動」で線を引くことができるようになるはずです。 また、少し修正すればOR(オープニングレンジ:セッション開始から30分とか1時間をこう呼ぶ)だけ背景色を変えるといったこともできるでしょう。
コード
//@version=4
study(title="Session-break", shorttitle="SB", overlay=true, scale=scale.none)
h = input(defval=8, title="Hour", type=input.integer, maxval=23, minval=0)
m = input(defval=45, title="Minute", type=input.integer, maxval=59, minval=0)
isHour = hour == h
isMinute = minute == m
vline(BarIndex, Color, LineStyle, LineWidth) =>
return = line.new(BarIndex, low - tr, BarIndex, high + tr,
xloc.bar_index, extend.both, Color, LineStyle, LineWidth)
if(isHour and isMinute)
vline(bar_index, color.silver, line.style_dotted, 1)
短いコードですが、重要な要素が色々つまっています。PineScriptの仕様やプログラミング的な概念を少しづつ理解していくには良いサンプルでしょう。
study(overlay=true)
study()
で、このコードがインジケーターであること明示します。その計算結果を出力できる場所は2か所です。
- ローソク足と同じパネル
- 下の別パネル
今回はローソク足と同じパネルの8時45分のところに線を引きたいので、overlay=true
とします。
別パネルに出力したい場合はoverlay=false
です。
input()
ここは、ユーザーがチャート上からも変更可能なパラメーターの値を受け取る部分です。
type=input.integer
で、このパラメーターが取れる値をinteger、つまり整数に限定しています。
さらに、その値は時間であれば0時から23時までとなるので最小値と最大値をそれぞれminval=0
とmaxval=23
で指定し、
デフォルト設定はdefval=8
で8時としました。
isHour = hour == h
ここがちょっとややこしい部分です。
isHour
はデータを格納しておく単なる箱で、名称に特段の意味はありませんので、自分が分かりやすい名前に変更しても問題ありません。
格納されるデータはローソク足の数の分だけあって、その値はtrue
かfalse
のどちらかとなります。
このスクリプトはローソク足ごとに毎回実行されるので、その分だけデータが蓄積されるのです。
また、その値がtrue
かfalse
に限定されるのは、その後に続くhour == h
によります。
これは条件式と言ってプログラミング的なものです。まず、h
には、inputから取得した「8」が入っている状態です。
hour
は、PineScriptにあらかじめ用意されている機能でローソク足の時間を取得するもの。
Pineエディタ上で「hour」を入力すると赤文字で表示されるはずです。
このhour
に入る値は一定ではなく、ローソク足によって異なります。
イコールが2つ連続する==
は、「この2つが等しいか」という条件を表し、
等しければtrue
が、等しくなければfalse
が、条件判定に従ってisHour
に格納されることになります。
vline() =>
プログラミングには関数という概念があります。これはファンクション(function)と言ったりもして、要は何かしらの目的を持った機能のことです。
Pine Scriptには水平線を引くための関数は用意されているのですが、垂直のラインを引くための関数がありません。
そこで、vline()
という名前をつけた、今回のテーマである「縦のラインを引く」ための 独自の関数 を作っています。
線の描写には、ラインを描写するための汎用的な関数である「line.new」を使い、 線の起点と終点に同じX軸の値を指定し、それを延長する ことで縦線を描写しています。
それぞれの関数については徐々に覚えていってもらうとして、
「自分で関数を作る際は、=>
を使って定義する」ということだけは頭に入れておきましょう。
if(isHour and isMinute)
if
もプログラミング的なものですが、これは特に問題とはならないでしょう。そのまま「もし~ならば」という意味です。
isHour
とisMinute
に入っているものが、どちらもtrue
ならば、先ほど作ったvline()という機能が実行されることになります。
コードを打ち込んでみる
TradingViewにはコードを記述するための「Pineエディタ」という機能が用意されています。このページを参考にコードを自分で打ち込んでみると良いでしょう。
保存ボタンを押すとエラーが吐き出されることもあるかもしれませんが、なぜエラーとなったのかを考え、その対処法を探す作業がスキル向上につながるはずです。
試しにTradingViewでも公開してみたので良かったら参考にしてみてください。こちらは線の色が変えられるようになっています。