Pineスクリプトの新機能: str.format() と array.from()

05 21, 2021

今回のPineスクリプト言語のアップデートでは、文字列と配列を扱うための関数が追加されました。

str.format() 関数は、渡された引数を、指定したフォーマットの文字列に変換することができます:

str.format(formatString, arg0, arg1, ...) -> string

formatString には、波括弧“{}”で囲まれたN個のサブスクリプトが含まれ、対応するフォーマットされた引数 (文字列または数値の arg0, arg1..argN) と後述のいくつかのパターンで置き換えられます。

つまり文字列の解析に、もはや str.replace_all() 関数を使った構文を利用する必要はありません:

txt := "Time to {0} some {1}!"

txt := str.replace_all(txt, "{0}", close > open ? "buy" : "sell")

txt := str.replace_all(txt, "{1}", syminfo.ticker)

より便利で短い新しい方法でそれを行うことができます:

txt = str.format("Time to {0} some {1}!", close > open ? "buy" : "sell", syminfo.ticker)

括弧で囲まれた {0}{1} のサブスクリプトは、対応する順序の引数で置き換えられます: {0} は、三項演算子の実行結果の文字列 “buy” または “sell” が終値と始値の不等式に応じて返されます、{1} は、チャート上の現在のシンボル syminfo.ticker が返されます:

number テンプレートを使用して、文字列に変換された数字を別の表現に変換することができます。例えば、小数点以下の桁数を制限する事や:

str.format("{0,number,#.#}", 1.34) // returns: 1.3

数値の端数部分を破棄したり:

str.format("{0,number,integer}", 1.34) // returns: 1

財務形式を取得したり:

str.format("The cash turnover amounted to {0,number,currency}", 1340000) 

// “The cash turnover amounted to $1,340,000.00”.

パーセンテージを取得する事が可能です:

str.format("Expected return is {0,number,percent} - {1,number,percent}", 0.1, 0.2)  

// returns: Expected return is 10% - 20%. 

str.format() 関数は、日付/時刻をフォーマットする為の date テンプレートもサポートしています。

このスクリプトは、年初からの経過月と週、日数を表示します:

//@version=4
study("str_format_date")

//formatting string with date pattern
txt = str.format("Current bar date: {0,date, Y-MM-d'.' \n M 'months \n' F 'weeks \n' D 'days \n from the beginning of the year' }", timenow)

//printing label
var l1 = label.new(na, na, color = #FFFFFF00)
label.set_x(l1, bar_index)
label.set_yloc(l1, yloc.belowbar)
label.set_text(l1, txt)

plot(close)

str.format() 関数に(チャート上のシンボルの取引所の現在の日時とタイムゾーンの)UNIXの時間表現が含まれる1つの変数 timenow のみが渡されています。文字列は、Y, M, D, F (年、月、日、月内の週) の文字と改行の特殊文字 \n、及び文字間にテキストを挿入する為のシングルクォート ‘’ を使ってフォーマットされています。

このスクリプトは、フォーマット形式の文字列とそれに対応する様々な文字で整形された str.format() 関数の結果をラベルに出力します:

//@version=4
study("str_format_date_time")

// creating date-time variable: 2021.05.04. 14:30:59
t = timestamp("GMT+0", 2021, 05, 04, 14, 30, 59)

// function for left side of the label
f_print_left(_text)  => var _label = label.new(bar_index, na, _text, xloc.bar_index, yloc.price, color(na), label.style_label_right, color.green, size.large, text.align_right), label.set_xy(_label, bar_index, 0), label.set_text(_label, _text)

// function for right side of the label
f_print_right(_text) => var _label = label.new(bar_index, na, _text, xloc.bar_index, yloc.price, color(na), label.style_label_left, color.red, size.large, text.align_left), label.set_xy(_label, bar_index, 0), label.set_text(_label, _text)

var string format = 
  "{0,date,y.MM.dd hh:mm:ss}\n" +
  "{1,date,short}\n" +
  "{2,date,medium}\n" +
  "{3,date,long}\n" +
  "{4,date,full}\n" +
  "{5,date,h a z (zzzz)}\n" +
  "{6,time,short}\n" +
  "{7,time,medium}\n" +
  "{8,time,long}\n" +
  "{9,time,full}\n" + 
  "{10,time,hh:mm:ss}\n" +
  "{11,time,HH:mm:ss}\n"

// printing format string 
f_print_left(format)
//printing formatted string
f_print_right(str.format(format, t, t, t, t, t, t, t, t, t, t, t, t))

ラベルの左列には{}で囲まれた文字、右列には str.format関数 の結果が表示されます:

変数 tstr.format() 関数に渡され, それにはUNIXの時間表現(現在の日付、時間、タイムゾーン)が格納されています。

次のイノベーションは array.from() 関数です。この関数は、float, int, bool, string, label, line, color のいずれかの型の可変長の入力引数を取り、対応する型の配列を返します。この関数を使用すると、たった1行のコードで、配列の宣言、配列への初期値の割り当て、任意の変数への結果の割り当てを行うことができます。

これまでは、配列を作成して初期値を設定するには、array.new() 関数と array.push() または array.set() 関数を使用する必要がありました:

color[] plotColors = array.new_color(size=0)
array.push(plotColors, color.red)
array.push(plotColors, color.green)
array.push(plotColors, #0000FF)

しかしこれからは、チャートの色を格納する配列の作成をたった1行で済ませることができます:

plotColors = array.from(color.red, color.green, #0000FF)

この関数は、受け取った引数に基づいて、自動的に plotColors の配列を color[] 型に型変換します:

//@version=4
study(title="array_from")

f_arr (series1, series2, color1, color2) =>
    [ array.from(series1, series2), array.from(color1, color2) ]

[lines, colors] = f_arr(close, open, color.red, color.green)    

plot ( array.get(lines, 0), color = array.get(colors, 0))
plot ( array.get(lines, 1), color = array.get(colors, 1))

これらの str.format()array.from() 関数に関する情報は、リファレンスマニュアルでいつでもご覧いただけます。

Pineスクリプトのアップデートについて知りたい場合には、リリースノートのセクションをご確認ください。また、PineCodersのアカウントは、更新情報を Squawk BoxのTelegramチャンネル、Twitter、TradingViewのPineスクリプトの公開チャットでも発信しています。

これらの改善点がお役に立てば幸いです。また引き続きご意見ををお寄せください。私たちは皆様のためにTradingViewを構築していますので、私たちのイノベーションについてのご意見をお聞かせください。

Look first Then leap

あなたのためのTradingView、その最高の機能を最大限にご活用ください
チャートを起動