Pine Scriptのバー確定とバー途中の違い:リペイント、アラート、calc_on_every_tick
3分で読めます · 更新日
過去のチャートではきれいに見えるPine Scriptが、リアルタイムではシグナルを出した後に消えることがあります。ほぼすべてのケースは1つの問いに行き着きます。スクリプトは確定したバーで動いているのか、まだ形成中のバーで動いているのか。
このガイドでは、それを左右する各設定と、私が水準のアラートに使っている設定を説明します。
過去のバーとリアルタイムのバー
過去のバーでは、Pineはスクリプトをバーごとに、その終値で1回だけ動かします。リアルタイムのバーでは、価格が更新されるたびに再実行します。close > level のような条件は、10:01には真、10:03には偽、10:04にはまた真になることがあります。過去のチャートには最後の答えしか残りません。この差が、トレーダーがリペイントと呼ぶものです。
barstate.isconfirmed
barstate.isconfirmed は、バーの最後の更新、つまり確定時にだけ真になります。条件に加えると、リアルタイムのバーが過去のバーと同じように動きます:
crossUp = ta.crossover(close, level) and barstate.isconfirmed
plotshape(crossUp, style=shape.triangleup, location=location.belowbar)
alertcondition(crossUp, "Close above level")
その代償は速度です。シグナルはバーの確定時に届くので、時間足が長いとまるまる1本遅れます。
アラートの頻度
アラートを作成すると、TradingViewがどのくらいの頻度で発動させるかを尋ねます:
- Once Per Bar Close:条件が真のままバーが確定したときだけ発動します。バックテストと一致します。
- Once Per Bar:バー内で条件が初めて真になった時点で発動します。バーが逆向きに確定しても発動します。
- Once Per MinuteとOnly Once:発動回数の制限です。
水準のアラートには、1分足または5分足でOnce Per Bar Closeを使います。水準を突き抜けたヒゲが水準の内側に戻って確定した場合は発動しないので、だましのブレイクの大半を減らせます。
ストラテジー:calc_on_every_tick と process_orders_on_close
ストラテジーは、既定では過去のバーでもリアルタイムのバーでもバー確定時に動きます。2つの設定がこれを変えます:
calc_on_every_tick=trueは、リアルタイムの更新のたびにストラテジーを動かします。過去のチャートではこれができないため、実際のトレードがバックテストとずれ始めます。process_orders_on_close=trueは、シグナルが出たバーの終値で注文を約定させます。既定では次のバーの始値で約定します。終値ベースの決済には向いていますが、エントリーを実際よりよく見せることがあります。
ストラテジーがバー確定時に正しく動くようになるまでは、どちらもオフのままにしてください。インジケーターとストラテジーの違いのガイドでは、Strategy Testerのその他の前提を説明しています。
Bar Magnifier
過去のチャートでは、ストラテジーが知っているのは各バーの始値、高値、安値、終値だけです。損切りと利確の両方が1本のバーの中にある場合、どちらが先に付いたかを推測するしかありません。use_bar_magnifier=true は、下位時間足のデータでそれを判定します。TradingViewの有料プランで使えます。幅の狭い損切りと利確を信頼する前に、オンにしてください。
request.securityと上位時間足
5分足のチャートに日足の高値を持ち込むのは、リペイントがよく起きる原因です。過去のチャートでは日足のバーはすでに完成しているため、スクリプトは1日の最初のバーから最終的な高値を見てしまいます。リアルタイムでは高値は動き続けます。前の、確定した値を指定してください:
prevHigh = request.security(syminfo.tickerid, "D", high[1], lookahead=barmerge.lookahead_on)
[1]とlookahead_onを組み合わせると、過去でもリアルタイムでも、今日のすべてのバーで昨日の高値が得られます。
チェックリスト
- シグナルに
barstate.isconfirmedを使っている、またはアラートがOnce Per Bar Closeになっている。 - 上位時間足の値に、
[1]とlookahead_onを使っている。 - ストラテジーがバー確定時に動き、
calc_on_every_tickがオフになっている。 - 損切りと利確の幅が近いときは、Bar Magnifierがオンになっている。
- 取引する前に、1週間分の実際のアラートをバックテストと比べている。
動かない水準
私のトレードプランの水準は取引セッションの前に決まり、1日中固定です。そのため、水準を描くスクリプトにはリペイントするものがありません。Pine Scriptの水準ガイドでは、それをTradingViewに表示する方法を説明しています。
よくある質問
Pine Scriptのバー確定とバー途中の違いは何ですか?
バー確定は、バーが完成したときに1回だけスクリプトが動くことです。バー途中は、バー内の価格更新のたびに動くことで、シグナルが出ても確定前に消えることがあります。
Pine Scriptのアラートがリペイントしないようにするには?
アラートをOnce Per Bar Closeにするか、条件にbarstate.isconfirmedを加えます。上位時間足のデータには、lookahead_onを付けて前のバーの値を使ってください。
ストラテジーのバックテストはバー内の価格を使いますか?
バー内の約定にだけ、しかもBar Magnifierをオンにしたときにだけ使います。過去のシグナルは、各バーの終値で計算されます。
出典
- TradingView Pine Script User Manual:実行モデル、リペイント、アラート
- TradingViewヘルプセンター:Bar Magnifier
教育目的のコンテンツです。投資助言ではありません。