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