2017年7月1日土曜日

[Trading View]NaNを気をつけよう

久しぶりです。

ちょっと土曜日早起きしたので、ブログ記事を・・。

TradingView記事です。

TradingViewのPineスクリプトですが、エラーが割合不親切です。謎現象でチャートが出ないとかあります。

とっかかりで、よくハマるポイントが、次の2点です。
・宣言式と代入式の違い。
・NaNの扱い

宣言式と代入式の違いは、ブログでも何回か書いていますね。

宣言式
abc = 0.0

代入式
abc := 0.0

と代入には:が必要です。

で、宣言式と書いているので、その行の次の行から左側で宣言された変数が有効になります。

abc = 0.0
//ここからabcが使える
def = abc

これは、たとえばemaの計算などで過去値を使えるのも次の行からとなります。
_ema = 0.2 * close + 0.8 * _ema[1]


実行するとこんな感じです。
この式をチャートに追加出来るようにするためには、次のように書く必要があります。
_ema = 0.0
_ema:= 0.2 * close + 0.8 * _ema[1]

さて・・・。これでも出る時はでるのですが、出ない時があります。

チャートに出ている以上にデータが存在しない場合、値がNaNという未定義を示す値になります。この値に何を掛け足ししてもNaNのままです。
上記の式の場合、最初の1個がNaNになる可能性があります。

そこで、NaN対策を打つ必要がでてきます。

NaN対策を打った計算式が次の通りです。
_ema:= 0.2 * close + 0.8 * nz(_ema[1])

nz関数は、値がNaNなら0を返すというものです。
この関数を入れておくと、正しく計算できるようになります。

0以外の値にしたい場合はna関数を利用します。
naは値がNaNならtrueを返す関数です。
na関数を利用した場合で、上の計算式と同じ結果となるには次のように書きます。

_ema := 0.2 * close + 0.8 * (na(_ema[1]) ? 0.0 : _ema[1])

本数が増えると大体影響がなくなりますが、たまに0以外にしたい場合もあるかと思います。(例えば割り算の分母になる場合)

_ema := 0.2 * close + 0.8 * (na(_ema[1]) ? close : _ema[1])

naを使うとNaNときに0以外に設定可能です。

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

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

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

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