申し訳ないが私自身の研究のレポートがメインのためPine Scriptについて完全初心者は置いていかれる記事になる。予めご了承願いたい。
実はいままでアラートに変数を渡すことはできなかった。
例えばアラートをメールで受け取っている場合はBuyやSellのタイミングを通知してくれる機能ではあったが、ではいくらの価格で発動したのかが分からなかった。
公式のアナウンスを読むこと無くこの記事だけでアラートに変数を入れる文法を理解できる。
アラートメッセージに {{close}}
や {{volume}}
というように中括弧を二重にして記述することで内側の変数に置き換わる仕組みだ。
これはvue.jsのデータバインディングに似ている。
Plotのデータとして渡すことでアラートに変数を含める事ができる。
plot
のtitle
を設定しておき、アラート側で次のように先程のタイトルから値を引っ張ってくる。
plot(100,title="test")
alertcondition(close>0, title='test_alert', message='{{plot("test")}}')
alertcondition
側のtitle
は関係ない。
もちろんalertcondition
を設定しなくても各自お好みのアラートメッセージに {{ ... }}
を指定できる。
少々強引なコードではあるが、これで「100」というデータがアラートから送られてくる。
当然だがplot
なので自由に変化する変数を第一引数に持ってこれる。
仕様に少し複雑な点があり、動作しないことがある。
たとえば次のコードは失敗する
//@version=4
study("マイスクリプト")
test = 100
alertcondition(close>0, title='test_alert', message='{{test}}')
変数 test
に100
をいれてアラートの message
として送信しているように見える。
しかし、このような文法に場合は予めTradingView側で定義された**ビルトイン変数(close
やvolume
等)**でしか使用できないようだ。
ユーザー側の変数を送信する場合はPlot
を使う必要がある。
次のコードでは何が悪いか分かるだろうか。
//@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に変換されて送信されただけだ(後述)
true
や false
といったbooleanが数字に変換されて送られるからだ。
false
は0 true
は1に変換されるようだ。
アラートを「ロング」「ショート」の合図で使用している例で話す。
このようなケースではアラートにはロング用に1つ、ショート用に1つ、場合によってはノーポジション用などなどアラートはどんどん増えていく仕組みだった。
これによりアラート設定ミスに遭遇した人も多いだろう。
ここにアラート発生タイミングでロングなら1,ショートなら-1などと予め決めておいて変数を送信することによりアラートを一つに纏める事ができそうだ。
ただ、上で述べたとおり文字列が使えないので不便だ。「BUY」や「SELL」の文字列で送信したかった。
同様にアラートを「ロング」「ショート」の合図で使用している例で話す。
過去のアラートの癖を見ていると、1本のローソク足のなかで何回も同じアラートが発射されるTradingView側の不具合が散見されている。
次のような例がそれにあたり、トレードへのリスクとなる。
どうだろうか?
アラートだけを信じてトレードしているとこの例ではTradingView側のシステムエラーによってユーザーは意図しないロングを持つことになる。
おまけにこのまま行くとショートが出てもショートポジションとならず、ずっとロング(orノーポジション)し続ける状態となる。つまりシステムエラーに気付くまでいくらアラートが出ようとも正しいポジションに戻らなくなるのだ。
これに関してTV側に何度も問い合わせを行ってくれた有志の報告によると、どうやらTV側は今の所対応する様子はなさそうだ。
ユーザー側で対応するしかない。
というわけで今回のアラートに変数を通知することができるため現在ロングかショートかを合わせて通知できる。
例えばロング状態を1、ノーポジションを0、ショートを-1と定めておくと、
というようなことが可能だと考える。ピラミッディングを行っているシステムであればポジション数をそのまま変数として入れれば良いだろう。
少々コードを練る必要があるが理論上できるので今はそれだけ理解しておけばよいだろう。
また何か思いついたら記事にする。