我们已经学会了如何用str.format()
的占位符{0}
, {1}
来做“完形填空”。但默认填进去的数字和时间可能格式很乱,比如小数位太多,或者时间戳是一长串看不懂的数字。
为了让我们的输出更专业、更易读,我们需要给这些“填空”的内容进行“化妆”,这就是格式说明符的作用。
格式说明符是占位符里的一个可选部分,它告诉str.format()
函数,应该把填进来的数据“打扮”成什么样子。我们来看一个例子:
// 用当前价格和日期生成买入指令
buyText = str.format("于 {0,date,short} 以 {1,number,currency} 价格买入 {2}",
timenow, close, syminfo.ticker)
// 假设 timenow 是 2025年7月27日, close 是 278.45, syminfo.ticker 是 "AAPL"
// buyText 将是: "于 07/27/25 以 $278.45 价格买入 AAPL"
在这个例子里:
{0,date,short}
:date,short
就是格式说明符,它把{0}
号坑里的时间戳timenow
,“打扮”成了短日期格式。{1,number,currency}
:number,currency
是格式说明符,它把{1}
号坑里的收盘价close
,“打扮”成了美元货币格式。{2}
:没有格式说明符,所以品种代码syminfo.ticker
就以原始字符串的样子被填了进去。
格式说明符大全
PineScript为数字、日期和时间提供了丰富的预设格式说明符,足以应对绝大多数场景。下面就是完整的列表:
注意:如果你不小心把一个普通的数字(比如收盘价269.10
)用在了日期的格式说明符上(比如date,short
),程序不会报错。它会把269.10
当成是从1970年1月1日开始计算的毫秒数,然后给你返回一个1970年初的日期。所以一定要确保数据类型和格式说明符是匹配的。
学长再补充两点
- 如果你不指定任何格式说明符(只写
{0}
),程序会用一套默认规则来显示:整数会带千位分隔符,小数最多显示三位,时间戳会显示为一个巨大的整数(毫秒数),完全没法看。 - 花括号里的空格无所谓:为了让代码好看,你可以在占位符里面随便加空格,比如
{0, number, currency}
和{0,number,currency}
的效果是完全一样的。
实战案例:格式化并显示开盘跳空信息
下面的指标脚本演示了如何在实际场景中综合运用多种格式说明符。
它会计算开盘跳空的大小(金额和百分比),并在图表最后一个K线上通过标签显示这些信息以及跳空发生的日期。
//@version=6
indicator(title="str.format() 格式说明符案例", overlay=true)
if barstate.islast
// 1. 计算开盘跳空的大小(金额)和百分比
openGapSize = open - close[1]
priceChange = (open - close[1]) / close[1]
// 2. 使用str.format()
labelText = str.format(
// 模板字符串,用 + 连接多行
"{0} 今日跳空 {1,number,currency} ({2,number,percent})\n发生于 {3,date,full}",
// --- 下方是按顺序填充到 {0} - {3} 的参数列表 ---
syminfo.ticker, // {0}: 品种代码
openGapSize, // {1}: 跳空金额
priceChange, // {2}: 跳空百分比
time // {3}: K线时间
)
// 3. 创建标签
label.new(bar_index + 1, open, text=labelText,
color=color.new(color.blue, 75), textcolor=color.white,
style=label.style_label_left, size=size.large)
最终图表上会显示一个标签,清晰地列出跳空金额、百分比以及详细日期,这些都得益于str.format()
格式说明符的灵活应用。
总结
总结一下,格式说明符是str.format()
函数的点睛之笔。它让我们不必满足于默认的、粗糙的文本输出,而是可以像设计师一样,为数字、日期和时间选择最合适的“皮肤”(如货币、百分比、短日期等)。Pine Script为数字、日期和时间分别提供了多种预定义的格式说明符,足以应对大部分需求。熟练掌握这些预设的格式,能极大提升你图表标签和警报信息的可读性和专业度。