2017年5月26日金曜日

[Trading View]Pineスクリプト 入門4 計算処理

Trading View Pine Script入門その4です。

スクリプトでインジケータ値を計算する際の勘所をかいておきたいと思います。
Pineでの計算関数一覧みたいなのを期待された方はごめんなさい。Trading View社の日本語化が進むことを期待したいと思います。
(もしくは、やるのでTrading View社さん雇ってくれないかなぁ・・・w)

Trading Viewの計算処理はなれると簡単ですが、変数の扱いが少しだけ特殊です。C系のプログラムをやっている方にとっては、考え方の切り替えが必要になってきます。


まず、呼び出しルールです。
上のチャートの場合、画面にバーが26本見えています。
この場合、スクリプトは26回呼び出されます。

その時、常に描画対象のバーをインデックス0として呼び出されます。
MQLのように昔のバーを描画する際に、forループで回す必要がないのはこのためです。

この制御は、移動平均など、常にバーに対して描画が発生するインジケータの作成をとても簡略化します。
例えば、単純移動平均のスクリプトは、次の通りです。パラメータ入力を含めても5行で終わります。

//@version=3
study("テストスクリプト", overlay = true)
_period = input(21, "Period")
_source = input(close, "Source", type=source)
plot(sma(_source, _period))

ただし、この制御のおかげで、強い制限がかかっている箇所があります。
その説明の前に、変数は配列扱いになっているという部分を見ていきたいと思います。

//@version=3
study("テストスクリプト")
_period = input(21, "Period")
_source = input(close, "Source", type=source)
_sma = sma(_source, _period)
//5本前のデータを参照する
_drawSma = _sma[5]
plot(_sma )
plot(_drawSma , color=red)

_sma = sma(_source, _period)で宣言した(何度も書きますが=は変数宣言構文です)
_sma変数に対して[5]というインデックス参照を行う事で、前のバーの計算結果を見ることができます。実行すると、赤線で5本遅れの移動平均が描画されます。(ちょっとわかりやすくするためにサブチャートとして出しています。)

EMAなど、前のバーの情報を見たい場合は、このテクニックを利用すれば計算可能です。

で、制限なのですが、MT4では普通に過去配列値を変更可能です。Fractalなど、自分のバーからみて未来情報も参照しているような場合、さかのぼって値を変更する制御を行ったりします。

Trading Viewでは、この書き換えという制御に強い制限が入っています。

//@version=3
study("テストスクリプト")
_period = input(21, "Period")
_source = input(close, "Source", type=source)
_sma = sma(_source, _period)
//5本前のデータを参照する
_drawSma = _sma[5]
//過去の書き換えはコンパイルエラーになる
_drawSma[2] := 0.0
plot(_sma )

上記のように、MQLでは普通に見かける書き換えロジックですが、Pine スクリプトでは実現できません。
このため、Zigzagのように書き換え前提となっているインジケータの実装には、手間がかかる事となります。

書き換えが発生しないインジケータは簡単に実装可能だが、過去の書き換えが発生するインジケータはとても手間がかかるということです。

2017/05/31追記
Pineスクリプトですが、計算中バーから未来情報は基本参照できません。そのため、計算中バーより未来が存在するかどうか、したとして何本存在するかなどは全く計算が行えません。

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

5 件のコメント:

  1. Pine Scriptの日本語の情報が少ないので勉強になります。
    質問なのですが、例えば現在から100本前の値を常に参照したい場合はどのように書けばいいのでしょうか?
    Close[100]ではその足から100本前になってしまうので。

    返信削除
    返信
    1. 私もまだまだ勉強中なので、下記は現在での理解となります。
      間違っていたらごめんなさい。

      Pineスクリプトでは
       ・未来情報の参照禁止
       ・一度プロットした情報の書き換え禁止
      という強い制限がかかっています。たぶんTrading View社の理念かと思います。

       そのため、計算中バーから、未来情報があるかどうかは基本取れません。
       ただしチャート表示時のみtimenowとbartate.islastを利用して何かしらの初期表示は可能です。

      手っ取り早いやり方として、最新バーしか処理しないというのが考えられます。
      最新バーかどうかはbarstate.islastで取れますので、その際に100本の計算を行うという事です。

      plot(barstate.islast ? close[100] : 0 )

      ただ、このやり方でも、Pine スクリプトの一度プロットした情報は書き換えできないという制限がかかります。
      新しいバーが追加されるたび、前の値は残り更新されていくイメージです。
      https://jp.tradingview.com/x/dC8YKSig/

      最新バーから100本の箇所に印となる線などを出したいとのことかと思いますが、
      日付の頭にするなど、Pineスクリプト流の考え方に切り替えが必要そうです。
      (意図している処理が違ってたらごめんなさい)

      #コメント一度書き直しました。

      削除
    2. なるほど、詳しい説明ありがとうございます!
      やりたかったことはある地点からの変化率を出すことなのですが、
      それなら日付の頭から未来の分だけプロットすることならできそうでしょうか?
      その場合、日付の頭の終値の取得はどのようにすればいいでしょうか?
      質問ばかりで申し訳ありませんが、ご迷惑でなければご回答よろしくお願いいたします。

      削除
    3. すみません。いろいろ忙しくてちょっとサンプル書いている時間がなさそうです。
      Pineスクリプトのチュートリアルに、時間の頭の取り方が書いてありますので、それを参考にするのが一番いいかと思います。
      https://www.tradingview.com/wiki/Sessions_and_Time_Functions

      削除
    4. できました!ありがとうございました!

      削除