ページを更新するとスクリプトやストラテジーの結果が変わります(リペイント)
ヒストリカルデータには、バーの中の価格の動きは含まれていません、始値、高値、安値、終値(OHLC)のみが含まれます。このことが時にリアルタイムデータとヒストリカルデータで、スクリプトの動作に違いを引き起こします。リアルタイムでは、始値の後、バーがクローズして高値、安値、終値が決定する前に、通常は何度も価格変動を繰り返しています。
チャートにスクリプトを追加して多くのリアルタイムバーが計算されてからページをリロードすると、時々スクリプトの描画がわずかに変化することがあります。この動きが一般的にインジケーターのリペイントと呼ばれる動作の一種です。そしてこれがこの記事に関連するリペイントの動作として言及するものです。リペイントが発生する理由はスクリプトで特定の機能が用いられると、ヒストリカルバーとリアルタイムバーで異なる計算が行われるためです。
また正しいかどうかはともかく、他のリペイントの種類には、過去バーに負のオフセットで描画することやrequest.security関数についての誤解による呼び出しで利用できない未来の情報を利用する場合が含まれます。 これはリアルタイムでは利用できないデータをスクリプトの計算に含めることを意味します。
ただし、ここで述べるリペイントの種類がすべてのインジケーターに当てはまるわけではありません。ほとんどのケースではリペイントは特定の関数や言語構造がコードで使用されているかに依存します。またリペイントの動きはバグではないことにご注意ください。これはTradingViewのヒストリカルバーとリアルタイムバーに含まれる情報の情報の本質的な違いの結果です。
次のケースでリペイントを確認できます:
1. ストラテジーで calc_on_every_tick = true を用いる場合。ストラテジーでパラメータを calc_on_every_tick = false に設定した場合でも、頻度は少ないですがリペイントが発生することがあります。
2. request.security関数を使用してチャートのメインシンボルの時間足よりも大きな時間足のデータを要求する場合:
//@version=5
indicator("My Script")
c = request.security(syminfo.tickerid, "5", close)
plot(close)
plot(c, color=color.red)
3. request.security関数を使用してチャートのメインシンボルの時間足よりも小さな時間足のデータを要求する場合(より詳細な情報はこちら):
//@version=5
indicator("My Script")
c = request.security(syminfo.tickerid, "1", close, lookahead=barmerge.lookahead_off)
plot(close)
plot(c, color=color.red)
lookahead=barmerge.lookahead_off の場合リペイントが発生します。lookahead=barmerge.lookahead_on の場合でも頻度は少ないですがリペイントが生じる可能性があります。この例では1分足と5分足タイミングが前後する場合にも、スクリプトがリペイントされる可能性があります。
4. すべてのスクリプトの計算は開始地点に依存します。イントラデイデータは、時間足によって週/月/年の始めで調整されます。そのため、そういったスクリプトで生成される結果は時々異なる可能性があります。こちらは開始地点に依存するスクリプトのケースです:
- スクリプトで valuewhen、barssince、ema関数を使用する場合(アルゴリズムの特殊性のため)。
- あらゆるバックテストストラテジー(calc_on_every_tick パラメータの定義に関わらず)。
時間足と開始地点の調整には次の依存関係があります:
- 1–14分 — 週の初めに調整されます
- 15–29分 — 月の初めに調整されます
- 30分以上 — 年の始めに調整されます
データ処理の際には、以下の履歴の長さの制限が考慮されます:
- Ultimateプランの場合、40000本のヒストリカルバー
- Expertプランの場合、25000本のヒストリカルバー
- Premiumプランの場合、20000本のヒストリカルバー
- EssentialおよびPlusプランの場合、10000本のヒストリカルバー
- その他のプランの場合、5000本のヒストリカルバー
5. 株式分割などによるヒストリカルデータ自体の変更。
6. スクリプトで以下の変数を利用する場合には通常リペイントが発生します: