2020-03-27

Pine Script v4 研究室 (TradingView) #1 アラートに変数を送信する

Pineスクリプトにて2019/10/31よりアラートに変数を入れられるようになった。やり方とユースケースを紹介する。

Article Image

Pine Script 研究室について

申し訳ないが私自身の研究のレポートがメインのためPine Scriptについて完全初心者は置いていかれる記事になる。予めご了承願いたい。

アラートに変数とは

実はいままでアラートに変数を渡すことはできなかった。

例えばアラートをメールで受け取っている場合はBuyやSellのタイミングを通知してくれる機能ではあったが、ではいくらの価格で発動したのかが分からなかった。

目標

公式のアナウンスを読むこと無くこの記事だけでアラートに変数を入れる文法を理解できる。

概要

アラートメッセージに {{close}}{{volume}} というように中括弧を二重にして記述することで内側の変数に置き換わる仕組みだ。

これはvue.jsのデータバインディングに似ている。

実装方法

Plotのデータとして渡すことでアラートに変数を含める事ができる。

plottitleを設定しておき、アラート側で次のように先程のタイトルから値を引っ張ってくる。

plot(100,title="test")
alertcondition(close>0, title='test_alert', message='{{plot("test")}}')

alertcondition側のtitleは関係ない。

もちろんalertconditionを設定しなくても各自お好みのアラートメッセージに {{ ... }} を指定できる。

実行結果

100というデータがアラートから送られてくる

少々強引なコードではあるが、これで「100」というデータがアラートから送られてくる。

当然だがplotなので自由に変化する変数を第一引数に持ってこれる。

動作しない例1

仕様に少し複雑な点があり、動作しないことがある。

たとえば次のコードは失敗する

//@version=4
study("マイスクリプト")
test = 100
alertcondition(close>0, title='test_alert', message='{{test}}')

変数 test100をいれてアラートの messageとして送信しているように見える。

しかし、このような文法に場合は予めTradingView側で定義された**ビルトイン変数(closevolume等)**でしか使用できないようだ。

ユーザー側の変数を送信する場合はPlotを使う必要がある。

動作しない例2

次のコードでは何が悪いか分かるだろうか。

//@version=3
study("マイスクリプト")
plot(100,title="test")
alertcondition(close>0, title='test_alert', message='{{plot("test")}}')

実行結果

次のコードでは動作しない

そのまま「{{plot("test")}}」が表示されている。

原因

原因は1行目のコメント //version=3 だ。

alertcondition内で使用する場合はversion 4以降にしか対応していない。

これを覚えておかないと正しいコードでも動かないためパニックになる。

残念な仕様(文字列使用不可)

ひとつ残念なことがあった。

変数に文字列が指定できない。

pine v4で文字列を表示させることができるようになったのだが 文字列表示は plotではなく label.new 関数なため非対応のようだ。

例えばこんなコードを書いてみたくなる人もいるかも知れない。

//@version=4
study("マイスクリプト")
plotchar(true, char="OK", title="test")
alertcondition(close>0, title='test_alert', message='{{plot("test")}}')

plotcharは第一引数はbooleanでそれがtrueの時に文字を1文字だけ表示するプロットである。

alertに送られるのは第一引数なので上のコードのアラート結果は次のようになる(文字の内容charは無視される)

trueが1に変換されて送信されただけだ(後述)

plotchar

なぜ1が表示されたのか

truefalseといったbooleanが数字に変換されて送られるからだ。

falseは0 trueは1に変換されるようだ。

ケース1 「ロングorショート」

アラートを「ロング」「ショート」の合図で使用している例で話す。

このようなケースではアラートにはロング用に1つ、ショート用に1つ、場合によってはノーポジション用などなどアラートはどんどん増えていく仕組みだった。

これによりアラート設定ミスに遭遇した人も多いだろう。

ここにアラート発生タイミングでロングなら1,ショートなら-1などと予め決めておいて変数を送信することによりアラートを一つに纏める事ができそうだ。

ただ、上で述べたとおり文字列が使えないので不便だ。「BUY」や「SELL」の文字列で送信したかった。

ケース2「TVのバグ対策」

アラートが連発する対策

同様にアラートを「ロング」「ショート」の合図で使用している例で話す。

過去のアラートの癖を見ていると、1本のローソク足のなかで何回も同じアラートが発射されるTradingView側の不具合が散見されている。

次のような例がそれにあたり、トレードへのリスクとなる。

  1. 数日前にアラートが指示したショートを現在保持している。
  2. 本日アラートがロングを指示する。ノーポジションの合図だと考え決済する。
  3. 同ローソク足でアラートがもう一度ロングのアラートが出る。ユーザーはもう一度ロングの方向にポジションを取った。
  4. 実は3はバグで二重アラートとなっていた。本来はノーポジションが正解だった。

どうだろうか?

アラートだけを信じてトレードしているとこの例ではTradingView側のシステムエラーによってユーザーは意図しないロングを持つことになる。

おまけにこのまま行くとショートが出てもショートポジションとならず、ずっとロング(orノーポジション)し続ける状態となる。つまりシステムエラーに気付くまでいくらアラートが出ようとも正しいポジションに戻らなくなるのだ。

これに関してTV側に何度も問い合わせを行ってくれた有志の報告によると、どうやらTV側は今の所対応する様子はなさそうだ。

ユーザー側で対応するしかない。

数字でロング状態なのかショート状態なのかを明示する

というわけで今回のアラートに変数を通知することができるため現在ロングかショートかを合わせて通知できる。

例えばロング状態を1、ノーポジションを0、ショートを-1と定めておくと、

  1. 数日前にアラートが指示したショートを現在保持している。
  2. アラートがロングを指示する。アラートには「0」が入る。ユーザはノーポジションにする。
  3. バグでアラートがもう一度ロングの指示を出す。アラートは先程の重複なので「0」が入っている。つまりユーザはバグと認識し何もしない。

というようなことが可能だと考える。ピラミッディングを行っているシステムであればポジション数をそのまま変数として入れれば良いだろう。

少々コードを練る必要があるが理論上できるので今はそれだけ理解しておけばよいだろう。

また何か思いついたら記事にする。



この記事のタグ

この記事をシェア


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