继StrContains()和StrStartsWith()之后,我们来打造我们自定义工具箱里的最后一件利器:StrEndsWith()。顾名思义,它专门解决不区分大小写的“后缀匹配”问题。这个功能在根据计价货币(如USD)、合约类型(如PERP)等品种代码后缀来做精细化筛选时,无可替代。
自定义不区分大小写的StrEndsWith()函数
实现思路和我们前两节课完全一样:在比较之前,先把两个字符串都用str.lower()函数一视同仁地转换成小写,抹平大小写的差异,然后再进行比较。
基于这个思路,我们可以封装出下面这个专门用于后缀匹配的自定义函数:
// 判断源字符串是否以子字符串结尾,不区分大小写
StrEndsWith(string source, string substring) =>
    // 转成小写,然后调用内置的str.endswith()进行精确的后缀匹配
     str.endswith(str.lower(source), str.lower(substring))
这个函数的使用示例及其结果如下:
使用注意事项 (处理空值)
我们这个自定义函数在处理空字符串或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新手走向高手的必经之路。



