前面我们讲了字符串比较的三剑客,但它们都有一个共同的毛病:太较真,严格区分大小写。比如,在它们眼里'BTC'和'btc'是完全不同的东西。
但在很多实际场景里,我们希望搜索能智能一点,忽略大小写的差异。比如,我想找到所有比特币相关的品种,不管是BTCUSD还是btcusd。
PineScript本身没有提供现成的函数来做这件事,但这正好给了我们一个机会,来学习如何自己动手,丰衣足食:创建一个我们自己的、不区分大小写的文本包含函数。
自定义不区分大小写的StrContains()函数
怎么实现呢?思路其实非常巧妙:既然问题的根源是大小写不统一,那我们就在比较之前,强行把它们都变成统一的格式。最简单的方法就是,不管原始文本是什么样,我们都用str.lower()函数,把它们全部转换成小写。
这样一来,BTCUSD变成了btcusd,btc还是btc,再去比较,问题不就解决了么?
基于这个思路,我们可以封装出下面这个超级实用的自定义函数:
// StrContains() 函数:不区分大小写
StrContains(string source, string substring) =>
// 用str.lower()把字符串转成小写,然后调用熟悉的str.contains()进行判断
str.contains(str.lower(source), str.lower(substring))
这个函数的使用示例及其结果如下:
| 代码示例 | 结果 |
StrContains("AUDUSD", "AUD") |
true。AUD字符串在AUDUSD中逐字出现。 |
StrContains("AUDUSD", "usd") |
true。usd这个字母短语出现在AUDUSD文本中,因为函数忽略了大小写差异。所以无论我们查找的是usd、USD还是Usd,对函数而言,它们都被视为相同,并在源字符串中找到匹配。 |
StrContains("AUDUSD", "usdo") |
false。虽然usd在字符串中,但整个短语usdo并没有出现,因此函数返回false。 |
StrContains("32.84", "4") |
true。“4”这个字符在“32.84”字符串内部出现了。 |
使用注意事项 (处理空值)
我们这个自定义函数在处理空字符串或na值时,行为和内置的str.contains()一样。简单总结就是:
- 任何字符串都包含一个空字符串,所以
StrContains("EURUSD", "")会返回true。 - 一个空字符串里不可能包含任何非空的内容,所以
StrContains("", "USD")会返回false。
实战案例:根据交易品种时区进行判断
下面的指标会根据交易品种的时区(syminfo.timezone)来工作。我们将使用自己创建的StrContains()函数,来判断这个时区信息里是否包含europe或america,从而识别出资产所属的市场区域。由于我们是不区分大小写的比较,因此无论时区是"America/New_York"还是"america/new_york",都能被正确识别。
//@version=6
indicator(title="不区分大小写的字符串包含", overlay=true)
StrContains(string source, string substring) =>
str.contains(str.lower(source), str.lower(substring))
// 绘制标签
if barstate.islastconfirmedhistory
// 检查品种时区是否包含"europe"
if StrContains(syminfo.timezone, "europe")
label.new(bar_index, high, "这是一个欧洲市场的品种!",
color=color.teal, textcolor=color.white)
// 如果不属于欧洲,再检查是否包含"america"
else if StrContains(syminfo.timezone, "america")
label.new(bar_index, high, "这是一个美市场的品种!",
color=color.purple, textcolor=color.white)
当我们查看一个在欧洲交易所交易的品种时,脚本会显示这是欧洲市场的品种;否则会显示这是美洲市场的品种:
总结
总结一下,虽然PineScript没有内置的不区分大小写的搜索函数,但通过组合str.lower()和str.contains(),我们可以轻松地打造出自己的专属工具StrContains()。这个过程不仅解决了实际问题,更重要的是让你体会到了编程的灵活之处:当现成的工具不满足需求时,学会自己动手创造工具。
相关文章阅读:



