どうも、しゅん@TradeTechです。
2021年10月7日にTradingViewで、Pineスクリプトの最新バージョン(v5)が公開されました!本記事執筆時点(10/16)ではまだ日本語版TradingViewでのお知らせが無いですが、すでに利用可能となっているようです。
仕組みやコードの書き方など、かなり変更点があるようなので、以下の公式ページを見ながらまとめてみました。
https://www.tradingview.com/blog/en/say-hello-to-pine-script-v5-26900/
新機能を使わないなら旧バージョン(v4)のままで引き続き使えますが、本記事を読んで最新バージョン(v5)も気になったらぜひ触ってみてください。
コード記述の変更点
インジケーターのstudyがindicatorに
インジケーターのPineスクリプト先頭はこれまで「study(~)」でしたが、「indicator(~)」にしれっと変更されていました。
ストラテジーの方は「strategy(~)」のままです。個人的にはstudyとstrategyを空目することが多かったのでこの方が良いなと思っています。ただしばらく慣れずに間違えそうです。苦笑
テクニカル分析系関数の名前空間がtaに
これもコード上の大きな変更点ですが、テクニカル指標などを計算する関数の先頭に「ta.」が付くようになりました。
例えば単純移動平均線を計算してくれる関数「sma」は「ta.sma」となります。影響範囲が大きそうな変更ですね。
新たな機能や構文
import可能なライブラリ機能
新バージョンの目玉は、何といってもこれでしょう。
「ライブラリ」と呼ばれる、再利用可能な関数群をパッケージ化できる機能が実装されました。
Pythonなどの他言語と同じようにimportして利用。ライブラリは自作するほか、公開されているものを利用することもできます。
【公開されているライブラリ】
https://www.tradingview.com/scripts/?script_type=libraries
これまでは、様々なインジケーターで同じような処理をする場合でも1つ1つコピペ等で書く必要がありましたが、共通部分をライブラリとして外にまとめることができるので便利になりそう。
また今後公開ライブラリが増えてくれば、先人の知恵をそのまま拝借することもできそうです。
僕も今後何か作って公開してみたいです。笑
switch構文が利用可能に
他言語ではおなじみのswitch構文が利用可能になりました。
switchはif系の構文で、複数の分岐がある場合にifやelseよりもキレイに書くことができます。
例えば文字列sma_typeが「SMA」ならsma関数で、「EMA」ならema関数で、「RMA」ならrma関数で、それぞれ計算した結果が欲しい場合は以下のように書けます。(いずれでもない場合は「0」を返す)
result = switch sma_type "SMA" => ta.sma(close, 25) "EMA" => ta.ema(close, 25) "RMA" => ta.rma(close, 25) => 0
パラメータをドロップダウン選択式にしているようなインジケーターやストラテジーとは特に相性が良さそうです。
while構文が利用可能に
こちらも新構文、whileが使えるようになりました。
whileはfor系の構文で、「条件を満たしている間ずっと繰り返す」という書き方になります。例えば以下は、現在足から遡って連続で何回終値が上昇したか?をカウントしています。
var n = 0 var count = 0 while close[n] > close[n+1] count += 1
for構文の場合は事前に繰り返す回数を指定する必要がありましたが、繰り返し回数が不定な場合などはwhile構文の方が便利です。
自作関数にパラメータ設定が可能に
v4では自作関数を作ることができましたが、他言語にあるような「引数(パラメータ)のデフォルト値」は指定できませんでした。
v5ではこのデフォルト値が設定可能になったため、より柔軟な関数が作れるようになります。公式ページでは以下のような累乗計算の自作関数が紹介されていました。
customPow(base, exp = 2) => result = 1 for i = 1 to exp result *= base
この関数を利用する場合は、
customPow(11, 4) と書けば11の4乗を、
customPow(11) と2つ目の引数を省略すれば11の2乗を、
それぞれ返してくれるようになります。
描画オブジェクトのIDが自動格納される配列
チャート上にライン(line)やラベル(label)などをPineで描画する場合、描画された各オブジェクトには自動でIDが振られます。
複数の描画オブジェクトを扱う際、このIDを制御するのが面倒だったのですが、v5では「line.all」といった形式で描画されている全オブジェクトのIDが格納された配列が用意されることになりました。
array.sizeで描画済みオブジェクトの数を数えたり、特定のタイミングで描画されたオブジェクトを設定変更したりなど、いろんな場面で使えそうです。
強制エラー停止できるRUNTIME.ERROR関数
強制的にエラーを発生してスクリプトを停止できる「RUNTIME.ERROR()」が追加されました。
これは単体で使うというよりも、スクリプトを実行させたくない特定の条件を書いたifと併せて利用することになります。
例えば以下のように書くと、指数などのような出来高の提供されていないシンボルにインジケーターを設定した場合に「出来高データの提供されていないシンボルです。」とエラー表示されます。
if na(volume) runtime.error("出来高データの提供されていないシンボルです。")
「エラーになった理由」を明記できるので、より利用者に親切なスクリプトを作れるようになりますね。
strategyで取得できる統計情報が増えた
ストラテジーにおけるバックテストの結果を取得できるstrategy.XXX系関数がいくつか追加されたようです。
終了したトレードのエントリー価格や日付を取得できる関数などが増えたみたいですね。詳細は公式ページ内の「NEW STRATEGY PARAMETERS」をご覧ください。
旧バージョンについて
旧バージョン(v4)は今後も利用可能
最新バージョンが公開されましたが、これまで自作してきた旧バージョン(v4)のPineスクリプトは引き続き利用できますのでご安心ください。
また、今後もv4でスクリプトを作成したい時は、コード冒頭にある「//@version=5」を「//@version=4」に変更すれば、旧来通りv4で作成可能です。
自動コンバージョン機能もあるが完璧ではないので注意
v4からv5への変換については、一応公式でコンバート(変換)機能が用意されています。
Pineスクリプトエディタの右上にある3点リーダをクリックして、メニューから「Convert to v5」を選択すればOKです。
ただし、コードの書き方や利用している関数などによっては正しく変換されない場合もあるようです。
コンバート機能を試す場合は、事前にコードのバックアップを取ってからやってみることをオススメします。
おわりに
以上、TradingViewのPineスクリプトv5における新機能や変更点についてご紹介しました。
ライブラリ機能など、まだまだ僕もじっくり触れていない部分があるので、その辺りは改めて別記事でまとめたいと思います。
また、今回は公式ブログの記事で紹介されているものを中心に紹介しましたが、細かく見ていくとまだまだ変更点などありそうです。
何か面白い見つけたらTwitterでつぶやいたりすると思うので、ぜひ僕のTwitterアカウントも以下からフォローしておいてください!
よろしくお願いします。
(・・「逆引きPine辞典」も修正しなきゃ。 orz)