オフセットを用いたインジケーターのアラートに関する問題

オフセットを伴うプロットを使ったインジケーターでアラートを作成したときに、アラートのシグナルとチャート上のシグナルを比較すると、アラートの方が遅れてトリガーされたように見えることがあります。

例として「ピボットハイ (pivotHigh)」検出時にアラートがトリガーされる場合を見てみましょう。

「ピボットハイ」は高値を検知するスクリプトで、一定数の前後の高値よりも大きい高値を検出します。(この例では、前後の高値を2つ以上に設定しています。)

以下のPineスクリプトを使用すると、上記条件を満たすバーを見つけることができます:

//@version=6
indicator("PivotHigh", overlay=false)
plot(high)
plot(high, linewidth=2, style = plot.style_circles)

phDetected  =  
     high[2] > high[0]
   and high[2] > high[1]
   and high[2] > high[3]
   and high[2] > high[4]

plotshape(phDetected?high[2]:na, style=shape.labeldown, location=location.absolute, text="pivotHigh", textcolor=color.white,  color=color.green, offset=0)

alertcondition(phDetected)

チャートにスクリプトを追加すると16:30のバーにラベルが表示されますが、実際に「ピボットハイ」になるのはそれよりも2つ左(14:30)のバーです。

このスクリプトの "alertcondition" でアラートを作成すると、「ピボットハイ」の検出条件が満たされる16:30のバーでアラートがトリガーされます。

ラベル表示については、plotshape関数を用いてオフセットを追加し、実際に「ピボットハイ」になるバーにラベルを表示させることができます。

plotshape(phDetected?high[2]:na, style=shape.labeldown, location=location.absolute, text="pivotHigh", textcolor=color.white,  color=color.green, offset=-2)

このとき、アラートについてもラベル同様にもっと早く(つまり14:30のバーで)トリガーされると思われるかもしれませんが、上記オフセットはラベル表示の便宜上から必要に応じて設定しているだけであり(ダイバージェンスに関するインジケーターでよく使われます)、アラートのトリガーには影響せずに、変わらず16:30のバーでトリガーされます。