"Security" 関数で別のシンボルやタイムフレームを利用する

From TradingView Wiki
Jump to: navigation, search
Language: English  • 日本語 • 한국어 • Русский


security関数を利用すると、インジケーターが適用されているチャートとは別のシンボルやタイムフレームのデータを利用することができます。

詳細解説

IBMの1分足のチャートにスクリプトを適用しているとします。次のコードは「IBMの15分足の終値」を表示します。

study("Example security 1", overlay=true)
ibm_15 = security("NYSE:IBM", "15", close)
plot(ibm_15)
Example security 1

security の引数は 関数解説でわかる通り、最初の引数がシンボル名、2番目の引数がタイムフレーム、3番目の引数は値の計算式です。

シンボル名は2つのパートから設定されます。プレフィックスは取引所(またはデータプロバイダー)を示します。省略することもできます。例えば "NYSE:IBM"、"BATS:IBM"、"IBM" などです。プレフィックスが無い場合、デフォルトで取引所にBATSが選択されます。

現在のシンボル名はビルトイン変数の 'ticker' と 'tickerid' に割り当てられます。変数 'ticker' の値は、取引所のプレフィックスが付かないシンボル名です(例: 'MSFT')。変数 'tickerid' の値には、取引所のプレフィックス付きでシンボル名が保存されます(例: 'BATS:MSFT'、'NASDAQ:MSFT')。インジケーターは取引所の違いからくるデータの差異で表示が異なることがあります。こうしたあいまいさを回避するには 'tickerid'を使用することをお勧めします。

resolution (security関数の2番目の引数 )はタイムフレームの事であり、文字列として指定します。すべての日中のタイムフレーム(時間足や分足)は分で指定します。最小単位は1分で、リテラル "1" で設定されます。様々な分指定が可能です("5"、"10"、"21" など)。時間足も分で指定します。例えば、"60"、"120"、"240" はそれぞれ、1時間足、2時間足、4時間足を意味します。日足の指定には、"D" または "1D" を指定します。こちらも様々な日指定が可能です("2D"、"3D" など)。週足や月足も同様の方法で設定します("W"、"1W"、"2W"、"M"、"1M"、"2M" など)。"M" と "1M" は共に一ヶ月の指定です。

security 関数の3番目のパラメーターには値の計算に、任意の算術式、または関数呼び出しを指定できます。

例えば、security関数を使うことで、分足のチャートを開きながら(例えば日足や週足、月足)のSMA(または他のインジケータ)を表示することができます。

study(title="High Time Frame MA", overlay=true)
src = close, len = 9
out = sma(src, len)
out1 = security(tickerid, 'D', out)
plot(out1)

あるいは、変数を宣言することもできます。

spread = high - low

1分足、15分足、60分足で計算されます。

spread_1 = security(tickerid, '1', spread)
spread_15 = security(tickerid, '15', spread)
spread_60 = security(tickerid, '60', spread)

関数 security は、この例からわかる通り、現在のチャートシンボルのタイムスケールに応じた値を返します。その結果は、(例えば plot を使って)直接チャート上に表示するか、インジケーターのコード内で再計算、のどちらにも使用することができます。インジケーター「Advance Decline Line(騰落レシオ)」のsecurity関数は、より難しい再計算の例です。

study(title = "Advance Decline Line", shorttitle="ADL")
sym(s) => security(s, period, close)
difference = (sym("INDEX:ADVN") - sym("INDEX:DECN"))/(sym("INDEX:UNCN") + 1)
adline = cum(difference > 0 ? sqrt(difference) : -sqrt(-difference))
plot(adline)

このスクリプトでは同時に3つのsecurity関数を呼び出します。結果は再計算され、最終結果が「Advance Decline Line(騰落レシオ)」になります。これは値上がりまたは値下がり個別株の数を調べる為に投資家に利用される株式市場のインジケーターです (詳細はこちらを参照)。

便宜上 security 関数の呼び出しが、ユーザー関数 sym にラッパーされているという事実に注意してください (少しだけコードを省略しています)。

なお、security 関数は現在のチャートの時間足よりも長い時間足をリクエストする様に設計されています。例えば、1時間足を開いている場合、4時間足や日足、週足(もしくはそれ以上のタイムフレーム)のデータをリクエストして、その結果を描画できます。より短いタイムフレームのリクエストは推奨しません。例えば1時間足のチャートで15分足のデータをリクエストする様なケースです。

Barmerge: ギャップと先読み

要求したデータが現在のタイムフレームにがどのようにマッピングされるかを定義する2つのスイッチがあります。

ひとつ目はギャップのコントロールに関してです。デフォルト値は barmerge.gaps_off で、この時データはギャップなしで隙間なくデータがマージされます。barmerge.gaps_on の場合、データは ギャップ(na値)がある可能性が考慮されマージされます。

2つ目は Pineスクリプト Version 3 で追加されました。先読みパラメーターには、barmerge.lookahead_offbarmerge.lookahead_onの2つの指定可能な値があります。security 関数の動作を、新しい動作(version 3)と古い動作(version 2 and 1)とで切り換えることができます。

こちらの例 では、5分足のチャートで security 関数の2つ動作の違いを示します。

//@version=3
study("My Script", overlay=true)
a = security(tickerid, '60', low, lookahead=barmerge.lookahead_off)
plot(a, color=red)
b = security(tickerid, '60', low, lookahead=barmerge.lookahead_on)
plot(b, color=lime)
V3.png

チャート内、緑の線は、先読みが有効(barmerge.lookahead_on)である場合の時間足の安値です。これはPineスクリプト V2で実装されていた security関数の古い動作です。過去データの場合、緑の線には新しい時間足のバーが作られた後(青点線の垂直線)の時間足安値の価格レベルが表示されます。赤い線は先読みを無効(barmerge.lookahead_off)にした場合の時間足の安値です。この場合、過去データの時間足の安値は、前の時間足のバーが利用されます。将来の安値は利用されません。赤紫色の点線はリアルタイムデーターの開始を示しています。リアルタイムデーターの場合、barmerge.lookahead_off の機能に基づいた形で、barmerge.lookahead_onbarmerge.lookahead_off は同じ動作となります。

先読みの理解

次の行を含む多数の公開スクリプトがあります。

//@version=2
//...
a = security(tickerid, 'D', close[1]) // It's barmerge.lookahead_on, because version=2

security関数の (close[1]) の式は、前日のclose値(終値)です。将来のデータは利用されません

V3ではこれを、barmerge.lookahead_onbarmerge.lookahead_off を使って、2通りの方法で書き直すことができます。

barmerge.lookahead_on を使う場合は非常に簡単です。

//@version=3
//...
a = security(tickerid, 'D', close[1], lookahead=barmerge.lookahead_on)

ただし元の構成は将来のデータを使用しないので、barmerge.lookahead_off で書き直すことができます。barmerge.lookahead_off を使用すると、スクリプトはより複雑になりますが、どの様に先読みパラメーターが動作するかの仕組みを理解することができます。

//@version=3
//...
indexHighTF = barstate.isrealtime ? 1 : 0
indexCurrTF = barstate.isrealtime ? 0 : 1
a0 = security(tickerid, 'D', close[indexHighTF], lookahead=barmerge.lookahead_off)
a = a0[indexCurrTF]

インジケーターが過去データに基づいている場合(例. barstate.isrealtimefalse の場合)、日足の現在の終値を取得し、そしてそれを現在のタイムフレームでバーを右に1つシフトします。インジケーターがリアルタイムデータで処理されている場合、シフトさせる事なく、過去の終値を取ります。


前の項目: 改行, 次の項目: ビルトイン変数 "barstate" でバーの状態を利用する, メニューに戻る: Pineスクリプトチュートリアル