前面我们讲了字符串比较的三剑客,但它们都有一个共同的毛病:太较真,严格区分大小写。比如,在它们眼里'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))
这个函数的使用示例及其结果如下:
使用注意事项 (处理空值)
我们这个自定义函数在处理空字符串或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()
。这个过程不仅解决了实际问题,更重要的是让你体会到了编程的灵活之处:当现成的工具不满足需求时,学会自己动手创造工具。
评论前必须登录!
立即登录 注册