继StrContains()和StrStartsWith()之后,我们来打造我们自定义工具箱里的最后一件利器:StrEndsWith()。顾名思义,它专门解决不区分大小写的后缀匹配问题。这个功能在根据计价货币(如USD)、合约类型(如PERP)等品种代码后缀来做精细化筛选时,无可替代。
自定义不区分大小写的StrEndsWith()函数
实现思路和我们前两节课完全一样:在比较之前,先把两个字符串都用str.lower()函数一视同仁地转换成小写,抹平大小写的差异,然后再进行比较。
基于这个思路,我们可以封装出下面这个专门用于后缀匹配的自定义函数:
// 判断源字符串是否以子字符串结尾,不区分大小写
StrEndsWith(string source, string substring) =>
// 转成小写,然后调用内置的str.endswith()进行精确的后缀匹配
str.endswith(str.lower(source), str.lower(substring))
这个函数的使用示例及其结果如下:
| 代码示例 | 结果 |
StrEndsWith("XRPUSD", "USD") |
true。XRPUSD字符串确实以USD结尾。 |
StrEndsWith("XRPUSD", "usd") |
true。usd的字母出现在XRPUSD字符串的末尾。由于函数忽略了大小写差异,因此usd、Usd、USD以及其他各种大小写形式都被视为相同。重要的是字母组合匹配,而不是它们的大小写。 |
StrEndsWith("XRPUSD", "xru") |
false。虽然xru这个短语存在于字符串内部,但它不是结尾部分的字符,因此函数返回false。 |
StrEndsWith("0.35675", "675") |
true。“0.35675”这个文本确实以675字符结尾。 |
使用注意事项 (处理空值)
我们这个自定义函数在处理空字符串或na值时,行为和内置的str.endswith()一样。简单总结就是:
- 任何字符串都以空字符串结尾,所以
StrEndsWith("EURUSD", "")会返回true。 - 一个空字符串不可能以任何非空内容结尾,所以
StrEndsWith("", "USD")会返回false。
实战案例:根据时区识别不同国家的股票
下面的指标旨在识别在英国、德国和美国交易所交易的股票。它通过我们自定义的StrEndsWith()函数,来检查交易品种的时区(syminfo.timezone)是否以特定的城市名结尾,从而判断其所属的国家。
//@version=6
indicator(title="不区分大小写的后缀匹配", overlay=true)
StrEndsWith(string source, string substring) =>
str.endswith(str.lower(source), str.lower(substring))
if barstate.islast and syminfo.type == "stock"
if StrEndsWith(syminfo.timezone, "london")
label.new(bar_index, high, "这是一只英国股票!",
color=color.teal, textcolor=color.white)
else if StrEndsWith(syminfo.timezone, "berlin")
label.new(bar_index, high, "这是一只德国股票!",
color=color.fuchsia, textcolor=color.white)
else if StrEndsWith(syminfo.timezone, "new_york")
label.new(bar_index, high, "这是一只美国股票!",
color=color.lime)
这个脚本首先通过一个外层if语句,确保我们只在图表的最后一个K线上,并且只对股票类型的品种进行操作。然后,在内层的级联if语句中,我们调用自己创建的StrEndsWith()函数,依次检查时区是否以"london"、"berlin"或"new_york"结尾,并根据结果打上不同颜色的标签。
在下面的股票图表上,脚本会正确地识别出这是一只哪国股票:
总结
总结一下,通过str.lower()和str.endswith()的组合,我们成功打造了自定义工具三剑客的最后一位StrEndsWith()。
至此,我们已经拥有了一套完整的、不区分大小写的文本匹配工具箱:
StrContains()用于模糊包含。StrStartsWith()用于前缀匹配。StrEndsWith()用于后缀匹配。
学会自己动手创造工具,是让你从PineScript新手走向高手的必经之路。
相关文章阅读:



