上次我们学习了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里随心所欲构建任何复杂文本的能力。

 
			


