Security
関数先日使ったSecurity
関数をもう一度詳しく見てみる。
こちらはストラテジが設定されているチャートとは別のチャートからデータを引っ張ってくる関数である。
ただし、これが少々複雑なバグの温床になっておりわかっているだけでも次のパターンで**「全く嘘の爆益ストラテジ」**を作ることが可能という問題がある。
次の例で使用する場合はsecurity
を使ったストラテジにしてはいけない(インジケータとしてのみで利用を推奨)
security
の足にheikinashi
を使っているはむとれコミュの00さんが大変参考になるノートを執筆されているので是非一度目を通して見てみてほしい。
また他にもTV左上のローソク足の形状選択から**「平均足」**を選択したチャートにストラテジを当てないように注意だ。
これは殆どのストラテジのPFがアップする魔法の効果があるが、完全に見かけだけなので注意だ。
ダマされないように。
Security
は基本バージョンが一番新しいものでのみ使う上記の理由で基本的にバージョンが新しいもののほうが信頼性が高い。
しかしながら全てのバグが把握できているわけではないので常に細心の注意を払って使う。
https://jp.tradingview.com/pine-script-reference/#fun_security
Pine
のドキュメントは比較的コンパクトに纏まっており参照が明確で理解しやすい印象であったが、Security
に関してみれば正直わかりにくい。
というわけで私なりに簡単なところから解説してみる。
btcush = security("BTCUSD","45",close)
1つ目に参照する銘柄、2つ目に足、3つ目にOHLCV
のいずれか(他にもあるかも)を入れる。
3つ目の引数は数式も入れられるので後ほど説明する。
ここではBTCUSD
。あれ?と思った方もいるだろう。
BTCUSD
という銘柄は沢山の取引所が取り扱っており、どこの取引所のBTCUSD
なのか分からない。
分からないが、とりあえず正しく動作する。
なぜか公式には記述がないのだが、銘柄の前に:
を打って取引所を入れることで取引所を明示することができる。
btcush = security("BTCUSD","45",close)
btcush2 = security("Bitstamp:BTCUSD","45",close) //ここに注目
plot(btcush)
plot(btcush2)
2行目に注目。Bitstamp
のBTCUSDが表示される。
ここでは無印のBTCUSD
とBitstamp
のBTCUSD
を2本表示しているので、取引所が違えばPLOT
が少しズレて表示されるはずである。
やってみると、**ピッタリ一致している。**ちなみに2行目をBitfinex
にすると
僅かにズレているので、違う取引所であることが分かる。
少々強引だが結論として無印のBTCUSD
は検索で出てくる最初の銘柄かと思う。次の画像を見ていただきたい。
わからなくなるので可能な限り:
を使って取引所を明示しておこう。
ちなみに取引所が存在しなかったりその取引所に銘柄がなかったらちゃんと一切グラフがプロットされない。
例えば
btcush2 = security("bitFlyer:BTCUSD","45",close)
bitFlyer
にBTCUSD
はないのでエラーだ。
btcush = security("BITMEX:XBTUSD","45",close)
ここでは45
という数字が入っている。これはなんだろうか。
これは45
分足を意味している。
次のルールで入力する。
「分足」
1S
, 5S
, 15S
, 30S
D
W
1~12M
ここはちょっと特殊だがルールがわかればそれほど難しくない。
文字でわかりやすい表現が私にはできなかった。
要するに対象銘柄の何を表示したいか、だ。
最も簡単なのがOHLCV
のどれかを使うこと。特にclose
はよく使う。公式でこの引数は次のように説明される。
expression (series[color]) security の呼び出しで式を計算し返す事ができます。系列または系列にキャストできる要素を含むタプルが可能です。
さっぱり分からないが、とりあえず「式」にすることができると覚えておけば良い。
例えば
btcush = security("BITMEX:XBTUSD","45",sma(close,75))
これで予めclose
の75日移動平均線にすることができる。
メインで表示しているチャートはユーザーが自由に足を変更できる。
冒頭で述べたように表示している足と違う足を参照している場合エラーになる。これを避けるためにtimeframe.period
というビルトイン変数が用意されている。
btcush = security("BITMEX:XBTUSD", timeframe.period, close)
2番めの引数に入れる。わかりやすいように同じbitFlyer
の銘柄で比較。
形状が一致。
足を変えても...
一致。
拡大倍率と線の太さが違うので若干違うように見えるが上下の動きを見れば一致しているのが分かる。
先程の例のように、表示しているチャートと全く同じ足の別時間足を参照する場合、銘柄名もビルトイン変数にできる。
厳しく検証したわけではないがこれは時間足が異なるため私からは非推奨。
syminfo.tickerid
を第一引数にすると、現在表示している銘柄と全く同じ銘柄がセットされる。
btcush = security(syminfo.tickerid, "1", close)
Version4から第2引数は「表示しているチャートより足が長いもの」しか指定できない。おそらく先程のバグ回避のためだと思われる。
上のコードで5秒足
のチャート上に1分足
をsecurity
で持ってくると
下側がsecurity
の1分足なので、価格の移動が1分間変化がない事がわかるが・・・
最後の箇所がオカシイ。1分未満で価格が動いている。もうすでにバグが目視で確認できる。非推奨な理由である。
スケールを縮小したらこう。やはり直近の価格だけおかしい。
barmerge.gaps_on
とbarmerge.gaps_off
これはかなりマニアックなパラメータ。
公式の解説では
gaps (const bool) リクエストされたデータのマージ方法(リクエストされたデータは自動的にメイン系列 (OHLCデータ) とマージされます)。可能な値は: barmerge.gaps_on, barmerge.gaps_off です。barmerge.gaps_on - リクエストされたデータはギャップ (na値) ありでマージされます。 barmerge.gaps_off - リクエストされたデータはギャップなしで連続してマージされ、すべてのギャップは以前の最も近い既存の値で埋められます。デフォルト値は barmerge.gaps_off です。
なるほど。わからん。
実際つかってみよう。
まずデフォルトはoff
のほう。
btcush = security(syminfo.tickerid, "1", close, barmerge.gaps_off)
元が1秒足
(上)。security
で1分足
(下)を重ねている。
当然1分間
は足のclose
は変わらないのでグラフは階段のようになるはず。これは先程解説した。
デフォルトはoff
なので、基本何も変わっていない。
次はbarmerge.gaps_on
に変更。
btcush = security(syminfo.tickerid, "1", close, barmerge.gaps_on)
カクカクだった線が少しスムーズになった。
何が起こったのか。
よく見るとグラフは00秒の点から次の00秒の点(1分間)に向かって直線が引かれている。
要するにあいだの1分間は全く同じ値ではなく均等に次の点へ結ばれるというイメージでよさそうだ。
ただ、これをどこで使うか?といわれたら正直わからん。
barmerge.gaps_on
のメリット?これにしておくとリアルタイムでチャートを描画しておくと先程述べた「リアルタイムで描画している箇所のグラフが変」というのが無くなる。
offの場合は最新の描画が普通に1秒足に引っ張られて描画されてしまっているが、
onの場合は最新の部分が描画されないので表示上のバグがない。
このbarmerge.gaps_on
に関しては今の所日本で解説しているサイトが他に存在しない模様。また今回も少しドヤれてよかったと思う。
At the moment only 40 security calls can be present in a single script.
一つのスクリプトに同時に40個までしかsecurity
はおけない模様。
次はまだ確認してない
Please note that using this variable/function can cause indicator repainting.
いわゆるリペイントのお話のよう。本日は時間がないのでスキップ。
If you want to specify additional parameters of the requested symbol, e.g. session type or adjustment type, you can use the tickerid() function.
It is not possible to pass a spread to this function using the 'ticker' variable. You can use the 'tickerid' variable or a string representation of the ticker, e.g. “AAPL+MSFT*TSLA”.
tickerid()
という関数を使って何かできる模様。
https://jp.tradingview.com/pine-script-reference/#fun_tickerid ここから一度勉強しないとダメそう。これもいつか時間が有る時に。
そもそも「銘柄の指定方法」や「自動的に表示している足と同じ足の長さにする」に関しては公式ドキュメントのsecurity
の欄に書いてない。
security
に関してはこのようにユーザーが予め別のサイトで知ってないと分からないような内容があり今回は記事にした。