見出し画像

Pineの謎②

公開スクリプトを読みながら疑問に思ったことを適当に書いています。
今回は「valuewhen」について。
↓のコード。何がどうなっているのかさっぱりわかりません。

x = valuewhen(sz, sz, 4)

https://jp.tradingview.com/pine-script-reference/v5/#fun_ta{dot}valuewhen

👆TradingViewのリファレンス情報
「ta.valuewhen」直近のn番目に出現した `condition` が true のバーの `source` 系列の値を返します。
ん~~~さっぱり分からん。
👇例として以下のコードが掲載されています。

//@version=5
indicator("")
slow = ta.sma(close, 7)
fast = ta.sma(close, 14)
// Get value of `close` on second most recent cross
ta.valuewhen(ta.cross(slow, fast), close, 1)

1つ目の引数がTrueの時に、「2つ目の引数」の「3つ目のインデックス」で値を取って来るってこと?
👇コードを書いて検証してみました。左の数字は行番号です。説明の為の。

 1 //@version=5
 2 strategy("マイストラテジー", overlay=true, margin_long=100, margin_short=100)
 3
 4 slow = ta.sma(close, 7)
 5 fast = ta.sma(close, 14)
 6 plot(slow)
 7 plot(fast)
 8
 9 b =ta.cross(slow, fast)
10 if b
11     label.new(bar_index, slow, "", tooltip=str.tostring(b), style=label.style_label_down, yloc=yloc.abovebar, color=color.blue)
12     label.new(bar_index, fast, "", tooltip=str.tostring(bar_index), style=label.style_label_up, yloc=yloc.belowbar, color=color.red)
13     c =ta.valuewhen(b, close, 0)
14     // c =ta.valuewhen(b, close, 1)
15    label.new(bar_index, c, "", tooltip=str.tostring(c), style=label.style_label_up, yloc=yloc.price, color=color.purple)

9行目、公式サンプルの一部を外だしして変数「b」に結果を代入しています。
10行目、「b」がTrueの時に11行目~15行目を実行します。14行目はコメントです。

11     label.new(bar_index, slow, "", tooltip=str.tostring(b), style=label.style_label_down, yloc=yloc.abovebar, color=color.blue)
12     label.new(bar_index, fast, "", tooltip=str.tostring(bar_index), style=label.style_label_up, yloc=yloc.belowbar, color=color.red)

11・12行目はラベルを作成しています。x軸はbar_index、y軸はsmaの結果、ラベルのテキストはブランク、ツールチップで「b」の結果と「bar_index」の値が分かるようにしています。

13     c =ta.valuewhen(b, close, 0)
14     // c =ta.valuewhen(b, close, 1)
15    label.new(bar_index, c, "", tooltip=str.tostring(c), style=label.style_label_up, yloc=yloc.price, color=color.purple)

13行目は「valuewhen」。引数1はここでは必ずTrue(10行目で聞いているので)ですので、「c」には値が入るはず。引数2は「close」、引数3は「0」ですので、その時の最新の「close」値が取得されるのか?14行目はコメント、15行目は「c」の値でラベルを作成します。

図1

👆実行結果はこんな感じです。ラベルが表示されている所は、移動平均がクロスしているのが分かります。青色ラベルにマウスを持っていくと「True」が表示されます。

図2

👆赤色レベルにマウスを持っていくと「bar_index」の値が表示されます。

図3

👆紫色ラベルにマウスを持っていくと、「c」の値が表示されます。そして「終値」の値と同じ事が分かります。

 1 //@version=5
 2 strategy("マイストラテジー", overlay=true, margin_long=100, margin_short=100)
 3
 4 slow = ta.sma(close, 7)
 5 fast = ta.sma(close, 14)
 6 plot(slow)
 7 plot(fast)
 8
 9 b =ta.cross(slow, fast)
10 if b
11     label.new(bar_index, slow, "", tooltip=str.tostring(b), style=label.style_label_down, yloc=yloc.abovebar, color=color.blue)
12     label.new(bar_index, fast, "", tooltip=str.tostring(bar_index), style=label.style_label_up, yloc=yloc.belowbar, color=color.red)
13     // c =ta.valuewhen(b, close, 0)
14     c =ta.valuewhen(b, close, 1)
15     label.new(bar_index, c, "", tooltip=str.tostring(c), style=label.style_label_up, yloc=yloc.price, color=color.purple)

👆13・14行目のコメントを入れ替えます。違いは引数3の値です。

図4

紫色のラベルのツールチップの値と、終値に差が出ています。

図5

👆1つ左のラベル位置にマウスを持っていきます。終値が「図4」とのツールチップと同じになりました。
ということで、「ta.valuewhen」は
 引数1:条件式(Trueの時に実行)
 引数2:「Open」「Close」などのソース
 引数3:0が最新のインデックス番号
でいいのか?

間違っていたら教えてください。

以上


この記事が気に入ったらサポートをしてみませんか?