Новые функции в Pine: str.format() и array.from()

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”, возвращается в зависимости от неравенства цен close и open, {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' }", 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() передается всего одна переменная, timenow, содержащая UNIX-представление времени: текущую дату, время и часовой пояс для биржи символа на графике. Строка форматируется с помощью символов y, M, D, F (год, месяц, день в году, неделя месяца), спецсимвола \n для переноса строки и одинарных кавычек ‘’ для вставки текста между символами.

Данный скрипт выводит форматируемые строки в объект label и соответствующий им результат работы функции 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))

В левой колонке объекта label приведены символы, заключенные в {}, в правой — результат работы функции str.format:

В функцию str.format() передается переменная t, содержащая UNIX-представление времени: текущую дату, время и часовой пояс.

Следующим нововведением является функция array.from(), которая принимает переменное количество входных аргументов одного из следующих типов: float, int, bool, string, label, line, color, и возвращает массив соответствующего типа. Функция позволяет объявить массив, присвоить ему начальные значения и присвоить результат любой переменной всего за одну строку кода. 

Раньше для создания массива и заполнения его начальными значениями нужно было использовать функцию 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)

Теперь для создании массива, который будет содержать в себе цвета графиков, можно обойтись всего одной строкой:

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, следите за разделом Release notes. Учетная запись PineCoders также транслирует новости об обновлениях в своем Telegram-канале Squawk Box, в Twitter и в публичном чате Pine Script на TradingView.

Мы надеемся, что эти улучшения будут вам полезны. Продолжайте делиться с нами своим мнением. Мы создаем TradingView для наших пользователей, и всегда рады услышать, что вы думаете о наших нововведениях.

Look first Then leap

Мы создали TradingView, чтобы вы могли пользоваться самыми крутыми функциями.
Открыть график