2020-06-06

Pine Script v4 研究室 #2 security関数

今日はストラテジ詐欺の温床となっているsecurity関数を使い倒す。

Article Image

本日のPine:Security関数

先日使ったSecurity関数をもう一度詳しく見てみる。

こちらはストラテジが設定されているチャートとは別のチャートからデータを引っ張ってくる関数である。

ただし、これが少々複雑なバグの温床になっておりわかっているだけでも次のパターンで**「全く嘘の爆益ストラテジ」**を作ることが可能という問題がある。

次の例で使用する場合はsecurityを使ったストラテジにしてはいけない(インジケータとしてのみで利用を推奨)

  • 参照元のチャートと「違う時間足」を参照している
  • securityの足にheikinashiを使っている

はむとれコミュの00さんが大変参考になるノートを執筆されているので是非一度目を通して見てみてほしい。

【TradingView】バックテストにご注意

おまけ:まだある詐欺ストラテジ制作法!

また他にもTV左上のローソク足の形状選択から**「平均足」**を選択したチャートにストラテジを当てないように注意だ。

image-20200605201947632

これは殆どのストラテジのPFがアップする魔法の効果があるが、完全に見かけだけなので注意だ。

ダマされないように。

Securityは基本バージョンが一番新しいものでのみ使う

上記の理由で基本的にバージョンが新しいもののほうが信頼性が高い。

しかしながら全てのバグが把握できているわけではないので常に細心の注意を払って使う。

Security公式のドキュメント

https://jp.tradingview.com/pine-script-reference/#fun_security

Pineのドキュメントは比較的コンパクトに纏まっており参照が明確で理解しやすい印象であったが、Securityに関してみれば正直わかりにくい。

というわけで私なりに簡単なところから解説してみる。

最も基本的な書き方

btcush = security("BTCUSD","45",close)

1つ目に参照する銘柄、2つ目に足、3つ目にOHLCVのいずれか(他にもあるかも)を入れる。

3つ目の引数は数式も入れられるので後ほど説明する。

1つ目の引数「銘柄」

ここではBTCUSD。あれ?と思った方もいるだろう。

BTCUSDという銘柄は沢山の取引所が取り扱っており、どこの取引所のBTCUSDなのか分からない。

分からないが、とりあえず正しく動作する。

なぜか公式には記述がないのだが、銘柄の前に:を打って取引所を入れることで取引所を明示することができる。

btcush = security("BTCUSD","45",close)
btcush2 = security("Bitstamp:BTCUSD","45",close) //ここに注目
plot(btcush)
plot(btcush2)

2行目に注目。BitstampのBTCUSDが表示される。

ここでは無印のBTCUSDBitstampBTCUSDを2本表示しているので、取引所が違えばPLOTが少しズレて表示されるはずである。 image-20200605234237492

やってみると、**ピッタリ一致している。**ちなみに2行目をBitfinexにすると

image-20200605234403843

僅かにズレているので、違う取引所であることが分かる。

無印にするとどこの取引所になっているのか

少々強引だが結論として無印のBTCUSDは検索で出てくる最初の銘柄かと思う。次の画像を見ていただきたい。

image-20200605234542001

わからなくなるので可能な限り:を使って取引所を明示しておこう。

ちなみに取引所が存在しなかったりその取引所に銘柄がなかったらちゃんと一切グラフがプロットされない。

例えば

btcush2 = security("bitFlyer:BTCUSD","45",close)

bitFlyerBTCUSDはないのでエラーだ。

2つ目の引数「足」

btcush = security("BITMEX:XBTUSD","45",close)

ここでは45という数字が入っている。これはなんだろうか。

これは45分足を意味している。

次のルールで入力する。

  • 数字をダイレクトにいれると「分足」
  • 秒足は1S, 5S, 15S, 30S
  • 日足はD
  • 週足はW
  • 月足は1~12M

ここはちょっと特殊だがルールがわかればそれほど難しくない。

3つ目の引数:具体的な数値

文字でわかりやすい表現が私にはできなかった。

要するに対象銘柄を表示したいか、だ。

最も簡単なのがOHLCVのどれかを使うこと。特にcloseはよく使う。公式でこの引数は次のように説明される。

expression (series[color]) security の呼び出しで式を計算し返す事ができます。系列または系列にキャストできる要素を含むタプルが可能です。

さっぱり分からないが、とりあえず「式」にすることができると覚えておけば良い。

例えば

btcush = security("BITMEX:XBTUSD","45",sma(close,75))

これで予めcloseの75日移動平均線にすることができる。

image-20200605235743261

メインで表示しているチャートと同じ足を使うには?

メインで表示しているチャートはユーザーが自由に足を変更できる。

冒頭で述べたように表示している足と違う足を参照している場合エラーになる。これを避けるためにtimeframe.periodというビルトイン変数が用意されている。

btcush = security("BITMEX:XBTUSD", timeframe.period, close)

2番めの引数に入れる。わかりやすいように同じbitFlyerの銘柄で比較。

image-20200606000331204

形状が一致。

足を変えても...

image-20200606000405987

一致。

拡大倍率と線の太さが違うので若干違うように見えるが上下の動きを見れば一致しているのが分かる。

ここからはあまり使わない使い方

先程の例のように、表示しているチャートと全く同じ足の別時間足を参照する場合、銘柄名もビルトイン変数にできる。

厳しく検証したわけではないがこれは時間足が異なるため私からは非推奨。

syminfo.tickeridを第一引数にすると、現在表示している銘柄と全く同じ銘柄がセットされる。

btcush = security(syminfo.tickerid, "1", close)

Version4から第2引数は「表示しているチャートより足が長いもの」しか指定できない。おそらく先程のバグ回避のためだと思われる。

上のコードで5秒足のチャート上に1分足securityで持ってくると

image-20200606001043639

下側がsecurityの1分足なので、価格の移動が1分間変化がない事がわかるが・・・

最後の箇所がオカシイ。1分未満で価格が動いている。もうすでにバグが目視で確認できる。非推奨な理由である。

image-20200606001219564

スケールを縮小したらこう。やはり直近の価格だけおかしい。

barmerge.gaps_onbarmerge.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)

image-20200606001951396

元が1秒足(上)。security1分足(下)を重ねている。

当然1分間は足のcloseは変わらないのでグラフは階段のようになるはず。これは先程解説した。

デフォルトはoffなので、基本何も変わっていない。

次はbarmerge.gaps_onに変更。

btcush = security(syminfo.tickerid, "1", close, barmerge.gaps_on)

image-20200606002151092

カクカクだった線が少しスムーズになった。

何が起こったのか。

よく見るとグラフは00秒の点から次の00秒の点(1分間)に向かって直線が引かれている

要するにあいだの1分間は全く同じ値ではなく均等に次の点へ結ばれるというイメージでよさそうだ。

ただ、これをどこで使うか?といわれたら正直わからん。

barmerge.gaps_onのメリット?

これにしておくとリアルタイムでチャートを描画しておくと先程述べた「リアルタイムで描画している箇所のグラフが変」というのが無くなる。

image-20200606002811453

offの場合は最新の描画が普通に1秒足に引っ張られて描画されてしまっているが、

image-20200606002926865

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に関してはこのようにユーザーが予め別のサイトで知ってないと分からないような内容があり今回は記事にした。



この記事をシェア


謎の技術研究部 (謎技研)