上次我们学习了str.format()
这个文本构建工具,它的核心思想就是完形填空。今天,我们就来深入研究一下这个填空题里面的占位符。理解了占位符的各种高级玩法,你才能真正驾驭str.format()
的全部用法。
我们先来明确两个核心概念:
- 占位符:就是你文本模板里,用一对花括号
{}
括起来的“坑”。它的作用有两个:一是在模板里“占一个位置”,二是规定填进来的数据要以什么样的“格式”显示。 - 占位符索引:就是坑里的“编号”,比如
{0}
,{1}
。这个编号告诉程序,应该拿我们提供的一串“填空答案”(也就是参数列表)里的第几个去填这个坑。记住,编号是从0开始的。
我们通过一个例子来直观感受一下:
// 为买入信号生成提示文本
positionSize = 100
buyText = str.format("买入 {0} 手 {1} 于价格 {2}", positionSize, syminfo.ticker, close)
在这个例子里:
formatString
是"买入 {0} 手 {1} 于价格 {2}"
- 参数列表是
positionSize
,syminfo.ticker
,close
- 占位符
{0}
,编号为0,对应参数列表的第一个值positionSize
。 - 占位符
{1}
,编号为1,对应参数列表的第二个值syminfo.ticker
。 - 占位符
{2}
,编号为2,对应参数列表的第三个值close
。
占位符的灵活用法
str.format()
的占位符非常灵活,远不止按顺序填数字这么简单。
1. 占位符可以填入文本
占位符不仅能填数字,也能填入字符串变量或字符串字面量。这让我们的模板变得更加动态。
// {0}号坑被字符串"买入"填入
alertText = str.format("{0}信号于 {1}, 目标价位 {2}。",
"买入", close, high + 2 * ta.tr)
// 输出: "买入信号于 33.97, 目标价位 38.48."
2. 重复使用同一个“内容”
一个很方便的技巧是,同一个“答案”可以填到多个“坑”里。你只需要在模板里多次使用同一个索引号就行了。这在需要重复显示某个值(比如止盈位)时特别有用,避免了重复计算和传递参数。
// {2}号坑被使用了两次
alertText = str.format("{0}信号于 {1}. 止盈一: {2}, 止盈二: {2}.",
"买入", close, high + 2 * ta.tr)
// 输出: "买入信号于 0.974. 止盈一: 1.055, 止盈二: 1.055."
3. 不按顺序填坑
虽然程序允许你不按顺序来使用索引(比如{3}, {1}, {0}
),但我强烈建议你最好还是按{0}, {1}, {2}
的顺序来写。这是一种良好的编程习惯,能让你的代码更容易被自己和他人读懂。
// 虽然语法正确,但不推荐这样写
alertText = str.format("{3}信号于 {1}. 目标一: {0}, 目标二: {2}.",
high + 2 * ta.tr, // -> {0}
close, // -> {1}
high + 4 * ta.tr, // -> {2}
"买入" // -> {3}
)
学长避坑指南:第一个参数对应索引{0}
,第二个对应{1}
,以此类推。占位符索引不能超出参数列表的范围,如果你只有3个参数(索引0, 1, 2),却在模板里用了{3}
,程序不会报错,但它会把"{3}"
这几个字符原样输出,而不是填入一个值。这是个很隐蔽的坑。{
和}
必须成对出现,如果想在文本里显示花括号本身,需要用单引号转义,例如str.format("'{0}'", 123)
会输出{123}
。参数列表里的值可以比模板里用到的占位符多,多余的参数会被安全地忽略。
完整示例:创建动态的买卖信号标签
下面的指标脚本演示了如何综合运用占位符,根据K线是阳是阴,来动态地生成包含“买入”或“卖出”文本的信号标签。
//@version=6
indicator(title="str.format()占位符案例", overlay=true)
if barstate.islast
// 1. 根据K线方向:"买入" 或 "卖出"
signalText = close > open ? "买入" : "卖出"
// 2. 计算持仓量
positionSize = math.floor(10000 / close)
// 3. 使用str.format()
labelText = str.format("{0} {1} 信号\n于价格 {2}\n数量 {3} 手",
syminfo.ticker, // -> {0}
signalText, // -> {1}
close, // -> {2}
positionSize) // -> {3}
// 4. 创建标签
label.new(bar_index, high, text=labelText,
color=color.new(color.teal, 10), textcolor=color.white,
size=size.large, style=label.style_label_left)
通过{1}
号占位符,我们巧妙地将if/else
逻辑(由三元运算符实现)的结果——"买入"
或"卖出"
文本——动态地插入到了最终的标签内容中。
总结
总结一下,str.format()
的魔法核心就在于它的占位符系统。通过简单的{0}
, {1}
…索引,我们就能建立起“模板里的坑”和“要填入的值”之间清晰的对应关系。无论是顺序使用、重复使用还是插入动态文本,占位符都能游刃有余。掌握了占位符,你就掌握了在PineScript里随心所欲构建任何复杂文本的能力。