前日レンジを表示するインジケーターを作成します。そこで問題となるのが、リペイントを回避する方法です。
2021年2月18日
リペイントとは?
TradingViewのインジケーターを自作するシリーズの第4回目。
今回扱うテーマは「リペイント」です。リペイントとは、チャートに表示するインジケーターの描写が書き換わってしまう現象のことを言います。
チャートに表示されるローソク足は、「現在の足」と「過去の足」の2種類があるわけですが、 現在の足で描写されたインジケーターの値が、過去の足に変わるタイミングで変わってしまうことがあるのです。
これはインジケーターの計算結果が変わるということでもあり、リアルタイムでの売買判断やバックテストなどで困ったことになります。
この記事を読むことで、以下のことが分かります。
リペイントが発生するとき
リペイントが発生する可能性があるのは、チャートに設定された時間軸より長い時間軸のインジケーターを表示する時です。
例えば、15分足のチャートに前日のレンジを表示するインジケーターの場合、
- チャートが参照するのは15分足のデータ
- インジケーターが参照するのは日足のデータ
と、参照するデータが異なります。ここにトラブルの原因があります。
具体的にどのような事が起こるのか確認してみましょう。
htfHigh = security(syminfo.tickerid, "D", high)
htfLow = security(syminfo.tickerid, "D", low)
plot(htfHigh, color=color.silver, title="HTF High")
plot(htfLow, color=color.silver, title="HTF Low")
security(syminfo.tickerid, "D", high)
で日足の高値を取得して、それをプロットすると以下のようになってしまいます。
過去の足では正しい前日高値のラインを引いているのに、現在の足だけは当日の高値になってしまうのです。
状況を整理します。まず、前提として、
そして、日足の高値を参照しようとして、実際に起こったのは、
となります。
前日レンジを描写するインジケーター
では、確認された問題を解決して、現在の足でも前日の高値を示すインジケーターを作成してみましょう。
見た目はこのようになればOKなはずです。
どのような時間軸を使っていても、日足の情報というのは重要です。 最も注目される日足がどのようなものになるのかは、トレードプランに大きな影響を与えるからです。
引かれるラインをブレイクすれば、少なくともインサイドデイは否定されたことになりますから、 それをもって相場が動いていると判断することも可能なわけです。
ただ、どの期間のレンジを重視するかはその人次第でしょうから、作成するインジケーターは前日レンジ以外にも対応できるようにしたいと思います。
コード
//@version=4
study("HLR", overlay=true)
res = input(title="TimeFrame", type=input.resolution, defval="D")
rep = input(title="Allow repaint", type=input.bool, defval=false)
htfHigh = security(syminfo.tickerid, res, high[rep ? 0 : barstate.isrealtime ? 1 : 0])
htfLow = security(syminfo.tickerid, res, low[rep ? 0 : barstate.isrealtime ? 1 : 0])
plot(htfHigh, color=color.silver, title="HTF High")
plot(htfLow, color=color.silver, title="HTF Low")
input()
まず、input(type=input.resolution)
で、レンジを表示する時間軸の指定ができるようにしています。
次に、input(type=input.bool)
で、リペイントを許可するかどうかを受け取っています。
これは必須の機能ではありません。チャート上でリペイントの挙動を確認するために用意しておきました。
リペイントを回避する
日足の高値安値が確定していない段階では、既に確定している前日の高値安値を参照する必要があります。
そのためには、security(syminfo.tickerid, "D", high)
で日足高値を取得する際に、一工夫しなければなりません。
現在の足において、日足高値が確定していないのであれば、日足のhigh[1]
、つまり前日高値を参照するように条件分岐します。
その条件となるのがbarstate.isrealtime
です。ここではsecurity()
の中で使っていますので、評価する対象は日足データとなります。
日足がリアルタイム(進行中)であれば、参照するのは日足のhigh[1]
となる仕組みです。
まとめ
チャートに上位時間軸のインジケーターを表示する人は多いと思います。 悩ましいのはリペイントの挙動ですが、それも発生する状況と対処法が分かっていれば問題とはなりません。
今回紹介したのは「リペイントを回避する方法」の一例です。 同じ目的を達成する方法はいくつもあるのが普通ですから、色々と試してみてください。