Pineチームは、v5のロールアウト以来、Pineを改善し続けるために努力してきました。この2ヶ月間に追加された待望の機能を見ていきましょう。
関数のオーバーロード
関数のオーバーロードは、ライブラリで定義したり、スクリプトに含めることができる関数のバリエーションです。オーバーロードは、元の関数と同じ名前を持っていますが、使用するパラメーターの数が異なっていたり、パラメーターの型が異なっていたりします。オーバーロードは、パラメーターの種類が必須であるライブラリで特に有用です。
このインジケーターでは、3つの引数を受け取る mult() 関数のオーバーロードを定義しています:
//@version=5 indicator("Function overload") // 2つのパラメーター mult(x1, x2) => x1 * x2 // 3つのパラメーター mult(x1, x2, x3) => x1 * x2 * x3 plot(mult(7, 4)) plot(mult(7, 4, 2))
ここでは、使用される引数の種類に応じて異なる動作をするオーバーロードを定義します。オーバーロードが元の関数と同じ数のパラメーターを持つ場合、パラメーターは異なる明示的な型を使用して定義する必要があります:
//@version=5 indicator("Function overload") // 'int' は 自動的に 'float' にキャストできるため、'int' と 'float' の両方の値を受け入れます mult(float x1, float x2) => x1 * x2 // 数値ではなく,'bool' 値を返します mult(bool x1, bool x2) => x1 and x2 ? true : false mult(string x1, string x2) => str.tonumber(x1) * str.tonumber(x2) // 3つのパラメーターを持つため,明示的な型は必要ありません mult(x1, x2, x3) => x1 * x2 * x3 plot(mult(7, 4)) plot(mult(7.5, 4.2)) plot(mult(true, false) ? 1 : 0) plot(mult("5", "6")) plot(mult(7, 4, 2))
for…in
for 構造を使って配列を反復処理する場合、配列が空の時にループに入らないようにしたり、範囲外の配列インデックスから保護する必要があります。
新しい for…in 構造は、配列のすべての要素を繰り返し処理することで、作業を容易にします。
構文は簡単です: for array_element in array_id は、array_id の要素をインデックス 0 から順に反復し、反復するたびに array_element 変数に配列の要素の値を代入します。配列が空の場合は、反復もエラーも発生しません。また、ループの反復の中で、配列の要素を追加したり削除したりすることができます。
以下のスクリプトでは、for…in を使用して、配列 a1 の中で最も大きい数値を求めています:
//@version=5 indicator("For...in cycle") var int[] a1 = array.from(1, 3, 6, 3, 8, 0, -9, 5) highest(array) => var int highestNum = na for element in array if na(highestNum) or element > highestNum highestNum := element highestNum plot(highest(a1))
文字列操作の新しい関数
これらの新しい関数により、文字列を処理する方法が増え、Pineで正規表現を利用できるようになりました。配列を使ったユーザ定義の文字列関数とは異なり、これらの関数は「シンプルな」形式の値を返すことができ、例えば request.security() の symbol 引数の作成に使用することができます。
str.contains(source, str)
source 文字列に str の部分文字列が含まれているかを判断します。例えば、現在のチャートが先物のつなぎ足かどうかは、内蔵変数 syminfo.tickerid に “!” の部分文字列が含まれているかで判断できます:
var isContinuous = str.contains(syminfo.tickerid, "!") plot(isContinuous ? 1 : 0)
str.pos(source, str)
source 文字列内の str 文字列の位置を返します。
str.substring(source, begin_pos, end_pos)
source 文字列から部分文字列を抽出します。この例では、str.substring() と str.pos() を使って、入力文字列 s から “AAPL” の部分文字列を取り出しています:
s = input.string("Time to sell some NASDAQ:AAPL") pos = str.pos(s, ":") // Get the position of the ":" character tkr = str.substring(s, pos + 1) // "AAPL"
str.replace(source, target, replacement, occurrence)
既存の str.replace_all() 関数とは逆に、str.replace() では、マッチした部分文字列を置換文字列で選択的に置き換えることができます。この例では、スプレッド文字列の最初のシンボルのプレフィックス “FTX” を “BINANCE” に置き換えています:
var source = "FTX:BTCUSD / FTX:BTCEUR" // 最初に出現する "FTX" を "BINANCE" の置換文字列で置き換えます Replace the first occurrence of "FTX" with the "BINANCE" replacement string var newSource = str.replace(source, "FTX", "BINANCE", 0)
str.lower(source) と str.upper(source)
source 文字列のすべての文字を小文字または大文字に変換します:
s = str.lower("Time to Sell Some AAPL") // time to sell some aapl! s = str.upper("Time to Sell Some AAPL!") // TIME TO SELL SOME AAPL!
str.startswith(source, str) と str.endswith(source, str)
source 文字列が str の部分文字列で始まる、または終わるかを判断します。
str.match(source, regex)
指定した正規表現にマッチする部分文字列を抽出します。例えば、正規表現 [\\w]+:[\\w]+ で、ソース文字列 “It’s time to sell some NASDAQ:AAPL!” からシンボル名を検索して返すことができます:
s = "It's time to sell some NASDAQ:AAPL!" var string tickerId = str.match(s, "[\\w]+:[\\w]+") //"NASDAQ:AAPL"
通貨変換
request.* 名前空間のほとんどの関数は、それらが返す値を別の通貨に変換できるようになりました。関数の呼び出しに currency 引数が指定されている場合、関数が返す価格の値は、ソースの通貨からターゲットの通貨に変換されます。currency パラメーターは、以下の関数に追加されました:
テキストボックス
Pineのボックス描画がテキストに対応しました!ボックスを描画する際に、box.new() 関数に text 引数を追加するだけで、ボックス内にテキストが表示されます。テキストのスタイルは、ボックスの作成時に text_size、text_color、text_valign、text_halign パラメーターの値を設定するか、以下の新しい関数でボックスを参照することで微調整できます:
この機能の例として、こちらは内蔵の「MTPC(マルチタイム期間チャート)」インジケーターを修正して、ハイライトされている週の高値・安値を表示しています:
Pineの新機能についての情報は、Pineユーザーマニュアルのリリースノートをご覧ください。またPineCodersは、Squawk BoxのTelegramチャンネル、Twitter、TradingViewのPineスクリプトの公開チャットで最新情報を発信しています。
ご要望を多く頂いたこれらの機能がお役に立てば幸いです。引き続き、改善のためのフィードバックやご提案をお寄せください。私たちは皆様のためにTradingViewを構築していますので、常にユーザーの方の声をお聞きしたいと思っています。