2017年5月29日月曜日

[Trading View]Pineスクリプト 入門5 関数宣言

トレーディングビュー Pineスクリプト 入門です。

もう少し本格的なプログラムをするには関数宣言が重要になってきますね。

まず英語ですが、リファレンスページにリンクをしておきたいと思います。
https://www.tradingview.com/wiki/Declaring_Functions

宣言の形式としては次の形です。
関数名(引数リスト)=>計算式

関数名(引数リスト)=>
    処理
    処理
    計算式

です。
=>が関数宣言式になります。
関数ですので、最後は何かの数値を返す必要があります。

Pineスクリプトでの関数宣言の勘所です。

1.使用の前に宣言する必要があります。
 .NetやJavaをやっている方だと、少し戸惑うかもしれませんが、宣言は使用の前に行う必要があります。

・NG例
plot(funcTest(close))

funcTest(a)=>a*a

・OK例
funcTest(a)=>a*a

plot(funcTest(close))

2.関数内でチャートの操作は行えません
plotやbgclor、barcolorなどのチャートに対する操作が発生する関数群は、使用できません。
関数はあくまで計算だけに限定されているようです。

こんな感じで怒られます。

ちなみに、これはif文なども同様です。
指定の条件の時だけ、バックグラウンドを描画するってどうやってやればいいの・・・?
Version3での話ですので、以後のバージョンで緩和されるかもしれません。

3.ローカルスコープが存在します。
関数の中で宣言された変数は、関数の外では利用できません。

・下のplot(b)はコンパイルエラーになります。
funcTest(a)=>
    b=a*a
    b[1]
    
plot(b)

4.再帰は行えません。
 ・・・波形の解析が行えない・・・悲しい
 Version3時点です。将来のバージョンでは緩和されるかもしれません。

5.関数名から=>までは改行できません。

・NG例
funcTest(
a    //テストのパラメータ
)=>
    b=a*a
    b[1]

なお、ビルドイン関数で、Pineスクリプトが得意とする形(最新バーのみ更新される形)のインジケータ作成に必要な関数はほとんど宣言済みです。
計算系に必要な関数は作る前に探してみてた方が良いです。

参考に一個作ってみたいと思います。
ビルドイン関数では、現在のバーから指定個数の高値安値を調査する関数がありますが、必ず現在バーからとなってしまいます。
そこで、オフセットも併せて指定できる関数を作ってみました。

■指定期間の高値安値を表示する。


//@version=3
study("high and low", overlay=true)

//-------------------------------------------------------
//入力
_offset = input(5, "Offset", type=integer)
_count = input(16, "Count", type=integer)

//-------------------------------------------------------
//指定オフセットから、指定数期間の最高値を取得する
// start 開始インデックス
// count 探査数
// return 最高値
HighestHigh(start, count)=>
    highest = 0.0
    for i = start to start + count - 1
        if nz(high[i]) > highest 
            highest := high[i]
    highest


//-------------------------------------------------------
//指定オフセットから、指定数期間の最安値を取得する
// start 開始インデックス
// count 探査数
// return 最安値
LowestLow(start, count)=>
    lowest = 999999999999999.0
    for i = start to start + count - 1
        if nz(low[i]) < lowest 
            lowest := low[i]
    lowest

//-------------------------------------------------------
//描画本体
plot(HighestHigh(_offset, _count), color=blue)
plot(LowestLow(_offset, _count), color=red)


※余談ですが、別に関数つくらなくても、ビルドイン関数+変数で同様のことは可能です。たぶん、本来はこのようにしなさいという事なのかと思います。

■書き換え例1 plotのオフセットを利用する
//@version=3
study("high and low", overlay=true)

//-------------------------------------------------------
//入力
_offset = input(5, "Offset", type=integer)
_count = input(16, "Count", type=integer)

highestHigh = highest(_count)
lowestLow = lowest(_count)

//-------------------------------------------------------
//描画本体
plot(highestHigh, color=blue, offset=_offset)
plot(lowestLow, color=red, offset=_offset)

■書き換え例2 オフセットした配列を用意する
//@version=3
study("high and low", overlay=true)

//-------------------------------------------------------
//入力
_offset = input(5, "Offset", type=integer)
_count = input(16, "Count", type=integer)

highestHigh = highest(_count)
lowestLow = lowest(_count)

offsetHigh = highestHigh[_offset]
offsetLow = lowestLow[_offset]

//-------------------------------------------------------
//描画本体
plot(offsetHigh, color=blue)
plot(offsetLow, color=red)


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

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

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

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